2016-04-26 8 views
0

Beim Lernen des LLVM-Framework, ich versuche, eine "Optimierung" zu implementieren, die den Namen jeder Methode zur Laufzeit beim Aufruf der Methode druckt.LLVM: Zugriff auf globale Variable von Funktion Pass

ich gelesen, dass globale Variablen nur in einem Modul Pass erstellt werden sollen, und ich erstellen, um die dort Strings (eine pro-Funktion), mit

Constant* data = ConstantDataArray::getString(M.getContext(), F.getName()); 

GlobalVariable* gvar = 
    new GlobalVariable(M, 
        data->getType(), 
        true, 
        GlobalValue::ExternalLinkage, 
        data, 
        "fname_" + F.getName().str()); 

Dies funktioniert gut, sofern die Saiten gelegt richtig im Speicher in der Assemblydatei, die durch den 'optimierten' Bitcode erzeugt wird.

Ich habe jedoch keine Möglichkeit gefunden, Aufrufe einzufügen, um diese Zeichenfolgen im Funktionspass zu drucken. Ich möchte

Value* string = F.getValueSymbolTable().lookup("fname_" + F.getName().str()); 
CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI)); 

aber string kommt zurück als NULL verwenden. Gibt es eine bessere Möglichkeit, globale Variablen aus einer Funktion nachzuschlagen?

Antwort

0

es herausgefunden:

Grundbausteine ​​haben eine getModule() Verfahren und Module haben eine getGlobalVariable(StringRef Name) Methode.

Alternativ kann IRBuilder:CreateGlobalStringPtr(...) von der Funktion übergeben werden, und die Value* zurückgegeben kann direkt an emitPutS(...) übergeben werden. Der Modulpass war nicht notwendig.

Hinweis, CallInst* call = builder.CreateCall(emitPutS(string, builder, &TLI)); ist falsch. emitPutS(...) erstellt den Anruf bereits im Basisblock. Die CreateCall ist fehlerhaft.