如何使用LLVM API查找函数中使用的全局变量?

时间:2014-09-10 09:04:41

标签: llvm llvm-ir llvm-c++-api

我想收集LLVm IR代码函数中使用的所有全局变量。有没有LLVM API可以做到这一点?例如,`如下面的代码。

int a,b;
int fun(){return a+b;}

全局变量a和b用于fun(),我需要在集合中收集a和b。

2 个答案:

答案 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的解决方案会更好。