Сколько места для батута LLVM - программирование
Подтвердить что ты не робот

Сколько места для батута LLVM

Я пытаюсь выяснить, как использовать trampoline intrinsics в LLVM. В документации упоминается некоторый объем хранилища, необходимый для хранения батута, который зависит от платформы. Мой вопрос в том, как мне понять, сколько нужно?

Я нашел этот пример, который выбирает 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
}
4b9b3361

Ответ 1

Да, батуты используются для генерации некоторого кода "на лету". Непонятно, зачем вам нужны эти внутренние функции, потому что они используются для реализации расширения вложенных функций GCC (в частности, когда адрес вложенной функции захватывается и функция получает доступ к материалу внутри встроенной функции).

Лучший способ определить необходимый размер и выравнивание буфера батута - это grep gcc-источники для "TRAMPOLINE_SIZE" и "TRAMPOLINE_ALIGNMENT".

Насколько я могу судить, на момент написания этого документа буфер для 72 байт и выравнивание 16 байтов будет достаточным для всех поддерживаемых gcc/LLVM платформ.