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文件中)时,您必须为它们指定一个名称以使它们具有可参考性,因此打印机会分配顺序数字名称到基本块(和其他值).但是,这些数字名称仅由打印机创建,并且实际上不存在于模块中.
虽然BasicBlocks可能没有名称(如hasName()方法所示),但可以通过使用currBB->printAsOperand(errs(), false)而不是流式传输到errs()值来打印唯一的BasicBlock标识符currBB->getName().对于未命名的BasicBlock,这将提供数字基本块表示,例如%68.
小智 5
使用 clang 将源代码编译为位码时,请使用以下标志
-fno-discard-value-names
Run Code Online (Sandbox Code Playgroud)
您将获得基本块的名称作为唯一的字符串