我想收集LLVm IR代码函数中使用的所有全局变量。有没有LLVM API可以做到这一点?例如,`如下面的代码。
int a,b;
int fun(){return a+b;}
全局变量a和b用于fun(),我需要在集合中收集a和b。
答案 0 :(得分:4)
我不知道有任何单一的API方法可以做到这一点,但写一个应该是直截了当的:
void getGlobalsUsedByFunction(const Function &F, set<GlobalValue*> *Globals) {
for (const BasicBlock &BB : F)
for (const Instruction &I : BB)
for (const Value *Op : I.operands())
if (const GlobalValue* G = dyn_cast<GlobalValue>(*Op))
Globals->insert(G);
}
答案 1 :(得分:3)
Oak的解决方案应该有效。我只想添加一个更有效的方法(在一个典型的翻译单元中),我要做的就是遍历每个全局变量的users()
列表(参见LLVM程序员手册中的this section)并注意它出现的功能,然后从中推断。
但诚然,这是一种权衡。如果你有一个(非典型的)翻译单元,只有很少的代码和很多全局变量,那么Oak的解决方案会更好。