我正在编写使用LLVM作为后端的a compiler,我的编译器生成以下LLVM汇编代码
@0 = private constant [25 x i8] c"Hello World to %dntegers\00"
declare void @printf (i8*, i32)
define void @main () {
%1 = getelementptr [25 x i8]* @0, i32 0, i32 0
%2 = 1
tail call void @printf(i8* %1, i32 %2)
ret void
}
但是我收到以下错误:
c.ll:8:8: error: expected instruction opcode
%2 = 1
^
文档显示examples like that。
你知道如何让它发挥作用吗?目前,我正在使用:
%2 = add i32 0, 1 ; FIXME
答案 0 :(得分:14)
参见LLVMdev讨论"How to assign a constant to a register?"正如Duncan Sands所指出的那样:
让我说,一般来说这样做毫无意义。由于SSA格式,如果%x设置为5,则以后无法将其设置为其他内容。因此,无论你在哪个地方使用%x,你都可以直接在那里使用5。一个常见的情况是你有一个寄存器%x,并且由于执行了优化,你发现实际上%x总是具有值5.你可以使用RAUW(也就是replaceAllUsesWith方法)将%x替换为5处。< / p>
该线程确实生成了几个直接使用常量的替代方法:
alloca
获取指针,存储指针,然后根据需要加载值。有人指出alloca
方法最终会在优化后使用寄存器。
无论如何,直接使用@ SK-logic建议的常量似乎是最干净的解决方案。
答案 1 :(得分:0)
%1是unnamed。请改用%name_here。