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
}
なぜ私はそれらが必要ですか?クロージャをカスタム言語で実装するあなたがそれらなしで閉鎖をする方法のアイデアや指針を持っているなら、私は興味を持っています。 – brooks94
@brooks [それについての質問](http://stackoverflow.com/questions/8706998/how-to-efficiently-implement-closures-in-llvm-ir)です。 – Anko