re PR middle-end/64744 (ARM: gcc internal compiler error: in store_field, at expr.c:6659)
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
This commit is contained in:
parent
f2fef1c8a3
commit
de0fb9055c
9 changed files with 110 additions and 13 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
10
gcc/expr.c
10
gcc/expr.c
|
@ -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? */
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
10
gcc/testsuite/gcc.target/arm/pr43404.c
Normal file
10
gcc/testsuite/gcc.target/arm/pr43404.c
Normal file
|
@ -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;
|
||||
}
|
11
gcc/testsuite/gcc.target/arm/pr48470.c
Normal file
11
gcc/testsuite/gcc.target/arm/pr48470.c
Normal file
|
@ -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);
|
||||
}
|
40
gcc/testsuite/gcc.target/arm/pr64744-1.c
Normal file
40
gcc/testsuite/gcc.target/arm/pr64744-1.c
Normal file
|
@ -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" } */
|
||||
}
|
13
gcc/testsuite/gcc.target/arm/pr64744-2.c
Normal file
13
gcc/testsuite/gcc.target/arm/pr64744-2.c
Normal file
|
@ -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" } */
|
||||
}
|
Loading…
Add table
Reference in a new issue