2012-03-03 9 views
6

Sto provando a utilizzare llvm come back-end di generazione del codice nel mio software e appena realizzato che llvm è stato compilato senza supporto per la gestione delle eccezioni C++ (per l'efficienza). Nel mio software, tuttavia, utilizzo estesamente la gestione delle eccezioni.Collegamento con codice che non supporta la gestione delle eccezioni (C++/LLVM)

Se avvolgo tutte le mie funzioni di callback nei blocchi try-catch (in modo che nessuna eccezione debba essere propagata "attraverso" il codice llvm), posso quindi rimuovere in modo sicuro "-fno-exceptions" (per GCC) dalle mie bandiere linker? (questo flag è normalmente richiesto quando si collega a llvm, come si presenta quando si fa llvm-config --cxxflags).

In caso contrario, la situazione cambia se avvolgo le funzioni llvm con le funzioni dichiarate con "throws()"? L'implementazione di queste funzioni potrebbe essere compilata con -fnove-eccezioni.

+0

Non scommetterei sulla compatibilità ABI, ma chi lo sa? Potrebbe essere più facile e sicuro compilare LLVM da soli con le eccezioni abilitate. – delnan

+0

@delnan Compilare llvm non è un'opzione. Il mio software è utilizzato da più persone su piattaforme diverse (linux, mac, windows) e devo fare affidamento sull'installazione di default di llvm che si ottiene, ad es. da apt-get. – Joel

+0

@delnan: Non so molto sulla compatibilità ABI, ma lo otterrei in questo caso se le funzioni sono dichiarate con throws()? Ho modificato la domanda di conseguenza. – Joel

risposta

3

Se mi avvolgo tutte le mie funzioni di callback in try-catch-blocchi (in modo che non si smentisce mai bisogno di essere propagate "attraverso" il codice LLVM), posso quindi rimuovere in modo sicuro i "-fno-eccezioni" (per GCC) dalle mie bandiere linker?

Sì, presupponendo che si disponga di un modo adeguato di segnalare le condizioni che hanno causato l'esclusione delle eccezioni.

-fexceptions è l'impostazione predefinita per C++. -fno-exceptions è il valore predefinito per C. Non c'è alcun problema nel mixare il codice C++ compilato con le opzioni predefinite insieme al codice C compilato con le opzioni predefinite, quindi non ci può essere un problema nel mixare -fexceptions con -fno-exceptions.

Tuttavia, è consigliabile aggiungere -fexceptions anziché rimuovere -fno-exceptions: analizzare le opzioni della riga di comando nello stesso modo in cui GCC è complicato e non è necessario tentare di farlo.

+0

OK! Questo è tutto ciò che ho bisogno di sapere. Non ho pensato al parallelo a C. Grazie! – Joel