https://gcc.gnu.org/g:4e174ac8ee96a484be97313a90d2e831e978e27e

commit r14-10858-g4e174ac8ee96a484be97313a90d2e831e978e27e
Author: Yangyu Chen <c...@cyyself.name>
Date:   Thu Oct 31 19:52:45 2024 +0000

    Fix function multiversioning dispatcher link error with LTO
    
    We forgot to apply DECL_EXTERNAL to __init_cpu_features_resolver decl. When
    building with LTO, the linker cannot find the
    __init_cpu_features_resolver.lto_priv* symbol, causing the link error.
    
    This patch gets this fixed by adding DECL_EXTERNAL to the decl. To avoid 
used
    but never defined warning for this symbol, we also mark TREE_PUBLIC to the 
decl.
    We should also mark the decl having hidden visibility. And fix the 
attribute in
    the same way for __aarch64_cpu_features identifier.
    
    Minimal steps to reproduce the bug:
    
    echo '__attribute__((target_clones("default", "aes"))) void func1() { }' > 
1.c
    echo '__attribute__((target_clones("default", "aes"))) void func2() { }' > 
2.c
    echo 'void func1();void func2();int main(){func1();func2();return 0;}' > 
main.c
    gcc -flto -c 1.c 2.c
    gcc -flto main.c 1.o 2.o
    
    Fixes: 0cfde688e213 ("[aarch64] Add function multiversioning support")
    Signed-off-by: Yangyu Chen <c...@cyyself.name>
    
    gcc/ChangeLog:
    
            * config/aarch64/aarch64.cc (dispatch_function_versions): Adding
            DECL_EXTERNAL, TREE_PUBLIC and hidden DECL_VISIBILITY to
            __init_cpu_features_resolver and __aarch64_cpu_features.
    
    (cherry picked from commit 875279ff3ee3b4135401286b8378087a24fd0f8d)

Diff:
---
 gcc/config/aarch64/aarch64.cc | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index e9bca8bbd08b..33a46c9eabec 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -20283,6 +20283,10 @@ dispatch_function_versions (tree dispatch_decl,
   tree init_fn_id = get_identifier ("__init_cpu_features_resolver");
   tree init_fn_decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
                                  init_fn_id, init_fn_type);
+  DECL_EXTERNAL (init_fn_decl) = 1;
+  TREE_PUBLIC (init_fn_decl) = 1;
+  DECL_VISIBILITY (init_fn_decl) = VISIBILITY_HIDDEN;
+  DECL_VISIBILITY_SPECIFIED (init_fn_decl) = 1;
   tree arg1 = DECL_ARGUMENTS (dispatch_decl);
   tree arg2 = TREE_CHAIN (arg1);
   ifunc_cpu_init_stmt = gimple_build_call (init_fn_decl, 2, arg1, arg2);
@@ -20302,6 +20306,9 @@ dispatch_function_versions (tree dispatch_decl,
                                get_identifier ("__aarch64_cpu_features"),
                                global_type);
   DECL_EXTERNAL (global_var) = 1;
+  TREE_PUBLIC (global_var) = 1;
+  DECL_VISIBILITY (global_var) = VISIBILITY_HIDDEN;
+  DECL_VISIBILITY_SPECIFIED (global_var) = 1;
   tree mask_var = create_tmp_var (long_long_unsigned_type_node);
 
   tree component_expr = build3 (COMPONENT_REF, long_long_unsigned_type_node,

Reply via email to