This patch looks fine to me.
在 2010年11月24日 下午9:50,朱庆 <zqing1...@gmail.com>写道:
> Hi, All
>
> Can gatekeeper help review this fix?
>
> Bug link: http://bugs.open64.net/show_bug.cgi?id=580
>
>
>
> small case to reproduce:
>
>
>
> typedef struct stru1
>
> {
>
> } Stru1;
>
> typedef struct stru2
>
> {
>
> unsigned int count;
>
> const char *table[];
>
> }Stru2;
>
> static Stru2 ins1 = {
>
> .count = 1,.table = {"base"}
>
> };
>
> static Stru2 ins2 = {
>
> .count = 4,.table = {"t", "IPMB-A only", "sgdsg","dsdg"}
>
> };
>
> static Stru1 ins3[] = {
>
> };
>
>
>
> Here the problem is no matter how many elements in the initialization of
> ins2.table, the org offset of ins3 is always 0x20. In this case it should be
> 0x40.
>
>
> .section .data
>
> .org 0x0
>
> .align 0
>
> .type ins1, @object
>
> .size ins1, 16
>
> ins1: # 0x0
>
> # offset 0
>
> .4byte 1
>
> .skip 4
>
> .quad .rodata +0
>
> # end of initialization for ins1
>
> .org 0x10
>
> .align 0
>
> .type ins2, @object
>
> .size ins2, 16
>
> ins2: # 0x10
>
> # offset 16
>
> .4byte 4
>
> .skip 4
>
> .quad .rodata +16
>
> .quad .rodata +32
>
> .quad .rodata +48
>
> .quad .rodata +64
>
> # end of initialization for ins2
>
> .org 0x20
>
> .align 0
>
> .type ins3, @object
>
> ins3: # 0x20
>
> # end of initialization for ins3
>
>
>
>
>
> The fix is when st's type is variable length struct, the size of st should
> be replaced by its inito size when been initialized.
>
> Patch:
>
> Index: osprey/be/com/data_layout.cxx
> ===================================================================
> --- osprey/be/com/data_layout.cxx (revision 3404)
> +++ osprey/be/com/data_layout.cxx (working copy)
> @@ -649,8 +649,16 @@
> {
> UINT align = Adjusted_Alignment(blk);
> INT64 old_offset;
> - INT64 size = ST_size(blk);
> -
> + 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)
> + {
> + size = Get_INITO_Size(ino_idx);
> + Is_True(size >= ST_size(blk),("%s's inito size smaller than
> ST_size",ST_name(blk)));
> + }
> + else
> + size = ST_size(blk);
> #if defined(TARG_PPC32)
> if ( ST_sclass(blk) == SCLASS_FORMAL &&
> MTYPE_is_m(TY_mtype(ST_type(blk))) ) {
> size = MTYPE_RegisterSize(Spill_Int_Mtype);;
>
>
> ------
>
> Best wishes
>
> zhuqing
>
>
>
> ------------------------------------------------------------------------------
> Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
> Tap into the largest installed PC base & get more eyes on your game by
> optimizing for Intel(R) Graphics Technology. Get started today with the
> Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
> http://p.sf.net/sfu/intelisp-dev2dev
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>
--
Regards,
Lai Jian-Xin
------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel