2014-10-09 47 views
6

我已經寫了一個通過檢測和打印功能中的basicblocks的標籤,因爲我想進一步使用splitBasicBlock()。我寫的是這樣的:llvm:如何獲得基本塊的標籤

virtual bool runOnModule(Module &M) 
{ 
    for(Module::iterator F = M.begin(), E = M.end(); F!= E; ++F) 
    { 
     errs()<<"Function:"<<F->getName()<<"\n"; 
     //for(Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) 
     for (iplist<BasicBlock>::iterator iter = F->getBasicBlockList().begin(); 
        iter != F->getBasicBlockList().end(); 
        iter++) 
     { 
      BasicBlock* currBB = iter; 
      errs() << "BasicBlock: " << currBB->getName() << "\n"; 
     } 
    } 
    return true; 
} 

IR文件看起來像這樣:

; <label>:63          ; preds = %43 
    %64 = load i32* %j, align 4 
    %65 = sext i32 %64 to i64 
    %66 = load i8** %tempdst, align 8 
    %67 = getelementptr inbounds i8* %66, i64 %65 
    store i8 -1, i8* %67, align 1 
    br label %73 

; <label>:68          ; preds = %43 
    %69 = load i32* %j, align 4 
    %70 = sext i32 %69 to i64 
    %71 = load i8** %tempdst, align 8 
    %72 = getelementptr inbounds i8* %71, i64 %70 
    store i8 0, i8* %72, align 1 
    br label %73 

; <label>:73          ; preds = %68, %63 
    br label %74 

不過,我一無所知標籤:

Function:main 
BasicBlock: 
BasicBlock: 
BasicBlock: 

有什麼不對這些 「無名」 的基本塊?我該怎麼辦?

回答

6

LLVM IR中的值不需要有名稱;實際上,這些基本塊沒有名稱,這就是爲什麼您從currBB->getName()獲得空字符串的原因。

他們在LLVM IR打印輸出中有名稱的原因是因爲當您打印到LLVM IR的文本格式(如它在.ll文件中出現的那樣)時,必須爲它們指定一個名稱以使它們可供參考,所以打印機將連續的數字名稱分配給基本塊(和其他值)。這些數字名稱僅由打印機創建,但實際上並不存在於模塊中。

+0

庵獲取標籤的名稱...如何分割THES基本塊的一個? – winter333 2014-10-10 01:11:41

+0

@ winter333如果你有其他問題,你應該單獨提問。 – Oak 2014-10-10 03:21:42

3

雖然BasicBlocks可以是沒有名(hasName()方法所指示的)一個可以通過使用currBB->printAsOperand(errs(), false)代替灑進errs()currBB->getName()值打印唯一BasicBlock標識符。對於未命名的BasicBlock,這將提供數字基本塊表示,例如%68

1

我認爲現在LLVM的行爲是不同的。 我使用的代碼,類似的路線,並且可以在LLVM-4.0

for (auto &funct : m) { 
      for (auto &basic_block : funct) { 
      StringRef bbName(basic_block.getName()); 
       errs() << "BasicBlock: " << bbName << "\n"; 
      } 
}