2016-02-12 12 views
6

Ho tre domande:chiamate vs Invoke in codici IR di LLVM

1) Quali sono le differenze tra le operazioni Invoke e delle chiamate in codici IR di LLVM?

2) Perché l'istruzione di chiamata non viene considerata come operazione di terminazione in BasicBlocks here?

3) È possibile che entrambe le operazioni Invoke e Call generino chiamate indirette in linguaggio a livello di assembly?

Grazie in anticipo,

risposta

7

1) R \ Invoke è una chiamata a una funzione che può lanciare un'eccezione. Se ti rendi conto, invoca definire un blocco per gestire le eccezioni e un altro per continuare il flusso normale.

2) R \ Le istruzioni di chiamata non sono considerate istruzioni di terminazione poiché il flusso di controllo viene trasmesso a un'altra funzione. In LLVM, un'istruzione di terminazione deve riflettere i blocchi di base successivi (o più di uno) che possono essere escogitati.

3) R \ Spiacente, non so

1

Per quanto riguarda 3), non è chiaro se si sta chiedendo w.r.t. scrivere a) un proprio back-end o b) riguardante un back-end esistente.

a) sì, ovviamente/in genere è possibile generare tutto ciò che si desidera se lo implementare nel proprio back-end. b) quale backend? ovvero la chiamata di ARM è una diramazione indiretta (cioè istruzione bl) mentre CALL di X86 ha effetti collaterali su X86 HW (ovvero salvataggio dell'indirizzo di ritorno, anche effetti collaterali non funzionali come il supporto per la previsione del ramo call-stack) e quindi non può solo essere sostituito da una chiamata indiretta senza emulazione che cosa CALL farebbe. L'emulazione AFAIK a CALL con rami indiretti non fa parte del backend LLVM di X86.