2016-12-09 2 views
0

Ich bin gerade in der Phase des Lernens, wie man LLVM benutzt. Ich versuche die folgende Datei über llc struct-method.ll -o struct-method zu kompilieren.LLVM IR getelelementptr ungültige Indizes

struct-method.ll

; ModuleID = 'struct-method.ll' 

@.formatstring = private unnamed_addr constant [13 x i8] c"%c\0A%ld\0A%lld\0A\00" 

%box = type { i8, i32, i64 } 

declare i32 @printf(i8* noalias nocapture, ...) 

define i32 @set_prop_32(%box* %object, i32 %value) { 
entry: 
    %0 = getelementptr inbounds %box, %box* %object, i64 0, i64 1 
    %1 = load i32, i32* %0 
    ret i32 %1 
} 

define i32 @main() { 
alloca: 
    %mybox = alloca %box 
    br label %entry 

entry: 
    %format = getelementptr [13 x i8], [13 x i8]* @.formatstring, i64 0, i64 0 
    %0 = getelementptr inbounds %box, %box* %mybox, i64 0, i64 0 
    %1 = getelementptr inbounds %box, %box* %mybox, i64 0, i64 1 
    %2 = getelementptr inbounds %box, %box* %mybox, i64 0, i64 2 

    store i8 65,  i8* %0 
    store i32 200,  i32* %1 
    store i64 9999999, i64* %2 

    %f8 = load i8, i8* %0 
    %f32 = load i32, i32* %1 
    %f64 = load i64, i64* %2 

    call i32 (i8*, ...) @printf(i8* %format, i8 %f8, i32 %f32, i64 %f64) 

    call i32 (%box*, i32) @set_prop_32(%box* %mybox, i32 300) 

    call i32 (i8*, ...) @printf(i8* %format, i8 %f8, i32 %f32, i64 %f64) 

    ret i32 0 
} 

aber ich invalid getelementptr indices auf Linie bekommen 11.

Weiß jemand, warum dies sein könnte, und was würde ich schreiben, dieses Problem zu lösen?

Edit:. Ich bin auf macOS Sierra 10.12 auf einem Macbook Pro Ende 2013

Antwort

2

gemäß http://llvm.org/docs/LangRef.html#getelementptr-instruction

„Der Typ jeden Index Argumente hängt von der Art ist es die Indizierung in Wenn die Indizierung In einer (optional gepackten) Struktur sind nur i32-Integer-Konstanten zulässig (wenn sie einen Vektor von Indizes verwenden, müssen sie alle die gleiche i32-Integer-Konstante sein). Beim Indexieren in ein Array, Zeiger oder Vektor sind Ganzzahlen beliebiger Breite zulässig sie müssen nicht konstant sein. Diese ganzen Zahlen werden als vorzeichenbehaftete Werte behandelt, wo relevant "

In Ihrem Fall Typ {i8, i32, i64} ist Strukturtyp, also versuchen Sie es mit i32 Typ Indizes.

statt

%0 = getelementptr inbounds %box, %box* %object, i64 0, i64 1 

versuchen

%0 = getelementptr inbounds %box, %box* %object, i32 0, i32 1 
+0

Dank! Das hat funktioniert. Aber warum funktionierte es in den ersten 4 Anweisungen im Eingangsblock? BTW: Hier ist die fertige Version von dem, was ich versuchte zu erreichen: https://github.com/KCreate/llvm-learning/blob/252f78b4634b69389b7d82fc89aa9a4a404bd646/struct-method.ll –

+0

Zum Beispiel kompiliert diese Datei ganz gut: https://github.com/KCreate/llvm-learning/blob/dff4b4624e38553056a6875f7646fd30d318c6ae/struct.ll –

+0

Der erste Operand von gep ist nicht struct, sondern eher struct ptr, also indexiert der erste Index nicht das struct-Element, sondern struct selbst, so dass es beliebig sein darf Typ des Integer-Index als erster Index (oder wenn er auch ptr enthält), so erhält der erste Index den Wert (& box [i64 0 index]). siehe http://llvm.org/docs/GetElementPtr.html#why-is-the-extra-0-index-required für weitere Informationen –

Verwandte Themen