3

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

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

全局变量 a 和 b 在 fun() 中使用,我需要将 a 和 b 收集到一个集合中。

4

2 回答 2

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);
}
于 2014-09-10T10:23:25.907 回答
4

Oak 的解决方案应该有效。我将添加一个更有效的方法(在典型的翻译单元中),我要做的是遍历users()每个全局变量的列表(请参阅LLVM 程序员手册中的本节)并注意它出现的函数,然后会从中推断出来。

但不可否认,这是一种权衡。如果您有一个(非典型)翻译单元,代码很少,全局变量很多,Oak 的解决方案会更好。

于 2014-09-10T12:18:33.883 回答