0

我在使用printf()LLVM IR 中的函数时遇到问题。我只想打印一个浮点数的值,但我只是得到0.000000. 它适用于整数和字符串,但不适用于浮点数。

简单的例子:

@.fstr = private unnamed_addr constant [4 x i8] c"%f\0A\00"

declare i32 @printf(i8*, ...)

define i32 @main() {
    %1 = getelementptr [4 x i8],[4 x i8]* @.fstr, i64 0, i64 0
    %2 = call i32 @printf(i8* %1, double 2.0)
    %3 = call i32 @printf(i8* %1, float 2.0)
    ret i32 0
}

当我用 LLVM 编译它并将它与 Clang 链接并运行可执行文件时,我得到:

0.000000
0.000000

如果我使用 .bc 文件运行相同的结果lli。我已经阅读了这篇相关的帖子,但正如你所见,它也不适用于双打。

4

1 回答 1

1

在使用运行您的示例时,lli-10我得到一个 @printf' defined with type 'i32 (i8*, ...)*' but expected 'i32 (i8*, double)*'错误,而不是打印 0.000000 的成功调用。

这个错误是意料之中的,原因在这里解释。帖子中的相关位是

...如果调用前面的类型是函数指针类型,则将其用作被调用事物的类型,如果不是,则将其用作返回类型,以及调用的类型是从指令中存在的参数推断出来的。

这就是为什么 LLVMprintf在第一次调用中推断出的类型为 asi32 (i8*, double)*但后来发现它被声明为i32 (i8*, ...)*. 要解决此问题,只需正确注释调用,

%2 = call i32 (i8*, ...) @printf(i8* %1, double 2.0)
%3 = call i32 (i8*, ...) @printf(i8* %1, float 2.0)

您很快就会注意到第二次printf调用仍然打印 0.000000。看看为什么

于 2021-10-20T11:07:38.613 回答