LLVM IR中的“declare”是如何工作的

LLVM IR中的“declare”是如何工作的,llvm,Llvm,比如说 @.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00" declare i32 @puts(i8* nocapture) nounwind define i32 @main() { %cast210 = getelementptr [13 x i8], [13 x i8]* @.str, i64 0, i64 0 call i32 @puts(i8* %cast210)

比如说

@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"

declare i32 @puts(i8* nocapture) nounwind

define i32 @main() {
  %cast210 = getelementptr [13 x i8], [13 x i8]* @.str, i64 0, i64 0

  call i32 @puts(i8* %cast210)
  ret i32 0
}

我不明白函数puts是从哪里来的。在stdio.h中它似乎是一个C函数,但这与LLVM有什么关系?它的实现在哪里?

用C/C++术语来说,每个翻译单元都可以引用外部符号。对于编译器来说,只要您对符号有声明,它实际上定义在哪里并不重要

编译.c文件后,您会得到一些需要链接到对象文件.o或LLVM IR.ll/.bc的内容。在链接阶段,所有符号定义都以不同的方式解析

在您的示例中,puts函数通常位于系统libc中,默认情况下会自动链接该系统。除非您以某种方式将整个libc编译成LLVM-IR,否则无法找到此函数的LLVM-IR代码


阅读有关编译和链接主题的一般教程。

用C/C++术语来说,每个翻译单元都可以引用外部符号。对于编译器来说,只要您对符号有声明,它实际上定义在哪里并不重要

编译.c文件后,您会得到一些需要链接到对象文件.o或LLVM IR.ll/.bc的内容。在链接阶段,所有符号定义都以不同的方式解析

在您的示例中,puts函数通常位于系统libc中,默认情况下会自动链接该系统。除非您以某种方式将整个libc编译成LLVM-IR,否则无法找到此函数的LLVM-IR代码

阅读有关编译和链接主题的一般教程