如何使用LLVM模块?

如何使用LLVM模块?,llvm,Llvm,我正在使用LLVM将用户定义的语言转换为字节码,我不确定如何使用模块 一开始,我认为它类似于C/C++对象文件(以避免在编辑单个文件时重新编译每个文件的字节码)。然而,我发现这句话似乎在说,事实并非如此: 模块间引用不可能。也就是说,模块A不能直接调用模块B中的函数 如果一个上下文不能有多个模块,有人能解释一下为什么模块与上下文分开吗?这是可能的,但就像您提到的.o文件一样,它们必须首先链接到一个二进制文件中 给定一对位代码文件: $ llvm-dis a.bc -o - ; ModuleID

我正在使用LLVM将用户定义的语言转换为字节码,我不确定如何使用模块

一开始,我认为它类似于C/C++对象文件(以避免在编辑单个文件时重新编译每个文件的字节码)。然而,我发现这句话似乎在说,事实并非如此:

模块间引用不可能。也就是说,模块A不能直接调用模块B中的函数


如果一个上下文不能有多个模块,有人能解释一下为什么模块与上下文分开吗?

这是可能的,但就像您提到的
.o
文件一样,它们必须首先链接到一个二进制文件中

给定一对位代码文件:

$ llvm-dis a.bc -o -
; ModuleID = 'a.bc'

@0 = global [13 x i8] c"Hello world!\0A"

declare i32 @printf(i8*)                                                                                               

define void @f() {                                                                                                                                                                              
  %1 = call i32 @printf(i8* getelementptr inbounds ([13 x i8]* @0, i64 0, i64 0))                                                                                                               
  ret void
}

$ llvm-dis b.bc -o -
; ModuleID = 'b.bc'

declare void @f()

define i32 @main() {
  call void @f()
  ret i32 0
}
这行不通:

$ lli b.bc
LLVM ERROR: Program used external function 'f' which could not be resolved!
但如果将它们连接在一起,它将:

$ llvm-ld a.bc b.bc -disable-opt -o c

$ llvm-dis c.bc -o -
; ModuleID = 'c.bc'

@0 = global [13 x i8] c"Hello world!\0A"

declare i32 @printf(i8*)

define void @f() {
  %1 = call i32 @printf(i8* getelementptr inbounds ([13 x i8]* @0, i64 0, i64 0))
  ret void
}

define i32 @main() {
  call void @f()
  ret i32 0
}

$ lli c.bc 
Hello world!

这是可能的,但就像您提到的
.o
文件一样,它们必须首先链接到一个二进制文件中

给定一对位代码文件:

$ llvm-dis a.bc -o -
; ModuleID = 'a.bc'

@0 = global [13 x i8] c"Hello world!\0A"

declare i32 @printf(i8*)                                                                                               

define void @f() {                                                                                                                                                                              
  %1 = call i32 @printf(i8* getelementptr inbounds ([13 x i8]* @0, i64 0, i64 0))                                                                                                               
  ret void
}

$ llvm-dis b.bc -o -
; ModuleID = 'b.bc'

declare void @f()

define i32 @main() {
  call void @f()
  ret i32 0
}
这行不通:

$ lli b.bc
LLVM ERROR: Program used external function 'f' which could not be resolved!
但如果将它们连接在一起,它将:

$ llvm-ld a.bc b.bc -disable-opt -o c

$ llvm-dis c.bc -o -
; ModuleID = 'c.bc'

@0 = global [13 x i8] c"Hello world!\0A"

declare i32 @printf(i8*)

define void @f() {
  %1 = call i32 @printf(i8* getelementptr inbounds ([13 x i8]* @0, i64 0, i64 0))
  ret void
}

define i32 @main() {
  call void @f()
  ret i32 0
}

$ lli c.bc 
Hello world!