Comstackr un fichier object à partir d’un fichier intermédiaire de gcc

En utilisant l’ option -fdump-tree- * , il est possible de vider un fichier de format intermédiaire pendant la compilation d’un fichier de code source. Ma question est de savoir si l’on peut utiliser ce fichier intermédiaire comme entrée de gcc pour obtenir le fichier d’object final.

Je pose la question parce que je veux append du code au fichier intermédiaire du format gimple (obtenu en utilisant le drapeau -fdump-tree-gimple ). Bien sûr, je peux utiliser des hooks et append mon propre laissez-passer, mais je ne veux pas encore atteindre ce niveau de complexité. Je veux juste donner à gcc mon fichier intermédiaire modifié, afin qu’il puisse démarrer sa compilation à partir de là et me donner le fichier object final. Des idées comment y parvenir?

GIMPLE était un format interne binary difficile à vider complètement et à recharger correctement. En comparaison avec LLVM, LLVM IR a été conçu pour pouvoir être transféré dans un fichier ordinaire (le format texte et binary de ces fichiers est entièrement convertible). Vous pouvez exécuter Clang avant d’émettre LLVMIR, puis lancer le programme opt avec certaines optimisations, puis avec d’autres, et il y aura des fichiers de code binary LLVM IR entre les phases. Et ensuite, vous pouvez démarrer la génération de code à partir du code bit IR en code natif (même, en théorie, sur une plate-forme différente, voir le projet PNaCl).

Il existe quelques projets de représentation interne de GCC en mode décharge / rechargement. Je sais qu’un tel projet a été créé pour intégrer gcc à un compilateur commercial. L’auteur ne peut pas simplement relier le code commercial à gcc, car gcc est VIRAL (il infectera tout code lié avec une licence GPL anti-commerciale). Ainsi, l’auteur a écrit un dumper / loader GPL de GIMPLE dans un format externe (xml); l’outil propriétaire était capable de lire et de traduire ce XML en un autre XML du même format, puis il était rechargé à nouveau avec l’outil GPL.

Dans les nouveaux gcc, vous avez la possibilité d’écrire un plugin, qui est VIRAL (23.2.1) en termes de GPL. Le plugin fonctionnera sur la représentation en mémoire du programme et il n’y aura aucun problème de sauvegarde / rechargement de GIMPLE via un fichier externe. Certains plugins peuvent être configurés / peuvent utiliser un programme fourni par l’utilisateur, par exemple MELT (Lisp) et GCC Python (Python). Une liste des plugins gcc est là

Il n’existe pas de fonction intégrée permettant de traduire la représentation textuelle GIMPLE en représentation interne GIMPLE originale.

Vous devez utiliser une interface frontale personnalisée (telle que celle suggérée par GIMPLE FE ) pour donner un sens à GIMPLE vidé.