2013-03-19 58 views
16

我想弄清楚如何在LLVM中使用trampoline intrinsics。文档提到了存储蹦床所需的一定数量的存储空间,这与平台有关。我的问题是,我怎么知道需要多少?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的嵌套函数扩展(特别是当嵌套函数的地址被捕获并且函数访问函数内部的东西时)。

找出蹦床缓冲区的必要大小和对齐方式的最佳方法是grep gpu源代码为“TRAMPOLINE_SIZE”和“TRAMPOLINE_ALIGNMENT”。

据我所知,在写这篇文章时,72字节的缓冲区和16字节的对齐对于gcc/LLVM支持的所有平台都足够了。

+2

为什么我需要它们?以自定义语言实现闭包。如果你对如何在没有它们的情况下进行关闭有任何想法或指示,我会很感兴趣。 – brooks94 2013-05-17 21:40:49

+0

@brooks有[关于这个问题](http://stackoverflow.com/questions/8706998/how-to-efficiently-implement-closures-in-llvm-ir)。 – Anko 2014-05-23 21:29:12