llvm:如何获取Basic Blocks的标签

win*_*333 12 llvm llvm-c++-api

我写了一个传递来检测和打印函数中基本块的标签,因为我想splitBasicBlock()进一步使用.我写的是这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是,我对标签一无所知:

Function:main
BasicBlock:
BasicBlock:
BasicBlock:
Run Code Online (Sandbox Code Playgroud)

这些"无名"基本块有什么问题?我该怎么办?

Oak*_*Oak 10

LLVM IR中的值不需要具有名称; 事实上,那些基本块没有名称,这就是你从中得到一个空字符串的原因currBB->getName().

它们在LLVM IR打印输出中具有名称的原因是因为当您打印到LLVM IR的文本格式(因为它出现在.ll文件中)时,您必须为它们指定一个名称以使它们具有可参考性,因此打印机会分配顺序数字名称到基本块(和其他值).但是,这些数字名称仅由打印机创建,并且实际上不存在于模块中.


Ela*_*arR 8

虽然BasicBlocks可能没有名称(如hasName()方法所示),但可以通过使用currBB->printAsOperand(errs(), false)而不是流式传输到errs()值来打印唯一的BasicBlock标识符currBB->getName().对于未命名的BasicBlock,这将提供数字基本块表示,例如%68.


小智 5

使用 clang 将源代码编译为位码时,请使用以下标志

-fno-discard-value-names
Run Code Online (Sandbox Code Playgroud)

您将获得基本块的名称作为唯一的字符串