Hi All, This is an update on the patch series enabling ACLE compliant FMV behaviour for targets supporting target_version and a refactor of FMV in the front end.
This patch series leaves much of the logic that enables FMV for x86 in place, often gated behind TARGET_HAS_FMV_TARGET_ATTRIBUTE. I would like to refactor more of the x86/PPC logic. Possibly even making it match ACLE behaviour/semantics in places. but want to avoid breaking changes and regressions, and as I could not find any x86/PPC spec I thought best left alone for now. The main changes between last patch series and this one are: * Added pretty-print formatting support for string_slice. (I'm not sure I did this completely correctly though in the c-family front end?) * Large refactor to the merging/conflicting logic in the C++ front end. This is because I found flaws in the previous version which could merge target_version decls that weren't distinct, but weren't mergaeble. * This involved a large refactor of the common_function_version hook to take string_slices instead of decls, and moving the target_version/target_clone distinctness/mergability logic into shared code. * This has the added benefit of enabling riscv target_version/ target_clones automatically as it now uses the same shared code which wasn't possible before the hook refactor. * This did also require some hacks to the riscv target parsing code which would benefit from a more careful refactor. * Added warning and skipping for unparsable target_clones values * This is part of the ACLE that I missed last time. * It only works properly for Aarch64 at the moment. Though I use the hook to check parsing and emit errors for riscv as otherwise I was breaking a lot of things. * Ideally this would be implemented by other targets (especially riscv with the shared target_clones semantics) to enable some portability. I am also working on a patch to add target_version support to the C frontend while making it ACLE compliant, and a patch to update the redirect_to_specific_clone logic to work properly with ACLE semantics which will both use the work in this patch. Reg tested and bootstrapped on x86-linux-gnu and aarch64-linux-gnu. FMV tests ran for PowerPC and RiscV. Kind regards, Alfie Richards Alfie Richards (17): 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. Change make_attribute to take string_slice. Add get_clone_versions and get_version functions. 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. Refactor riscv target parsing to take string_slice. Add regect_target_clone hook and filter target_clone versions. Change target_version semantics to follow ACLE specification. Refactor FMV frontend hooks and logic. Support mixing of target_clones and target_version. Add error cases and tests for Aarch64 FMV. Remove FMV beta warning. Andrew Carlotti (2): Add PowerPC FMV symbol tests. Add x86 FMV symbol tests gcc/attribs.cc | 252 +++++---------- gcc/attribs.h | 6 +- gcc/c-family/c-attribs.cc | 29 +- gcc/c-family/c-format.cc | 9 + gcc/c-family/c-format.h | 1 + gcc/cgraph.cc | 28 +- gcc/cgraph.h | 20 +- gcc/cgraphclones.cc | 16 +- gcc/cgraphunit.cc | 9 + gcc/config/aarch64/aarch64.cc | 247 ++++++-------- gcc/config/aarch64/aarch64.opt | 2 +- gcc/config/i386/i386-features.cc | 141 ++++---- gcc/config/i386/i386.cc | 3 + gcc/config/riscv/riscv-protos.h | 2 + gcc/config/riscv/riscv-target-attr.cc | 14 +- gcc/config/riscv/riscv.cc | 231 ++++++------- gcc/config/rs6000/rs6000.cc | 153 ++++++--- gcc/cp/call.cc | 10 + gcc/cp/class.cc | 19 +- gcc/cp/cp-gimplify.cc | 11 +- gcc/cp/cp-tree.h | 4 +- gcc/cp/decl.cc | 79 ++++- gcc/cp/decl2.cc | 2 +- gcc/cp/typeck.cc | 10 + gcc/doc/invoke.texi | 5 +- gcc/doc/tm.texi | 9 +- gcc/doc/tm.texi.in | 2 + gcc/ipa.cc | 11 + gcc/multiple_target.cc | 304 +++++++++--------- gcc/pretty-print.cc | 10 + gcc/target.def | 14 +- gcc/testsuite/g++.target/aarch64/mv-1.C | 5 +- .../g++.target/aarch64/mv-and-mvc-error1.C | 9 + .../g++.target/aarch64/mv-and-mvc-error2.C | 9 + .../g++.target/aarch64/mv-and-mvc-error3.C | 8 + .../g++.target/aarch64/mv-and-mvc1.C | 37 +++ .../g++.target/aarch64/mv-and-mvc2.C | 28 ++ .../g++.target/aarch64/mv-and-mvc3.C | 40 +++ .../g++.target/aarch64/mv-and-mvc4.C | 37 +++ gcc/testsuite/g++.target/aarch64/mv-error1.C | 18 ++ gcc/testsuite/g++.target/aarch64/mv-error2.C | 9 + gcc/testsuite/g++.target/aarch64/mv-error3.C | 12 + gcc/testsuite/g++.target/aarch64/mv-error4.C | 9 + gcc/testsuite/g++.target/aarch64/mv-error5.C | 8 + gcc/testsuite/g++.target/aarch64/mv-error6.C | 20 ++ gcc/testsuite/g++.target/aarch64/mv-error7.C | 11 + gcc/testsuite/g++.target/aarch64/mv-error8.C | 12 + gcc/testsuite/g++.target/aarch64/mv-pragma.C | 1 - .../g++.target/aarch64/mv-symbols1.C | 1 - .../g++.target/aarch64/mv-symbols10.C | 26 ++ .../g++.target/aarch64/mv-symbols11.C | 29 ++ .../g++.target/aarch64/mv-symbols12.C | 27 ++ .../g++.target/aarch64/mv-symbols13.C | 27 ++ .../g++.target/aarch64/mv-symbols2.C | 13 +- .../g++.target/aarch64/mv-symbols3.C | 7 +- .../g++.target/aarch64/mv-symbols4.C | 7 +- .../g++.target/aarch64/mv-symbols5.C | 7 +- .../g++.target/aarch64/mv-symbols6.C | 24 ++ .../g++.target/aarch64/mv-symbols7.C | 47 +++ .../g++.target/aarch64/mv-symbols8.C | 45 +++ .../g++.target/aarch64/mv-symbols9.C | 42 +++ .../g++.target/aarch64/mv-warning1.C | 9 - gcc/testsuite/g++.target/aarch64/mvc-error1.C | 9 + gcc/testsuite/g++.target/aarch64/mvc-error2.C | 9 + .../g++.target/aarch64/mvc-symbols1.C | 1 - .../g++.target/aarch64/mvc-symbols2.C | 1 - .../g++.target/aarch64/mvc-symbols3.C | 13 +- .../g++.target/aarch64/mvc-symbols4.C | 1 - .../g++.target/aarch64/mvc-warning1.C | 11 +- 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 | 224 +++++++++++-- gcc/tree.h | 21 +- gcc/vec.cc | 207 ++++++++++++ gcc/vec.h | 45 +++ 91 files changed, 2504 insertions(+), 874 deletions(-) create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc-error1.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc-error2.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc-error3.C 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-error2.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error3.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error4.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error5.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error6.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-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-symbols13.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols7.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 create mode 100644 gcc/testsuite/g++.target/aarch64/mvc-error1.C create mode 100644 gcc/testsuite/g++.target/aarch64/mvc-error2.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