From 06e7e3183b8869d45ed8719b449c0f7dd2573ab8 Mon Sep 17 00:00:00 2001 From: Rohit Arul Raj Date: Thu, 14 May 2015 22:58:27 -0600 Subject: [PATCH] varasm.c (output_constant_pool_1): Pass down alignment from constant pool entry's descriptor to output_constant_pool_2. 2015-05-14 Rohit Arul Raj * varasm.c (output_constant_pool_1): Pass down alignment from constant pool entry's descriptor to output_constant_pool_2. (output_object_block): Add comment prior to call to output_constant_pool_1. * gcc.target/powerpc/pr60158.c: New test. From-SVN: r223209 --- gcc/ChangeLog | 7 ++ gcc/testsuite/ChangeLog | 4 + gcc/testsuite/gcc.target/powerpc/pr60158.c | 89 ++++++++++++++++++++++ gcc/varasm.c | 10 ++- 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr60158.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bf28867ac4d..4a3d74f21c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-05-14 Rohit Arul Raj + + * varasm.c (output_constant_pool_1): Pass down alignment from + constant pool entry's descriptor to output_constant_pool_2. + (output_object_block): Add comment prior to call to + output_constant_pool_1. + 2015-05-14 Vladimir Makarov PR rtl-optimization/65862 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2d48683d6f1..8c71bd56822 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-05-14 Rohit Arul Raj + + * gcc.target/powerpc/pr60158.c: New test. + 2015-05-14 Alexander Monakov * gcc.target/i386/sibcall-7.c: New test. diff --git a/gcc/testsuite/gcc.target/powerpc/pr60158.c b/gcc/testsuite/gcc.target/powerpc/pr60158.c new file mode 100644 index 00000000000..e832397ddc2 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr60158.c @@ -0,0 +1,89 @@ +/* { 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 { \} } } */ diff --git a/gcc/varasm.c b/gcc/varasm.c index 11cb2c5ee20..7630202322e 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -3968,8 +3968,12 @@ output_constant_pool_1 (struct constant_descriptor_rtx *desc, /* Output the label. */ targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno); - /* Output the data. */ - output_constant_pool_2 (desc->mode, x, align); + /* Output the data. + Pass actual alignment value while emitting string constant to asm code + as function 'output_constant_pool_1' explicitly passes the alignment as 1 + assuming that the data is already aligned which prevents the generation + of fix-up table entries. */ + output_constant_pool_2 (desc->mode, x, desc->align); /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS sections have proper size. */ @@ -7380,6 +7384,8 @@ output_object_block (struct object_block *block) if (CONSTANT_POOL_ADDRESS_P (symbol)) { desc = SYMBOL_REF_CONSTANT (symbol); + /* Pass 1 for align as we have already laid out everything in the block. + So aligning shouldn't be necessary. */ output_constant_pool_1 (desc, 1); offset += GET_MODE_SIZE (desc->mode); } -- 2.30.2