dans ce cas, il ne s'agit pas de simplement passer le bon paramètre au compilateur ?
Dans la théorie, cela pourrait être le cas. On aurait alors (en gros) :
un frontal qui interprète le langage (eg. le C) et émet une représentation intermédiaire (IR, intermediate representation) du programme (pour gcc, c ́est du GIMPLE (in-memory, pas de on-disk), pour llvm, c ́est du bitcode (on-disk, pas de nom pour in-memory)
un ou plusieurs optimiseurs qui modifient la structure de l ́IR (et donc émettent aussi de l ́IR)
un backend qui interprète l'IR et émet du code assembleur
l ́éditeur de liens (linker) qui émet du code binaire
En fonction des flags passés au compilateur (ou en fonction de son nom), le compilateur peut alors choisir quel backend et éditeur de liens utiliser.
C ́est globalement la structure utilisée par LLVM, mais pas pour gcc. Pour gcc, le frontal, les optimiseurs et le backend sont dans le même binaire (en gros). Si tu veux rajouter un frontal ou un backend, il faut recompiler tout gcc (tsss…).
De plus, pour LLVM, les optimiseurs peuvent être des programmes ou librairies à part. Pour gcc, ce ne peut être que des librairies, et c ́est plus dur à utiliser, vu que GIMPLE est peu documenté (à ma connaissance). Pour LLVM, bitcode est très bien documenté, ce qui rend l ́écriture d ́optimiseurs plus facile.
Mais en gros, dans le monde 'gcc', vu que le backend est intégré aux frontaux, ajouter une cible ou un langage implique de recompiler tout gcc…
[^] # Re: Quelle est la difficulté de la compilation croisée ?
Posté par ymorin . En réponse au journal Chaine(s) de compilation ARM. Évalué à 9.
Dans la théorie, cela pourrait être le cas. On aurait alors (en gros) :
IR,intermediate representation) du programme (pour gcc, c ́est duGIMPLE(in-memory, pas deon-disk), pour llvm, c ́est dubitcode(on-disk, pas de nom pourin-memory)backendqui interprète l'IR et émet du code assembleurlinker) qui émet du code binaireEn fonction des flags passés au compilateur (ou en fonction de son nom), le compilateur peut alors choisir quel
backendet éditeur de liens utiliser.C ́est globalement la structure utilisée par LLVM, mais pas pour gcc. Pour gcc, le frontal, les optimiseurs et le
backendsont dans le même binaire (en gros). Si tu veux rajouter un frontal ou unbackend, il faut recompiler tout gcc (tsss…).De plus, pour LLVM, les optimiseurs peuvent être des programmes ou librairies à part. Pour gcc, ce ne peut être que des librairies, et c ́est plus dur à utiliser, vu que GIMPLE est peu documenté (à ma connaissance). Pour LLVM,
bitcodeest très bien documenté, ce qui rend l ́écriture d ́optimiseurs plus facile.Mais en gros, dans le monde 'gcc', vu que le
backendest intégré aux frontaux, ajouter une cible ou un langage implique de recompiler tout gcc…Hop,
Moi.