]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
report message for operator %a on unaddressible operand
authorJiufu Guo <guojiufu@linux.ibm.com>
Tue, 23 Jul 2024 05:34:20 +0000 (13:34 +0800)
committerguojiufu <guojiufu@linux.ibm.com>
Tue, 23 Jul 2024 10:21:25 +0000 (18:21 +0800)
Hi,

For PR96866, when printing asm code for modifier "%a", an addressable
operand is required.  While the constraint "X" allow any kind of
operand even which is hard to get the address directly. e.g. extern
symbol whose address is in TOC.
An error message would be reported to indicate the invalid asm operand.

Compare with previous version, test case is updated with -mno-pcrel.

Bootstrap&regtest pass on ppc64{,le}.
Is this ok for trunk?

BR,
Jeff(Jiufu Guo)

PR target/96866

gcc/ChangeLog:

* config/rs6000/rs6000.cc (print_operand_address): Emit message for
unsupported operand.

gcc/testsuite/ChangeLog:

* gcc.target/powerpc/pr96866-1.c: New test.
* gcc.target/powerpc/pr96866-2.c: New test.

gcc/config/rs6000/rs6000.cc
gcc/testsuite/gcc.target/powerpc/pr96866-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr96866-2.c [new file with mode: 0644]

index 85211565eb4c156f0309c7fdfa57ce73eb1427e2..0bcc6a2d0ab604f3a696a44bc34db7f87ab9ba3d 100644 (file)
@@ -14706,7 +14706,12 @@ print_operand_address (FILE *file, rtx x)
        fprintf (file, "@%s(%s)", SMALL_DATA_RELOC,
                 reg_names[SMALL_DATA_REG]);
       else
-       gcc_assert (!TARGET_TOC);
+       {
+         /* Do not support getting address directly from TOC, emit error.
+            No more work is needed for !TARGET_TOC. */
+         if (TARGET_TOC)
+           output_operand_lossage ("%%a requires an address of memory");
+       }
     }
   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
           && REG_P (XEXP (x, 1)))
diff --git a/gcc/testsuite/gcc.target/powerpc/pr96866-1.c b/gcc/testsuite/gcc.target/powerpc/pr96866-1.c
new file mode 100644 (file)
index 0000000..72e59a1
--- /dev/null
@@ -0,0 +1,18 @@
+/* The "%a" modifier can't get the address of extern symbol directly from TOC
+   with -fPIC, even the symbol is propagated for "X" constraint under -O2. */
+/* { dg-options "-fPIC -O2 -mno-pcrel" } */
+
+/* It's to verify no ICE here, ignore error messages about invalid 'asm'.  */
+/* { dg-excess-errors "pr96866-1.c" } */
+
+int x[2];
+
+int __attribute__ ((noipa))
+f1 (void)
+{
+  int n;
+  int *p = x;
+  *p++;
+  __asm__ volatile("ld %0, %a1" : "=r"(n) : "X"(p));
+  return n;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr96866-2.c b/gcc/testsuite/gcc.target/powerpc/pr96866-2.c
new file mode 100644 (file)
index 0000000..72bb15f
--- /dev/null
@@ -0,0 +1,13 @@
+/* The "%a" modifier can't get the address of extern symbol directly from TOC
+   with -fPIC. */
+/* { dg-options "-fPIC -O2 -mno-pcrel" } */
+
+/* It's to verify no ICE here, ignore error messages about invalid 'asm'.  */
+/* { dg-excess-errors "pr96866-2.c" } */
+
+void
+f (void)
+{
+  extern int x;
+  __asm__ volatile("#%a0" ::"X"(&x));
+}