2013-06-07 2 views
0

Я пытаюсь написать 5-элементную программу сложения векторов в LLVM и не могу понять, как вернуть весь результирующий вектор. Мой код ниже, и ошибкаПрограмма добавления векторов в LLVM

LLVM ERROR: Invalid return type of main() supplied

@veca = global [5 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5] 
@vecb = global [5 x i32] [i32 4, i32 6, i32 9, i32 2, i32 4] 

define [5 x i32]* @vector_add([5 x i32]* %vec1, [5 x i32]* %vec2) 
{ 
    entry: 
    %vecc = alloca [5 x i32] 
    br label %loop 

    loop: 
    %i = phi i32 [0, %entry], [%nexti, %loop] 
    %nexti = add i32 %i, 1 
    %ptra = getelementptr [5 x i32]* %vec1, i64 0, i32 %i 
     %loada = load i32* %ptra 
    %ptrb = getelementptr [5 x i32]* %vec2, i64 0, i32 %i 
    %loadb = load i32* %ptrb 
    %added = add i32 %loada, %loadb 
    %ptr = getelementptr [5 x i32]* %vecc, i32 0, i32 %i 
    store i32 %added, i32* %ptr 
    %eq = icmp eq i32 %i, 4 
    br i1 %eq, label %loop, label %exit 

    exit: 
    ret [5 x i32]* %vecc 
} 

define [5 x i32] @main() 
{ 
    %answer = call [5 x i32]* @vector_add([5 x i32]* @veca, [5 x i32]* @vecb) 
    %ans = load [5 x i32]* %answer 
    ret [5 x i32] %ans 
} 

ответ

1

Там нет ничего плохого в этом ИК сама по себе - это компилируется нормально с llc. Ваша проблема, вероятно, с попытками JIT или интерпретировать его, потому что LLVM ExecutionEngine ожидает main со стандартной подписью:

int main() 
+0

Я скомпилированные с LLVM-как вектор-add.ll и побежал с LLi вектор-add.bc который затем произвел ошибку. Что мне следует запускать в терминале linux, чтобы он работал правильно? – FCo

+0

Я мог бы также распечатать ответ, а не возвращать его. В этом случае я мог бы использовать: 'declare i32 @main() {.... @puts ..... return 0} '. В этом случае вы знаете, как печатать 5 целых чисел, используя @puts? – FCo

+2

@FCo: простой способ сделать такие вещи - это скомпилировать небольшие фрагменты кода C с помощью «clang» и изучить IR, который он производит –

 Смежные вопросы

  • Нет связанных вопросов^_^