mips.c (mips_final_postscan_insn): Modify call to `mips_set_text_contents_type' to...
authorFaraz Shahbazker <fshahbazker@wavecomp.com>
Tue, 11 Jun 2019 20:09:57 +0000 (20:09 +0000)
committerJeff Law <law@gcc.gnu.org>
Tue, 11 Jun 2019 20:09:57 +0000 (14:09 -0600)
* config/mips/mips.c (mips_final_postscan_insn): Modify call
to `mips_set_text_contents_type' to indicate whether a
non-debug insn follows.

* gcc.target/mips/data-sym-pool.c: Update expected output.
* gcc.target/mips/data-sym-multi-pool.c: New test.

From-SVN: r272169

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/data-sym-multi-pool.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/data-sym-pool.c

index bf0dc947e8fa13fd5387a8ec030f45d66a85cbac..ba257665673f1b553a209f24d4275616a7f7d2fe 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-11  Faraz Shahbazker  <fshahbazker@wavecomp.com>
+
+       * config/mips/mips.c (mips_final_postscan_insn): Modify call
+       to `mips_set_text_contents_type' to indicate whether a
+       non-debug insn follows.
+
 2019-06-11  Michael Meissner  <meissner@linux.ibm.com>
 
        * config/rs6000/rs6000-cpus.def (ISA_FUTURE_MASKS_SERVER): Delete
index c6433dca1155ea1cc2fe8e3510390f7559dbdaa3..0e1a68a9c469a4e04ee252486c56c731d1883a1b 100644 (file)
@@ -20636,9 +20636,19 @@ mips_final_postscan_insn (FILE *file ATTRIBUTE_UNUSED, rtx_insn *insn,
   if (INSN_P (insn)
       && GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
       && XINT (PATTERN (insn), 1) == UNSPEC_CONSTTABLE_END)
-    mips_set_text_contents_type (asm_out_file, "__pend_",
-                                INTVAL (XVECEXP (PATTERN (insn), 0, 0)),
-                                TRUE);
+    {
+      rtx_insn *next_insn = next_real_nondebug_insn (insn);
+      bool code_p = (next_insn != NULL
+                    && INSN_P (next_insn)
+                    && (GET_CODE (PATTERN (next_insn)) != UNSPEC_VOLATILE
+                        || XINT (PATTERN (next_insn), 1) != UNSPEC_CONSTTABLE));
+
+      /* Switch content type depending on whether there is code beyond
+        the constant pool.  */
+      mips_set_text_contents_type (asm_out_file, "__pend_",
+                                  INTVAL (XVECEXP (PATTERN (insn), 0, 0)),
+                                  code_p);
+    }
 }
 
 /* Return the function that is used to expand the <u>mulsidi3 pattern.
index 443084486ef9ac79c455c75df7d788fbf7d7d97c..302ac15bbe969879cfbfb1717ccef75367a49fd3 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-11  Faraz Shahbazker  <fshahbazker@wavecomp.com>
+
+       * gcc.target/mips/data-sym-pool.c: Update expected output.
+       * gcc.target/mips/data-sym-multi-pool.c: New test.
+
 2019-06-11  Iain Sandoe  <iain@sandoe.co.uk>
 
        PR testsuite/65364
diff --git a/gcc/testsuite/gcc.target/mips/data-sym-multi-pool.c b/gcc/testsuite/gcc.target/mips/data-sym-multi-pool.c
new file mode 100644 (file)
index 0000000..1936f5b
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-do compile } */
+/* { dg-options "-mips16 -mcode-readable=yes" } */
+/* { dg-skip-if "per-function expected output" { *-*-* } { "-flto" } { "" } } */
+
+/* This testcase generates multiple constant pools within a function body.  */
+
+#define C(a,b) \
+  if (a > b)  goto gt; \
+  if (a < b)  goto lt;
+
+#define C4(x,b) C((x)[0], b) C((x)[1],b) C((x)[2],b) C((x)[3],b)
+#define C16(x,y) C4(x, (y)[0]) C4(x, (y)[1]) C4(x, (y)[2]) C4(x, (y)[3])
+
+#define C64(x,y) C16(x,y) C16(x+4,y) C16(x+8,y)
+#define C256(x,y) C64(x,y) C64(x,y+4) C64(x,y+8)
+
+unsigned foo(int x[64], int y[64])
+{
+  C256(x,y);
+
+  return 0x01234567;
+ gt:
+  return 0x12345678;
+ lt:
+  return 0xF0123456;
+}
+
+/*  Check that:
+1. The __pend symbol is emitted as STT_FUNCTION followed by instructions:
+       .type   __pend_frob_<X>, @function      # Symbol # must match label.
+__pend_foo_<X>:                                # The symbol must match.
+       .insn
+.L<Y>:
+
+2. __pend symbol at end of function has type STT_OBJECT
+
+       .type   __pend_foo_<X>, @object
+__pend_foo_<X>:
+       .insn
+       .end    foo
+
+  */
+
+/* { dg-final { scan-assembler "\t\\.type\t(__pend_foo_\[0-9\]+), @function\n\\1:\n\t\\.insn\n.L\[0-9\]+:\n" } }  */
+/* { dg-final { scan-assembler "\t\\.type\t(__pend_foo_\[0-9\]+), @object\n\\1:\n\t\\.end\tfoo\n" } }  */
index 8776d2b6e4e9aba7f51bc518e20ef3e31057be96..f093511179b4732e0d09622496bfb986a973ac7e 100644 (file)
@@ -16,9 +16,8 @@ __pool_frob_3:                                        # The symbol must match.
        .align  2
 $L3:                                           # The label must match.
        .word   305419896
-       .type   __pend_frob_3, @function        # Symbol # must match label.
+       .type   __pend_frob_3, @object          # Symbol # must match label.
 __pend_frob_3:                                 # The symbol must match.
-       .insn
 
    that is `__pool_*'/`__pend_*' symbols inserted around a constant pool.
 
@@ -26,4 +25,4 @@ __pend_frob_3:                                        # The symbol must match.
    symbol from being placed in the constant pool at `-O0' for SVR4 code
    and consequently interfering with test expectations.  */
 
-/* { dg-final { scan-assembler "\tl\[wd\]\t\\\$\[0-9\]+,(.L(\[0-9\]+))\n.*\t\\.type\t(__pool_frob_\\2), @object\n\\3:\n\t\\.align\t2\n\\1:\n\t\\.d?word\t305419896\n\t\\.type\t(__pend_frob_\\2), @function\n\\4:\n\t\\.insn\n" } } */
+/* { dg-final { scan-assembler "\tl\[wd\]\t\\\$\[0-9\]+,(.L(\[0-9\]+))\n.*\t\\.type\t(__pool_frob_\\2), @object\n\\3:\n\t\\.align\t2\n\\1:\n\t\\.d?word\t305419896\n\t\\.type\t(__pend_frob_\\2), @object\n\\4:\n" } } */