В настоящее время я нахожусь в процессе обучения использованию LLVM. Я пытаюсь скомпилировать следующий файл через llc struct-method.ll -o struct-method
.LLVM IR getelementptr недопустимые индексы
-структуры 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
}
Однако я получаю invalid getelementptr indices
на линии 11.
знает кто-то, почему это может быть и то, что я хотел бы написать, чтобы решить эту проблему?
Edit:. Я на MacOS Sierra 10.12 на Macbook Pro конце 2013 г.
Спасибо! Это сработало. Но почему он работал в первых 4 инструкциях внутри блока ввода? BTW: Вот готовая версия того, чего я пытался достичь: https://github.com/KCreate/llvm-learning/blob/252f78b4634b69389b7d82fc89aa9a4a404bd646/struct-method.ll –
Например, этот файл компилируется просто отлично: https://github.com/KCreate/llvm-learning/blob/dff4b4624e38553056a6875f7646fd30d318c6ae/struct.ll –
Первый операнд gep - это не struct, а скорее struct ptr, поэтому первый индекс не индексирует элемент struct, а сам struct, поэтому ему разрешено иметь любой тип целочисленного индекса в качестве первого индекса (или если он содержит ptr, то для него также), поэтому первый индекс получит вам (& box [i64 0 index]) значение. см. http://llvm.org/docs/GetElementPtr.html#why-is-the-extra-0-index-required для получения дополнительной информации –