2014-10-09 162 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"; 
      } 
}