Message ID | d0a7b88818ff4272a92e2cd6b49f12f5@DM2PR03MB352.namprd03.prod.outlook.com |
---|---|
State | New |
Headers | show |
On Fri, Apr 25, 2014 at 02:57:38PM +0000, rohitarulraj@freescale.com wrote: > Source file: gcc-4.8.2/gcc/varasm.c > @@ -7120,7 +7120,7 @@ > if (CONSTANT_POOL_ADDRESS_P (symbol)) > { > desc = SYMBOL_REF_CONSTANT (symbol); > output_constant_pool_1 (desc, 1); ------------- (A) > offset += GET_MODE_SIZE (desc->mode); I think the reason 1 is passed here for align is that with -fsection-anchors, in output_object_block we've already laid out everything in the block, assigning offsets from the start of the block. Aligning shouldn't be necessary, because we've already done that.. OTOH, it shouldn't hurt to align again.
> -----Original Message----- > From: Alan Modra [mailto:amodra@gmail.com] > Sent: Saturday, April 26, 2014 11:52 AM > To: Dharmakan Rohit-B30502 > Cc: gcc-patches@gcc.gnu.org; dje.gcc@gmail.com; Wienskoski Edmar-RA8797 > Subject: Re: [Patch, PR 60158] Generate .fixup sections for > .data.rel.ro.local entries. > > On Fri, Apr 25, 2014 at 02:57:38PM +0000, rohitarulraj@freescale.com > wrote: > > Source file: gcc-4.8.2/gcc/varasm.c > > @@ -7120,7 +7120,7 @@ > > if (CONSTANT_POOL_ADDRESS_P (symbol)) > > { > > desc = SYMBOL_REF_CONSTANT (symbol); > > output_constant_pool_1 (desc, 1); > ------------- (A) > > offset += GET_MODE_SIZE (desc->mode); > > I think the reason 1 is passed here for align is that with -fsection- > anchors, in output_object_block we've already laid out everything in the > block, assigning offsets from the start of the block. Aligning shouldn't > be necessary, because we've already done that.. OTOH, it shouldn't hurt > to align again. > Thanks. I have tested for both the cases on e500v2, e500mc, e5500, ppc64 (GCC v4.8.2 branch) with no regressions. Patch1 [gcc.fix_pr60158_fixup_table-fsf]: Pass actual alignment value to output_constant_pool_2. Patch2 [gcc.fix_pr60158_fixup_table-fsf-2]: Use the alignment data available in the first argument (constant_descriptor_rtx) of output_constant_pool_1. (Note: this generates ".align" directive twice). Is it ok to commit? Any comments? Regards, Rohit
Rohit, The subject line and thread may confuse people that this is a PowerPC-specific issue. You need approval from a reviewer with authority over varasm.c. Thanks, David On Thu, May 8, 2014 at 9:54 AM, rohitarulraj@freescale.com <rohitarulraj@freescale.com> wrote: >> -----Original Message----- >> From: Alan Modra [mailto:amodra@gmail.com] >> Sent: Saturday, April 26, 2014 11:52 AM >> To: Dharmakan Rohit-B30502 >> Cc: gcc-patches@gcc.gnu.org; dje.gcc@gmail.com; Wienskoski Edmar-RA8797 >> Subject: Re: [Patch, PR 60158] Generate .fixup sections for >> .data.rel.ro.local entries. >> >> On Fri, Apr 25, 2014 at 02:57:38PM +0000, rohitarulraj@freescale.com >> wrote: >> > Source file: gcc-4.8.2/gcc/varasm.c >> > @@ -7120,7 +7120,7 @@ >> > if (CONSTANT_POOL_ADDRESS_P (symbol)) >> > { >> > desc = SYMBOL_REF_CONSTANT (symbol); >> > output_constant_pool_1 (desc, 1); >> ------------- (A) >> > offset += GET_MODE_SIZE (desc->mode); >> >> I think the reason 1 is passed here for align is that with -fsection- >> anchors, in output_object_block we've already laid out everything in the >> block, assigning offsets from the start of the block. Aligning shouldn't >> be necessary, because we've already done that.. OTOH, it shouldn't hurt >> to align again. >> > Thanks. I have tested for both the cases on e500v2, e500mc, e5500, ppc64 (GCC v4.8.2 branch) with no regressions. > > Patch1 [gcc.fix_pr60158_fixup_table-fsf]: Pass actual alignment value to output_constant_pool_2. > Patch2 [gcc.fix_pr60158_fixup_table-fsf-2]: Use the alignment data available in the first argument (constant_descriptor_rtx) of output_constant_pool_1. > (Note: this generates ".align" directive twice). > > Is it ok to commit? Any comments? > > Regards, > Rohit >
Ping. I have changed the subject line accordingly. Regards, Rohit > -----Original Message----- > From: David Edelsohn [mailto:dje.gcc@gmail.com] > Sent: Thursday, May 08, 2014 9:28 PM > To: Dharmakan Rohit-B30502; Jakub Jelinek; Richard Biener > Cc: Alan Modra; gcc-patches@gcc.gnu.org; Wienskoski Edmar-RA8797 > Subject: Re: [Patch, PR 60158] Generate .fixup sections for > .data.rel.ro.local entries. > > Rohit, > > The subject line and thread may confuse people that this is a PowerPC- > specific issue. You need approval from a reviewer with authority over > varasm.c. > > Thanks, David > > On Thu, May 8, 2014 at 9:54 AM, rohitarulraj@freescale.com > <rohitarulraj@freescale.com> wrote: > >> -----Original Message----- > >> From: Alan Modra [mailto:amodra@gmail.com] > >> Sent: Saturday, April 26, 2014 11:52 AM > >> To: Dharmakan Rohit-B30502 > >> Cc: gcc-patches@gcc.gnu.org; dje.gcc@gmail.com; Wienskoski > >> Edmar-RA8797 > >> Subject: Re: [Patch, PR 60158] Generate .fixup sections for > >> .data.rel.ro.local entries. > >> > >> On Fri, Apr 25, 2014 at 02:57:38PM +0000, rohitarulraj@freescale.com > >> wrote: > >> > Source file: gcc-4.8.2/gcc/varasm.c @@ -7120,7 +7120,7 @@ > >> > if (CONSTANT_POOL_ADDRESS_P (symbol)) > >> > { > >> > desc = SYMBOL_REF_CONSTANT (symbol); > >> > output_constant_pool_1 (desc, 1); > >> ------------- (A) > >> > offset += GET_MODE_SIZE (desc->mode); > >> > >> I think the reason 1 is passed here for align is that with -fsection- > >> anchors, in output_object_block we've already laid out everything in > >> the block, assigning offsets from the start of the block. Aligning > >> shouldn't be necessary, because we've already done that.. OTOH, it > >> shouldn't hurt to align again. > >> > > Thanks. I have tested for both the cases on e500v2, e500mc, e5500, > ppc64 (GCC v4.8.2 branch) with no regressions. > > > > Patch1 [gcc.fix_pr60158_fixup_table-fsf]: Pass actual alignment value > to output_constant_pool_2. > > Patch2 [gcc.fix_pr60158_fixup_table-fsf-2]: Use the alignment data > available in the first argument (constant_descriptor_rtx) of > output_constant_pool_1. > > (Note: this generates ".align" directive twice). > > > > Is it ok to commit? Any comments? > > > > Regards, > > Rohit > >
Index: gcc/varasm.c =================================================================== --- gcc/varasm.c (revision 209534) +++ gcc/varasm.c (working copy) @@ -3771,7 +3771,7 @@ output_constant_pool_1 (struct constant_ targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno); /* Output the data. */ - output_constant_pool_2 (desc->mode, x, align); + output_constant_pool_2 (desc->mode, x, desc->align); /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS sections have proper size. */ Index: gcc/testsuite/gcc.target/powerpc/pr60158.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/pr60158.c (revision 0) +++ gcc/testsuite/gcc.target/powerpc/pr60158.c (revision 0) @@ -0,0 +1,91 @@ +/* { dg-do compile } */ +/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */ +/* { dg-options "-mcpu=8548 -mno-spe -mfloat-gprs=double -Os -fdata-sections -fpic -mrelocatable" } */ + +#define NULL 0 +int func (int val); +void *func2 (void *ptr); + +static const char *ifs; +static char map[256]; + +typedef struct { +/* + * None of these fields are used, but removing any + * of them makes the problem go away. + */ + char *data; + int length; + int maxlen; + int quote; +} o_string; + +#define NULL_O_STRING {NULL,0,0,0} + +static int parse_stream (void *dest, void *ctx) +{ + int ch = func (0), m; + + while (ch != -1) { + m = map[ch]; + if (ch != '\n') + func2(dest); + + ctx = func2 (ctx); + if (!func (0)) + return 0; + if (m != ch) { + func2 ("htns"); + break; + } + } + return -1; +} + +static void mapset (const char *set, int code) +{ + const char *s; + for (s=set; *s; s++) map[(int)*s] = code; +} + +static void update_ifs_map(void) +{ + /* char *ifs and char map[256] are both globals. */ + ifs = func2 ("abc"); + if (ifs == NULL) ifs="def"; + + func2 (map); + { + char subst[2] = {4, 0}; + mapset (subst, 3); + } + mapset (";&|#", 1); +} + +int parse_stream_outer (int flag) +{ + int blah; + o_string temp=NULL_O_STRING; + int rcode; + + do { + update_ifs_map (); + func2 (&blah); /* a memory clobber works as well */ + rcode = parse_stream (&temp, NULL); + func2 ("aoeu"); + if (func (0) != 0) { + func2 (NULL); + } + } while (rcode != -1); + return 0; +} + +/* { dg-final { if ![file exists pr60158.s] { fail "pr60158.c (compile)"; return; } } } */ + +/* { dg-final { set c_rel [llength [grep pr60158.s \\.data\\.rel\\.ro\\.local]] } } */ +/* { dg-final { set c_fix [llength [grep pr60158.s \\.fixup]] } } */ +/* { dg-final { if [string match $c_rel $c_fix] \{ } } */ +/* { dg-final { pass "pr60158.c (passed)" } } */ +/* { dg-final { \} else \{ } } */ +/* { dg-final { fail "pr60158.c (.fixup table entries not generated for .data.rel.ro.local section)" } } */ +/* { dg-final { \}