2013-11-20 29 views
0

我向编译器添加了一些新的测试,它产生了以下内容,但给出了预期的%4错误。为什么LLVM需要一个新的临时寄存器标识符

; 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 
} 

而且是明智使用无名的临时..

回答

4

%3%4等既不是暂时的,也没有登记 - 不存在的两个概念在LLVM IR中 - 相反,它们是指令的名称。我建议阅读更多关于single static assignment的表格,了解它的工作原理。

在LLVM IR的文字表示,没有任何名称非空指令被分配数字的名称,如%3%4,以及是否在代码中或明或暗地分配,这些数字必须是连续的。指令call i32 @__LS19ConsoleApplication37Program_mt_4Main()是一个非空的指令,因此它被隐式分配一个数字 - %3 - 因此下一个未命名的指令load i32* %0, align 4应该给出%4而不是%3

如果你写LLVM IR的手,有麻烦指令命名则可以考虑使用my LLVM IR editor plugin for Eclipse,这将标志着你这样的错误,并会提供与正确的人来取代任何错误的号码:

screenshot from the editor showing syntax error on bad name

(注意无名add i32 %1, 1是如何隐含地分配%2

+0

感谢橡树是正确的写了这样的呼吁为%3 =呼叫123-132 @ __LS19ConsoleApplication37Program_mt_4Main() – user1496062

+0

@ user1496062是的,这是正确的。 – Oak

相关问题