The new patch works well with the small and even larger cases.  I am ok with it.

Hi Steve,
Thank you for providing the patch. Do you need me to follow up the
checkin after Sun approved?

Thanks
zhuqing

在 2011年8月26日 下午9:23,Sun Chan <sun.c...@gmail.com> 写道:
> I had not much of experience with the WGEN code. Judging from the bug
> description and your fix, it seemed this is the right and better fix.
> Zqing,
> can you pls try this fix since Stephen isn't sure this is the only
> change needed?
> Thx!
> Sun
>
> 2011/8/26 Stephen Clarke <stephen.cla...@st.com>:
>> Here we appear to have a different and simpler fix for the failing
>> case.  It avoids recursing into WGEN_Expand_Expr which corrupts the
>> initializer.
>>
>> Unfortunately we have several other changes in this area, and
>> I cannot immediately say for sure if that change works standalone or
>> if it requires something else.
>>
>> Steve.
>>
>> $ diff -u wgen_decl.cxx.orig wgen_decl.cxx
>> --- wgen_decl.cxx.orig  2011-08-26 13:14:00.242892000 +0100
>> +++ wgen_decl.cxx       2011-08-26 13:38:00.459860000 +0100
>> @@ -2578,21 +2578,9 @@
>>        case GS_NOP_EXPR:
>>                gs_t kid;
>>                kid = gs_tree_operand(val,0);
>> -               if (gs_tree_code(kid) == GS_ADDR_EXPR &&
>> -                   /* bug fix for OSP_279 */
>> -                   gs_tree_code(gs_tree_operand(kid,0)) == GS_STRING_CST)
>> -               {
>> -                       kid = gs_tree_operand(kid,0);
>> -                       WGEN_Add_Aggregate_Init_Address (kid);
>> -                       break;
>> -               }
>> -               else
>> -               if (gs_tree_code(kid) == GS_INTEGER_CST) {
>> -                      WGEN_Add_Aggregate_Init_Integer (
>> -                              gs_get_integer_value(kid), size);
>> -                     break;
>> -               }
>> -               // fallthru
>> +               // [SC] NOP_EXPR does not change representation, so just 
>> recurse on kid.
>> +               Add_Initv_For_Tree (kid, size);
>> +               break;
>>        default:
>>                {
>>         WN *init_wn;
>>
>>
>>
>> 朱庆 wrote:
>>> Hi all,
>>> Can gatekeeper help review following fix for bug833?
>>> https://bugs.open64.net/show_bug.cgi?id=833
>>> case:
>>> struct in6_addr
>>> {
>>> unsigned char u6_addr8[16];
>>> };
>>>
>>> static const struct ip6addrlbl_init_table
>>> {
>>> const struct in6_addr *prefix;
>>> int prefixlen;
>>> } array_table =
>>> {
>>>   .prefix = &(struct in6_addr){ 0xfc },
>>>   .prefixlen = 7,
>>> };
>>> int main()
>>> {
>>> printf("%x\n",*array_table.prefix);
>>> }
>>> The result should be 0xfc, but not Segmentation fault.
>>> The problem is the initial for array_table is incorrect.
>>> The creation of inito and initv is sequently,  if there is an initial
>>> in another initial, and need to set up a new st , the initv index is
>>> increased in the new st initialize, when return from the new init_wn,
>>> we should adjust the block index of the uplevel inito.
>>>
>>> =======================================================================
>>> INITOs:
>>> [1]: array_table (0x3501):
>>> BLOCK:
>>> BLOCK: ==>
>>> BLOCK: ==>
>>> VAL: 252   ===> SYMOFF: .init(0x3601)+0(0x0)
>>> PAD: 15    ==> VAL: 7
>>> ENDBLOCK=> PAD: 4
>>> ENDBLOCK==>
>>> ENDBLOCK
>>> [2]: .init (0x3601):
>>> BLOCK:
>>> BLOCK:
>>> VAL: 252
>>> PAD: 15
>>> ENDBLOCK
>>> ENDBLOCK
>>>
>>> patch:
>>> Index: osprey/wgen/wgen_decl.cxx
>>> ===================================================================
>>> --- osprey/wgen/wgen_decl.cxx   (revision 3714)
>>> +++ osprey/wgen/wgen_decl.cxx   (working copy)
>>> @@ -2622,7 +2622,19 @@
>>>                     WGEN_Get_LABEL (label_decl, FALSE);
>>>                   WGEN_Add_Aggregate_Init_Label (label_idx);
>>>                 }
>>> -                else Add_Init_For_WHIRL(init_wn, size, 0);
>>> +               else {
>>> +                  Add_Init_For_WHIRL(init_wn, size, 0);
>>> +                  if (WN_has_sym(init_wn)) {
>>> +                    ST* st = WN_st(init_wn);
>>> +                    INITO_IDX idx = Find_INITO_For_Symbol(st);
>>> +                    if (idx != 0 &&
>>> +                        ST_initv_in_other_st(st) &&
>>> +                        idx > _inito ) {
>>> +                      INITO ino = Inito_Table[idx];
>>> +                      Set_INITV_blk(ino.val-1, _last_initv);
>>> +                    }
>>> +                  }
>>> +               }
>>>                 WN_DELETE_Tree (init_wn);
>>>                 break;
>>>                 }
>>>
>>>
>>> Thanks
>>> zhuqing
>>>
>>> ------------------------------------------------------------------------------
>>> EMC VNX: the world's simplest storage, starting under $10K
>>> The only unified storage solution that offers unified management
>>> Up to 160% more powerful than alternatives and 25% more efficient.
>>> Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
>>> _______________________________________________
>>> Open64-devel mailing list
>>> Open64-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/open64-devel
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> EMC VNX: the world's simplest storage, starting under $10K
>> The only unified storage solution that offers unified management
>> Up to 160% more powerful than alternatives and 25% more efficient.
>> Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
>> _______________________________________________
>> Open64-devel mailing list
>> Open64-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/open64-devel
>>
>

------------------------------------------------------------------------------
EMC VNX: the world's simplest storage, starting under $10K
The only unified storage solution that offers unified management 
Up to 160% more powerful than alternatives and 25% more efficient. 
Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to