Hi!

On Fri, Dec 08, 2017 at 08:10:08PM +0100, Christophe Lyon wrote:
> >> Can you check?
> >
> > I think that's a separate preexisting problem.  Could you file a PR?
> >
> 
> Sure, I filed:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83335
> 
> > Personally I'd just remove the assert, but I'm guessing that wouldn't
> > be acceptable...

So, I think either we can return false instead of dying on the assertion,
but then it will emit output_addr_const and often just silently emit it
without diagnosing it (first patch), or just call output_operand_lossage
there, which will ICE except for inline asm, where it will error.
It is true there is no code provided, but output_addr_const wouldn't
provide that either:
    default:
      if (targetm.asm_out.output_addr_const_extra (file, x))
        break;

      output_operand_lossage ("invalid expression as operand");
in final.c.

        Jakub
2017-12-11  Jakub Jelinek  <ja...@redhat.com>

        PR target/83335
        * config/aarch64/aarch64.c (aarch64_print_address_internal):
        If x doesn't have Pmode, return false to let.

--- gcc/config/aarch64/aarch64.c.jj     2017-12-11 17:54:13.000000000 +0100
+++ gcc/config/aarch64/aarch64.c        2017-12-11 17:57:41.245261299 +0100
@@ -5633,7 +5633,8 @@ aarch64_print_address_internal (FILE *f,
   struct aarch64_address_info addr;
 
   /* Check all addresses are Pmode - including ILP32.  */
-  gcc_assert (GET_MODE (x) == Pmode);
+  if (GET_MODE (x) != Pmode)
+    return false;
 
   if (aarch64_classify_address (&addr, x, mode, op, true))
     switch (addr.type)
2017-12-11  Jakub Jelinek  <ja...@redhat.com>

        PR target/83335
        * config/aarch64/aarch64.c (aarch64_print_address_internal):
        If x doesn't have Pmode, call output_operand_lossage and return true.

        * gcc.target/aarch64/asm-2.c: Expect error if ilp32.

--- gcc/config/aarch64/aarch64.c.jj     2017-12-11 17:54:13.000000000 +0100
+++ gcc/config/aarch64/aarch64.c        2017-12-11 18:23:25.847181675 +0100
@@ -5633,7 +5633,11 @@ aarch64_print_address_internal (FILE *f,
   struct aarch64_address_info addr;
 
   /* Check all addresses are Pmode - including ILP32.  */
-  gcc_assert (GET_MODE (x) == Pmode);
+  if (GET_MODE (x) != Pmode)
+    {
+      output_operand_lossage ("invalid expression as operand");
+      return true;
+    }
 
   if (aarch64_classify_address (&addr, x, mode, op, true))
     switch (addr.type)
--- gcc/testsuite/gcc.target/aarch64/asm-2.c.jj 2017-12-08 00:50:23.000000000 
+0100
+++ gcc/testsuite/gcc.target/aarch64/asm-2.c    2017-12-11 18:24:44.192215734 
+0100
@@ -6,5 +6,5 @@ int x;
 void
 f (void)
 {
-  asm volatile ("%a0" :: "X" (&x));
+  asm volatile ("%a0" :: "X" (&x));    /* { dg-error "invalid" "" { target 
ilp32 } } */
 }

Reply via email to