Synthèse de compilateurs certifiés

par Léo Gourdin

Projet de thèse en Informatique

Sous la direction de Sylvain Boulme et de Frédéric Pétrot.

Thèses en préparation à l'Université Grenoble Alpes , dans le cadre de École doctorale mathématiques, sciences et technologies de l'information, informatique (Grenoble) , en partenariat avec VERIMAG (laboratoire) et de Preuves et Analyses de Code pour la Sûreté et la Sécurité (equipe de recherche) depuis le 01-10-2020 .


  • Résumé

    Les bugs dans les compilateurs, même s'ils sont relativement rares dans les compilateurs de production pour les familles de processeurs les plus répandues, sont particulièrement insidieux : un code source correct peut être compilé en un code assembleur incorrect, et des changements du code source destinés à mieux cerner l'erreur peuvent faire disparaître le bug. Dans certains contextes (p.ex. logiciels de contrôle-commande critiques niveau A en aviation civile), on peut exiger une traçabilité du code source au code objet qui exclut en pratique l'utilisation d'optimisations, d'où une utilisation très sous-optimale du processeur cible. Cela est d'autant plus dommageable que dans ce contexte, mettre un processeur plus rapide, mais plus complexe et potentiellement plus erroné ou nécessitant une forte dissipation thermique, ou encore un processeur multi-cœur, avec des problèmes de programmation concurrente, ne sont pas des options forcément acceptables. Une solution a été apportée par le compilateur CompCert: la traçabilité entre code source et code objet est assurée par une preuve mathématique de raffinement de programmes au travers de toutes les phases de traduction et d'optimisation. Cette preuve est elle-même formellement vérifiée par l'assistant de preuve Coq. Preuve de l'intérêt industriel pour cette solution, CompCert est actuellement commercialisé. Dans le cadre de sa thèse (toujours en cours à Verimag), Cyril Six a étendu CompCert pour lui ajouter comme cible le processeur Kalray KVX, avec réordonnancement d'instructions — CompCert, de base, ne réordonne pas les instructions, ce qui est pénalisant sur les processeurs superscalaires sans réordonnancement dynamique. Il s'avère que lors de l'ajout d'une nouvelle cible, il y a des étapes assez fastidieuses : définition des jeux d'instructions des différentes représentations intermédiaires et de leur sémantique formelle, modélisation du pipeline pour l'algorithme d'ordonnancement, etc., avec des informations transcrites depuis la documentation. Si ce travail a pu être mené manuellement à bien pour un nombre restreint d'instructions, il serait extrêmement pénible pour des jeux d'instructions étendus (que ce soit par des instructions SIMD ou par des extensions particulières destinées à accélérer tel ou tel type de calcul). Idéalement, on aimerait un système qui prenne la description du jeu d'instruction, du pipeline etc. et produirait la plus grande partie de la sélection d'instruction, des combinaisons d'instructions, des ordonnancements etc. et de leur preuve, voire produirait un « superoptimisateur » capable de recombiner des blocs complexes d'instructions. Dans le cadre de l'éco-système RISC-V, dont l'architecture ouverte et extensible va permettre une grande diversité de processeurs, un tel système permettrait de produire efficacement des compilateurs conciliant extrême spécialisation et extrême fiabilité. Le travail de thèse consisterait donc à concevoir un tel système, au besoin en utilisant des techniques telles que la satisfiabilité modulo théorie vérifiée.

  • Titre traduit

    Synthesis of certified compilers


  • Résumé

    Bugs in compilers, although relatively rare in very common production compilers, are particularly insidious: correct source code may be compiled into incorrect assembler code, and changes on the source code to better understand the error may make the bug disappear. In safety critical applications, regulation authorities may require traceability from source code to binary code which in practice excludes compiler optimizations, hence a very suboptimal use of the target processor. Moreover for such applications, using a faster, but more complex and potentially more erroneous, more heating processor, or even a multi-core processor, with concurrent programming problems, are not necessarily acceptable options. A solution is provided by the CompCert compiler: the traceability from the source code to the assembly code is ensured by a mathematical proof of refinement of programs through all the translation and optimization phases. This proof is itself formally verified by the Coq proof assistant. As an evidence of its industrial relevance, CompCert is currently on the market. As part of his thesis (still in progress at Verimag), Cyril Six extended CompCert to add the Kalray KVX processor as target, with instruction reordering - CompCert, basic, does not reorder instructions, which is penalizing on superscalar processors without dynamic reordering. It turns out that when adding a new target, there are quite tedious steps: defining the instruction sets of the different intermediate representations and their formal semantics, modeling the pipeline for the scheduling algorithm , etc., with information transcribed from the documentation. While this work has been carried out manually for a limited number of instructions, it would be extremely painful for extended instruction sets (either by SIMD instructions or by specific extensions intended to accelerate such or such type of calculation). Ideally, we would like a system that takes the description of the instruction set, the pipeline, etc. and would produce most of the instruction selection, instruction combinations, schedules etc. and of their evidence, or even produce a 'superoptimizer' capable of recombining complex blocks of instructions. As part of the RISC-V ecosystem, whose open and extensible architecture will allow a wide variety of processors, such a system would make it possible to efficiently produce compilers combining extreme specialization and extreme reliability. The thesis would therefore consist in designing such a system, if necessary using techniques such as modulo verified theory satisfiability.