looks fine to me.
BTW, if sym_class is FUNC, you should never see it in this routine.
May be you should assert that.
sun
On Mon, Apr 11, 2011 at 6:25 PM, 朱庆 <zqing1...@gmail.com> wrote:
> Hi all,
>
> Can gatekeeper help review this fix?
>
> The problem is that for expr TY_kind(ST_type(blk)), the ty_idx for blk
> is invalid if the sym_class is CLASS_FUNC or CLASS_BLOCK,CLASS_NAME.
>
> svn diff for r3492:
> Modified: trunk/osprey/be/com/data_layout.cxx
> ===================================================================
> --- trunk/osprey/be/com/data_layout.cxx 2011-02-24 22:51:04 UTC (rev 3491)
> +++ trunk/osprey/be/com/data_layout.cxx 2011-02-25 09:58:56 UTC (rev 3492)
> @@ -652,7 +652,7 @@
> INT64 size;
> INITO_IDX ino_idx;
> // if blk is variable length struct, its size should be inito size.
> - if (TY_kind(ST_type(blk)) == KIND_STRUCT && (ino_idx =
> Find_INITO_For_Symbol(blk)) != 0)
> + if (TY_kind(ST_type(blk)) == KIND_STRUCT && (ino_idx =
> Find_INITO_For_Symbol(blk)) != 0 && INITV_kind(INITO_val(ino_idx)) ==
> INITVKIND_BLOCK)
> {
> size = Get_INITO_Size(ino_idx);
> Is_True(size >= ST_size(blk),("%s's inito size smaller than
> ST_size",ST_name(blk)));
>
> Here is the case, may need to enlarge file number to reproduce:
>
> n=1
> while [ $n -lt 2500 ]
> do
> echo "Processing $n"
> echo "void myfunc$n(){}" > file$n.c
> opencc -Ofast -c -o file$n.o file$n.c
> n=`expr $n + 1`
>
> done
>
> opencc -Ofast -shared -o a.so *.o
>
> The fix is:
> Index: be/com/data_layout.cxx
> ===================================================================
> --- be/com/data_layout.cxx (revision 3537)
> +++ be/com/data_layout.cxx (working copy)
> @@ -652,7 +652,10 @@
> INT64 size;
> INITO_IDX ino_idx;
> // if blk is variable length struct, its size should be inito size.
> - if (TY_kind(ST_type(blk)) == KIND_STRUCT && (ino_idx =
> Find_INITO_For_Symbol(blk)) != 0 && INITV_kind(INITO_val(ino_idx)) ==
> INITVKIND_BLOCK)
> + if ( ST_class(blk) == CLASS_VAR &&
> + TY_kind(ST_type(blk)) == KIND_STRUCT &&
> + (ino_idx = Find_INITO_For_Symbol(blk)) != 0 &&
> + INITV_kind(INITO_val(ino_idx)) == INITVKIND_BLOCK )
> {
> size = Get_INITO_Size(ino_idx);
> Is_True(size >= ST_size(blk),("%s's inito size smaller than
> ST_size",ST_name(blk)));
>
> Thanks Michael Lai point out the issue and provide the case!
>
> Thanks
> zhuqing
>
> ------------------------------------------------------------------------------
> Xperia(TM) PLAY
> It's a major breakthrough. An authentic gaming
> smartphone on the nation's most reliable network.
> And it wants your games.
> http://p.sf.net/sfu/verizon-sfdev
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel