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
risposta
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.
Grazie! Non avevo mai visto quella pagina demo, è esattamente quello che stavo cercando. – chameco
@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. –
Ho una versione leggermente modificata della pagina che ti permette di guardare il linguaggio assembly anche per altri target LLVM: http://ellcc.org/demo –
- 1. Assembly x86 - "lasciare" Instruction
- 2. Chiamare funzioni C da linguaggio assembly x86
- 3. assembly x86 equ =
- 4. idiomi di assembly x86
- 5. Infrastruttura del compilatore LLVM per architetture VLIW
- 6. x86 Assembly Force Cache Store
- 7. Dereferenziare un'etichetta in assembly x86
- 8. Fibonacci Series in Assembly x86
- 9. Errore LLVM 3.1 Apple compilatore
- 10. Compilatore Apple LLVM 4.1 Errore
- 11. programma x86 in esecuzione _on_ llvm
- 12. assembly x86 - Quale dimensione variabile da usare (db, dw, dd)
- 13. Lingua di output del compilatore - LLVM IR vs C
- 14. Conversione da GCC IR a LLVM IR
- 15. Force x86 CLR su un assembly .NET "Any CPU"
- 16. Bug di ottimizzazione del compilatore LLVM o cosa?
- 17. frontend al compilatore basato su LLVM
- 18. Aggiungendo due stringhe in assembly x86
- 19. Porting app da LWUIT a CodenameOne
- 20. Porting a Windows Phone 7 da iPhone
- 21. Convert to ARC - LLVM compilatore 3.0 Errore
- 22. generazione binaria da LLVM
- 23. Porting di codice Delphi a 64 bit - Perché nessun avvertimento del compilatore?
- 24. Lingua per compilatore basato su LLVM
- 25. dynamic_cast sul compilatore clang llvm in errore
- 26. Conversione da app .NET a codice nativo x86
- 27. Porting clock_gettime a windows
- 28. Perché il compilatore MOV + PUSH del VC++ argomenta invece di limitarsi a PUSH? x86
- 29. Chiama il codice Python da LLVM JIT
- 30. Ciao Mondo in LLVM-Assembly Language su Windows
Non ci sarà una mappatura uno a uno. Non ci sono scorciatoie qui. –
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
I documenti LLVM. ha un (almeno un) tutorial che ti guida attraverso la creazione di un compilatore per un linguaggio giocattolo. – Mat