LLVM:从函数传递访问全局变量

LLVM: Access Global Variable from Function Pass

在学习 LLVM 框架时,我试图实现一个 'optimization' 传递,在调用方法时在运行时打印每个方法的名称。

我读到全局变量只能在 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());

这工作正常,只要字符串在 'optimized' 位码生成的汇编文件中的内存中正确布局。

但是,我还没有找到一种方法来插入调用以在 Function Pass 中打印这些字符串。 我想用

Value* string = F.getValueSymbolTable().lookup("fname_" + F.getName().str());
CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI));

string 返回为 NULL。有没有更好的方法从函数中查找全局变量?

想通了:

基本块有一个getModule()方法,模块有一个getGlobalVariable(StringRef Name)方法。

或者,IRBuilder:CreateGlobalStringPtr(...) 可以从函数 pass 调用,返回的 Value* 可以直接传递给 emitPutS(...)。模块通行证不是必需的。

请注意,CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI)); 不正确。 emitPutS(...) 将在基本块中创建调用。 CreateCall 是错误的。