Previous Up Next

Chapter 3 Using the CompCert C compiler

This chapter explains how to invoke the CompCert C compiler and describes its command-line interface.

3.1 Overview

The CompCert C compiler is a command-line executable named ccomp. Its interface similar to that of many other C compilers. An invocation of ccomp is of the form

ccomp [option …] input-file

By default, every input file is processed in sequence to obtain a compiled object file; then, all compiled object files thus obtained, plus those given on the command line, are linked together to produce an executable program. The name of the generated executable is controlled with the -o option; it is a.out if no option is given. The -c, -S and -E options allow the user to stop this process at an intermediate stage. For example, the -c option stops compilation before invoking the linker, leaving the compiled object files (with extension .o) as the final result. Likewise, the -S option stops compilation before invoking the assembler, leaving assembly files with the .s extension as the final result.

CompCert C accepts several kinds of input files:

.c  C source files
Arguments ending in .c are taken to be source files written in C. Given the file x.c, the compiler preprocesses the file, then compiles it to assembly language, then invokes the assembler to produce an object file named x.o.
.i or .p  C source files that should not be preprocessed
Arguments ending in .i or .p are taken to be source files written in C and already preprocessed, or not using any preprocessing directive. These files are not run through the preprocessor. Given the file x.i or x.p, the compiler compiles it to assembly language, then invokes the assembler to produce an object file named x.o.
.s  Assembly source files
Arguments ending in .s are taken to be source files written in assembly language. Given the file x.s, the compiler passes it to the assembler, producing an object file named x.o.
.S  Assembly source files that must be preprocessed
Arguments ending in .S are taken to be source files written in assembly language plus C-style macros and preprocessing directives. Given the file x.S, the compiler passes the file through the C preprocessor, then through the assembler, producing an object file named x.o.
.o  Compiled object files
Arguments ending in .o are taken to be object files obtained by a prior run of compilation. They are passed directly to the linker.
.a  Compiled library files
Arguments ending in .a are taken to be libraries. Like .o files, they are passed directly to the linker.
-llib  Compiled library files
Arguments starting in -l are taken to be system libraries. They are passed directly to the linker.

Here are some examples of use. To compile the single-file program src.c and create an executable called exec, just do

   ccomp -o exec src.c

To compile a two-file program src1.c and src2.c, do

   ccomp -c src1.c
   ccomp -c src2.c
   ccomp -o exec src1.o src2.o

To see the generated assembly code for src1.c, do

   ccomp -S src1.c

3.1.1 Response files

CompCert can read command line arguments from response files passed via @filename, too. The options read from a response file replace the @filename option. If a response file does not exist or cannot be read, the option will be treated literally and is not removed.

Within a response file, the options are separated by whitespace, i.e. by space, tab, or newline characters. Options can be enclosed in either single or double quotes to allow whitespace as part of an option. Furthermore, any character can be escaped by prefixing it with a backslash character.

Including options via response files works recursively, i.e. it is possible to specify @otherfile from within a response file. Circular includes are detected and treated as error.

3.1.2 Configuration files

CompCert reads its target configuration from a file that can be specified in different ways. The following list describes the search order for configuration files with decreasing precedence:

Commandline option  -conf <file>
If specified, CompCert reads its configuration from <file>.
Environment variable  COMPCERT_CONFIG
If present, the environment variable denotes the path to the configuration file to be used.
Commandline option  -target target-triple
If specified, CompCert reads its target configuration from a file named <target-triple>.ini. CompCert searches the configuration file in the bin/, share/, or share/compcert/ subfolders of its installation directory.
Default configuration  compcert.ini
As fallback CompCert looks for a default configuration file named compcert.ini in the same folders as described for the -target option. Such a default configuration is created when CompCert is built from sources.

3.2 Options

The ccomp command recognizes the following options. All options start with a minus sign (-).

3.2.1 Options controlling the output

