LLVM:从函数Pass访问全局变量

LLVM:从函数Pass访问全局变量,llvm,llvm-c++-api,Llvm,Llvm C++ Api,在学习LLVM框架时,我试图实现一个“优化”过程,在调用每个方法时,在运行时打印每个方法的名称 我读到全局变量应该只在模块过程中创建,我在那里创建字符串(每个函数一个),使用 只要字符串在由“优化”位代码生成的程序集文件中的内存中正确布局,这就可以正常工作 但是,我还没有找到在函数Pass中插入打印这些字符串的调用的方法。 我想用 Value* string = F.getValueSymbolTable().lookup("fname_" + F.getName().str()); CallI

在学习LLVM框架时,我试图实现一个“优化”过程,在调用每个方法时,在运行时打印每个方法的名称

我读到全局变量应该只在模块过程中创建,我在那里创建字符串(每个函数一个),使用

只要字符串在由“优化”位代码生成的程序集文件中的内存中正确布局,这就可以正常工作

但是,我还没有找到在函数Pass中插入打印这些字符串的调用的方法。 我想用

Value* string = F.getValueSymbolTable().lookup("fname_" + F.getName().str());
CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI));
但是
string
返回为
NULL
。有没有更好的方法从函数中查找全局变量?

找到了:

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

或者,可以从函数pass调用
IRBuilder:CreateGlobalStringPtr(…)
,返回的
值*
可以直接传递到
emitput(…)
。模块通过不是必需的

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

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