2012-12-03 29 views
1

我正在使用LLVM将用户定义的语言转换为字节码,并且我不确定要如何使用模块。应该如何使用LLVM模块?

在开始时,我认为它就像C/C++对象文件(以避免编辑单个文件时每个文件的字节码重新编译)。然而,我发现这条线路变成了LLVMpy documentation,这似乎并非如此:

模块之间的引用是不可能的。即模块A无法直接调用模块B中的函数。

有人可以解释为什么模块与上下文分离如果我们不能有一个上下文的多个模块?

回答

9

这是可能的,但是就像你提到的.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!