]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix PR debug/60655 - part 1
authorRamana Radhakrishnan <ramana@gcc.gnu.org>
Fri, 4 Apr 2014 16:10:07 +0000 (16:10 +0000)
committerRamana Radhakrishnan <ramana@gcc.gnu.org>
Fri, 4 Apr 2014 16:10:07 +0000 (16:10 +0000)
This is a partial fix for PR60655 where dwarf2out.c rejects NOT of a
value in const_ok_for_output_1. There is still a problem with the
testcase on armhf where we get operations of the form, const (minus
(const_int) (symref)) without the -fdata-sections option which is just
weird. I'm not yet sure where this is produced from and will not have
the time to dig further today.

As Jakub said on IRC, const_ok_for_output_1 is called only with
partial rtx's and therefore disabling minus (const_int) (symref) might
not be the best thing to do especially if this were part of plus
(symref) (minus (const int) (symref)) and both symrefs were in the
same section.

Bootstrapped and regtested on armhf

Bootstrap and regression test running on x86_64.

Ok to commit ?

regards
Ramana

gcc/

<DATE>   Jakub Jelinek <jakub@redhat.com>
         Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>

* dwarf2out.c (const_ok_for_output_1): Reject expressions
containing a NOT.

gcc/testsuite

<DATE>  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>

* gcc.c-torture/compile/pr60655-1.c: New test.

From-SVN: r209121

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr60655-1.c [new file with mode: 0644]

index 942b011f0c14108ef078d0cfe51f415fe0d2c466..ad1d2c15e638ec51331450706ff53d0ec9230dcd 100644 (file)
@@ -1,3 +1,10 @@
+2014-04-04  Jakub Jelinek  <jakub@redhat.com>
+       Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
+
+       PR debug/60655
+       * dwarf2out.c (const_ok_for_output_1): Reject expressions
+       containing a NOT.
+
 2014-04-04  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR bootstrap/60743
index 2b584a58853138f89190f01a4523c97bd8d74267..67b37eba506644d214e57a1c99d28a88468734d4 100644 (file)
@@ -11325,8 +11325,18 @@ const_ok_for_output_1 (rtx *rtlp, void *data ATTRIBUTE_UNUSED)
       return 1;
     }
 
+  /* FIXME: Refer to PR60655. It is possible for simplification
+     of rtl expressions in var tracking to produce such expressions.
+     We should really identify / validate expressions
+     enclosed in CONST that can be handled by assemblers on various
+     targets and only handle legitimate cases here.  */
   if (GET_CODE (rtl) != SYMBOL_REF)
-    return 0;
+    {
+      if (GET_CODE (rtl) == NOT)
+         return 1;
+
+      return 0;
+    }
 
   if (CONSTANT_POOL_ADDRESS_P (rtl))
     {
index a8268b939da7dfaa75f14cdbdf5f59e7e2563ef0..11a0a5e21a7a9b9c48c3e58a5c81ab033aa95255 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-04  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
+
+       PR debug/60655
+       * gcc.c-torture/compile/pr60655-1.c: New test.
+
 2014-04-04  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/60640
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr60655-1.c b/gcc/testsuite/gcc.c-torture/compile/pr60655-1.c
new file mode 100644 (file)
index 0000000..5f38701
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-options "-fdata-sections" } */
+
+typedef unsigned char unit;
+typedef unit *unitptr;
+extern short global_precision;
+typedef unsigned int size_t;
+extern void *memcpy (void *dest, const void *src, size_t n);
+
+short mp_compare(const unit* r1, const unit* r2)
+{
+  register short precision;
+  precision = global_precision;
+  (r1) = ((r1)+(precision)-1);
+  (r2) = ((r2)+(precision)-1);
+  do
+    { if (*r1 < *r2)
+       return(-1);
+      if (*((r1)--) > *((r2)--))
+       return(1);
+    } while (--precision);
+}
+
+static unit modulus[((1280+(2*8))/8)];
+static unit d_data[((1280+(2*8))/8)*2];
+
+int upton_modmult (unitptr prod, unitptr multiplicand, unitptr multiplier)
+{
+ unitptr d = d_data;
+ while (mp_compare(d,modulus) > 0)
+   memcpy((void*)(prod), (const void*)(d), (global_precision));
+}