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
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 –
Zum Beispiel kompiliert diese Datei ganz gut: https://github.com/KCreate/llvm-learning/blob/dff4b4624e38553056a6875f7646fd30d318c6ae/struct.ll –
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 –