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

时间:2016-04-26 04:33:25

标签: llvm llvm-c++-api

在学习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));

stringNULL的形式返回。有没有更好的方法从函数中查找全局变量?

1 个答案:

答案 0 :(得分:1)

想出来:

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

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

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