Compcert is a compiler that generates PowerPC, ARM and x86 assembly code from Compcert C, a large subset of the C programming language. The particularity of this compiler is that it is written mostly within the specification language of the Coq proof assistant, and its correctness --- the fact that the generated assembly code is semantically equivalent to its source program --- was entirely proved within the Coq proof assistant.
High-level descriptions of the Compcert compiler and its proof of correctness can be found in the following papers (in increasing order of technical details):
This Web site gives a commented listing of the underlying Coq specifications and proofs. Proof scripts and the parts of the compiler written directly in Caml are omitted. This development is a work in progress; some parts have substantially changed since the overview papers above were written.
The complete sources for Compcert can be downloaded from the Compcert Web site.
This document and the Compcert sources are copyright 2005, 2006, 2007, 2008, 2009, 2010 Institut National de Recherche en Informatique et en Automatique (INRIA) and distributed under the terms of the following license.
Pass | Source & target | Compiler code | Correctness proof |
---|---|---|---|
Pulling side-effects out of expressions; fixing an evaluation order |
Compcert C to Clight | SimplExpr | SimplExprspec SimplExprproof |
Simplification of control structures; explication of type-dependent computations |
Clight to Csharpminor | Cshmgen | Cshmgenproof |
Stack allocation of local variables whose address is taken; simplification of switch statements |
Csharpminor to Cminor | Cminorgen | Cminorgenproof |
Recognition of operators and addressing modes |
Cminor to CminorSel | Selection SelectOp |
Selectionproof SelectOpproof |
Construction of the CFG, 3-address code generation |
Cminor to RTL | RTLgen | RTLgenspec RTLgenproof |
Recognition of tail calls | RTL to RTL | Tailcall | Tailcallproof |
Constant propagation | RTL to RTL | Constprop ConstpropOp |
Constpropproof ConstproppOproof |
Common subexpression elimination | RTL to RTL | CSE | CSEproof |
Elimination of redundant casts | RTL to RTL | CastOptim | CastOptimproof |
Register allocation by coloring of an interference graph |
RTL to LTL | InterfGraph Coloring Allocation |
Coloringproof Allocproof |
Branch tunneling | LTL to LTL | Tunneling | Tunnelingproof |
Linearization of the CFG | LTL to LTLin | Linearize | Linearizeproof |
Spilling, reloading, calling conventions | LTLin to Linear | Conventions Reload |
Parallelmove Reloadproof |
Laying out the activation records | Linear to Mach | Bounds Stacking |
Stackingproof |
Storing the activation records in memory | Mach to Mach | (none) | Asmgenretaddr Machabstr2concr |
Emission of assembly code | Mach to Asm | Asmgen | Asmgenproof1 Asmgenproof |