2016-02-12 26 views
6

Mam trzy pytania:Call vs Invoke w kodach IR LLVM

1) Jakie są różnice między operacjami Invoke i Call w kodach IR LLVM?

2) Dlaczego instrukcja Call nie jest uważana za operację terminatora w BasicBlocks here?

3) Czy w obu operacjach Invoke i Call można generować połączenia pośrednie w języku asemblerowym?

Dziękuję z góry,

Odpowiedz

7

1) R \ Invoke jest wywołanie funkcji, która może uruchomić wyjątek. Jeśli zdajesz sobie sprawę, wywołaj zdefiniuj blok dla wyjątków uchwytów, a drugi, aby kontynuować normalny przepływ.

2) Instrukcja połączenia nie jest uważana za instrukcję terminatora, ponieważ przepływ sterowania jest przesyłany do innej funkcji. W LLVM instrukcja terminatora musi odzwierciedlać następny (lub więcej niż jeden) podstawowy blok, który można wykorzenić.

3) R \ Niestety, nie wiem

1

Odnośnie 3), to nie jest jasne, czy pytasz w.r.t. pisanie a) własnego backendu lub b) dotyczącego istniejącego backendu.

a) tak, oczywiście/ogólnie można wygenerować wszystko, co chcesz, jeśli zaimplementujesz to w swoim backend. b) który backend? tj. wywołanie ARM to już jest odgałęzieniem pośrednim (tj. instrukcja bl), podczas gdy wywołanie X86 ma efekty uboczne na X86 HW (tj. zapisywanie adresu zwrotnego, również niefunkcjonalnych efektów ubocznych, takich jak obsługa prognozowania gałęzi stosu wywołań), a zatem nie może po prostu zastąpione przez połączenie pośrednie bez emulacji, co zrobi CALL. AFAIK Emulacja CALL za pomocą pośrednich gałęzi nie jest częścią backendu LLVM X86.