2016-03-24 7 views
0

Ich schreibe etwas llvm (3.7) pass, und ich brauche einige Informationen über Constant-Klassen. In der llvm-IR, die ich analysiere, gibt es "ConstantStruct" - oder "ConstantArray" -Instanzen, die als Initialisierer für globale Variablen verwendet werden. Zum Beispiel:ConstantStruct oder ConstantArray lesen Speicherinhalt

%struct.S = type { i32, i32, i32, i32 } 

@s = global [2 x %struct.S] [%struct.S { i32 6, i32 8, i32 -8, i32 -5 }, %struct.S { i32 0, i32 2, i32 -1, i32 2 }], align 4 

Meine Arbeit wäre viel einfacher, wenn ich die Erinnerung an thoses Konstanten lesen konnte, ohne rekursiv mit allen Elementen durchlaufen (die auch ConstantStructs oder Arrays sein können).

Zum Beispiel würde ich brauche eine Funktion als

llvm::ConstantStruct* initializer = globalVar->getInitializer(); 
void* memoryContent; 
int sizeInBytes = initializer->getMemoryContent(&memoryContent); 

Bisher hat ich Elemente eines nach dem anderem zu lesen, der ein schmerzhafter (und Fehlern anfällig) Prozess.

Jeder Hinweis wird geschätzt.

+1

Jeder Kommentar für den Downvote würde geschätzt werden ... Ich halte das nicht für eine triviale Frage ... –

Antwort

0

Ich habe gerade verstanden, dass es wegen möglicher ConstExpr in den Initialisierungsoperanden nicht möglich ist.

Allerdings habe ich es geschafft, eine nette rekursive Implementierungen mit einem großen Schalter auf valueId zu bekommen.