> On Oct 30, 2024, at 19:59, Richard Sandiford <richard.sandif...@arm.com>
> wrote:
>
> Yangyu Chen <c...@cyyself.name> writes:
>> 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")
>>
>> 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.
>
> Thanks, LGTM. I've tested this locally and was about to push, but then
> realised: since you've already contributed changes (great!), it probably
> wouldn't be acceptable to treat it as trivial for copyright purposes.
> Could you confirm that you're contributing under the DCO:
> https://gcc.gnu.org/dco.html ? If so, could you repost with a
> Signed-off-by?
>
> Sorry for the administrivia.
I added signed-off-by and revised to v4:
https://patchwork.sourceware.org/project/gcc/patch/tencent_f08be088f6b1e3152e508c63c870e31cd...@qq.com/
Since this is a fix patch, it should also be committed to the
releases/gcc-14 branch.
Thanks,
Yangyu Chen
>
> Richard
>
>> ---
>> 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 5770491b30c..2b2d5b9e390 100644
>> --- a/gcc/config/aarch64/aarch64.cc
>> +++ b/gcc/config/aarch64/aarch64.cc
>> @@ -20437,6 +20437,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);
>> @@ -20456,6 +20460,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,