2014-12-21 8 views
5

Dov'è il codice nel codice sorgente GCC che effettivamente costruisce l'assieme per le diverse architetture?Dove nel codice sorgente GCC viene compilato per le diverse lingue di assemblaggio?

Chiedendosi quanti diversi linguaggi di assemblaggio vengono compilati e come lo fa effettivamente (dando un'occhiata al codice sorgente).

È nel repository gcc da qualche parte o in un altro repository? Ho iniziato a scavare ma non ho trovato nulla.

https://github.com/gcc-mirror/gcc

Per esempio, qui è parte del codice di generazione di assemblaggio in V8:

https://github.com/v8/v8-git-mirror/tree/master/src/x64

C'è qualcosa equivalente per GCC?

Mi chiedo perché è un mistero come GCC fa questo, e sarebbe un ottimo modo per imparare come i compilatori sono effettivamente implementati fino al livello di assemblaggio.

+0

'gcc' è molto potente, ma allo stesso tempo è estremamente complesso e ostile. Consiglierei di avvicinarmi all'apprendimento di quest'area dal lato LLVM. È bello, pulito e compatto, con ogni passaggio ben isolato, quindi è molto più facile da comprendere. Suggerisco di iniziare leggendo questo: http://eli.thegreenplace.net/2012/11/24/life-of-an-instruction-in-llvm –

risposta

11

I file .md (descrizione macchina) della sorgente GCC contengono elementi per generare l'assemblaggio. GCC contiene diversi generatori di codice C/C++ specializzati (e alcuni di essi convertono i file .md in un gruppo di emissione di codice).

GCC è un programma molto complesso. Il documentation of GCC MELT contiene diversi link interessanti e diapositive, in particolare riferendosi alla indiano GCC Resource Center

La maggior parte delle ottimizzazioni di GCC accade nel mezzo-end (che è per lo più indipendente dalla lingua di origine o sistema di destinazione), in particolare con molti passi a lavorare su le rappresentazioni di Gimple.

Il repository GCC è un SVN repository.

Vedere anche this answer, in particolare le immagini al suo interno.

4

Il codice sorgente per GCC è più accessibile da qui:

https://gcc.gnu.org/svn.html

Il software è accessibile tramite SVN (subversion), un sistema di controllo del codice sorgente. Questo sarebbe essere installato su molte versioni di Linux/UNIX, ma se non sulla vostra piattaforma, è possibile installare il kit svn e poi prendere la fonte utilizzando il seguente comando:

svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir 

GCC è complessa e che avrebbe preso una significativa esperienza capire la natura di come l'applicazione compila effettivamente a diverse architetture.

In breve, GCC ha tre componenti principali: elaborazione front-end, middle e back-end. Il processore front-end ha il componente dell'analisi del linguaggio per comprendere la sintassi dei linguaggi (come C, C++, Objective-C, ecc.). Il front-end decostruisce il codice in un costrutto portatile che viene poi passato al back-end per la compilazione nell'ambiente di destinazione.

La parte centrale esegue l'analisi e l'ottimizzazione del codice, tentando di dare la priorità al codice per generare il miglior risultato possibile alla fine dell'intero processo. Tecnicamente, l'ottimizzazione può verificarsi in qualsiasi parte del processo mentre i modelli vengono scoperti durante l'analisi.

Il processore di back-end compila il codice in un formato di output in stile albero (non in realtà un codice eseguibile finale). Basato su ciò che l'output previsto è progettato per essere, lo "pseudo-codice" è ottimizzato per l'uso di registri, dimensioni di bit, endianità e così via. Il codice finale viene quindi generato durante la fase di assemblaggio, che converte il codice di back-end in istruzioni eseguibili della macchina.

È importante notare che il compilatore ha molte opzioni per gestire i formati di output in modo da poter creare output in molte classi di architettura, solitamente fuori dalla scatola. Per le opzioni di cross-compiling e compilatore di destinazione, provare a controllare questo link:

https://gcc.gnu.org/install/configure.html

+3

Hai dimenticato la parte centrale di GCC, che è più grande del front-end e del back-end combinato! –

+1

Ci sono molte posizioni in cui è possibile vedere l'intero processo: la pagina [Wiki] (http://en.wikipedia.org/wiki/GNU_Compiler_Collection) è un buon inizio. La parte centrale non ha affrontato direttamente la domanda, ma l'ho aggiunta alla risposta a prescindere. – rebelyell

Problemi correlati