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 get this fixed by adding DECL_EXTERNAL to the decl.
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")
gcc/ChangeLog:
* config/aarch64/aarch64.cc (dispatch_function_versions): Adding
DECL_EXTERNAL to __init_cpu_features_resolver decl.
---
gcc/config/aarch64/aarch64.cc | 1 +
1 file changed, 1 insertion(+)
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 5770491b30c..2baa8c5d5c0 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -20437,6 +20437,7 @@ 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 arg1 = DECL_ARGUMENTS (dispatch_decl);
tree arg2 = TREE_CHAIN (arg1);
ifunc_cpu_init_stmt = gimple_build_call (init_fn_decl, 2, arg1, arg2);
--
2.47.0