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