re PR middle-end/64744 (ARM: gcc internal compiler error: in store_field, at expr...
authorAlexander Basov <coohpt@gmail.com>
Mon, 3 Aug 2015 19:34:31 +0000 (19:34 +0000)
committerJeff Law <law@gcc.gnu.org>
Mon, 3 Aug 2015 19:34:31 +0000 (13:34 -0600)
PR middle-end/64744
PR middle-end/48470
PR middle-end/43404
* cfgexpand.c (expand_one_var): Add check if stack is going to
be used in naked function.
* expr.c (expand_expr_addr_expr_1): Remove excess checking
whether expression should not reside in MEM.
* function.c (use_register_for_decl): Do not use registers for
non-register things (volatile, float, BLKMode) in naked functions.

PR middle-end/64744
PR middle-end/48470
PR middle-end/43404
* gcc.target/arm/pr43404.c : New testcase.
* gcc.target/arm/pr48470.c : New testcase.
* gcc.target/arm/pr64744-1.c : New testcase.
* gcc.target/arm/pr64744-2.c : New testcase.

From-SVN: r226528

gcc/ChangeLog
gcc/cfgexpand.c
gcc/expr.c
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr43404.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/pr48470.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/pr64744-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/arm/pr64744-2.c [new file with mode: 0644]

index ca0da01fe0acdc80e15b81beef435e16c6908c5f..d9fb2c1495dbfb114231b459f38d2ddcbd37ef89 100644 (file)
@@ -1,3 +1,15 @@
+2015-08-03  Alexander Basov <coohpt@gmail.com>
+
+       PR middle-end/64744
+       PR middle-end/48470
+       PR middle-end/43404
+       * cfgexpand.c (expand_one_var): Add check if stack is going to
+       be used in naked function.
+       * expr.c (expand_expr_addr_expr_1): Remove excess checking
+       whether expression should not reside in MEM.
+       * function.c (use_register_for_decl): Do not use registers for
+       non-register things (volatile, float, BLKMode) in naked functions.
+
 2015-08-03  John David Anglin  <danglin@gcc.gnu.org>
 
        PR target/67060
index 8ff79abf6910f194356bb2900d386c2f7c93f9ed..7df9d06fab33d0be288b226aa412f250853fbd44 100644 (file)
@@ -1335,7 +1335,16 @@ expand_one_var (tree var, bool toplevel, bool really_expand)
   else
     {
       if (really_expand)
-        expand_one_stack_var (origvar);
+        {
+          if (lookup_attribute ("naked",
+                                DECL_ATTRIBUTES (current_function_decl)))
+            error ("cannot allocate stack for variable %q+D, naked function.",
+                   var);
+
+          expand_one_stack_var (origvar);
+        }
+
+
       return tree_to_uhwi (DECL_SIZE_UNIT (var));
     }
   return 0;
index 46084c2efec0393bf589614f4dadbf241d0d3557..31b4573009adb02cd1324d2c8d297f88c944d028 100644 (file)
@@ -7603,15 +7603,7 @@ expand_expr_addr_expr_1 (tree exp, rtx target, machine_mode tmode,
             marked TREE_ADDRESSABLE, which will be either a front-end
             or a tree optimizer bug.  */
 
-         if (TREE_ADDRESSABLE (exp)
-             && ! MEM_P (result)
-             && ! targetm.calls.allocate_stack_slots_for_args ())
-           {
-             error ("local frame unavailable (naked function?)");
-             return result;
-           }
-         else
-           gcc_assert (MEM_P (result));
+         gcc_assert (MEM_P (result));
          result = XEXP (result, 0);
 
          /* ??? Is this needed anymore?  */
index 536de195acfd1e01671507f3fe8284b678a1fad5..20bf3b3a834bab502470c744b01dc15fa2af441d 100644 (file)
@@ -2105,9 +2105,6 @@ aggregate_value_p (const_tree exp, const_tree fntype)
 bool
 use_register_for_decl (const_tree decl)
 {
-  if (!targetm.calls.allocate_stack_slots_for_args ())
-    return true;
-
   /* Honor volatile.  */
   if (TREE_SIDE_EFFECTS (decl))
     return false;
@@ -2135,6 +2132,9 @@ use_register_for_decl (const_tree decl)
   if (flag_float_store && FLOAT_TYPE_P (TREE_TYPE (decl)))
     return false;
 
+  if (!targetm.calls.allocate_stack_slots_for_args ())
+    return true;
+
   /* If we're not interested in tracking debugging information for
      this decl, then we can certainly put it in a register.  */
   if (DECL_IGNORED_P (decl))
index 44d7eb9588299713ebb0f64a7b7ecb7fc04a37f4..1fe025bc487ceca6da6d438c26d558cb0b05ae4e 100644 (file)
@@ -1,3 +1,13 @@
+2015-08-03  Alexander Basov <coohpt@gmail.com>
+
+       PR middle-end/64744
+       PR middle-end/48470
+       PR middle-end/43404
+       * gcc.target/arm/pr43404.c : New testcase.
+       * gcc.target/arm/pr48470.c : New testcase.
+       * gcc.target/arm/pr64744-1.c : New testcase.
+       * gcc.target/arm/pr64744-2.c : New testcase.
+
 2015-08-03  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR tree-optimization/67077
diff --git a/gcc/testsuite/gcc.target/arm/pr43404.c b/gcc/testsuite/gcc.target/arm/pr43404.c
new file mode 100644 (file)
index 0000000..4f2291d
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target naked_functions } */
+/* { dg-options "-O0" } */
+
+__attribute__ ((naked))
+void __data_abort(void)
+{
+  long foo; /* { dg-error "cannot allocate stack for variable" } */
+  long* bar = &foo;
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr48470.c b/gcc/testsuite/gcc.target/arm/pr48470.c
new file mode 100644 (file)
index 0000000..20343e7
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target naked_functions } */
+/* { dg-options "-O0" } */
+
+extern void g(int *x);
+
+void __attribute__((naked)) f(void)
+{
+    int x = 0; /* { dg-error "cannot allocate stack for variable" } */
+    g(&x);
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr64744-1.c b/gcc/testsuite/gcc.target/arm/pr64744-1.c
new file mode 100644 (file)
index 0000000..4029303
--- /dev/null
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target naked_functions } */
+/* { dg-options "-O0" } */
+
+__attribute__((naked))
+void foo1 ()
+{
+  int aa = 0;
+  int ab = {0};
+}
+
+__attribute__((naked))
+void foo2() {
+  char aa [ ] = {}; /* { dg-error "cannot allocate stack for variable" } */
+  char ab [1] = {};
+  char ac [2] = {}; /* { dg-error "cannot allocate stack for variable" } */
+  char ad [3] = {}; /* { dg-error "cannot allocate stack for variable" } */
+}
+
+__attribute__((naked))
+void foo3() {
+  char aa [1] = {0};
+  char ab [2] = {0}; /* { dg-error "cannot allocate stack for variable" } */
+  char ac [3] = {0}; /* { dg-error "cannot allocate stack for variable" } */
+  char ad [4] = {0}; /* { dg-error "cannot allocate stack for variable" } */
+}
+
+__attribute__((naked))
+void foo4() {
+  char aa [2] = {0,0}; /* { dg-error "cannot allocate stack for variable" } */
+}
+__attribute__((naked))
+void foo5() {
+  char aa [3] = {0,0,0}; /* { dg-error "cannot allocate stack for variable" } */
+}
+
+__attribute__((naked))
+void foo6() {
+  char aa [4] = {0,0,0,0}; /* { dg-error "cannot allocate stack for variable" } */
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr64744-2.c b/gcc/testsuite/gcc.target/arm/pr64744-2.c
new file mode 100644 (file)
index 0000000..d33ea7b
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target naked_functions } */
+/* { dg-options "-O0" } */
+
+struct s {
+  char a;
+    int b;
+};
+
+__attribute__((naked))
+void foo () {
+  struct s x = {}; /* { dg-error "cannot allocate stack for variable" } */
+}