declare i32 @vprintf(i8*, i8*)
declare i32 @printf(i8*, ...)
declare void @llvm.va_start(i8*)
declare void @llvm.va_end(i8*)
@.str_3 = private unnamed_addr constant [2 x i8] c"\0A\00"
@.str_5 = private unnamed_addr constant [13 x i8] c"number is %i\00"
define void @println(i8* %a, ...) {
entry:
%zk.ellipsis = alloca i8*
call void @llvm.va_start(i8* %zk.ellipsis)
%t1 = call i32 @vprintf(i8* %a, i8* %zk.ellipsis)
%t2 = call i32 @printf(i8* @.str_3)
call void @llvm.va_end(i8* %zk.ellipsis)
ret void
}
define void @main() {
entry:
call void @println(i8* @.str_5, i32 5)
ret void
}
运行此程序时,我得到输出:
number is 5
Segmentation fault (core dumped)
我想要输出的内容得到了输出,但最后出现了分段错误。我该如何解决这个问题?这是我为我正在制作的编译器所做的,所以这就是为什么有些指令可能是多余的并且可以减少,但是是的。
这里的段错误是由于可变参数指针的错误使用造成的。在
println
函数中,您将 zk.ellipsis
分配为 i8*
,它保存指向可变参数列表的指针。但是,它们需要一个指向实际参数的 i8*
,而不是指向指针的指针。
define void @println(i8* %a, ...) {
entry:
%zk.ellipsis = alloca i8 # Change i8* to i8 here
...
}