2013-03-19 19 views
16

Próbuję dowiedzieć się, jak korzystać z w LLVM. Dokumentacja wspomina o pewnej ilości pamięci, która jest potrzebna do przechowywania trampoliny, która jest zależna od platformy. Moje pytanie brzmi: jak mogę się dowiedzieć, ile jest potrzebne?Ile miejsca na trampolinę LLVM

Znalazłem this example, który wybiera 32 bajty dla najwyraźniej żadnego powodu. Jak wybrać dobrą wartość?

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 
} 

Odpowiedz

2

Tak, trampoliny są używane do generowania kodu "w locie". Nie jest jasne, dlaczego w ogóle potrzebujesz tych właściwości, ponieważ są one używane do implementacji rozszerzenia zagnieżdżonych funkcji GCC (w szczególności, gdy adres zagnieżdżonej funkcji jest przechwytywany, a funkcja uzyskuje dostęp do funkcji wewnątrz funkcji otaczającej).

Najlepszym sposobem na określenie wymaganego rozmiaru i wyrównania bufora trampolinowego jest wyszukanie źródeł gcc dla "TRAMPOLINE_SIZE" i "TRAMPOLINE_ALIGNMENT".

O ile widzę, w chwili pisania tego artykułu bufor o długości 72 bajtów i wyrównanie 16 bajtów będzie wystarczający dla wszystkich platform obsługujących gcc/LLVM.

+2

Dlaczego ich potrzebuję? Aby zaimplementować zamknięcia w niestandardowym języku. Jeśli masz jakieś pomysły lub wskazówki, jak robić zamknięte bez nich, byłbym zainteresowany. – brooks94

+0

@brooks Istnieje [pytanie na ten temat] (http://stackoverflow.com/questions/8706998/how-to-efficiently-implement-closures-in-llvm-ir). – Anko