2013-03-19 5 views
16

trampoline intrinsicsをLLVMで使用する方法を理解しようとしています。このドキュメントでは、プラットフォームに依存してトランポリンを格納するのに必要なストレージの量について述べています。私の質問は、どのくらい必要なのか把握する方法です。LLVMトランポリンのためのスペース

私はthis exampleを見つけました。明らかに理由がないのに32バイトを選びます。どのようにして良い価値を選択するのですか?

declare void @llvm.init.trampoline(i8*, i8*, i8*); 
declare i8* @llvm.adjust.trampoline(i8*); 

define i32 @foo(i32* nest %ptr, i32 %val) 
{ 
    %x = load i32* %ptr 
    %sum = add i32 %x, %val 
    ret i32 %sum 
} 

define i32 @main(i32, i8**) 
{ 
    %closure = alloca i32 
    store i32 13, i32* %closure 
    %closure_ptr = bitcast i32* %closure to i8* 

    %tramp_buf = alloca [32 x i8], align 4 
    %tramp_ptr = getelementptr [32 x i8]* %tramp_buf, i32 0, i32 0 
    call void @llvm.init.trampoline(
      i8* %tramp_ptr, 
      i8* bitcast (i32 (i32*, i32)* @foo to i8*), 
      i8* %closure_ptr) 
    %ptr = call i8* @llvm.adjust.trampoline(i8* %tramp_ptr) 
    %fp = bitcast i8* %ptr to i32(i32)* 

    %val2 = call i32 %fp (i32 13) 

    ; %val = call i32 @foo(i32* %closure, i32 42); 

    ret i32 %val2 
} 

答えて

2

はい、トランプラインは、「オン・フライ」のコードを生成するために使用されます。 GCCのネストされた関数の拡張を実装するために(なぜなら、ネストされた関数のアドレスがキャプチャされ、関数がその関数の内部にあるものにアクセスするとき)、これらの組み込み関数がなぜ必要なのかは不明です。

トランポリンバッファの必要なサイズとアラインメントを調べる最も良い方法は、 "TRAMPOLINE_SIZE"と "TRAMPOLINE_ALIGNMENT"のgrep gccソースです。

この記事の執筆時点では、gcc/LLVMがサポートするすべてのプラットフォームで、72バイトのバッファと16バイトのアラインメントで十分です。

+2

なぜ私はそれらが必要ですか?クロージャをカスタム言語で実装するあなたがそれらなしで閉鎖をする方法のアイデアや指針を持っているなら、私は興味を持っています。 – brooks94

+0

@brooks [それについての質問](http://stackoverflow.com/questions/8706998/how-to-efficiently-implement-closures-in-llvm-ir)です。 – Anko

関連する問題