]> gcc.gnu.org Git - gcc.git/commitdiff
varasm.c (output_constant_pool_1): Pass down alignment from constant pool entry's...
authorRohit Arul Raj <rohitarulraj@freescale.com>
Fri, 15 May 2015 04:58:27 +0000 (22:58 -0600)
committerJeff Law <law@gcc.gnu.org>
Fri, 15 May 2015 04:58:27 +0000 (22:58 -0600)
2015-05-14  Rohit Arul Raj  <rohitrulraj@freescale.com>

* 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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr60158.c [new file with mode: 0644]
gcc/varasm.c

index bf28867ac4da17f328d12ec0ea9d9ca574fc76ec..4a3d74f21c533a4f996e17680a06e55b4c8d940f 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-14  Rohit Arul Raj  <rohitrulraj@freescale.com>
+
+       * 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  <vmakarov@redhat.com>
 
        PR rtl-optimization/65862
index 2d48683d6f17539fd2b1bdd2c77d193ccebc5d9d..8c71bd56822e8d957a41bed6ca0868497e6ffa03 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-14  Rohit Arul Raj  <rohitrulraj@freescale.com>
+
+       * gcc.target/powerpc/pr60158.c: New test.
+
 2015-05-14  Alexander Monakov  <amonakov@ispras.ru>
 
        * 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 (file)
index 0000000..e832397
--- /dev/null
@@ -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 { \}     } } */
index 11cb2c5ee209275b6816698543d2503355c9c105..7630202322e861d5e72909d38518caeea93459be 100644 (file)
@@ -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);
        }
This page took 0.083275 seconds and 5 git commands to generate.