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
'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 –