1

ユーザー定義言語をバイトコードに変換するために LLVM を使用していますが、モジュールをどのように使用すればよいかわかりません。

最初は、C/C++ オブジェクト ファイルのようなものだと思っていました (単一のファイルを編集するときに、すべてのファイルのバイトコードの再コンパイルを避けるため)。ただし、LLVMpy のドキュメントに次の行を見つけましたが、そうではないようです。

モジュール間参照はできません。つまり、モジュール A はモジュール B の関数を直接呼び出すことはできません。

単一のコンテキストに対して複数のモジュールを使用できない場合、モジュールがコンテキストから分離されている理由を誰かが説明できますか?

4

1 に答える 1

11

可能ですが、あなたが言及したファイルと同様に、.o最初にそれらを単一のバイナリにリンクする必要があります。

1 組のビットコード ファイルがあるとします。

$ 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!
于 2012-12-03T05:46:54.297 に答える