2017-07-13 1 views
0

J'essaie de parcourir le graphe d'appel dans llvm. Une fois que je reçois un nœud dans le graphe d'appel, j'essaie d'imprimer le nom de la fonction correspondant à ce noeud du graphe d'appel ainsi que le nombre de références.llvm: CallGraphNode donnant une fonction incorrecte Nom

Résultats: 1) Le nom de la fonction est toujours une chaîne vide. 2) Le nombre de références est toujours un nombre aléatoire. 3) Les noms des fonctions appelées sont également une chaîne vide.

code: bool runOnModule (LLVM :: Module & M) override {

CallGraph cg = CallGraph(M); 
    cg.dump();// this is correct. It is printing the expected the call graph 

    for (CallGraph::const_iterator itr = cg.begin(), ie = cg.end() ; itr != ie; itr++) 
    { 
     if (itr->second != nullptr) 
     { 
      itr->second->dump(); 
      errs()<<"-----------CGN---------\n"; 
      CallGraphNode *cgn = itr->second.get(); 



      if(const Function* fptr = cgn->getFunction()) 
      { 
       errs()<<"Number of references are"<<cgn->getNumReferences()<<"\n"; 

       errs()<<fptr->getName()<<"\n"; 


       if(cgn->operator[](0) != nullptr) 
       { 

        if(cgn->operator[](0)->getFunction() != nullptr) 
        { 
         errs()<<cgn->operator[](0)->getFunction()->getName()<<"\n"; 
        } 

       } 
       } 
     } 
    } 

}

Répondre

1

essayer d'ajouter le drapeau de compilation -DNDEBUG. J'ai eu le même problème et ça m'a aidé. Si vous utilisez CMake, vous pouvez ajouter la ligne suivante au fichier CMakeLists:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG") 
+0

Merci much..It résolu mon problème. Où as tu trouvé ça? –

+0

J'ai appris cela de mon superviseur :) Autant que je comprends, vous devez compiler vos sources avec ce drapeau pour être compatible avec llvm. Ce drapeau désactive fondamentalement les assertions. Si vous utilisez llvm construit à partir de sources, vous n'en aurez pas besoin. –

+0

Mais j'utilise llvm construit à partir des sources lui-même ... :) –