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

Reply via email to