-c
Compile or assemble the source files, but do not link. The final output is an object file x.o for every input file x.c or x.s or x.S. The name of the output can be controlled using the -o option.
-S
Compile the source files all the way to assembly, but do not assemble nor link. The final output is an assembly file x.s for every input file x.c. The name of the output can be controlled using the -o option.
-E
Stop after the preprocessing stage; do not compile nor link. The output is preprocessed C source code for every input file x.c. If no -o option is given, the preprocessed code is sent to the standard output. If a -o option is given, the preprocessed code is saved to the indicated file.
-o file
Generate the final output in file named file. If none of the -c, -S or -E options are given, the final output is the executable program produced during the linking phase. The -o file option causes this executable to be placed in file. Otherwise, it is placed in file a.out in the current directory.

If the -c option is given along with the -o option, the object file generated by the compilation of the source file given on the command line is saved in file. If no -o option is given, it is generated in the current directory with extension .o.

If the -S option is given along with the -o option, the assembly file generated by the compilation of the source file given on the command line is saved in file. If no -o option is given, it is generated in the current directory with extension .s.

If the -E option is given along with the -o option, the result of preprocessing the source file given on the command line is saved in file. If no -o option is given, the preprocessed result is sent to standard output.

When the -o option is given in conjunction with one of the -c, -S or -E options, there must be only one source file given on the command line.

-sdump
In addition to the outputs normally produced by Compcert, generate a x.sdump file for every x.c input file. The .sdump file contains the abstract syntax tree for the generated assembly code, in JSON format. The .sdump files can be used by the Valex validation tool distributed by AbsInt.

3.2.2 Preprocessing options

-Idir
Add directory dir to the list of directories searched for included .h files.
-Dname
Define name as a macro that expands to “1”. This is equivalent to adding a line “#define name 1” at the beginning of the source file.
-Dname=def
Define name as a macro that expands to def. This is equivalent to adding a line “#define name def” at the beginning of the source file. A parenthesized list of parameters can occur between name and the = sign, to define a macro with parameters. For example, -DF(x,y)=x is equivalent to adding a line “#define F(x,y) x” at the beginning of the source file.
-Uname
Erase any previous definition of the macro name, either built-in or performed via a previous -D option. This is equivalent to adding a line “#undef name” at the beginning of the source file.
-Wp,opt
Pass opt as an option to the preprocessor. If opt contains commas (,), it is split into multiple options at the commas.
-Xpreprocessor opt
Pass opt as an option to the preprocessor.

The macro __COMPCERT__ is always predefined, with expansion “1”.

The macros __COMPCERT_MAJOR__, __COMPCERT_MINOR__ and __COMPCERT_VERSION__ are awlays predefined, with expansions the major version number of CompCert, the minor version number, and a combined version number. For instance, CompCert version 3.7 predefines __COMPCERT_MAJOR__ to 3, __COMPCERT_MINOR__ to 7, and __COMPCERT_VERSION__ to 307.

Refer to section 5 (§6.10.8 Predefined macro names) for further standard predefined macros used by CompCert.

The preprocessing options above can either be concatenated with their arguments (as shown above) or separated from their arguments by spaces.

For GNU backends the options -C, -CC, -finput-charset, -idirafter, -imacros, -iquote, -isystem, -M, -MF, -MG, -MM, -MP, -MQ, -MT, -nostdinc, and -P are recognized and propagated to the preprocessor.

3.2.3 Optimization options

