LLVM IR打印一个数字
LLVM IR printing a number
我正在尝试打印一个数字,但出现错误提示我的打印功能有误:
define i32 @main() {
entry:
%d = shl i32 2, 3
%call = call i32 (i8*, ...)* @printf(i8* %d)
ret i32 1
}
declare i32 @printf(i8*, ...)
这是错误:
Error in compilation: /bin/this.program: llvm.ll:4:44: error: '%d' defined with type 'i8'
%call = call i32 (i8*, ...)* @printf(i8* %d)
^
是否有其他一些打印功能可以解决这个问题?
LLVM IR 没有隐式转换(显式转换是单独的指令)。
从第一条指令开始,您的 %d
变量的类型为 i32
(奇怪的是,错误消息是 '%d' defined with type 'i8'
,可能您的示例不是您的真实代码?)。
至于printf
函数,就是Cprintf。并且您应该传递完全相同的参数 - 一个格式字符串(i8*
指向空终止 "%d"
)和一个数字。
对于字符串,你应该定义全局
@formatString = private constant [2 x i8] c"%d"
并将其作为第一个参数传递给 printf
:
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)
完整代码:
@formatString = private constant [2 x i8] c"%d"
define i32 @main() {
entry:
%d = shl i32 2, 3
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)
ret i32 1
}
declare i32 @printf(i8*, ...)
我正在尝试打印一个数字,但出现错误提示我的打印功能有误:
define i32 @main() {
entry:
%d = shl i32 2, 3
%call = call i32 (i8*, ...)* @printf(i8* %d)
ret i32 1
}
declare i32 @printf(i8*, ...)
这是错误:
Error in compilation: /bin/this.program: llvm.ll:4:44: error: '%d' defined with type 'i8'
%call = call i32 (i8*, ...)* @printf(i8* %d)
^
是否有其他一些打印功能可以解决这个问题?
LLVM IR 没有隐式转换(显式转换是单独的指令)。
从第一条指令开始,您的 %d
变量的类型为 i32
(奇怪的是,错误消息是 '%d' defined with type 'i8'
,可能您的示例不是您的真实代码?)。
至于printf
函数,就是Cprintf。并且您应该传递完全相同的参数 - 一个格式字符串(i8*
指向空终止 "%d"
)和一个数字。
对于字符串,你应该定义全局
@formatString = private constant [2 x i8] c"%d"
并将其作为第一个参数传递给 printf
:
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)
完整代码:
@formatString = private constant [2 x i8] c"%d"
define i32 @main() {
entry:
%d = shl i32 2, 3
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)
ret i32 1
}
declare i32 @printf(i8*, ...)