我向编译器添加了一些新的测试,这些测试生成了以下内容但是给出了预期的%4错误。
; Entry Point
define i32 @main(i32 %argc, i8** %argv) {
entry:
%argc_addr = alloca i32
%argv_addr = alloca i8**
%retval = alloca i32
%0 = alloca i32
store i32 %argc, i32* %argc_addr
store i8** %argv, i8*** %argv_addr
%1 = load i32* %argc_addr
%2 = load i8*** %argv_addr
call void @__llvmsharp_init(i32 %1, i8** %2)
call i32 @__LS19ConsoleApplication37Program_mt_4Main()
store i32 0, i32* %0, align 4
%3 = load i32* %0, align 4
//错误预期%4
store i32 %3, i32* %retval
br label %return
return:
%retval1 = load i32* %retval
ret i32 %retval1
}
使用未命名的临时工也是明智的。
答案 0 :(得分:4)
%3
,%4
等既不是临时的也不是寄存器 - LLVM IR中不存在的两个概念 - 相反,它们是指令的名称。我建议您阅读有关single static assignment表单的更多信息,以了解其工作原理。
在LLVM IR的文本表示中,没有任何名称的非void指令被分配了数字名称,例如%3
,%4
,以及是否在代码中隐式或显式分配,这些数字必须是连续的。指令call i32 @__LS19ConsoleApplication37Program_mt_4Main()
是非空的,因此隐式分配了一个数字 - %3
- 所以下一个未命名的指令load i32* %0, align 4
应该被赋予%4
,而不是%3
。
如果您手动编写LLVM IR并且在指令命名方面遇到问题,可以考虑使用my LLVM IR editor plugin for Eclipse,它会为您标记此类错误,并提供用正确的错误替换任何错误的数字:
(注意未命名的add i32 %1, 1
是如何隐式分配的%2
)