Hi all, This is a minor update to V4.
Firstly it updates the diagnostics for versioned function decls to include the target_version/target_clones attribute, and simplified the diagnostic logic changes in cpp/c frontends. Secondly, I merged this series with my C FMV support series and my FMV inlining optimization patch. It proved keeping 3 patch series in sync was more bother than it was worth. Kind regards, Alfie Richards Change log ========== V5: - Merged patch series with C support series, and FMV call inlining optimization - Addressed Jason's feedback and simplified the diagnostics for FMV. V4: https://gcc.gnu.org/pipermail/gcc-patches/2025-April/681047.html - Changed version_info structure to be sorted by priority - Split the target_clones pass into early/late stages - Split out fix for PR c++/119498 V3: https://gcc.gnu.org/pipermail/gcc-patches/2025-March/679488.html - Added reject target_clones version logic and hook - Added pretty print for string_slice - Refactored merging and conflict logic in front end - Improved diagnostics V2: https://gcc.gnu.org/pipermail/gcc-patches/2025-February/675960.html - Changed recording of assembly name to be done in version into initialisation - Changed behaviour for a lone default decl V1: https://gcc.gnu.org/pipermail/gcc-patches/2025-February/674973.html - Initial Alfie Richards (22): Add string_slice class. Remove unnecessary `record` argument from maybe_version_functions. Update is_function_default_version to work with target_version. Refactor record_function_versions. Change make_attribute to take string_slice. Add get_clone_versions and get_target_version functions. Add assembler_name to cgraph_function_version_info. Add dispatcher_resolver_function and is_target_clone flags to cgraph_node. Add clone_identifier function. fmv: i386: Refactor FMV name mangling. riscv: Refactor riscv target parsing to take string_slice. fmv: Add reject_target_clone hook for filtering target_clone versions. fmv: Change target_version semantics to follow ACLE specification. c/c++: Add target_[version/clones] to decl diagnostics formatting. c++: Refactor FMV frontend conflict and merging logic and hooks. fmv: Support mixing of target_clones and target_version. c++: Fix FMV return type ambiguation aarch64: testsuite: Add diagnostic tests for Aarch64 FMV. aarch64: Remove FMV beta warning. c: Add target_version attribute support. c/aarch64: Add FMV diagnostic tests. FMV: Redirect to specific target Alice Carlotti (2): ppc: Add PowerPC FMV symbol tests. i386: Add x86 FMV symbol tests gcc/attribs.cc | 186 +++---- gcc/attribs.h | 6 +- gcc/c-family/c-attribs.cc | 33 +- gcc/c-family/c-format.cc | 7 + gcc/c-family/c-format.h | 1 + gcc/c-family/c-pretty-print.cc | 65 +++ gcc/c-family/c-pretty-print.h | 2 + gcc/c/c-decl.cc | 113 ++++ gcc/c/c-objc-common.cc | 6 + gcc/cgraph.cc | 80 +-- gcc/cgraph.h | 29 +- gcc/cgraphclones.cc | 16 +- gcc/cgraphunit.cc | 9 + gcc/config/aarch64/aarch64.cc | 299 +++++----- gcc/config/aarch64/aarch64.opt | 2 +- gcc/config/i386/i386-features.cc | 141 ++--- gcc/config/riscv/riscv-protos.h | 2 + gcc/config/riscv/riscv-target-attr.cc | 14 +- gcc/config/riscv/riscv.cc | 267 ++++----- gcc/config/rs6000/rs6000.cc | 150 +++-- gcc/cp/call.cc | 10 + gcc/cp/class.cc | 18 +- gcc/cp/cp-gimplify.cc | 11 +- gcc/cp/cp-tree.h | 2 +- gcc/cp/cxx-pretty-print.h | 4 + gcc/cp/decl.cc | 55 +- gcc/cp/decl2.cc | 2 +- gcc/cp/error.cc | 3 + gcc/cp/typeck.cc | 10 + gcc/doc/invoke.texi | 5 +- gcc/doc/tm.texi | 20 +- gcc/doc/tm.texi.in | 4 + gcc/hooks.cc | 13 + gcc/hooks.h | 4 + gcc/ipa.cc | 11 + gcc/multiple_target.cc | 517 ++++++++++-------- gcc/passes.def | 3 +- gcc/pretty-print.cc | 10 + gcc/target.def | 30 +- .../g++.target/aarch64/fmv-selection1.C | 40 ++ .../g++.target/aarch64/fmv-selection2.C | 40 ++ .../g++.target/aarch64/fmv-selection3.C | 25 + .../g++.target/aarch64/fmv-selection4.C | 30 + .../g++.target/aarch64/fmv-selection5.C | 28 + .../g++.target/aarch64/fmv-selection6.C | 27 + 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 | 20 + .../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/testsuite/gcc.target/aarch64/mv-1.c | 43 ++ .../gcc.target/aarch64/mv-and-mvc-error1.c | 9 + .../gcc.target/aarch64/mv-and-mvc-error2.c | 9 + .../gcc.target/aarch64/mv-and-mvc-error3.c | 8 + .../gcc.target/aarch64/mv-and-mvc1.c | 37 ++ .../gcc.target/aarch64/mv-and-mvc2.c | 28 + .../gcc.target/aarch64/mv-and-mvc3.c | 40 ++ .../gcc.target/aarch64/mv-and-mvc4.c | 37 ++ gcc/testsuite/gcc.target/aarch64/mv-error1.c | 18 + gcc/testsuite/gcc.target/aarch64/mv-error2.c | 9 + gcc/testsuite/gcc.target/aarch64/mv-error3.c | 12 + gcc/testsuite/gcc.target/aarch64/mv-error4.c | 9 + gcc/testsuite/gcc.target/aarch64/mv-error5.c | 8 + gcc/testsuite/gcc.target/aarch64/mv-error6.c | 20 + gcc/testsuite/gcc.target/aarch64/mv-error7.c | 11 + gcc/testsuite/gcc.target/aarch64/mv-error8.c | 12 + gcc/testsuite/gcc.target/aarch64/mv-error9.c | 12 + .../gcc.target/aarch64/mv-symbols1.c | 38 ++ .../gcc.target/aarch64/mv-symbols10.c | 42 ++ .../gcc.target/aarch64/mv-symbols11.c | 16 + .../gcc.target/aarch64/mv-symbols12.c | 27 + .../gcc.target/aarch64/mv-symbols13.c | 28 + .../gcc.target/aarch64/mv-symbols2.c | 28 + .../gcc.target/aarch64/mv-symbols3.c | 27 + .../gcc.target/aarch64/mv-symbols4.c | 31 ++ .../gcc.target/aarch64/mv-symbols5.c | 36 ++ .../gcc.target/aarch64/mv-symbols6.c | 20 + .../gcc.target/aarch64/mv-symbols7.c | 47 ++ .../gcc.target/aarch64/mv-symbols8.c | 47 ++ .../gcc.target/aarch64/mv-symbols9.c | 44 ++ gcc/testsuite/gcc.target/aarch64/mvc-error1.c | 9 + gcc/testsuite/gcc.target/aarch64/mvc-error2.c | 9 + .../gcc.target/aarch64/mvc-symbols1.c | 25 + .../gcc.target/aarch64/mvc-symbols2.c | 15 + .../gcc.target/aarch64/mvc-symbols3.c | 19 + .../gcc.target/aarch64/mvc-symbols4.c | 12 + .../gcc.target/aarch64/mvc-warning1.c | 13 + gcc/tree.cc | 315 ++++++++++- gcc/tree.h | 24 +- gcc/vec.cc | 207 +++++++ gcc/vec.h | 45 ++ 142 files changed, 4081 insertions(+), 939 deletions(-) create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection1.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection2.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection3.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection4.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection5.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection6.C 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 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error7.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error9.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols10.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols11.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols12.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols13.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols7.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols9.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-error1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-error2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-warning1.c -- 2.34.1