Hi, 

After some more study on __builtin_clear_padding and the corresponding testing 
cases.
And also considered both Richard Biener and Richard Sandiford’s previous 
suggestion to use
__builtin_clear_padding.  I have the following thought on the paddings 
initialization:

****** We can insert a call to __builtin_clear_padding (&decl, 0) to all the 
variables that need to be
Auto-initialized during gimplification phase.  This include two places:

    A. If the auto-variable does not have an explicit initializer, and we need 
to add a call to .DEFERRED_INIT.
         We always add a call to __builtin_clear_padding following this 
.DEFERRED_INIT call.

        structure_type temp;

        temp = .DEFERRED_INIT ();
        __builtin_clear_padding (&temp, 0);

        
       NOTE: 
      ****** If temp has a type without paddings, then __builtin_clear_padding 
will be lowered to a gimple_nop automatically.
      ****** regardless with zero or pattern init,  the paddings will be always 
initialized to ZEROes, which is compatible with CLANG.


    B. If the auto-variable does HAVE an explicit initializer, then we will add 
the call to __builtin_clear_padding 
         In the beginning of “gimplify_init_constructor”.

        
          structure_type temp = {…..};


         __builtin_clear_padding (&temp, 0);
         Expand_the_constructor;

        NOTE:
        ****** if temp has a type without padding, the call to 
__builtin_clear_padding will be lowed to gimple_nop;
        ****** padding will be always initialized to ZEROes. 


******the major benefit with this approach are:

          1. Padding initialization will be compatible with CLANG;
          2. Implemenation will be much more simple and consistent;
      
My questions:

1. What do you think of this approach?
2. During implementation, if I want to add the following routine:

/* Generate padding initialization for automatic vairable DECL.
   C guarantees that brace-init with fewer initializers than members
   aggregate will initialize the rest of the aggregate as-if it were
   static initialization.  In turn static initialization guarantees
   that padding is initialized to zero. So, we always initialize paddings
   to zeroes regardless INIT_TYPE.
   To do the padding initialization, we insert a call to
   __BUILTIN_CLEAR_PADDING (&decl, 0).
   */
static void
gimple_add_padding_init_for_auto_var (tree decl, gimple_seq *seq_p)
{
 ?????? how to build a addr_of_decl tree node???
  tree addr_of_decl = ….

  gimple *call = gimple_build_call (builtin_decl_implicit 
(BUILT_IN_CLEAR_PADDING),
                                    2, addr_of_decl, build_zero_cst (TREE_TYPE 
(decl));
  gimplify_seq_add_stmt (seq_p, call);
}


I need help on how to build “addr_of_decl” in the above routine.

Thanks a lot for your help.

Qing
         

Reply via email to