2012-04-29 18 views
11

Quindi, nel tentativo di affinare le mie capacità di assemblaggio, ho scritto un compilatore MOLTO semplice per un linguaggio giocattolo in C++. Esegue il passaggio singolo e emette direttamente il codice durante la fase di analisi su diversi flussi di stringhe, ognuno dei quali rappresenta una sezione del codice (ad esempio uno rappresenta section .bss, mentre altri rappresentano .data e .text). Successivamente, questi stream di stringhe vengono scritti su un file, e io uso NASM e gcc per assemblarli e collegarli. So che questo approccio single-pass è orribilmente inefficiente, ma, di nuovo, questo è stato più un esercizio di comprensione della fase di generazione del codice di qualsiasi altra cosa. Ad ogni modo, vorrei modificare il mio codice per emettere direttamente LLVM IL invece di raw assembly, ancora come esercizio di apprendimento. C'è qualche guida introduttiva a LLVM IL? O, ancora meglio, uno strumento per determinare il codice IL equivalente per una linea di assemblaggio? Ho guardato, e ho trovato solo la specifica completa, che è molto più informazioni di quanto ho bisogno.Porting del compilatore da x86 Assembly a LLVM

+0

Non ci sarà una mappatura uno a uno. Non ci sono scorciatoie qui. –

+0

Mi rendo conto di questo, sto solo cercando una guida su come emettere le cose di base, come prenotare dati, cmp e salti conditonal, ecc. – chameco

+0

I documenti LLVM. ha un (almeno un) tutorial che ti guida attraverso la creazione di un compilatore per un linguaggio giocattolo. – Mat

risposta

14

Il riferimento del linguaggio IR LLVM è available here. Nota che è una pagina di riferimento dettagliata, non un tutorial. Non esiste una corrispondenza diretta 1-a-1 tra l'assembly x86 e l'IR LLVM, sebbene poiché LLVM IR sia di livello superiore e più generale dell'assembly x86, non dovrebbe essere troppo difficile adattare un compilatore dall'emettere x86 all'emissione di LLVM IR.

La documentazione ufficiale di LLVM viene fornita con uno detailed tutorial, che è assolutamente il miglior punto di partenza per voi: passa attraverso la creazione di un compilatore di giocattoli da un linguaggio di programmazione di alto livello semplicistico a LLVM IR. Lavorando su di esso imparerai molti dei concetti chiave di LLVM e potrai quindi utilizzare efficacemente il riferimento linguistico sopra menzionato.

Se si riscontrano problemi con il tutorial, si prega di segnalarlo al bug tracker LLVM o alla mailing list. Il tutorial dovrebbe essere funzionale e qualsiasi problema segnalato verrà risolto.

Un'altra buona risorsa iniziale per la comprensione di LLVM IR è il online demo page. Permette di compilare blocchi di codice C fino a LLVM IR online (senza installare nulla) e dovrebbe essere molto utile per capire come i costrutti di programmazione di base possono essere rappresentati in LLVM IR.

+2

Grazie! Non avevo mai visto quella pagina demo, è esattamente quello che stavo cercando. – chameco

+0

@chameco: la pagina demo è davvero utile, personalmente la uso spesso per verificare quale tipo di ottimizzazione Clang può eseguire (o meno). Aiuta davvero a far vedere la luce alla gente ed evitare che diventino troppo bassi nel loro codice. –

+0

Ho una versione leggermente modificata della pagina che ti permette di guardare il linguaggio assembly anche per altri target LLVM: http://ellcc.org/demo –