[PATCH gcc/* 0/2] Typed qualifiers
Arsen Arsenović
aarsenovic@baylibre.com
Sun Jul 5 21:15:26 GMT 2026
From: Arsen Arsenović <arsen@gcc.gnu.org>
Hi!
This patch implements the refactor discussed in
https://inbox.sourceware.org/gcc/20260626191622.1785567-1-aarsenovic@baylibre.com/
for all the frontends and backends.
No functional changes intended.
A few points of note:
1. The C FE could undergo a process of "modernization" to remove the
places where it implements qualifier joins/merges ad-hocly. I
decided to leave this aside for now.
2. I decided to make qualifier_set a struct after all. In most cases,
it should be easy to remove all of the potential overhead that
entails, which is limited to just the 32-bit targets anyway, AFAICT
(it is trivially copyable and destructible, and it is 2 chars long,
so it should be passed by registers on many ABIs).
3. Due to cp_declarator, I had to make qualifier_set trivially
default-constructible (or, alternatively, add a constructor to
cp_declarator). This means it is slightly easier to misuse (because
'qualifier_set foo;' is uninitialized).
4. I didn't remove the Rust copies of expected/optional.h, as that broke
compilation a good bit. Also, the Rust versions use rust_assert, the
new GCC one of course does not. It'd be good to remove the former.
5. I've added a new union operation besides the 'merge' one discussed in
the previous email. Merging two qualifier sets produces a qualifier
set that can be used in place of both. The new operation ended up
being called 'join', and it simply produces a qualifier set
containing the qualifiers of both by simple syntactic concatenation.
6. Making the distinction above also made it quite clear what needs to
be done about the atomic qualifier. For join, it is OK for one QS to
have _Atomic but not the other; for merge, it is not.
The C++ Named Address Space implementation benefited greatly from this
patch (the changes here turned a number of bugs in that patch into
compile errors). I will send it soon (I want to write more
target-independent self-tests for it first).
The reason the CC list is so long is because this patch touches multiple
backends and nearly all frontends. Luckily, most of the changes are
mechanical, so, hopefully it shouldn't be difficult to review.
Reg-strapped on x86_64-linux-gnu, powerpc64le-linux-gnu.
Build-tested for rl78-elf.
Will be regression tested soon for amdgcn-amdhsa and (reg-strapped) for
s390x-ibm-linux-gnu. (these are slower)
OK for trunk? Assuming those tests find no bugs, of course.
TIA, have a lovely day!
Arsen Arsenović (2):
gcc: copy expected and optional out of rust/utils
gcc: stop using 'int' to represent sets of qualifiers
gcc/ada/gcc-interface/decl.cc | 15 +-
gcc/ada/gcc-interface/gigi.h | 14 +-
gcc/ada/gcc-interface/utils.cc | 3 +-
gcc/attribs.cc | 9 +-
gcc/attribs.h | 2 +-
gcc/c-family/c-ada-spec.cc | 6 +-
gcc/c-family/c-common.cc | 18 +-
gcc/c-family/c-common.h | 8 +-
gcc/c-family/c-format.cc | 2 +-
gcc/c-family/c-pretty-print.cc | 9 +-
gcc/c-family/c-pretty-print.h | 2 +-
gcc/c/c-aux-info.cc | 2 +-
gcc/c/c-decl.cc | 144 +-
gcc/c/c-objc-common.cc | 4 +-
gcc/c/c-parser.cc | 16 +-
gcc/c/c-tree.h | 6 +-
gcc/c/c-typeck.cc | 108 +-
gcc/config/gcn/gcn-tree.cc | 11 +-
gcc/config/i386/i386-builtins.cc | 2 +-
gcc/config/i386/i386.cc | 2 +-
gcc/config/rl78/rl78.cc | 2 +-
gcc/config/rs6000/rs6000-c.cc | 6 +-
gcc/config/rs6000/rs6000.cc | 2 +-
gcc/config/s390/s390-c.cc | 6 +-
gcc/coretypes.h | 2 +-
gcc/cp/call.cc | 8 +-
gcc/cp/class.cc | 2 +-
gcc/cp/cp-objcp-common.h | 5 +-
gcc/cp/cp-tree.h | 12 +-
gcc/cp/decl.cc | 12 +-
gcc/cp/error.cc | 2 +-
gcc/cp/mangle.cc | 7 +-
gcc/cp/method.cc | 32 +-
gcc/cp/module.cc | 3 +-
gcc/cp/pt.cc | 11 +-
gcc/cp/reflect.cc | 12 +-
gcc/cp/semantics.cc | 4 +-
gcc/cp/tree.cc | 34 +-
gcc/cp/typeck.cc | 42 +-
gcc/d/d-codegen.cc | 2 +-
gcc/d/types.cc | 2 +-
gcc/dwarf2out.cc | 46 +-
gcc/fold-const.cc | 2 +-
gcc/fortran/trans-openmp.cc | 2 +-
gcc/fortran/trans-types.cc | 3 +-
gcc/gimple-lower-bitint.cc | 21 +-
gcc/gimplify.cc | 13 +-
gcc/ipa-free-lang-data.cc | 5 +-
gcc/jit/dummy-frontend.cc | 2 +-
gcc/langhooks-def.h | 2 +-
gcc/langhooks.cc | 2 +-
gcc/langhooks.h | 5 +-
gcc/objc/objc-act.cc | 6 +-
gcc/omp-low.cc | 4 +-
gcc/omp-oacc-neuter-broadcast.cc | 4 +-
gcc/omp-offload.cc | 21 +-
gcc/rust/backend/rust-tree.cc | 35 +-
gcc/rust/backend/rust-tree.h | 10 +-
gcc/tree-core.h | 68 +-
gcc/tree-dump.cc | 7 +-
gcc/tree-inline.cc | 4 +-
gcc/tree-pretty-print.cc | 14 +-
gcc/tree-profile.cc | 2 +-
gcc/tree-sra.cc | 3 +-
gcc/tree-ssa-address.cc | 3 +-
gcc/tree-switch-conversion.cc | 3 +-
gcc/tree-vect-stmts.cc | 3 +-
gcc/tree.cc | 149 +-
gcc/tree.h | 322 +++-
gcc/ubsan.cc | 4 +-
gcc/util/expected.h | 2439 ++++++++++++++++++++++++++++++
gcc/util/expected_fwd.h | 24 +
gcc/util/optional.h | 2131 ++++++++++++++++++++++++++
gcc/util/optional_fwd.h | 24 +
gcc/vtable-verify.cc | 10 +-
libcc1/libcc1plugin.cc | 2 +-
libcc1/libcp1plugin.cc | 4 +-
77 files changed, 5569 insertions(+), 421 deletions(-)
create mode 100644 gcc/util/expected.h
create mode 100644 gcc/util/expected_fwd.h
create mode 100644 gcc/util/optional.h
create mode 100644 gcc/util/optional_fwd.h
--
2.54.0
More information about the Algol68
mailing list