在学习LLVM框架时,我试图实现一个'优化'传递,它在调用方法时在运行时打印每个方法的名称。
我读到全局变量应该只在Module Pass中创建,我在那里创建字符串(每个函数一个),
Constant* data = ConstantDataArray::getString(M.getContext(), F.getName());
GlobalVariable* gvar =
new GlobalVariable(M,
data->getType(),
true,
GlobalValue::ExternalLinkage,
data,
"fname_" + F.getName().str());
这种方法很好,因为字符串在'优化'bitcode生成的汇编文件的内存中正确布局。
但是,我还没有找到一种方法来插入在函数通道中打印这些字符串的调用。 我想用
Value* string = F.getValueSymbolTable().lookup("fname_" + F.getName().str());
CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI));
但string
以NULL
的形式返回。有没有更好的方法从函数中查找全局变量?
答案 0 :(得分:1)
想出来:
基本块具有getModule()
方法,模块具有getGlobalVariable(StringRef Name)
方法。
或者,可以从函数传递中调用IRBuilder:CreateGlobalStringPtr(...)
,并且返回的Value*
可以直接传递给emitPutS(...)
。模块传递不是必需的。
注意,CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI));
不正确。 emitPutS(...)
将在基本块中创建调用。 CreateCall
是错误的。