【问题标题】:LLVM IR printing a numberLLVM IR 打印数字
【发布时间】:2015-06-27 19:09:47
【问题描述】:

我正在尝试打印一个数字,但我收到错误消息,提示我的打印功能错误:

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)
                                       ^

还有其他的打印功能可以解决这个问题吗?

【问题讨论】:

    标签: assembly llvm bytecode


    【解决方案1】:

    LLVM IR 没有隐式转换(显式转换是单独的指令)。 您的 %d 变量的类型为 i32,来自第一条指令(奇怪的是错误消息是 '%d' defined with type 'i8',可能您的示例不是您的真实代码?)。

    至于printf函数,就是Cprintf。您应该传递完全相同的参数 - 一个格式字符串(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*, ...)
    

    【讨论】:

    • 此代码产生以下错误代码:“getelementptr 类型后的预期逗号”。具体来说,它指出在格式字符串之前需要一个逗号。有什么想法吗?
    • @ErikP。要么是我没有测试代码,要么是 LLVM IR 格式发生了变化。您可以使用 clang 和 -emit-llvm 来了解它现在的外观:godbolt.org/g/yoYBiS
    • 看来我们需要将类型添加到格式字符串的开头:%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @formatString , i32 0, i32 0), i32 %d)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2014-10-30
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多