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

Reply via email to