2016-04-26 89 views
0

在学习LLVM框架时,我试图实现一个'优化'过程,该过程在调用方法时在运行时打印每个方法的名称。LLVM:从函数传递访问全局变量

,我读了全局变量只能在模块间传递创建,并且我有创造串(每功能之一),与

Constant* data = ConstantDataArray::getString(M.getContext(), F.getName()); 

GlobalVariable* gvar = 
    new GlobalVariable(M, 
        data->getType(), 
        true, 
        GlobalValue::ExternalLinkage, 
        data, 
        "fname_" + F.getName().str()); 

这工作得很好,只要该字符串奠定了正确在由'优化'位码生成的汇编文件的内存中。

但是,我还没有找到一种方法来插入调用来打印函数通过这些字符串。 我想用

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

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

回答

0

想通了:

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

或者,IRBuilder:CreateGlobalStringPtr(...)可以从函数传递中调用,并且返回的Value*可以直接传递给emitPutS(...)。模块通行证没有必要。

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