LLVM蹦床有多少空间

bro*_*s94 16 llvm

我试图弄清楚如何在LLVM中使用trampoline内在函数.文档提到了存储蹦床所需的一些存储空间,这取决于平台.我的问题是,我如何计算出需要多少钱?

我发现这个例子,显然没有理由选择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
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*kov 1

是的,蹦床用于“动态”生成一些代码。目前还不清楚为什么需要这些内在函数,因为它们用于实现 GCC 的嵌套函数扩展(特别是,当捕获嵌套函数的地址并且该函数访问封闭函数内的内容时)。

确定蹦床缓冲区的必要大小和对齐方式的最佳方法是 grep gcc 源中的“TRAMPOLINE_SIZE”和“TRAMPOLINE_ALIGNMENT”。

据我所知,在撰写本文时,72 字节的缓冲区和 16 字节的对齐足以满足 gcc / LLVM 支持的所有平台。

  • 为什么我需要它们?用自定义语言实现闭包。如果您对如何在没有它们的情况下进行闭包有任何想法或指示,我会很感兴趣。 (2认同)