-O        (default mode)
Optimize the code with the objective of improving execution speed. This is the default.
-O1 / -O2 / -O3
Synonymous for -O (optimize for speed).
-Os
Optimize the code with the objective of reducing the size of the executable. CompCert’s optimizations improve both execution speed and code size, but some of the code generation heuristics in -O mode favor speed over compactness. The -Os option biases these heuristics in the other direction, favoring compactness over speed.
-Obranchless
Optimize to generate fewer conditional branches and use branch-free instruction sequences instead. When -fif-conversion is enabled, the conversion is peformed aggressively even if the resulting code is less performant.
-O0
Turn most optimizations off. This produces slower code but reduces compilation times. Equivalent to -fno-const-prop -fno-cse -fno-if-conversion -fno-inline -fno-redundancy -fno-tailcalls. The only optimizations performed are 1- integer constant propagation within expressions, 2- register allocation, and 3- dead code elimination.
-fconst-prop / -fno-const-prop
Turn on/off the constant propagation optimization. Enabled by default.
-fcse / -fno-cse
Turn on/off the elimination of common subexpressions. Enabled by default.
-fif-conversion / -fno-if-conversion
Turn on/off generation of conditional moves for simple if-then-else statements or the conditional operator (?:). If-conversion is heuristics based and selects only small and balanced expressions for optimization. The target architecture must also provide a conditional move instruction suitable for the type of the expression. Enabled by default.
-finline / -fno-inline
Turn on/off the inlining of functions. Enabled by default.
-finline-functions-called-once / -fno-inline-functions-called-once
Turn on/off inlining of functions only required by a single caller. Enabled by default.
-fredundancy / -fno-redundancy
Turn on/off the elimination of redundant computations and useless memory stores. Enabled by default.
-ftailcalls / -fno-tailcalls
Turn on/off the optimization of function calls in tail position. Enabled by default.
-ffloat-const-prop N
This option controls whether and how floating-point constants are propagated at compile-time. The constant propagation optimization consists in evaluating, at compile-time, arithmetic and logical operations whose arguments are constants, and replace these operations by the constants just obtained. A constant, here, is either an integer or float literal, the initial value of a const variable, or, recursively, the result of an arithmetic or logical operation itself contracted by constant propagation. The -ffloat-const-prop controls how floating-point constants are propagated and translated.
-ffloat-const-prop 2        (default mode)
Full propagation of floating-point constants. Float arithmetic is performed by the compiler in IEEE double precision format, with round-to-nearest mode. This propagation is correct only if the program does not change float rounding mode at run-time, leaving it in the default round-to-nearest mode.
-ffloat-const-prop 0
No propagation of floating-point constants. This option should be given if the program changes the float rounding mode during its execution.
-ffloat-const-prop 1
Propagate floating-point constants, assuming round-to-nearest mode, but only for arguments of integer-valued operations such as float comparisons and float-to-integer conversions. In other words, floating-point constants are propagated, but no new floating-point constants are inserted in the generated assembly code. This option is useful for some processor configurations where floating-point constants are stored in slow memory and therefore loading a floating-point constant from memory can be slower than recomputing it at run-time.

3.2.4 Code generation options

-falign-functions N
Force the entry point to any compiled function to be aligned on an N byte boundary. The default alignment for function entry points is 16 bytes for the IA32 target and 4 bytes for the ARM and PowerPC targets.
-falign-branch-targets N
This option is specific to the PowerPC target. In the generated assembly code, align the targets of branch instructions to a multiple of N bytes. Only branch targets that cannot be reached by fall-through execution are thus aligned. If no -falign-branch-targets option is specified, alignment handling for branch targets is deactivated.
-falign-cond-branches N
This option is specific to the PowerPC target. It causes conditional branch instructions (bc) to be aligned to a multiple of N bytes in the generated assembly code. If no -falign-cond-branches option is specified, alignment handling for conditional branch instructions is deactivated.
-fcommon / -fno-common
Turn on/off placement of global variables defined without an initializer (tentative definitions) in the common section. Disabling the use of the common section inhibits merging of tentative definitions by the linker and may lead to multiple-definition errors. By default the use of the common section is enabled.
-fno-fpu
Prevent the generation of floating-point or SSE2 instructions for assignments between composites (structures or unions) and for the __builtin_memcpy_aligned built-in function.
-fsmall-data N
This option is specific to the PowerPC EABI target platform with Diab tools. It causes global variables of size less than or equal to N bytes and of non-const type to be placed in the small data area (SDA) of the generated executable, and to be addressed by 16-bit offsets relative to the SDA register. This is more efficient than the default absolute addressing used to access global variables. If no -fsmall-data option is given, N is taken to be 8 by default.

