diff options
author | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2020-05-19 10:25:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-19 10:25:45 +0200 |
commit | 0eba6f63b6bc458d856e477f6f8ec6b78ef78c58 (patch) | |
tree | 6ab59e34aea0369013ed7e7461f3bf2f732d97bd /backend/Tailcall.v | |
parent | 4a676623badb718da4055b7f26ee05f5097f4e7b (diff) | |
download | compcert-0eba6f63b6bc458d856e477f6f8ec6b78ef78c58.tar.gz compcert-0eba6f63b6bc458d856e477f6f8ec6b78ef78c58.zip |
Add a canonical encoding of identifiers as numbers and use it in clightgen (#353)
Within CompCert, identifiers (names of C functions, variables, types,
etc) are represented by unique positive numbers, sometimes called
"atoms".
In the original implementation, atoms 1, 2, ..., N are assigned
to identifiers as they are encountered. The resulting number
are small and are efficient when used as keys in data structures
such as PTrees. However, the mapping from C source-level identifiers
to atoms differs between compilation units. This is not a problem
for CompCert but complicates CompCert-based verification tools
that need to combine several compilation units.
This commit introduces an alternate implementation of atoms, suggested
by Andrew Appel. The choice between implementations is governed by
the Boolean reference `Camlcoq.use_canonical_atoms`.
In the alternate implementation, identifiers are converted to bit
sequences via a Huffman encoding, then the bits are represented as
positive numbers. The same identifier is always represented by the
same number. However, the numbers are usually bigger than in the
original implementation, making PTree operations slower: lookups and
updates take time linear in the length of the identifier, instead of
logarithmic time in the number of identifiers encountered.
The CompCert compiler (the `ccomp` executable) still uses the original
implementation, but the `clightgen` tool used in conjunction with the
VST program logic can use either implementations:
- The alternate "canonical atoms" implementation is used by default,
and also if the `-canonical-idents` option is given.
- The original implementation is used if the `-short-idents` option is
given.
Closes: #222
Closes: #311
Diffstat (limited to 'backend/Tailcall.v')
0 files changed, 0 insertions, 0 deletions