Hi, Christophe,

Thanks for reporting the issue. 

Yes, the testing cases I added only got tested on aarch64 and x86_64 platforms, 
failures on other platforms are expected.

I will take a look on this and to see how to resolve the testing issues.

Qing

> On Sep 10, 2021, at 3:47 AM, Christophe LYON <christophe.l...@foss.st.com> 
> wrote:
> 
> 
> On 10/09/2021 00:49, Qing Zhao via Gcc-patches wrote:
>> Hi, FYI
>> 
>> I just committed the following patch to gcc upstream:
>> 
>> 
>> https://gcc.gnu.org/pipermail/gcc-cvs/2021-September/353195.html
>> 
> Hi,
> 
> Several of the new tests fail on arm and aarch64 with -mabi=ilp32.
> 
> On arm:
> 
> gcc:gcc.dg/dg.exp=c-c++-common/auto-init-1.c  -Wc++-compat   scan-tree-dump 
> gimple "temp5 = .DEFERRED_INIT \\(8, 2, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-1.c  -Wc++-compat   
> scan-tree-dump gimple "temp7 = .DEFERRED_INIT \\(8, 2, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-2.c  -Wc++-compat   
> scan-tree-dump gimple "temp5 = .DEFERRED_INIT \\(8, 1, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-2.c  -Wc++-compat   
> scan-tree-dump gimple "temp7 = .DEFERRED_INIT \\(8, 1, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-3.c  -Wc++-compat   
> scan-tree-dump gimple "temp3 = .DEFERRED_INIT \\(16, 2, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-4.c  -Wc++-compat   
> scan-tree-dump gimple "temp3 = .DEFERRED_INIT \\(16, 1, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-5.c  -Wc++-compat   
> scan-tree-dump gimple "temp3 = .DEFERRED_INIT \\(32, 2, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-6.c  -Wc++-compat   
> scan-tree-dump gimple "temp3 = .DEFERRED_INIT \\(32, 1, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-padding-1.c  -Wc++-compat   
> scan-tree-dump gimple ".DEFERRED_INIT \\(24, 1, 0\\)"
> 
> on aarch64 -mabi=ilp32:
> 
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-1.c  -Wc++-compat   
> scan-tree-dump gimple "temp5 = .DEFERRED_INIT \\(8, 2, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-1.c  -Wc++-compat   
> scan-tree-dump gimple "temp7 = .DEFERRED_INIT \\(8, 2, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-2.c  -Wc++-compat   
> scan-tree-dump gimple "temp5 = .DEFERRED_INIT \\(8, 1, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-2.c  -Wc++-compat   
> scan-tree-dump gimple "temp7 = .DEFERRED_INIT \\(8, 1, 0\\)"
>    gcc:gcc.dg/dg.exp=c-c++-common/auto-init-padding-1.c  -Wc++-compat   
> scan-tree-dump gimple ".DEFERRED_INIT \\(24, 1, 0\\)"
>    gcc:gcc.target/aarch64/aarch64.exp=gcc.target/aarch64/auto-init-2.c 
> scan-rtl-dump-times expand "0xfefefefefefefefe" 2
>    
> gcc:gcc.target/aarch64/aarch64.exp=gcc.target/aarch64/auto-init-padding-5.c 
> scan-assembler-times stp\txzr, xzr, 2
> 
> Can you check?
> 
> 
> Thanks,
> 
> Christophe
> 
> 
> 
>> Thanks.
>> 
>> Qing
>> 
>>> On Sep 6, 2021, at 5:16 AM, Richard Biener <rguent...@suse.de> wrote:
>>> 
>>> On Sat, 21 Aug 2021, Qing Zhao wrote:
>>> 
>>>> Hi,
>>>> 
>>>> This is the 8th version of the patch for the new security feature for GCC.
>>>> I have tested it with bootstrap on both x86 and aarch64, regression 
>>>> testing on both x86 and aarch64.
>>>> Also tested it with the kernel testing case provided by Kees.
>>>> Also compile CPU2017 (running is ongoing), without any issue.
>>>> 
>>>> Please take a look at this patch and let me know any issues.
>>> +  /* If this DECL is a VLA, a temporary address variable for it has been
>>> +     created, the replacement for DECL is recorded in DECL_VALUE_EXPR
>>> (decl),
>>> +     we should use it as the LHS of the call.  */
>>> +
>>> +  tree lhs_call
>>> +    = is_vla ? DECL_VALUE_EXPR (decl) : decl;
>>> +  gimplify_assign (lhs_call, call, seq_p);
>>> 
>>> you shouldn't need to replace the lhs with DECL_VALUE_EXPR of it
>>> here, gimplify_assign should take care of that.
>>> 
>>> +/* Return true if the DECL need to be automaticly initialized by the
>>> +   compiler.  */
>>> +static bool
>>> +is_var_need_auto_init (tree decl)
>>> +{
>>> +  if (auto_var_p (decl)
>>> +      && (opt_for_fn (current_function_decl, flag_auto_var_init)
>>> 
>>> maybe I said otherwise at some point but you can test 'flag_auto_var_init'
>>> directly when not in an IPA pass, no need to use 'opt_for_fn'
>>> 
>>> +           > AUTO_INIT_UNINITIALIZED)
>>> +      && (!lookup_attribute ("uninitialized", DECL_ATTRIBUTES (decl))))
>>> +    return true;
>>> +  return false;
>>> 
>>> 
>>> diff --git a/gcc/tree.c b/gcc/tree.c
>>> index e923e67b6942..23d7b17774ce 100644
>>> --- a/gcc/tree.c
>>> +++ b/gcc/tree.c
>>> @@ -9508,6 +9508,22 @@ build_common_builtin_nodes (void)
>>>   tree tmp, ftype;
>>>   int ecf_flags;
>>> 
>>> +  /* If user requests automatic variables initialization, the builtin
>>> +     BUILT_IN_CLEAR_PADDING is needed.  */
>>> +  if (flag_auto_var_init > AUTO_INIT_UNINITIALIZED
>>> +      && !builtin_decl_explicit_p (BUILT_IN_CLEAR_PADDING))
>>> 
>>> I think this is prone to fail with LTO and auto-var-init setting
>>> different in different TUs.  Just build the builtin unconditionally
>>> when it's not available.
>>> 
>>> +    {
>>> +      ftype = build_function_type_list (void_type_node,
>>> +                                       ptr_type_node,
>>> +                                       ptr_type_node,
>>> +                                       integer_type_node,
>>> +                                       NULL_TREE);
>>> +      local_define_builtin ("__builtin_clear_padding", ftype,
>>> +                           BUILT_IN_CLEAR_PADDING,
>>> +                           "__builtin_clear_padding",
>>> +                             ECF_LEAF | ECF_NOTHROW);
>>> +    }
>>> 
>>> 
>>> With these changes the patch looks OK to me, so please go ahead
>>> after fixing the above.
>>> 
>>> Thanks,
>>> Ricahrd.
>>> 
>>>> thanks.
>>>> 
>>>> Qing
>>>> 
>>>> In this version:
>>>> 
>>>> *****Fix all issues raised by Richard B on 8/9: (compared with version 7)
>>>> 
>>>>  1. in "handle_uninitialized_attribute", exclude globals with additional 
>>>> checking and warning message. Update corresponding testing cases for this 
>>>> change c-c++-common/auto-init-9/10.c
>>>>  2. add more clarification on the new argument "for_auto_init" for 
>>>> "BUILT_IN_CLEAR_PADDING" in the comments part.
>>>>  3. use auto_var_p to replace "VAR_P && !DECL_EXTERNAL && !TREE_STATIC";
>>>>     add a new helper routine "is_var_need_auto_init" to check whether a 
>>>> variable need to be initialized.
>>>>  4. move the "gimple_add_padding_init_for_auto_var" inside the routine 
>>>> "gimplify_init_constructor";
>>>>  5. restrict gimple_add_padding_init_for_auto_var only for INIT_EXPR;
>>>>  6. in "gimplify.c" phase, generate a GENERIC call to DEFERRED_INIT + 
>>>> gimplfiy_assign  instead of a gimple call to fully gimplify the call to 
>>>> the .DEFERRED_INIT to avoid some potential issues.
>>>>  7. in "internal-fn.c" phase, use helper routines "lang_hooks.types, 
>>>> type_for_mode", "can_native_interpret_type_p", "native_interpret_expr" to 
>>>> simplify the implementation for pattern generation.
>>>>  8. move "generating tree node for __BUILTIN_CLEAR_PADDING" in tree.c;
>>>>  9. cleanup tree-cfg.c.
>>>>  10. testing cases updates.
>>>>      for address taken variable -Wuninitialized warnings, add "xfail" for 
>>>> C testing cases; deleting C++ testing cases since "xfail" does not work. 
>>>> (FIXME, add them back if something like "xfail" works for C++.)
>>>> 
>>>> ******Known issue:
>>>> 
>>>>  1. -Wuninitialized warnings migh not be issued for address taken auto 
>>>> variables.
>>>> please see 
>>>> https://gcc.gnu.org/pipermail/gcc-patches/2021-August/577431.html
>>>> for details.
>>>> 
>>>>     Plan: add a separate patch to improve -Wuninitialized on address taken 
>>>> auto variables.
>>>> 
>>>> ******NOTE:
>>>> 
>>>>  1. Changes in tree-sra.c  have been reviewed and approved by Martin 
>>>> Jambor.
>>>>  2. the code changes should be very clean now;
>>>>  3. The testing cases might need more review, I need comments and 
>>>> suggestions on testing cases part. (Not feel very comfortable especially 
>>>> on the testing cases for checking pattern initializations).
>>>> 
>>>> ******Please see version 7 at:
>>>> https://gcc.gnu.org/pipermail/gcc-patches/2021-July/576341.html
>>>> 
>>>> ******ChangeLog is:
>>>> gcc/ChangeLog:
>>>> 
>>>> 2021-08-21  qing zhao  <qing.z...@oracle.com>
>>>> 
>>>>        * builtins.c (expand_builtin_memset): Make external visible.
>>>>        * builtins.h (expand_builtin_memset): Declare extern.
>>>>        * common.opt (ftrivial-auto-var-init=): New option.
>>>>        * doc/extend.texi: Document the uninitialized attribute.
>>>>        * doc/invoke.texi: Document -ftrivial-auto-var-init.
>>>>        * flag-types.h (enum auto_init_type): New enumerated type
>>>>        auto_init_type.
>>>>        * gimple-fold.c (clear_padding_type): Add one new parameter.
>>>>        (clear_padding_union): Likewise.
>>>>        (clear_padding_emit_loop): Likewise.
>>>>        (clear_type_padding_in_mask): Likewise.
>>>>        (gimple_fold_builtin_clear_padding): Handle this new parameter.
>>>>        * gimplify.c (gimple_add_init_for_auto_var): New function.
>>>>        (gimple_add_padding_init_for_auto_var): New function.
>>>>        (is_var_need_auto_init): New function.
>>>>        (gimplify_decl_expr): Add initialization to automatic variables per
>>>>        users' requests.
>>>>        (gimplify_call_expr): Add one new parameter for call to
>>>>        __builtin_clear_padding.
>>>>        (gimplify_init_constructor): Add padding initialization in the end.
>>>>        * internal-fn.c (INIT_PATTERN_VALUE): New macro.
>>>>        (expand_DEFERRED_INIT): New function.
>>>>        * internal-fn.def (DEFERRED_INIT): New internal function.
>>>>        * tree-cfg.c (verify_gimple_call): Verify calls to .DEFERRED_INIT.
>>>>        * tree-sra.c (generate_subtree_deferred_init): New function.
>>>>        (scan_function): Avoid setting cannot_scalarize_away_bitmap for
>>>>        calls to .DEFERRED_INIT.
>>>>        (sra_modify_deferred_init): New function.
>>>>        (sra_modify_function_body): Handle calls to DEFERRED_INIT specially.
>>>>        * tree-ssa-structalias.c (find_func_aliases_for_call): Likewise.
>>>>        * tree-ssa-uninit.c (warn_uninit): Handle calls to DEFERRED_INIT
>>>>        specially.
>>>>        (check_defs): Likewise.
>>>>        (warn_uninitialized_vars): Likewise.
>>>>        * tree-ssa.c (ssa_undefined_value_p): Likewise.
>>>>        * tree.c (build_common_builtin_nodes): Build tree node for
>>>>        BUILT_IN_CLEAR_PADDING when needed.
>>>> 
>>>> gcc/c-family/ChangeLog:
>>>> 
>>>> 2021-08-21  qing zhao  <qing.z...@oracle.com>
>>>> 
>>>>        * c-attribs.c (handle_uninitialized_attribute): New function.
>>>>        (c_common_attribute_table): Add "uninitialized" attribute.
>>>> 
>>>> gcc/testsuite/ChangeLog:
>>>> 
>>>> 
>>>> 2021-08-20  qing zhao  <qing.z...@oracle.com>
>>>> 
>>>>        * c-c++-common/auto-init-1.c: New test.
>>>>        * c-c++-common/auto-init-10.c: New test.
>>>>        * c-c++-common/auto-init-11.c: New test.
>>>>        * c-c++-common/auto-init-12.c: New test.
>>>>        * c-c++-common/auto-init-13.c: New test.
>>>>        * c-c++-common/auto-init-14.c: New test.
>>>>        * c-c++-common/auto-init-15.c: New test.
>>>>        * c-c++-common/auto-init-16.c: New test.
>>>>        * c-c++-common/auto-init-2.c: New test.
>>>>        * c-c++-common/auto-init-3.c: New test.
>>>>        * c-c++-common/auto-init-4.c: New test.
>>>>        * c-c++-common/auto-init-5.c: New test.
>>>>        * c-c++-common/auto-init-6.c: New test.
>>>>        * c-c++-common/auto-init-7.c: New test.
>>>>        * c-c++-common/auto-init-8.c: New test.
>>>>        * c-c++-common/auto-init-9.c: New test.
>>>>        * c-c++-common/auto-init-esra.c: New test.
>>>>        * c-c++-common/auto-init-padding-1.c: New test.
>>>>        * c-c++-common/auto-init-padding-2.c: New test.
>>>>        * c-c++-common/auto-init-padding-3.c: New test.
>>>>        * g++.dg/auto-init-uninit-pred-1_a.C: New test.
>>>>        * g++.dg/auto-init-uninit-pred-2_a.C: New test.
>>>>        * g++.dg/auto-init-uninit-pred-3_a.C: New test.
>>>>        * g++.dg/auto-init-uninit-pred-4.C: New test.
>>>>        * gcc.dg/auto-init-sra-1.c: New test.
>>>>        * gcc.dg/auto-init-sra-2.c: New test.
>>>>        * gcc.dg/auto-init-uninit-1.c: New test.
>>>>        * gcc.dg/auto-init-uninit-12.c: New test.
>>>>        * gcc.dg/auto-init-uninit-13.c: New test.
>>>>        * gcc.dg/auto-init-uninit-14.c: New test.
>>>>        * gcc.dg/auto-init-uninit-15.c: New test.
>>>>        * gcc.dg/auto-init-uninit-16.c: New test.
>>>>        * gcc.dg/auto-init-uninit-17.c: New test.
>>>>        * gcc.dg/auto-init-uninit-18.c: New test.
>>>>        * gcc.dg/auto-init-uninit-19.c: New test.
>>>>        * gcc.dg/auto-init-uninit-2.c: New test.
>>>>        * gcc.dg/auto-init-uninit-20.c: New test.
>>>>        * gcc.dg/auto-init-uninit-21.c: New test.
>>>>        * gcc.dg/auto-init-uninit-22.c: New test.
>>>>        * gcc.dg/auto-init-uninit-23.c: New test.
>>>>        * gcc.dg/auto-init-uninit-24.c: New test.
>>>>        * gcc.dg/auto-init-uninit-25.c: New test.
>>>>        * gcc.dg/auto-init-uninit-26.c: New test.
>>>>        * gcc.dg/auto-init-uninit-3.c: New test.
>>>>        * gcc.dg/auto-init-uninit-34.c: New test.
>>>>        * gcc.dg/auto-init-uninit-36.c: New test.
>>>>        * gcc.dg/auto-init-uninit-37.c: New test.
>>>>        * gcc.dg/auto-init-uninit-4.c: New test.
>>>>        * gcc.dg/auto-init-uninit-5.c: New test.
>>>>        * gcc.dg/auto-init-uninit-6.c: New test.
>>>>        * gcc.dg/auto-init-uninit-8.c: New test.
>>>>        * gcc.dg/auto-init-uninit-9.c: New test.
>>>>        * gcc.dg/auto-init-uninit-A.c: New test.
>>>>        * gcc.dg/auto-init-uninit-B.c: New test.
>>>>        * gcc.dg/auto-init-uninit-C.c: New test.
>>>>        * gcc.dg/auto-init-uninit-H.c: New test.
>>>>        * gcc.dg/auto-init-uninit-I.c: New test.
>>>>        * gcc.target/aarch64/auto-init-1.c: New test.
>>>>        * gcc.target/aarch64/auto-init-2.c: New test.
>>>>        * gcc.target/aarch64/auto-init-3.c: New test.
>>>>        * gcc.target/aarch64/auto-init-4.c: New test.
>>>>        * gcc.target/aarch64/auto-init-5.c: New test.
>>>>        * gcc.target/aarch64/auto-init-6.c: New test.
>>>>        * gcc.target/aarch64/auto-init-7.c: New test.
>>>>        * gcc.target/aarch64/auto-init-8.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-1.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-10.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-11.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-12.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-2.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-3.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-4.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-5.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-6.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-7.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-8.c: New test.
>>>>        * gcc.target/aarch64/auto-init-padding-9.c: New test.
>>>>        * gcc.target/i386/auto-init-1.c: New test.
>>>>        * gcc.target/i386/auto-init-2.c: New test.
>>>>        * gcc.target/i386/auto-init-21.c: New test.
>>>>        * gcc.target/i386/auto-init-22.c: New test.
>>>>        * gcc.target/i386/auto-init-23.c: New test.
>>>>        * gcc.target/i386/auto-init-24.c: New test.
>>>>        * gcc.target/i386/auto-init-3.c: New test.
>>>>        * gcc.target/i386/auto-init-4.c: New test.
>>>>        * gcc.target/i386/auto-init-5.c: New test.
>>>>        * gcc.target/i386/auto-init-6.c: New test.
>>>>        * gcc.target/i386/auto-init-7.c: New test.
>>>>        * gcc.target/i386/auto-init-8.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-1.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-10.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-11.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-12.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-2.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-3.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-4.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-5.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-6.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-7.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-8.c: New test.
>>>>        * gcc.target/i386/auto-init-padding-9.c: New test.
>>>> 
>>>> ****** The patch against the 7th patch:
>>>> 
>>>> 
>>>> ******The complete 8th patch:
>>>> 
>>>> 
>>> -- 
>>> Richard Biener <rguent...@suse.de>
>>> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
>>> Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to