It is possible to use the -fsmall-data option with GNU based PowerPC backends, provided that SDA section and register are correctly set up. However, the option currently can cause problems with static uninitialized variables that are still placed in the .bss section and will result in assembler errors. It is recommended to use the -fno-common option to avoid this.

-fsmall-const N
Similar to -fsmall-data N, but governs the placement of const global variables in the small data area. Remarks for GNU based backends apply analogously.
-Wa,opt
Pass opt as an option to the assembler. If opt contains commas (,), it is split into multiple options at the commas.
-Xassembler opt
Pass opt as an option to the assembler.

3.2.5 Target processor options

-target target-triple
Select a specific target processor configuration for code generation instead of using the default described in compcert.ini. Refer to section 3.1.2 for detailed information about configuration files.
-mthumb
This option applies only to the ARM port of CompCert. It instructs CompCert to generate code using the Thumb2 instruction encoding. This is the default if CompCert was configured for the ARMv7M profile.
-marm
This option applies only to the ARM port of CompCert. It instructs CompCert to generate code using the classic ARM instruction encoding. This is the default if CompCert was configured for a profile other than ARMv7M.

3.2.6 Target toolchain options

-t tof:env
This option is specific to the PowerPC EABI target platform with Diab toolchain. It selects the target architecture and execution environment and is forwarded to the preprocessor, assembler and linker of the Diab toolchain. It has no effect on the code generated by CompCert.

3.2.7 Debugging options

-g
Generate full debugging information in DWARF format. Programs compiled and linked with the -g option can be debugged using a debugger such as GDB.
-g0 / -g1 / -g2 / -g3
Control generation of debugging information (0: none, 1: only globals, 2: globals and locals without locations, 3: full debug information). The default level is 3 for full debug information.
-gdwarf-2 / -gdwarf-3
Available for GNU backends to select between debug information in DWARF format version 2 or 3. The default format is DWARF v3.

3.2.8 Linking options

-lx
Link with the system library -lx. The linker searches a standard list of directories for the file libx.a and links it.
-Ldir
Add directory dir to the list of directories searched for -llib libraries.
-Wl,opt
Pass opt as an option to the linker. If opt contains commas (,), it is split into multiple options at the commas.
-WUl,opt
Pass opt as an option to the driver program used for linking. If opt contains commas (,), it is split into multiple options at the commas.
-Xlinker opt
Pass opt as an option to the linker.

For GNU backends the options -nodefaultlibs, -nostartfiles, and -nostdlib are recognized and propagated to the linker.

3.2.9 Language support options

The formally-verified part of the CompCert compiler lacks several features of the C language. Some of these features can be simulated by prior source-to-source transformations, performed during the elaboration phase, before entering the formally-verified part of the compiler. The following language support options control which features are simulated this way. Note that these source-to-source transformations are not formally verified yet and cannot be absolutely trusted. For high-assurance software, it is recommended to deactivate them entirely (option -fnone) or to review the C source code after these transformations (option -dc).

-std=standard
Select the ISO C language standard used. Possible values are c99, c11, and c18. For GNU toolchains the option is passed down to the preprocessor. Specifying the option also enables (c99) or disables (c11, c18) the named warnings of class c11-extensions (see section 3.2.10).

For compatibility with previous CompCert releases, the default, if no -std option is given, is to pass -std=c99 to the preprocessor and disable warning class c11-extensions.

