]> git.ipfire.org Git - thirdparty/gcc.git/commit
c: Add target_version attribute support.
authorAlfie Richards <alfie.richards@arm.com>
Wed, 2 Apr 2025 13:37:02 +0000 (13:37 +0000)
committerAlfie Richards <alfie.richards@arm.com>
Thu, 2 Oct 2025 08:29:06 +0000 (08:29 +0000)
commit73888cefe6da6531c590216c74ea5e04521897cb
treec023a9bfba52349d3b820f6b55989c4d88b2fbe0
parent5f08e49653f5c04df39faef23bba4abfb555e053
c: Add target_version attribute support.

This commit introduces support for the target_version attribute in the c
frontend, following the behavior defined in the Arm C Language Extension.

Key changes include:

- During pushdecl, the compiler now checks whether the current symbol is
  part of a multiversioned set.
  - New versions are added to the function multiversioning (FMV) set, and the
    symbol binding is updated to include the default version (if present).
    This means the binding for a multiversioned symbol will always reference
    the default version (if present), as it defines the scope and signature
    for the entire set.
  - Pre-existing versions are merged with their previous version (or diagnosed).
- Lookup logic is adjusted to prevent resolving non-default versions.
- start_decl and start_function are updated to handle marking and mangling of
  versioned functions.
- c_parse_final_cleanups now includes a call to process_same_body_aliases.
  This has no functional impact other than setting cpp_implicit_aliases_done
  on all nodes, which is necessary for certain shared FMV logic.

gcc/c/ChangeLog:

* c-decl.cc (maybe_mark_function_versioned): New function.
(merge_decls): Preserve DECL_FUNCTION_VERSIONED in merging.
(duplicate_decls): Add check and diagnostic for unmergable version decls.
(pushdecl): Add FMV target_version logic.
(lookup_name): Don't resolve non-default versions.
(start_decl): Mark and mangle versioned functions.
(start_function): Mark and mangle versioned functions.
(c_parse_final_cleanups): Add call to process_same_body_aliases.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/mv-1.c: New test.
* gcc.target/aarch64/mv-and-mvc1.c: New test.
* gcc.target/aarch64/mv-and-mvc2.c: New test.
* gcc.target/aarch64/mv-and-mvc3.c: New test.
* gcc.target/aarch64/mv-and-mvc4.c: New test.
* gcc.target/aarch64/mv-symbols1.c: New test.
* gcc.target/aarch64/mv-symbols10.c: New test.
* gcc.target/aarch64/mv-symbols11.c: New test.
* gcc.target/aarch64/mv-symbols12.c: New test.
* gcc.target/aarch64/mv-symbols13.c: New test.
* gcc.target/aarch64/mv-symbols14.c: New test.
* gcc.target/aarch64/mv-symbols2.c: New test.
* gcc.target/aarch64/mv-symbols3.c: New test.
* gcc.target/aarch64/mv-symbols4.c: New test.
* gcc.target/aarch64/mv-symbols5.c: New test.
* gcc.target/aarch64/mv-symbols6.c: New test.
* gcc.target/aarch64/mv-symbols7.c: New test.
* gcc.target/aarch64/mv-symbols8.c: New test.
* gcc.target/aarch64/mv-symbols9.c: New test.
* gcc.target/aarch64/mvc-symbols1.c: New test.
* gcc.target/aarch64/mvc-symbols2.c: New test.
* gcc.target/aarch64/mvc-symbols3.c: New test.
* gcc.target/aarch64/mvc-symbols4.c: New test.
24 files changed:
gcc/c/c-decl.cc
gcc/testsuite/gcc.target/aarch64/mv-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-and-mvc1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-and-mvc2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-and-mvc3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-and-mvc4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mv-symbols9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mvc-symbols1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mvc-symbols2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mvc-symbols3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/mvc-symbols4.c [new file with mode: 0644]