<alfie.richa...@arm.com> writes:
> From: Alfie Richards <alfie.richa...@arm.com>
>
> This patch is an overhaul of how FMV name mangling works. Previously
> mangling logic was duplicated in several places across both target
> specific and independent code. This patch changes this such that all
> mangling is done in targetm.mangle_decl_assembler_name (including for the
> dispatched symbol and dispatcher resolver).
>
> Adds the assembler_name member to cgraph_function_version_info to store
> the base assembler name of the function set, before FMV mangling.
>
> This allows for the removing of previous hacks, such as where the default
> mangled decl's assembler name was unmangled to then remangle all versions
> and the resolver and dispatched symbol.
>
> This introduces a change (shown in test changes) for the assembler name of the
> dispatched symbol for a x86 versioned function set. Previously it used the
> function name mangled twice. This was hard to reproduce without hacks I
> wasn't comfortable with. Therefore, the mangling is changed to instead append
> ".ifunc" which matches clang's behavior.
>
> This change also refactors expand_target_clone using
> targetm.mangle_decl_assembler_name for mangling and get_clone_versions.
> It is modified such that if the target_clone is in a FMV structure
> the ordering is preserved once expanded. This is used later for ACLE semantics
> and target_clone/target_version mixing.
>
> gcc/ChangeLog:
>
>       * attribs.cc (make_dispatcher_decl): Move duplicated cgraph logic into
>       this function and change to use targetm.mangle_decl_assembler_name for
>       mangling.
>       * cgraph.cc (cgraph_node::insert_new_function_version): Record
>       assembler_name.
>       * cgraph.h (struct cgraph_function_version_info): Add assembler_name.
>       (struct cgraph_node): Add dispatcher_resolver_function and
>       is_target_clone.
>       * config/aarch64/aarch64.cc (aarch64_parse_fmv_features): Change to
>       support string_slice.
>       (aarch64_process_target_version_attr): Ditto.
>       (get_feature_mask_for_version): Ditto.
>       (aarch64_mangle_decl_assembler_name): Add logic for mangling dispatched
>       symbol and resolver.
>       (get_suffixed_assembler_name): Removed.
>       (make_resolver_func): Refactor to use
>       aarch64_mangle_decl_assembler_name for mangling.
>       (aarch64_generate_version_dispatcher_body): Remove remangling.
>       (aarch64_get_function_versions_dispatcher): Refactor to remove
>       duplicated cgraph logic.
>       * config/i386/i386-features.cc
>       (ix86_mangle_function_version_assembler_name): Refactor to use
>       clone_identifier and to mangle default.
>       (ix86_mangle_decl_assembler_name): Add logic for mangling dispatched
>       symbol and resolver.
>       (ix86_get_function_versions_dispatcher): Remove duplicated cgraph
>       logic.
>       (make_resolver_func): Refactor to use ix86_mangle_decl_assembler_name
>       for mangling.
>       * config/riscv/riscv.cc (riscv_mangle_decl_assembler_name): Add logic
>       for FMV mangling.
>       (get_suffixed_assembler_name): Removed.
>       (make_resolver_func): Refactor to use riscv_mangle_decl_assembler_name
>       for mangling.
>       (riscv_generate_version_dispatcher_body): Remove unnecessary remangling.
>       (riscv_get_function_versions_dispatcher): Remove duplicated cgraph
>       logic.
>       * config/rs6000/rs6000.cc (rs6000_mangle_decl_assembler_name): New
>       function.
>       (rs6000_get_function_versions_dispatcher): Remove duplicated cgraph
>       logic.
>       (make_resolver_func): Refactor to use rs6000_mangle_decl_assembler_name
>       for mangling.
>       (rs6000_mangle_function_version_assembler_name): New function.
>       * multiple_target.cc (create_dispatcher_calls): Remove mangling code.
>       (get_attr_str): Removed.
>       (separate_attrs): Ditto.
>       (is_valid_asm_symbol): Removed.
>       (create_new_asm_name): Ditto.
>       (expand_target_clones): Refactor to use
>       targetm.mangle_decl_assembler_name for mangling and be more general.
>       * tree.cc (get_target_clone_attr_len): Removed.
>       * tree.h (get_target_clone_attr_len): Removed.
>
> gcc/cp/ChangeLog:
>
>       * decl.cc (maybe_mark_function_versioned): Change to insert function 
> version
>       and therefore record assembler name.
>
> gcc/testsuite/ChangeLog:
>
>       * g++.target/i386/mv-symbols1.C: Update x86 FMV mangling.
>       * g++.target/i386/mv-symbols3.C: Ditto.
>       * g++.target/i386/mv-symbols4.C: Ditto.
>       * g++.target/i386/mv-symbols5.C: Ditto.
> ---

OK for these files:

>  gcc/attribs.cc                              |  45 +++-
>  gcc/cgraph.cc                               |   1 +
>  gcc/cgraph.h                                |  13 +-
>  gcc/multiple_target.cc                      | 250 ++++++--------------
>  gcc/tree.cc                                 |  26 --
>  gcc/tree.h                                  |   2 -

I'll leave the C++, x86, and RISC-V changes to people more qualified.

A formatting nit though:

> +  /* If this target_clones contains a default, then convert this node to the
> +     default.  If this node does not contain default (this is only possible
> +     in target_version semantics) then remove the node.  This is safe at this
> +     point as only target_clones declarations containing default version is
> +     resolvable so this decl will have no calls/references.  */
> +
> +  tree attrs =  remove_attribute ("target_clones",

should only be one space after "=".

Thanks,
Richard

Reply via email to