-flongdouble
Accept the long double type and treat it as synonymous for the double type, that is, double-precision IEEE 754 floats. This implementation of long double is correct according to the C standards, but does not conform to the ABIs of the target platforms. In other terms, the code generated by CompCert in -flongdouble mode may not interoperate with code generated by an ABI-conformant compiler.
-fno-longdouble (default)
Reject all occurrences of the long double type.
-fpacked-structs
Enable the programmer to control the alignment of struct types and of their individual fields, via the non-standard packed type attribute (section 6.2).
-fno-packed-structs (default)
Ignore the packed type attribute, and always use the field alignment rules specified by the ABI of the target platform.
-fstruct-passing
Support functions that take parameters and return results of composite types (struct or union types) by value.
-fno-struct-passing (default)
Reject all functions that take arguments or return results of struct or union types.
-funprototyped (default)
Support the declaration and invocation of functions declared without function prototypes (“old-style” unprototyped functions).
-fno-unprototyped
Reject all functions that are not declared with a function prototype.
-funstructured-switch
Enable full support for unstructured switch statements via additional source-to-source transformation.
-fno-unstructured-switch (default)
Reject unstructured forms of switch statements.
-fvararg-calls (default)
Support defining functions with a variable number of arguments, and calling such functions. A typical example is the printf function and its variants from the C standard library.
-fno-vararg-calls
Reject all attempts to define or invoke a variable-argument function.
-finline-asm
Activate support for inline assembly statements (see section 6.6). Indiscriminate use of this statement can ruin all the semantic preservation guarantees of CompCert.
-fno-inline-asm (default)
Reject all uses of asm statements.
-fall
Activate all language support options above.
-fnone
Turn off all language support options above.

As listed in the description above, the -fvararg-calls and -funprototyped language support options are turned on by default, and all other are turned off by default.

3.2.10 Diagnostic options

CompCert supports a scheme of named warnings that allows you to individually enable or disable warnings or to treat them as errors. The diagnostic options are:

-Wall
Enable all warnings.
-Wwarning
Enable the specific warning warning. See below for a list of possible warning names.
-Wno-warning
Disable the specific warning warning. See below for a list of possible warning names.
-w
Suppress all warnings.
-Werror
Treat all warnings of CompCert as errors.
-Werror=warning
Treat the specific warning warning as an error. See below for a list of possible warning names.
-Wno-error=warning
Prevent the specific warning warning from being treated as error even if -Werror is specified. See below for a list of possible warning names.
-Wfatal-errors
Treat all errors of CompCert as fatal errors, so that the compilation is aborted immediately.
-fmax-errors=N
Limits the maximum number of error messages to N, at which point CompCert stops processing the source-code. If N is 0 (default) the number of error messages is unlimited.
-fdiagnostics-format=format
Set format for location information in diagnostic messages. Possible formats are ccomp (default), msvc or vi.
-fdiagnostics-color
CompCert will print all diagnostic messages with color codes. Colorized output is enabled by default when CompCert is invoked with a TTY output device.
-fno-diagnostics-color
CompCert will print all diagnostic messages as standard ASCII text without colorization. This behavior is the default when CompCert is invoked with a non-TTY as output device.
-fdiagnostics-show-option (default)
Print option name with mappable diagnostics.
-fno-diagnostics-show-option (default)
Disable printing option name with mappable diagnostics.

Warning names  CompCert currently supports the following warning names. The names must be inserted instead of the <warning> placeholder in the diagnostic options described above. E.g. use the option -Werror=c11-extensions to turn warnings related to C11 specific features into errors.

