繁体   English   中英

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没有隐式强制转换(显式强制转换是单独的指令)。 从第一条指令i32 ,您的%d变量的类型为i32 (奇怪的是,错误消息是'%d' defined with type 'i8' ,可能您的示例不是您的真实代码?)。

至于printf函数,恰好是C printf 并且您应该传递完全相同的参数-格式字符串( i8*指向以null结尾的"%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*, ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM