CompCert Release 15.10 ---------------------- DWARF support ------------- DWARF2 debugging information is now written for the Diab and GCC backends. New language features --------------------- * Added an implicit "return 0" for main() without return. * Set and clear the CR6 bit before calling an unprototyped function to support unprototyped variable argument functions. * Fixed issue with parsing of type names which occur if a typedef name is used after a for loop that uses the same name for a loop variable. * Allow redefinitions of typedefs with the same name and same type as specified in ISO/IEC 9899:201x ยง6.7p3 bullet point 1. * Added support for bitfield members in unions. New built-in functions ---------------------- Note: the built-ins are for a PPC architecture in embedded mode only. - __builtin_set_spr(spr,val) Moves "val" to special purpose register "spr" - result = __builtin_get_spr(spr) Returns the value of the special purpose register "spr" in "result" - __builtin_prefetch(ea,rw=0/1,ct=0/1/2) Data Cache Block (rw=0) or Data Cache Block for Store (rw=1) - __builtin_dcbf(ea) Data Cache Block Flush - __builtin_dcbt(ea) Data Cache Block Touch - __builtin_dcbtls(ea,ct=0/2) Data Cache Block Touch and Lock Set - __builtin_dcbi(ea) Data Cache Block Invalidate - __builtin_dcbz(ea) Data Cache Block set to Zero - __builtin_icbtls(ea,ct=0/2) Instruction Cache Block Touch and Lock Set - __builtin_icbi(ea) Instruction Cache Block Invalidate - __builtin_mbar(mo=0/1) Memory Barrier - __builtin_isync() Instruction Synchronize - __builtin_sync() / __builtin_lwsync Synchronize - __builtin_cmpb(result,a,b) Compare Bytes - __atomic_exchange(ea0,ea1,result) Atomic Exchange: stores the contents of "*ea1" into "*ea0" while the original value of "*ea0" is copied to "*result" - result = __atomic_compare_exchange(ea,expected,desired) Atomic Compare and Exchange: compares the content of "*ea" to that of "*expected"; if these are equal, the operation is a read-modify-write that writes "*desired" into "*ea" and the returned value "result" is "1"; if they are not equal, the operation is a read and the current content of "*ea" is written into "*expected" while the returned value "result" is "0" - __atomic_load(source,destination) Atomic Load: returns the contents of "*source" in "*destination" - result = __sync_fetch_and_add(ea,val) Syncronize Fetch and Add: increments the content of "*ea" by "val" and returns the previous value of "*ea" - result = __builtin_clz(val) Count Leading Zeros in "val" - result = __builtin_isel(e, vala, valb) Returns "vala" if the given boolean expression "e" is true, and "valb" otherwise Valex ----- * Added the Valex tool for postpass validation of the executable assembled/linked with the WindRiver Diab or GCC toolchain. * New serialization of the assembler AST in ".json" format. * Static functions are renamed to avoid name clashes; "<f>" becomes "_<file>_<f>". Fixes ----- * Faster parsing of floating point numbers with large exponents. * Subtraction of two pointers produces now a signed result. * When assigning to a bit field of type "_Bool", the right-hand side is now normalized to "0" or "1" via a cast to "_Bool". * Fixed the printing of assembly output of the "stwux" and "cntlzw" instructions. * Reject non-void functions with incomplete return types. * Reject more cases of unstructured control flow in switch statements. * Resolved issue with struct return to an overlapping struct. * The implict type of the wchar_t type and the typedef in the stddef header are now compatible to the WindRiver Diab C compiler. * More conservative pointer analysis to avoid optimizations on code that casts pointer to integer and back. Usability --------- * CompCert standard headers no longer lead to incompatible type definitions. * Added support for anonymous structs and unions in the debug type information as well as forward declarations of structs and unions. * CompCert now writes its build number along with a version string and compile-time options to the generated assembler files and into the Dwarf debugging information. Known issues ------------ If any of the following features are used, code correctness cannot be guaranteed in the current version of CompCert and must be checked separately. * External variable declarations in block scope are not supported. * The result of casts between pointer and integer types with sizes other than 32 bit are undefined in the CompCert C semantics. * The bitfield layout of CompCert is incompatible with the bitfield layout of the WindRiver Diab C compiler. * Function parameters of type "float" that are passed via the stack are passed as 4-byte single precision values. This behaviour differs from that of the Windriver Diab C compiler, which converts float arguments to double precision when passing them via the stack. * Types introduced in sizeof and cast expressions cannot be used after said expressions. The scopes are not correct. * CompCert may fail to parse empty initializer lists for array variables. * Wide string literals are parsed incorrectly when they contain non-ASCII wide characters. * Compcert currently cannot compile K&R functions with incompatible prototype definitions. * CompCert may fail to parse (partial) initialization of multi-dimensional arrays if braces are missing. * Compiling several C files with debug information at once may fail. ============================================================================== Last modified on 9 October 2015 by alex@absint.com. Copyright 2015 AbsInt. www.absint.com ============================================================================== An HTML version of these release notes is available at www.absint.com/releasenotes/compcert/15.10