c11-extensions (disabled by default)
Feature specific to C11.
compare-distinct-pointer-types (enabled by default)
Comparison of different pointer types.
compcert-conformance (disabled by default)
Features that are not part of the CompCert C core language, e.g. K&R style functions.
constant-conversion (enabled by default)
Dangerous conversion of constants, e.g. literals that are too large for the given type.
extern-after-definition (enabled by default)
Extern declarations after non-extern definitions.
flexible-array-extensions (disable by default)
Use of structs with flexible arrays nexted within structs or arrays.
gnu-empty-struct (enabled by default)
GNU extension for empty structs.
ignored-attributes (enabled by default)
Attribute declarations after definitions.
implicit-function-declaration (enabled by default)
Deprecated implicit function declarations.
implicit-int (enabled by default)
Type of parameter or return type is implicitly assumed to be int.
inline-asm-sdump (enabled by default)
Use of unsupported features in combination with dump of abstract syntax tree (via option -sdump).
int-conversion (enabled by default)
Conversion between pointer and integer.
invalid-noreturn (enabled by default)
Functions declared as noreturn that actually contain a return statement.
invalid-utf8 (enabled by default)
Illegal unicode characters in string or character constants.
literal-range (enabled by default)
Floating point literals with out-of-range magnitudes or values that convert to NaN.
main-return-type (enabled by default)
Wrong return type for main.
missing-declarations (enabled by default)
Declations which do not declare anything.
non-linear-cond-expr (disabled by default)
Conditional expression that may not be optimized to branchless code. Only issued in -Obranchless mode.
pointer-type-mismatch (enabled by default)
Use of incompatible pointer types in conditional expressions.
reduced-alignment (disabled by default)
Alignment specifications below natural alignment.
return-type (enabled by default)
Void-return statement in non-void function.
static-in-inline (enabled by default)
Use of static variables in non-static inline functions.
tentative-incomplete-static (disabled by default)
Static tentative definition with incomplete type.
unknown-attributes (enabled by default)
Use of unsupported or unknown attributes.
unknown-pragmas (disabled by default)
Use of unsupported or unknown pragmas.
unused-ais-parameter (disabled by default)
Unused parameter for embedded program annotations.
unused-variable (disabled by default)
Unused local variables.
varargs (enabled by default)
Promotable vararg arguments.
wrong-ais-parameter (enabled by default)
Use of illegal parameter expressions for embedded program annotations.
zero-length-array (disabled by default)
GNU extension for zero length arrays.

3.2.11 Tracing options

The following options direct the compiler to save the file being compiled into files at various stages of compilation. The three most useful tracing options are:

-dparse
Save the C file after parsing, elaboration, and source-to-source transformations as described in section “Language support options”. If the source file is named x.c, the intermediate form is saved in file x.parsed.c, in C syntax. This intermediate form is useful to review the effect of the unverified source-to-source transformations.
-dc
Save the generated CompCert C code, just before entering the verified part of the compiler. If the source file is named x.c, the intermediate form is saved in file x.compcert.c, in C syntax. This intermediate form is useful in conjunction with the reference interpreter, because it represents the program exactly as it is interpreted.
-dasm
Save the generated assembly code, just before calling the assembler. If the source file is named x.c, the assembly code is saved in file x.s. Unlike with option -S, compilation does not stop here and continues with assembling and linking.

The remaining tracing options are of interest mainly to the CompCert developers. In the description below, we assume that the source file is named x.c.

-dclight
Save generated Clight intermediate code in file x.light.c, in C-like syntax.
-dcminor
Save generated Cminor intermediate code in file x.cm.
-drtl
Save generated RTL form at successive stages of optimization in files x.rtl.0, x.rtl.1, etc.
-dltl
Save LTL form after register allocation in x.ltl
-dmach
Save Mach form after stack layout in file x.mach

3.2.12 Miscellaneous options

-v
Before every invocation of an external command (preprocessor, assembler, linker), print the command and its arguments.
-timings
Measure and display the time spent in various compilation passes.
-stdlib dir
Specify the directory dir containing the CompCert C specific library and header files. This option is useful in the rare case where the user needs to override the default location specified at CompCert installation time.
-conf file
Read CompCert configuration from file. This takes precedence over any other specification. Refer to section 3.1.2 for detailed information about configuration files.

Previous Up Next