在 LLVM IR 中使用 printf

Using printf in LLVM IR

因此,我一直在使用 Rust 为简单的 lisp 编写编译器,并使用 Inkwell crate 生成 LLVM IR。在尝试找到一种将值打印到标准输出的方法时,我遇到了很多使用 print 函数的答案,就像在 C/C++ 中一样。它似乎在大多数情况下都可以正常工作。

但是,只有函数声明出现在生成的 IR 中,所以这可能意味着定义正在由 llvm 本身在某处链接(目前使用 lli 解释器,因为它更容易测试)。不管怎样,我只是想了解这个函数是在哪里定义的。就像 llvm 中定义的核心模块一样?或者是使用依赖于类 Unix 平台的 printf 而不是 llvm 的东西,因为大多数 llvm 函数似乎有“llvm”前缀?

printf在C标准库(libc)中定义。

因此,当您将 llvm IR 编译为目标文件然后 link 它们时,您必须 link 反对 libc 才能使用 printf(请注意link LLVM 使用诸如 gcc 或 clang 之类的 C 编译器生成的目标文件是很常见的,它将 link 自动针对 libc。

使用 lli 时,我相信您可以访问 lli 本身 link 反对的任何库,其中包括一个 libc。