2014-09-10 2 views

Répondre

3

Je ne sais pas d'une méthode API unique qui fait cela, mais l'écriture il faut être simple:

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); 
} 
2

solution de chêne devrait fonctionner. J'ajouterai simplement que pour une approche plus efficace (dans une unité de traduction typique), je ferais marcher la liste users() de chaque variable globale (voir this section dans le manuel du programmeur LLVM) et noter les fonctions dans lesquelles elle apparaît, et alors en déduire de cela.

Mais il s'agit, il est vrai, d'un compromis. Si vous avez une unité de traduction (non typique) avec peu de code et beaucoup de globaux, la solution de Oak sera meilleure.

Questions connexes