我正在使用LLVM将用户定义的语言转换为字节码,我不确定应该如何使用模块.
一开始,我认为它类似于C/C++目标文件(避免在编辑单个文件时重新编译每个文件的字节码).但是,我已经在LLVMpy文档中找到了这一行,这似乎说不是这样的:
模块间引用是不可能的.即模块A不能直接调用模块B中的函数.
如果我们不能为单个上下文提供多个模块,有人可以解释为什么模块与上下文分离?
小智 11
这是可能的,但是与.o
您提到的文件一样,它们必须首先链接在一起形成一个二进制文件.
给出一对bitcode文件:
$ 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
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
$ lli b.bc
LLVM ERROR: Program used external function 'f' which could not be resolved!
Run Code Online (Sandbox Code Playgroud)
但如果你将它们连接在一起,它将:
$ 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!
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
893 次 |
最近记录: |