Hello, This patch series intends to changes the behavior of targets with TARGET_HAS_FMV_TARGET_ATTRIBUTE set to false (ie. uses target_version attributes for FMV as opposed to target attributes) to follow the behavior specified in the Arm C Language Extension.
There is significant refactoring to FMV in the process. Notable changes include: * Introduction of the string_slice class. * Refactoring FMV mangling to always use the existing hook. * Changing the x86 mangling of dispatched symbols. * Adding new members to cgraph_function_version_info and cgraph_node. * Specifically, adding cgraph logic earlier in the C and C++ front ends than it was previously. * Changing the cgraph_function_version_info to be implicitly ordered. * Changing resolver creation for target_version to reuse the target_clones logic. * Only creating the resolver (in target_version semantics) when the default version is implemented. * Changing C++ symbol resolution for target_version semantics to only resolve default versions. * ie. changing the scope and signature of the FMV function set to be determined by default versions. I would appreciate overall feedback on these changes, and specific thoughts on the behavioral changes it makes to riscv FMV (as it also uses target_version semantics) and to the mangling change for x86 (see test changes for both) from relevant maintainers. These changes are targeting GCC 16 stage 1. Regression tested and bootstrapped for aarch64-none-linux-gnu and x86_64-unknown-linux-gnu. Cross compiled and the FMV tests ran for riscv and powerpc. Kind regards, Alfie Richards Alfie Richards (16): Add PowerPC FMV symbol tests. Add x86 FMV symbol tests Add string_slice class. Remove unnecessary `record` argument from maybe_version_functions. Update is_function_default_version to work with target_version. Change function versions to be implicitly ordered. Add version of make_attribute supporting string_slice. Add get_clone_versions function. Add assembler_name to cgraph_function_version_info. Add dispatcher_resolver_function and is_target_clone to cgraph_node. Add clone_identifier function. Refactor FMV name mangling. Remove unused target_clone parsing code. Change target_version semantics to follow ACLE specification. Support mixing of target_clones and target_version for aarch64. Remove FMV beta warning. gcc/attribs.cc | 79 ++++-- gcc/attribs.h | 1 + gcc/c-family/c-attribs.cc | 4 +- gcc/c/c-decl.cc | 20 ++ gcc/cgraph.cc | 49 +++- gcc/cgraph.h | 31 ++- gcc/cgraphclones.cc | 16 +- gcc/cgraphunit.cc | 9 + gcc/config/aarch64/aarch64.cc | 233 ++++++++---------- gcc/config/i386/i386-features.cc | 123 +++++---- gcc/config/riscv/riscv.cc | 136 ++++------ gcc/config/rs6000/rs6000.cc | 139 ++++++++--- gcc/cp/call.cc | 8 + gcc/cp/class.cc | 13 +- gcc/cp/cp-gimplify.cc | 6 +- gcc/cp/cp-tree.h | 2 +- gcc/cp/decl.cc | 80 +++++- gcc/cp/typeck.cc | 8 + gcc/ipa.cc | 11 + gcc/multiple_target.cc | 220 ++++++----------- gcc/testsuite/g++.target/aarch64/mv-1.C | 6 +- .../g++.target/aarch64/mv-and-mvc1.C | 38 +++ .../g++.target/aarch64/mv-and-mvc2.C | 29 +++ .../g++.target/aarch64/mv-and-mvc3.C | 41 +++ .../g++.target/aarch64/mv-and-mvc4.C | 38 +++ gcc/testsuite/g++.target/aarch64/mv-error1.C | 13 + gcc/testsuite/g++.target/aarch64/mv-error13.C | 13 + gcc/testsuite/g++.target/aarch64/mv-error2.C | 10 + gcc/testsuite/g++.target/aarch64/mv-error3.C | 13 + gcc/testsuite/g++.target/aarch64/mv-error7.C | 9 + gcc/testsuite/g++.target/aarch64/mv-error8.C | 21 ++ gcc/testsuite/g++.target/aarch64/mv-error9.C | 12 + gcc/testsuite/g++.target/aarch64/mv-pragma.C | 2 +- .../g++.target/aarch64/mv-symbols1.C | 2 +- .../g++.target/aarch64/mv-symbols10.C | 43 ++++ .../g++.target/aarch64/mv-symbols11.C | 27 ++ .../g++.target/aarch64/mv-symbols12.C | 18 ++ .../g++.target/aarch64/mv-symbols14.C | 16 ++ .../g++.target/aarch64/mv-symbols15.C | 16 ++ .../g++.target/aarch64/mv-symbols2.C | 14 +- .../g++.target/aarch64/mv-symbols3.C | 8 +- .../g++.target/aarch64/mv-symbols4.C | 8 +- .../g++.target/aarch64/mv-symbols5.C | 8 +- .../g++.target/aarch64/mv-symbols6.C | 23 ++ .../g++.target/aarch64/mv-symbols8.C | 48 ++++ .../g++.target/aarch64/mv-symbols9.C | 46 ++++ .../g++.target/aarch64/mv-warning1.C | 9 - .../g++.target/aarch64/mvc-symbols1.C | 2 +- .../g++.target/aarch64/mvc-symbols2.C | 2 +- .../g++.target/aarch64/mvc-symbols3.C | 14 +- .../g++.target/aarch64/mvc-symbols4.C | 2 +- .../g++.target/aarch64/mvc-warning1.C | 6 - gcc/testsuite/g++.target/i386/mv-symbols1.C | 68 +++++ gcc/testsuite/g++.target/i386/mv-symbols2.C | 56 +++++ gcc/testsuite/g++.target/i386/mv-symbols3.C | 44 ++++ gcc/testsuite/g++.target/i386/mv-symbols4.C | 50 ++++ gcc/testsuite/g++.target/i386/mv-symbols5.C | 56 +++++ gcc/testsuite/g++.target/i386/mvc-symbols1.C | 44 ++++ gcc/testsuite/g++.target/i386/mvc-symbols2.C | 29 +++ gcc/testsuite/g++.target/i386/mvc-symbols3.C | 35 +++ gcc/testsuite/g++.target/i386/mvc-symbols4.C | 23 ++ .../g++.target/powerpc/mvc-symbols1.C | 47 ++++ .../g++.target/powerpc/mvc-symbols2.C | 35 +++ .../g++.target/powerpc/mvc-symbols3.C | 41 +++ .../g++.target/powerpc/mvc-symbols4.C | 29 +++ gcc/testsuite/g++.target/riscv/mv-symbols2.C | 12 +- gcc/testsuite/g++.target/riscv/mv-symbols3.C | 6 +- gcc/testsuite/g++.target/riscv/mv-symbols4.C | 6 +- gcc/testsuite/g++.target/riscv/mv-symbols5.C | 6 +- gcc/testsuite/g++.target/riscv/mvc-symbols3.C | 12 +- gcc/tree.cc | 52 ++-- gcc/tree.h | 6 +- gcc/vec.cc | 157 ++++++++++++ gcc/vec.h | 38 +++ 74 files changed, 2007 insertions(+), 590 deletions(-) create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc1.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc2.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc3.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc4.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error1.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error13.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error2.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error3.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error7.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error8.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error9.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols10.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols11.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols12.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols14.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols15.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols8.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols9.C delete mode 100644 gcc/testsuite/g++.target/aarch64/mv-warning1.C delete mode 100644 gcc/testsuite/g++.target/aarch64/mvc-warning1.C create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols1.C create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols2.C create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols3.C create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols4.C create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols5.C create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols1.C create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols2.C create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols3.C create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols4.C create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols1.C create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols2.C create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols3.C create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols4.C -- 2.34.1