[ARC] Rework delegitimate_address hook
authorClaudiu Zissulescu <claziss@synopsys.com>
Fri, 26 Jan 2018 11:34:16 +0000 (12:34 +0100)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Fri, 26 Jan 2018 11:34:16 +0000 (12:34 +0100)
Delegitimize address is used to undo the obfuscating effect of PIC
addresses, returning the address in a way which is understood by the
compiler.  The old version of the hook was outdated, not beeing able
to recognize the current addresses generated by the ARC backend.

gcc/
2018-01-26  Claudiu Zissulescu  <claziss@synopsys.com>

* config/arc/arc.c (arc_delegitimize_address_0): Refactored to
recognize new pic like addresses.
(arc_delegitimize_address): Clean up.

testsuite/
2018-01-26  Claudiu Zissulescu  <claziss@synopsys.com>

* testsuite/gcc.target/arc/tdelegitimize_addr.c: New test.

From-SVN: r257084

gcc/ChangeLog
gcc/config/arc/arc.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c [new file with mode: 0755]

index f4f61feaca0c30b8ef1586557122956df2116bc5..751226dcda7c1a7a43658514fa83ad79941f8474 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-26  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * config/arc/arc.c (arc_delegitimize_address_0): Refactored to
+       recognize new pic like addresses.
+       (arc_delegitimize_address): Clean up.
+
 2018-01-26  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/arc/arc-arches.def: Option mrf16 valid for all
index fd10d0146a55d08fce1274e5a85afa31188d3e37..fc18f65aa909a8dacf200cb8a10d033c1514ca72 100644 (file)
@@ -9567,68 +9567,55 @@ arc_legitimize_address (rtx orig_x, rtx oldx, machine_mode mode)
 }
 
 static rtx
-arc_delegitimize_address_0 (rtx x)
+arc_delegitimize_address_0 (rtx op)
 {
-  rtx u, gp, p;
-
-  if (GET_CODE (x) == CONST && GET_CODE (u = XEXP (x, 0)) == UNSPEC)
+  switch (GET_CODE (op))
     {
-      if (XINT (u, 1) == ARC_UNSPEC_GOT
-         || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC)
-       return XVECEXP (u, 0, 0);
+    case CONST:
+      return arc_delegitimize_address_0 (XEXP (op, 0));
+
+    case UNSPEC:
+      switch (XINT (op, 1))
+       {
+       case ARC_UNSPEC_GOT:
+       case ARC_UNSPEC_GOTOFFPC:
+         return XVECEXP (op, 0, 0);
+       default:
+         break;
+       }
+      break;
+
+    case PLUS:
+      {
+       rtx t1 = arc_delegitimize_address_0 (XEXP (op, 0));
+       rtx t2 = XEXP (op, 1);
+
+       if (t1 && t2)
+         return gen_rtx_PLUS (GET_MODE (op), t1, t2);
+       break;
+      }
+
+    default:
+      break;
     }
-  else if (GET_CODE (x) == CONST && GET_CODE (p = XEXP (x, 0)) == PLUS
-          && GET_CODE (u = XEXP (p, 0)) == UNSPEC
-          && (XINT (u, 1) == ARC_UNSPEC_GOT
-              || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC))
-    return gen_rtx_CONST
-           (GET_MODE (x),
-            gen_rtx_PLUS (GET_MODE (p), XVECEXP (u, 0, 0), XEXP (p, 1)));
-  else if (GET_CODE (x) == PLUS
-          && ((REG_P (gp = XEXP (x, 0))
-               && REGNO (gp) == PIC_OFFSET_TABLE_REGNUM)
-              || (GET_CODE (gp) == CONST
-                  && GET_CODE (u = XEXP (gp, 0)) == UNSPEC
-                  && XINT (u, 1) == ARC_UNSPEC_GOT
-                  && GET_CODE (XVECEXP (u, 0, 0)) == SYMBOL_REF
-                  && !strcmp (XSTR (XVECEXP (u, 0, 0), 0), "_DYNAMIC")))
-          && GET_CODE (XEXP (x, 1)) == CONST
-          && GET_CODE (u = XEXP (XEXP (x, 1), 0)) == UNSPEC
-          && XINT (u, 1) == ARC_UNSPEC_GOTOFF)
-    return XVECEXP (u, 0, 0);
-  else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS
-          && ((REG_P (gp = XEXP (XEXP (x, 0), 1))
-               && REGNO (gp) == PIC_OFFSET_TABLE_REGNUM)
-              || (GET_CODE (gp) == CONST
-                  && GET_CODE (u = XEXP (gp, 0)) == UNSPEC
-                  && XINT (u, 1) == ARC_UNSPEC_GOT
-                  && GET_CODE (XVECEXP (u, 0, 0)) == SYMBOL_REF
-                  && !strcmp (XSTR (XVECEXP (u, 0, 0), 0), "_DYNAMIC")))
-          && GET_CODE (XEXP (x, 1)) == CONST
-          && GET_CODE (u = XEXP (XEXP (x, 1), 0)) == UNSPEC
-          && XINT (u, 1) == ARC_UNSPEC_GOTOFF)
-    return gen_rtx_PLUS (GET_MODE (x), XEXP (XEXP (x, 0), 0),
-                        XVECEXP (u, 0, 0));
-  else if (GET_CODE (x) == PLUS
-          && (u = arc_delegitimize_address_0 (XEXP (x, 1))))
-    return gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0), u);
   return NULL_RTX;
 }
 
 static rtx
-arc_delegitimize_address (rtx x)
+arc_delegitimize_address (rtx orig_x)
 {
-  rtx orig_x = x = delegitimize_mem_from_attrs (x);
-  if (GET_CODE (x) == MEM)
+  rtx x = orig_x;
+
+  if (MEM_P (x))
     x = XEXP (x, 0);
+
   x = arc_delegitimize_address_0 (x);
-  if (x)
-    {
-      if (MEM_P (orig_x))
-       x = replace_equiv_address_nv (orig_x, x);
-      return x;
-    }
-  return orig_x;
+  if (!x)
+    return orig_x;
+
+  if (MEM_P (orig_x))
+    x = replace_equiv_address_nv (orig_x, x);
+  return x;
 }
 
 /* Return a REG rtx for acc1.  N.B. the gcc-internal representation may
index 4e02b1e6c6488237379fec14e20a307f906bedb0..741e538f5e735e483f9bbf23e586273344e57dce 100644 (file)
@@ -1,3 +1,7 @@
+2018-01-26  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * testsuite/gcc.target/arc/tdelegitimize_addr.c: New test.
+
 2018-01-26  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * gcc.target/arc/jli-1.c: New file.
diff --git a/gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c b/gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c
new file mode 100755 (executable)
index 0000000..0d010ff
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! { clmcpu } } } */
+/* { dg-options "-mcpu=archs -g -O1 -fpic -mlra" } */
+
+/* Check if delegitimize address returns correctly the un-obfuscated
+   address.  */
+
+typedef struct {
+  long long tv_usec;
+} t_a;
+
+static t_a a;
+
+int b;
+extern void fn2 (t_a);
+
+void fn1 (void)
+{
+ again:
+  fn2(a);
+  if (b)
+    goto again;
+}