gpt4 book ai didi

assembly - LLVM IR 打印号码

转载 作者:行者123 更新时间:2023-12-02 21:59:01 35 4
gpt4 key购买 nike

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

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(奇怪的是,错误消息是使用类型 'i8' 定义的 '%d' ,也许你的例子不是你真正的代码?)。

至于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*, ...)

关于assembly - LLVM IR 打印号码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31092531/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com