這是我的程序全部;我使用的是一個愚蠢的遞歸算法與LLVM組件,以自己熟悉:什麼是在LLVM組件中進行遞歸的正確方法?
declare void @print_int(i32)
define i32 @rec_add(i32 %a, i32 %b) {
entry:
%tmp1 = icmp eq i32 %a, 0
br i1 %tmp1, label %done, label %recurse
recurse:
%tmp2 = sub i32 %a, 1
%tmp3 = add i32 %b, 1
ret i32 @rec_add(i32 %tmp2, i32 %tmp3)
done:
ret i32 %b
}
define i32 @main() {
%tmp4 = i32 4;
%tmp5 = i32 1;
%cast = call i32 @rec_add(i32 %tmp4, i32 %tmp5)
call void @print_int(i32 %cast)
}
當我編譯這個程序與$ llvm-as rec_add.ll
,我收到此錯誤信息:
llvm-as: rec_add.ll:10:11: error: global variable reference must have pointer type
ret i32 @rec_add(i32 %tmp2, i32 %tmp3)
^
我不明白這是什麼錯誤消息意味着,因爲我的程序沒有全局變量。而且我知道LLVM彙編不需要指針作爲參數。
我不知道LLVM彙編,但你確定你不需要在那裏'調用',可能作爲另一種說法?否則,它看起來像你試圖返回的功能,除了間接通過指針,你不能這樣做。 –
@RossRidge:IDK LLVM asm,但這似乎沒有工作沒有臨時代碼gen沒有不良影響。很好地捕捉到缺少的「呼叫」。我同意OP的語法可能試圖返回一個函數指針。 –