pha*_*ase 2 assembly bytecode llvm
我正在尝试打印一个数字,但我收到错误,说我的打印功能错误:
define i32 @main() {
entry:
%d = shl i32 2, 3
%call = call i32 (i8*, ...)* @printf(i8* %d)
ret i32 1
}
declare i32 @printf(i8*, ...)
Run Code Online (Sandbox Code Playgroud)
这是错误:
Error in compilation: /bin/this.program: llvm.ll:4:44: error: '%d' defined with type 'i8'
%call = call i32 (i8*, ...)* @printf(i8* %d)
^
Run Code Online (Sandbox Code Playgroud)
还有其他一些打印功能可以解决这个问题吗?
小智 6
LLVM IR没有隐式转换(显式转换是单独的指令).你的%d变量有i32第一条指令的类型(错误信息是奇怪的'%d' defined with type 'i8',可能你的例子不是真正的代码吗?).
至于printf功能,它恰好是C printf.你应该传递完全相同的参数 - 格式字符串(i8*指向null终止"%d")和一个数字.
对于字符串,您应该定义全局
@formatString = private constant [2 x i8] c"%d"
Run Code Online (Sandbox Code Playgroud)
并将其作为第一个参数传递给printf:
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)
Run Code Online (Sandbox Code Playgroud)
完整代码:
@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*, ...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2376 次 |
| 最近记录: |