]> git.ipfire.org Git - thirdparty/gcc.git/commit
fmv: c++: Change target_version semantics to follow ACLE specification.
authorAlfie Richards <alfie.richards@arm.com>
Thu, 13 Feb 2025 15:30:45 +0000 (15:30 +0000)
committerAlfie Richards <alfie.richards@arm.com>
Tue, 23 Sep 2025 09:47:43 +0000 (09:47 +0000)
commitaeb9a43bbb2e92d5e4b93250785701d0e37355d9
tree8d0778cd588fa4dc5bd714340dd22b12841e39fd
parent3cc894e7c38c6ffaaa79ae92181b32c248f0d837
fmv: c++: Change target_version semantics to follow ACLE specification.

This patch changes the semantics of target_version and target_clones attributes
to match the behavior described in the Arm C Language extension.

The changes to behavior are:

- The scope and signature of an FMV function set is now that of the default
  version.
- The FMV resolver is now created at the locations of the default version
  implementation. Previously this was at the first call to an FMV function.
- When a TU has a single annotated function version, it gets mangled.
  - This includes a lone annotated default version.

This only affects targets with TARRGET_HAS_FMV_TARGET_ATTRIBUTE set to false.
Currently that is aarch64 and riscv.

This is achieved by:

- Skipping the existing FMV dispatching code at C++ gimplification and instead
  making use of the target_clones dispatching code in multiple_targets.cc.
  (This fixes PR target/118313 for aarch64 and riscv).
- Splitting target_clones pass in two, an early and late pass, where the early
  pass handles cases where multiple declarations are used to define a version,
  and the late pass handling target semantics targets, and cases where a FMV
  set is defined by a single target_clones decl.
- Changing the logic in add_candidates and resolve_address of overloaded
  function to prevent resolution of any version except a default version.
  (thus making the default version determine scope and signature of the
  versioned function set).
- Adding logic for dispatching a lone annotated default version in
  multiple_targets.cc
  - As as annotated default version gets mangled an alias is created from the
    dispatched symbol to the default version as no ifunc resolution is required
    in this case. (ie. an alias from `_Z3foov` to `_Z3foov.default`)
- Adding logic to `symbol_table::remove_unreachable_nodes` and analyze_functions
  that a reference to the default function version also implies a possible
  reference to the other versions (so they shouldnt be deleted and do need to
  be analyzed).

gcc/ChangeLog:

PR target/118313
* cgraph.cc (delete_function_version): Made public static member of
cgraph_node.
* cgraph.h (delete_function_version): Ditto.
* cgraphunit.cc (analyze_functions): Add logic for target version
dependencies.
* ipa.cc (symbol_table::remove_unreachable_nodes): Ditto.
* multiple_target.cc (create_dispatcher_calls): Change to support
target version semantics.
(ipa_target_clone): Change to dispatch all function sets in
target_version semantics, and to have early and late pass.
(expand_target_clones): Add logic for cases of target_clones with no
defaults.
(is_simple_target_clones_case): New function.
(class pass_target_clone): New parameter for early or late pass.
* config/aarch64/aarch64.cc: (aarch64_get_function_versions_dispatcher):
Refactor with the assumption that the DECL node will be default.
* config/riscv/riscv.cc: (riscv_get_function_versions_dispatcher):
Refactor with the assumption that the DECL node will be default.
* passes.def: Split target_clones pass into early and late version.

gcc/cp/ChangeLog:

PR target/118313
* call.cc (add_candidates): Change to not resolve non-default versions
in target_version semantics.
* class.cc (resolve_address_of_overloaded_function): Ditto.
* cp-gimplify.cc (cp_genericize_r): Change logic to not apply for
target_version semantics.
* decl.cc (maybe_mark_function_versioned): Remove static.
* cp-tree.h (maybe_mark_function_versioned): New function.
* decl2.cc (cplus_decl_attributes ): Change to mark and therefore
mangle all target_version decls in target_version semantics.
* typeck.cc (cp_build_function_call_vec): Add error for calling
unresolvable non-default node in target_version semantics.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-1.C: Change for target_version semantics.
* g++.target/aarch64/mv-symbols2.C: Ditto.
* g++.target/aarch64/mv-symbols3.C: Ditto.
* g++.target/aarch64/mv-symbols4.C: Ditto.
* g++.target/aarch64/mv-symbols5.C: Ditto.
* g++.target/aarch64/mvc-symbols3.C: Ditto.
* g++.target/riscv/mv-symbols2.C: Ditto.
* g++.target/riscv/mv-symbols3.C: Ditto.
* g++.target/riscv/mv-symbols4.C: Ditto.
* g++.target/riscv/mv-symbols5.C: Ditto.
* g++.target/riscv/mvc-symbols3.C: Ditto.
* g++.target/aarch64/mv-symbols10.C: New test.
* g++.target/aarch64/mv-symbols11.C: New test.
* g++.target/aarch64/mv-symbols12.C: New test.
* g++.target/aarch64/mv-symbols13.C: New test.
* g++.target/aarch64/mv-symbols6.C: New test.
* g++.target/aarch64/mv-symbols7.C: New test.
* g++.target/aarch64/mv-symbols8.C: New test.
* g++.target/aarch64/mv-symbols9.C: New test.
34 files changed:
gcc/cgraph.cc
gcc/cgraph.h
gcc/cgraphunit.cc
gcc/config/aarch64/aarch64.cc
gcc/config/riscv/riscv.cc
gcc/cp/call.cc
gcc/cp/class.cc
gcc/cp/cp-gimplify.cc
gcc/cp/cp-tree.h
gcc/cp/decl.cc
gcc/cp/decl2.cc
gcc/cp/typeck.cc
gcc/ipa.cc
gcc/multiple_target.cc
gcc/passes.def
gcc/testsuite/g++.target/aarch64/mv-1.C
gcc/testsuite/g++.target/aarch64/mv-symbols10.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mv-symbols11.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mv-symbols12.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mv-symbols13.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mv-symbols2.C
gcc/testsuite/g++.target/aarch64/mv-symbols3.C
gcc/testsuite/g++.target/aarch64/mv-symbols4.C
gcc/testsuite/g++.target/aarch64/mv-symbols5.C
gcc/testsuite/g++.target/aarch64/mv-symbols6.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mv-symbols7.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mv-symbols8.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mv-symbols9.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mvc-symbols3.C
gcc/testsuite/g++.target/riscv/mv-symbols2.C
gcc/testsuite/g++.target/riscv/mv-symbols3.C
gcc/testsuite/g++.target/riscv/mv-symbols4.C
gcc/testsuite/g++.target/riscv/mv-symbols5.C
gcc/testsuite/g++.target/riscv/mvc-symbols3.C