If you have tested that, pls go ahead Sun 2011/8/29 朱庆 <zqing1...@gmail.com>: > 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