2016-06-17 1 views
3

Kürzlich benutze ich llvm, um Anrufanweisung in LLVM-IR einzufügen. Das Problem ist, dass, wenn ich eine Funktion namens add habe, kann ich es nicht finden, getFuntion (string), da die add() in IR . Ich weiß, dass alle Funktionen in IR einen neuen Namen haben, aber ich wusste nicht, was der neue Name genau ist.LLVM- Wie man Funktion durch realen/ursprünglichen Namen der Funktion erhält

Module *m = f->getParent(); 
    IRBuilder<> builder(m->getContext()); 
    Function *call = m->getFunction("add"); 
    // call is NULL. 
    std::vector<Value *> args; 
    ...... 



Module *m = f->getParent(); 
IRBuilder<> builder(m->getContext()); 
Function *call = m->getFunction("_Z3addv"); 
// call is not NULL. 
std::vector<Value *> args; 
...... 

Wie finde ich die Funktion mit ihrem ursprünglichen Namen?

+2

Der C++ Namen ändern Mangeln wird durch Klängen erledigt, also schauen Sie in den APIs von clang nach. –

Antwort

2

Sie können Mangler von LLVMCore wiederverwenden. Hier

ist ein Beispiel für die Nutzung:

std::string mangledName; 
raw_string_ostream mangledNameStream(mangledName); 
Mangler::getNameWithPrefix(mangledNameStream, "add", m->getDataLayout()); 
// now mangledName contains, well, mangled name :) 
+0

denkt. Das ist was ich will !!! HINWEIS: Nach den 3 Zeilen sollte 'mangledNameStream.flush()' hinzugefügt werden, um den Puffer zu löschen, andernfalls kann der mangledname NULL sein. – qc1iu

+2

Ich habe es gerade versucht, aber es scheint nicht zu funktionieren. 'mangledName' enthält den nicht gemanagten Namen. – executor21

0

libstdC++ hat eine schöne Demangling Bibliothek, umfassen nur cxxabi.h Dann können Sie Function *call = m->getFunction("_Z3addv");

zu

int status; Function *call = m->getFunction(abi::__cxa_demangle("_Z3addv"), nullptr, nullptr, &status);

Verwandte Themen