aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Second update for release 3.10v3.10Xavier Leroy2021-11-191-4/+6
|
* mention AArch64 in man-pageMichael Schmidt2021-11-171-1/+1
|
* Remove documentation of bitfield language support option.Michael Schmidt2021-11-171-5/+0
|
* First update for release 3.10Xavier Leroy2021-11-163-2/+57
|
* Maps.v: transparency of NodeXavier Leroy2021-11-161-1/+3
| | | | Add one more `Local Transparent Node` to ensure compatibility with Coq < 8.12
* An improved PTree data structure (#420)Xavier Leroy2021-11-169-668/+908
| | | | | | | | | | | | | | This PR replaces the "PTree" data structure used in lib/Maps.v by the canonical binary tries data structure proposed by A. W. Appel and described in the paper "Efficient Extensional Binary Tries", https://arxiv.org/abs/2110.05063 The new implementation is more memory-efficient and a bit faster, resulting in reduced compilation times (-5% on typical C programs, up to -10% on very large C functions). It also enjoys the extensionality property (two tries mapping equal keys to equal data are equal), which simplifies some proofs.
* Revised checks for multi-character constants 'xyz'Xavier Leroy2021-11-161-24/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The previous code for elaborating character constants has a small bug: the value of a wide character constant consisting of several characters was normalized to type `int`, while, statically, it has type `wchar_t`. If `wchar_t` is `unsigned short`, for example, the constant `L'ab'` would elaborate to 6357090, which is not of type `unsigned short`. This commit fixes the bug by normalizing wide character constants to type `wchar_t`, regardless of how many characters they contain. The previous code was odd in another respect: leading `\0` characters in multi-character constants were ignored. Hence, `'\0bcde'` was accepted while `'abcde'` caused a warning. This commit implements a more predictable behavior: the number of characters in a character literal is limited a priori to sizeof(type of result) / sizeof(type of each character) So, for non-wide character constants we can typically have up to 4 characters (sizeof(int) / sizeof(char)), while for wide character constants we can only have one character. In effect, multiple-character wide character literals are not supported. This is allowed by the ISO C99 standard and seems consistent with GCC and Clang. Finally, a multi-character constant with too many characters was reported either as an error (if the computation overflowed the 64-bit accumulator) or as a warning (otherwise). Here, we make this an error in all cases. GCC and Clang only produce warnings, and truncate the value of the character constant, but an error feels safer.
* Resurrect a warning for bit fields of enum typesXavier Leroy2021-11-121-15/+33
| | | | | | | | | | | | | | | | Earlier CompCert versions would warn if a bit field of width N and type enum E was too small for the values of the enumeration: whether the field is interpreted as a N-bit signed integer or a N-bit unsigned integer, some values of the enumeration are not representable. This warning was performed in the Bitfields emulation pass, which went away during the reimplementation of bit fields within the verified part of CompCert. In this commit, we resurrect the warning and perform it during the Elab pass. In passing, some of the code that elaborates bit fields was moved to a separate function "check_bitfield".
* PPC64: revised generation of rldic* instructionsXavier Leroy2021-10-284-20/+31
| | | | | | | | | | | | In Op.v, the definitions of is_rldl_mask and is_rldr_mask mask were swapped: - rldl is for [00001111] masks that clear on the left, hence start with 1s and finish with 0s; - rldr is for [11110000] masks that clear on the right, hence start with 0s and finish with 1s. In Asmgen.v, the case for masks of the form [00011111100] that can generate a rldic instruction was incorrectly detected.
* Explicitly remove __SIZEOF_INT128__ macro definition. (#419)roconnor-blockstream2021-10-161-4/+4
| | | | | | | | CompCert does not support 128-bit integers, but the gcc and clang preprocessors do include support as part of its 'built-in'. A common way of testing for 128-bit integer support is to check to see if `__SIZEOF_INT128__` is defined. Eliminating this macro prevents software from believing that 128-bit integers are supported.
* Merge pull request #415 from AbsInt/coq-8.14-compatXavier Leroy2021-10-1618-58/+68
|\ | | | | Improved compatibility with Coq 8.14
| * Add Coq 8.14.0 to the supported versions of CoqXavier Leroy2021-10-031-3/+3
| |
| * Selectively turn some Coq 8.14 warnings offXavier Leroy2021-10-031-1/+11
| | | | | | | | | | | | | | | | | | | | | | | | Warning "deprecated hint rewrite without locality" cannot be addressed: the suggested fix (qualify with Global or Local or [#export]) is not supported by Coq 8.11 to 8.13 ! Warning "deprecated instance without locality" is turned off for generated file cparser/Parser.v only. Menhir needs to be changed so as to generate the `Global` modifier that would silence this warning.
| * Qualify `Instance` and `Program Instance` as `Global`Xavier Leroy2021-10-0315-53/+53
| | | | | | | | This avoids a new warning of Coq 8.14.
| * Vendored Flocq library: address Coq 8.14 warningXavier Leroy2021-10-031-1/+1
|/
* Synchronize vendored MenhirLib with upstream (#416)Jacques-Henri Jourdan2021-10-037-36/+47
| | | | It remains compatible with earlier Menhir versions.
* Adapt to coq/coq#13837 ("apply with" does not rename arguments) (#417)Gaƫtan Gilbert2021-10-032-4/+4
| | | | The change is backward compatible with Coq 8.9 to 8.13 (at least).
* Typo in expand_builtin_memcpy_smallXavier Leroy2021-10-011-1/+1
| | | | Follow-up to c34d25e01
* Ignore unnamed bit fields for initialization of unionsBernhard Schommer2021-09-282-7/+16
| | | | | | | | | | | | When a union is initialized with an initializer without designator the first named member should be initialized. This commit skips members without names during the elaboration of union initializers. Note that anonymous members (unnamed members of struct or union type) should not be skipped, and are not skipped since elaboration give names to these members. Bug 31982
* Ignore unnamed plain members of structs and unionsXavier Leroy2021-09-281-10/+15
| | | | | | | | | | | | | | | | | | | E.g. `struct { int; int x; };`. The `int;` declaration provides no name, is not a bit field, and is not a C11 anonymous struct/union member. Such declarations are not allowed by the C99 grammar, even though GCC, Clang and CompCert tolerate them. The C11 grammar allows these declarations but the standard text gives them no meaning. CompCert used to warn about such declarations, yet include them in the struct or union as unnamed members, similar to an unnamed bit field. This is incorrect and inconsistent with what GCC and Clang do. With this commit, CompCert still warns, then ignores the declaration and does not create an unnamed member. This is consistent with GCC and Clang. Fixes: #411
* Merge pull request #413 from AbsInt/new-exportXavier Leroy2021-09-2727-694/+1098
|\ | | | | Add support to clightgen for generating Csyntax AST as .v files
| * Update export/README.mdXavier Leroy2021-09-221-18/+18
| |
| * Add support to clightgen for generating Csyntax AST as .v filesXavier Leroy2021-09-2221-271/+625
| | | | | | | | | | | | | | | | | | As proposed in #404. This is presented as a new option `-clight` to the existing `clightgen` tool. Revise clightgen testing to test the Csyntax output in addition to the Clight output.
| * Refactor clightgenXavier Leroy2021-09-2213-594/+644
| | | | | | | | | | | | | | Split reusable parts of ExportClight.ml off, into ExportBase.ml and ExportCtypes.ml. Rename exportclight/ directory to export/
* | Vendored MenhirLib: replace Require Omega with Require ZArithXavier Leroy2021-09-251-1/+1
| | | | | | | | | | | | For compatibility with Coq 8.14. Cherry-picked from upstream commit 2e3c2441
* | Update the vendored Flocq library to version 3.4.2Xavier Leroy2021-09-255-38/+24
| | | | | | | | For compatibility with the upcoming Coq 8.14.
* | Fix wrong expansion of __builtin_memcpy_alignedXavier Leroy2021-09-234-8/+8
| | | | | | | | | | | | | | | | | | In the "small" case, there was an error in the choice of temporary registers to use when one argument is a stack location and the other is a register. The chosen temporary could conflict with the argument that resides in a register. Fixes: #412
* | For __builtin_memcpy_aligned, watch out for alignment of stack offsetsXavier Leroy2021-09-231-0/+1
|/ | | | | | | | | | Stack offsets must be multiple of 8 when using ldp/stp instructions and multiple of the transferred size when using other load/store instructions with offsets greater than 256. For simplicity, always require that the offset is multiple of 8. Fixes: #410
* Fix the type and the semantics of BI_bselXavier Leroy2021-09-221-4/+17
| | | | The return type is Tint8unsigned (i.e. _Bool), not Tint.
* For numerical builtins, support return types that are small integer typesXavier Leroy2021-09-221-25/+47
|
* Avoid `Global Set Asymmetric Patterns` (#408)Xavier Leroy2021-09-158-5/+13
| | | | | | Instead, add `Set Asymmetric Patterns` to the files that need it, or use `Arguments` to make inductive types work better with symmetric patterns. Closes: #403
* clightgen: handle empty names given to padding bit fieldsXavier Leroy2021-09-152-16/+28
| | | | | | | | | | | | In the Clight AST, padding bit fields (such as `int : 6;`) in composite declarations are given an ident that corresponds to the empty string. Previously, clightgen would give name `_` to this ident, but this is not valid Coq. This commit gives name `empty_ident` to the empty ident. This name does not start with an underscore, so it cannot conflict with the names for regular idents, which all start with `_`.
* Handle the new warnings of OCaml 4.13Xavier Leroy2021-09-132-4/+4
| | | | | | | | | | | Warning 69 "mutable record field is never mutated": 3 occurrences in backend/IRC.ml removed the "mutable" qualifier on these fields Warning 70 "cannot find interface file" many .ml files have no .mli no strong motivation to add the .mli files turned off the warning in Makefile.extr
* Share code for memory access for PowerPCBernhard Schommer2021-09-064-166/+159
| | | | | | Instead of duplicating the memory access code in `Asmexpand.ml` we move the code for each of the different addressings in `Asmgen.v` into separate functions that then can be reused in `Asmexpand.ml`.
* Protect against overflows in `leaq` (all forms)Bernhard Schommer2021-08-271-22/+27
| | | | | | | | leaq's offsets can overflow (not fit in 32 bits) in other cases than those fixed in 4daebb7a0, e.g. in the expansion of __builtin_memcpy_aligned. This commit implements full normalization of the `leaq` instructions produced in Asmexpand, following the same method used in Asmgen.
* Protect against overflows in `leaq N(src), dst` (#407)Xavier Leroy2021-08-271-12/+17
| | | | | | | | | | | | If N does not fit in signed 32 bits, `leaq` cannot be used and `mov; addq` must be used instead. This was already the case for `leaq` instructions produced by the Asmgen pass, but not for some `leaq` instructions produced by Asmexpand. Normally, assemblers should fail if the `leaq` offset is not representable, but this is not always the case (see issue #406). Fixes: #406
* Merge branch 'bitfields' (#400)Xavier Leroy2021-08-2245-2305/+4004
|\
| * Native support for bit fields (#400)Xavier Leroy2021-08-2242-2299/+3866
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This big PR adds support for bit fields in structs and unions to the verified part of CompCert, namely the CompCert C and Clight languages. The compilation of bit field accesses to normal integer accesses + shifts and masks is done and proved correct as part of the Cshmgen pass. The layout of bit fields in memory is done by the functions in module Ctypes. It follows the ELF ABI layout algorithm. As a bonus, basic soundness properties of the layout are shown, such as "two different bit fields do not overlap" or "a bit field and a regular field do not overlap". All this replaces the previous emulation of bit fields by source-to-source rewriting in the unverified front-end of CompCert (module cparse/Bitfield.ml). This emulation was prone to errors (see nonstandard layout instead. The core idea for the PR is that expressions in l-value position denote not just a block, a byte offset and a type, but also a bitfield designator saying whether all the bits of the type are accessed (designator Full) or only some of its bits (designator Bits). Designators of the Bits kind appear when the l-value is a bit field access; the bit width and bit offset in Bits are computed by the functions in Ctypes that implement the layout algorithm. Consequently, both in the semantics of CompCert C and Clight and in the SimplExpr, SimplLocals and Cshmgen compilation passes, pairs of a type and a bitfield designator are used in a number of places where a single type was used before. The introduction of bit fields has a big impact on static initialization (module cfrontend/Initializers.v), which had to be rewritten in large part, along with its soundness proof (cfrontend/Initializersproof.v). Both static initialization and run-time manipulation of bit fields are tested in test/abi using differential testing against GCC and randomly-generated structs. This work exposed subtle interactions between bit fields and the volatile modifier. Currently, the volatile modifier is ignored when accessing a bit field (and a warning is printed at compile-time), just like it is ignored when accessing a struct or union as a r-value. Currently, the natural alignment of bit fields and their storage units cannot be modified with the aligned attribute. _Alignas on bit fields is rejected as per C11, and the packed modifier cannot be applied to a struct containing bit fields.
| * Add Ctypes.link_match_program_genXavier Leroy2021-08-221-0/+52
| | | | | | | | | | A more general version of the link_match_program linking theorem. It supports match_fundef relations parameterized by the source compilation unit.
| * Int.sign_ext_shr_shl: weaker hypothesisXavier Leroy2021-08-223-6/+6
| | | | | | | | | | | | Works also for sign_ext 32. ARM, RISC-V: adapt Asmgenproof1 accordingly
| * Add `floor` and some propertiesXavier Leroy2021-07-261-0/+37
| |
| * More lemmas about `align`Xavier Leroy2021-07-261-0/+17
| |
| * More lemmas about list appendXavier Leroy2021-07-261-0/+26
| |
* | Revise the declaration of __compcert_* helper functionsXavier Leroy2021-06-301-82/+79
| | | | | | | | | | | | Don't put them in the C environment used for elaboration. Instead, add them directly to the generated CompCert C at the end of the C2C translation.
* | x86 assembly: fix the comment delimiter for macos and make it per-OSXavier Leroy2021-06-101-3/+11
| | | | | | | | | | | | | | | | | | As reported in #399, it seems better to use `##` instead of `#` as comment delimiter under macOS. For the time being we keep using `#` for Linux and Cygwin. Closes: #399
* | Support `# 0 ...` preprocessed line directiveXavier Leroy2021-06-011-1/+1
|/ | | | | | | Before, the line number had to start with a nonzero digit. However, the GCC 11 preprocessor was observed to produce `# 0 ...` directives. Fixes: #398
* Register X1 is destroyed by some built-in functionsXavier Leroy2021-05-132-3/+5
| | | | E.g. __builtin_bswap. Update Asm modeling of builtins accordingly.
* Update for release 3.9v3.9Xavier Leroy2021-05-101-1/+1
|
* Update Changelog for release 3.9Xavier Leroy2021-05-091-0/+3
|
* Update for release 3.9Xavier Leroy2021-05-091-4/+5
| | | | Also: limit the max width of the page, to avoid very long lines.