re PR target/66569 ([CHKP] internal compiler error: in assign_by_spills)
authorIlya Enkovich <enkovich.gnu@gmail.com>
Thu, 18 Jun 2015 10:18:48 +0000 (10:18 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Thu, 18 Jun 2015 10:18:48 +0000 (10:18 +0000)
gcc/

PR target/66569
* function.c (assign_bounds): Add arguments assign_regs,
assign_special, assign_bt.
(assign_parms): For vararg functions handle bounds in BT
and special slots after incoming vararg bounds.

gcc/testsuite/

PR target/66569
* gcc.target/i386/mpx/chkp-vararg.c: New test.

From-SVN: r224602

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/mpx/pr66569.c [new file with mode: 0644]

index 23301d4beee43d6ff7fddfed96283ea76dec2c1b..fae12ccdd1a59e4732d17b844dcaf6548ae979ba 100644 (file)
@@ -1,3 +1,11 @@
+2015-06-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
+
+       PR target/66569
+       * function.c (assign_bounds): Add arguments assign_regs,
+       assign_special, assign_bt.
+       (assign_parms): For vararg functions handle bounds in BT
+       and special slots after incoming vararg bounds.
+
 2015-06-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
 
        PR middle-end/66568
index ac0458a6cc8fe744ac37aca120481f00a162acb5..ea0eba8fe857ff3ff6aff564ba9e309ea10f5573 100644 (file)
@@ -3489,9 +3489,11 @@ assign_parm_load_bounds (struct assign_parm_data_one *data,
 
 static void
 assign_bounds (vec<bounds_parm_data> &bndargs,
-              struct assign_parm_data_all &all)
+              struct assign_parm_data_all &all,
+              bool assign_regs, bool assign_special,
+              bool assign_bt)
 {
-  unsigned i, pass, handled = 0;
+  unsigned i, pass;
   bounds_parm_data *pbdata;
 
   if (!bndargs.exists ())
@@ -3505,17 +3507,20 @@ assign_bounds (vec<bounds_parm_data> &bndargs,
       {
        /* Pass 0 => regs only.  */
        if (pass == 0
-           && (!pbdata->parm_data.entry_parm
-               || GET_CODE (pbdata->parm_data.entry_parm) != REG))
+           && (!assign_regs
+               ||(!pbdata->parm_data.entry_parm
+                  || GET_CODE (pbdata->parm_data.entry_parm) != REG)))
          continue;
        /* Pass 1 => slots only.  */
        else if (pass == 1
-                && (!pbdata->parm_data.entry_parm
-                    || GET_CODE (pbdata->parm_data.entry_parm) == REG))
+                && (!assign_special
+                    || (!pbdata->parm_data.entry_parm
+                        || GET_CODE (pbdata->parm_data.entry_parm) == REG)))
          continue;
        /* Pass 2 => BT only.  */
        else if (pass == 2
-                && pbdata->parm_data.entry_parm)
+                && (!assign_bt
+                    || pbdata->parm_data.entry_parm))
          continue;
 
        if (!pbdata->parm_data.entry_parm
@@ -3536,14 +3541,7 @@ assign_bounds (vec<bounds_parm_data> &bndargs,
        else
          assign_parm_setup_stack (&all, pbdata->bounds_parm,
                                   &pbdata->parm_data);
-
-       /* Count handled bounds to make sure we miss nothing.  */
-       handled++;
       }
-
-  gcc_assert (handled == bndargs.length ());
-
-  bndargs.release ();
 }
 
 /* Assign RTL expressions to the function's parameters.  This may involve
@@ -3668,12 +3666,14 @@ assign_parms (tree fndecl)
              /* We expect this is the last parm.  Otherwise it is wrong
                 to assign bounds right now.  */
              gcc_assert (i == (fnargs.length () - 1));
-             assign_bounds (bndargs, all);
+             assign_bounds (bndargs, all, true, false, false);
              targetm.calls.setup_incoming_vararg_bounds (all.args_so_far,
                                                          data.promoted_mode,
                                                          data.passed_type,
                                                          &pretend_bytes,
                                                          false);
+             assign_bounds (bndargs, all, false, true, true);
+             bndargs.release ();
            }
        }
 
@@ -3685,7 +3685,8 @@ assign_parms (tree fndecl)
        bound_no++;
     }
 
-  assign_bounds (bndargs, all);
+  assign_bounds (bndargs, all, true, true, true);
+  bndargs.release ();
 
   if (targetm.calls.split_complex_arg)
     assign_parms_unsplit_complex (&all, fnargs);
index 3b1d0710c1a93b151263375ece3d8a3b4d8cd889..7692ae53382daee2491df73c85c6401c74000f3d 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
+
+       PR target/66569
+       * gcc.target/i386/mpx/chkp-vararg.c: New test.
+
 2015-06-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
 
        PR middle-end/66568
diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr66569.c b/gcc/testsuite/gcc.target/i386/mpx/pr66569.c
new file mode 100644 (file)
index 0000000..ba2023c
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
+
+struct s1 {
+  int *p;
+  int i;
+};
+
+struct s2 {
+  struct s1 s;
+  int i;
+};
+
+int test (struct s2 s, ...) { }