2016-12-09 15 views
0

В настоящее время я нахожусь в процессе обучения использованию 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 г.

ответ

2

согласно http://llvm.org/docs/LangRef.html#getelementptr-instruction

«Тип каждого индекса аргумента зависит от типа его индексация в При индексации в (необязательно упакованную) структуру допускаются только целые константы i32 (при использовании вектора индексов они должны быть одинаковой константой целочисленного числа i32). При индексировании в массив, указатель или вектор допустимы целые числа любой ширины и они не обязаны быть постоянными. Эти целые числа обрабатываются как знаковые значения, если это необходимо "

в вашем случае тип {i8, i32, i64} - это тип структуры, поэтому попробуйте использовать индексы типа i32.

вместо

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

попробовать

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

Спасибо! Это сработало. Но почему он работал в первых 4 инструкциях внутри блока ввода? BTW: Вот готовая версия того, чего я пытался достичь: https://github.com/KCreate/llvm-learning/blob/252f78b4634b69389b7d82fc89aa9a4a404bd646/struct-method.ll –

+0

Например, этот файл компилируется просто отлично: https://github.com/KCreate/llvm-learning/blob/dff4b4624e38553056a6875f7646fd30d318c6ae/struct.ll –

+0

Первый операнд gep - это не struct, а скорее struct ptr, поэтому первый индекс не индексирует элемент struct, а сам struct, поэтому ему разрешено иметь любой тип целочисленного индекса в качестве первого индекса (или если он содержит ptr, то для него также), поэтому первый индекс получит вам (& box [i64 0 index]) значение. см. http://llvm.org/docs/GetElementPtr.html#why-is-the-extra-0-index-required для получения дополнительной информации –