2011-12-04 8 views
10

Durante la creazione dell'IR da un AST esistente, il mio AST ha alcuni valori di stringa (in fase di compilazione sono costruiti da std::string) e desidero impostarli in modo sicuro come llvm::Value da utilizzare come parte di un'espressione.Stringa LLVV Oggetti valore: come posso recuperare la stringa da un valore?

In questo caso, non ho bisogno di legare la stringa in fase di esecuzione, perché i valori stringa sono pensati solo per risolvere roba come variabili, funzioni o classi in fase di compilazione (il linguaggio non supporta un nativo tipo di stringa).

cosa è il modo migliore per mantenere i miei contenuti stringa come llvm::Value e ancora essere in grado di recuperarlo in fasi successive della compilazione (quando le espressioni di nidificazione sono costruite)?

Più concretamente, se ho impostato il llvm::Value con:

llvm::Value* v = llvm::ConstantArray::get(llvmContext, myString.c_str()); 

Come posso tranquillamente recuperare il valore della stringa? llvm::ConstantArray è il modo appropriato per avvolgere le stringhe?

risposta

5

Sì, ConstantArray è quello che dovresti usare qui. Per recuperare il valore in seguito, utilizzare ConstantArray :: getAsCString(). Se hai asserzioni attivate, asserirà se qualcosa è andato storto (ad esempio, proverai ad afferrare una stringa dall'array senza terminatore zero).

3

esecuzione http://llvm.org/demo/ sul codice C char *x = "asdf"; dà:

@.str = private unnamed_addr constant [5 x i8] c"asdf\00" 
@x = global i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), align 8 

In sostanza, per ottenere l'indirizzo di una stringa, è necessario costruire una società globale che lo contiene. È possibile passare a http://llvm.org/demo/ per l'emissione di chiamate API C++ se si ha difficoltà a capire come farlo.

Problemi correlati