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
是错误的。
在学习 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
是错误的。