summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2011-05-25 11:00:14 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2011-05-25 11:00:14 +0000
commit8c0dd6141ac94f5b7e842bf19e13c25302599dc8 (patch)
tree8f263f60484dabe77a13c389e9ce210b121dbc56
parentebb9e48b6bf683afc0ee573649c2f12519688dab (diff)
downloadgcc-8c0dd6141ac94f5b7e842bf19e13c25302599dc8.tar.gz
* common.opt (flag_stack_usage_info): New variable.
(-Wstack-usage): New option. * doc/invoke.texi (Warning options): Document -Wstack-usage. * opts.c (common_handle_option) <OPT_Wstack_usage_>: New case. <OPT_fstack_usage>: Likewise. * toplev.c (output_stack_usage): Handle -Wstack-usage. * calls.c (expand_call): Test flag_stack_usage_info variable instead of flag_stack_usage. (emit_library_call_value_1): Likewise. * explow.c (allocate_dynamic_stack_space): Likewise. * function.c (instantiate_virtual_regs ): Likewise. (prepare_function_start): Likewise. (rest_of_handle_thread_prologue_and_epilogue): Likewise. * config/alpha/alpha.c (alpha_expand_prologue): Likewise. * config/arm/arm.c (arm_expand_prologue): Likewise. (thumb1_expand_prologue): Likewise. * config/avr/avr.c (expand_prologue): Likewise. * config/i386/i386.c (ix86_expand_prologue): Likewise. * config/ia64/ia64.c (ia64_expand_prologue): Likewise. * config/m68k/m68k.c (m68k_expand_prologue): Likewise. * config/mips/mips.c (mips_expand_prologue): Likewise. * config/pa/pa.c (hppa_expand_prologue): Likewise. * config/rs6000/rs6000.c (rs6000_emit_prologue): Likewise. * config/s390/s390.c (s390_emit_prologue): Likewise. * config/sh/sh.c (sh_expand_prologue): Likewise. * config/sparc/sparc.c (sparc_expand_prologue): Likewise. * config/spu/spu.c (spu_expand_prologue): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174182 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog30
-rw-r--r--gcc/calls.c6
-rw-r--r--gcc/common.opt8
-rw-r--r--gcc/config/alpha/alpha.c2
-rw-r--r--gcc/config/arm/arm.c4
-rw-r--r--gcc/config/avr/avr.c2
-rw-r--r--gcc/config/i386/i386.c2
-rw-r--r--gcc/config/ia64/ia64.c2
-rw-r--r--gcc/config/m68k/m68k.c2
-rw-r--r--gcc/config/mips/mips.c2
-rw-r--r--gcc/config/pa/pa.c2
-rw-r--r--gcc/config/rs6000/rs6000.c2
-rw-r--r--gcc/config/s390/s390.c2
-rw-r--r--gcc/config/sh/sh.c2
-rw-r--r--gcc/config/sparc/sparc.c2
-rw-r--r--gcc/config/spu/spu.c2
-rw-r--r--gcc/doc/invoke.texi33
-rw-r--r--gcc/explow.c10
-rw-r--r--gcc/function.c6
-rw-r--r--gcc/opts.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/stack-usage-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/stack-usage-2.c33
-rw-r--r--gcc/toplev.c58
24 files changed, 182 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 694a0947d1e..b57b242724e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,33 @@
+2011-05-25 Eric Botcazou <ebotcazou@adacore.com>
+
+ * common.opt (flag_stack_usage_info): New variable.
+ (-Wstack-usage): New option.
+ * doc/invoke.texi (Warning options): Document -Wstack-usage.
+ * opts.c (common_handle_option) <OPT_Wstack_usage_>: New case.
+ <OPT_fstack_usage>: Likewise.
+ * toplev.c (output_stack_usage): Handle -Wstack-usage.
+ * calls.c (expand_call): Test flag_stack_usage_info variable instead
+ of flag_stack_usage.
+ (emit_library_call_value_1): Likewise.
+ * explow.c (allocate_dynamic_stack_space): Likewise.
+ * function.c (instantiate_virtual_regs ): Likewise.
+ (prepare_function_start): Likewise.
+ (rest_of_handle_thread_prologue_and_epilogue): Likewise.
+ * config/alpha/alpha.c (alpha_expand_prologue): Likewise.
+ * config/arm/arm.c (arm_expand_prologue): Likewise.
+ (thumb1_expand_prologue): Likewise.
+ * config/avr/avr.c (expand_prologue): Likewise.
+ * config/i386/i386.c (ix86_expand_prologue): Likewise.
+ * config/ia64/ia64.c (ia64_expand_prologue): Likewise.
+ * config/m68k/m68k.c (m68k_expand_prologue): Likewise.
+ * config/mips/mips.c (mips_expand_prologue): Likewise.
+ * config/pa/pa.c (hppa_expand_prologue): Likewise.
+ * config/rs6000/rs6000.c (rs6000_emit_prologue): Likewise.
+ * config/s390/s390.c (s390_emit_prologue): Likewise.
+ * config/sh/sh.c (sh_expand_prologue): Likewise.
+ * config/sparc/sparc.c (sparc_expand_prologue): Likewise.
+ * config/spu/spu.c (spu_expand_prologue): Likewise.
+
2011-05-25 Richard Guenther <rguenther@suse.de>
* gimple.c (iterative_hash_canonical_type): Skip non-FIELD_DECLs.
diff --git a/gcc/calls.c b/gcc/calls.c
index 44a16ff63ff..512ff0e4912 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -2501,7 +2501,7 @@ expand_call (tree exp, rtx target, int ignore)
stack_arg_under_construction = 0;
}
argblock = push_block (ARGS_SIZE_RTX (adjusted_args_size), 0, 0);
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_has_unbounded_dynamic_stack_size = 1;
}
else
@@ -2708,7 +2708,7 @@ expand_call (tree exp, rtx target, int ignore)
/* Record the maximum pushed stack space size. We need to delay
doing it this far to take into account the optimization done
by combine_pending_stack_adjustment_and_call. */
- if (flag_stack_usage
+ if (flag_stack_usage_info
&& !ACCUMULATE_OUTGOING_ARGS
&& pass
&& adjusted_args_size.var == 0)
@@ -3573,7 +3573,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
if (args_size.constant > crtl->outgoing_args_size)
crtl->outgoing_args_size = args_size.constant;
- if (flag_stack_usage && !ACCUMULATE_OUTGOING_ARGS)
+ if (flag_stack_usage_info && !ACCUMULATE_OUTGOING_ARGS)
{
int pushed = args_size.constant + pending_stack_adjust;
if (pushed > current_function_pushed_stack_size)
diff --git a/gcc/common.opt b/gcc/common.opt
index 492d25e4646..3ee9ded4624 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -138,6 +138,10 @@ enum vect_verbosity_levels user_vect_verbosity_level = MAX_VERBOSITY_LEVEL
Variable
enum stack_check_type flag_stack_check = NO_STACK_CHECK
+; True if stack usage information needs to be computed.
+Variable
+bool flag_stack_usage_info = false
+
; -dA causes debug commentary information to be produced in
; the generated assembly code (to make it more readable). This option
; is generally only of use to those who actually need to read the
@@ -575,6 +579,10 @@ Wstack-protector
Common Var(warn_stack_protect) Warning
Warn when not issuing stack smashing protection for some reason
+Wstack-usage=
+Common Joined RejectNegative UInteger Var(warn_stack_usage) Init(-1) Warning
+Warn if stack usage might be larger than specified amount
+
Wstrict-aliasing
Common Warning
Warn about code which might break strict aliasing rules
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 99ebf62d242..7323329e80d 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -7522,7 +7522,7 @@ alpha_expand_prologue (void)
sa_size = alpha_sa_size ();
frame_size = compute_frame_size (get_frame_size (), sa_size);
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = frame_size;
if (TARGET_ABI_OPEN_VMS)
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 47c7a3a4ca9..22ddcd217ce 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -15815,7 +15815,7 @@ arm_expand_prologue (void)
}
}
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size
= offsets->outgoing_args - offsets->saved_args;
@@ -20800,7 +20800,7 @@ thumb1_expand_prologue (void)
emit_move_insn (gen_rtx_REG (Pmode, ARM_HARD_FRAME_POINTER_REGNUM),
stack_pointer_rtx);
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size
= offsets->outgoing_args - offsets->saved_args;
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index c8c363ad948..5a565b0857f 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -892,7 +892,7 @@ expand_prologue (void)
}
}
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = cfun->machine->stack_usage;
}
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 854e376b58e..4b5bc96c492 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -10546,7 +10546,7 @@ ix86_expand_prologue (void)
allocate = frame.stack_pointer_offset - m->fs.sp_offset;
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
{
/* We start to count from ARG_POINTER. */
HOST_WIDE_INT stack_size = frame.stack_pointer_offset;
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index adcb780b927..c1cebbaf21b 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -3183,7 +3183,7 @@ ia64_expand_prologue (void)
ia64_compute_frame_size (get_frame_size ());
last_scratch_gr_reg = 15;
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = current_frame_info.total_size;
if (dump_file)
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 47f47af888c..fd27ee43a14 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -981,7 +981,7 @@ m68k_expand_prologue (void)
m68k_compute_frame_layout ();
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size
= current_frame.size + current_frame.offset;
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 26028192db5..46b25f7b985 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -10008,7 +10008,7 @@ mips_expand_prologue (void)
frame = &cfun->machine->frame;
size = frame->total_size;
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = size;
/* Save the registers. Allocate up to MIPS_MAX_FIRST_STACK_STEP
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index e3260c4105f..e512a33c070 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -3807,7 +3807,7 @@ hppa_expand_prologue (void)
local_fsize += STARTING_FRAME_OFFSET;
actual_fsize = compute_frame_size (size, &save_fregs);
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = actual_fsize;
/* Compute a few things we will use often. */
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index ea272fcaad6..48f387e98b6 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -20116,7 +20116,7 @@ rs6000_emit_prologue (void)
&& call_used_regs[STATIC_CHAIN_REGNUM]);
HOST_WIDE_INT sp_offset = 0;
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = info->total_size;
if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && info->total_size)
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index de1c32638f8..e86755b37d9 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -8097,7 +8097,7 @@ s390_emit_prologue (void)
if (!TARGET_PACKED_STACK)
next_fpr = cfun_save_high_fprs_p ? 31 : 0;
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = cfun_frame_layout.frame_size;
/* Decrement stack pointer. */
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index d799782181e..94c8ba4fb0a 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -7349,7 +7349,7 @@ sh_expand_prologue (void)
emit_insn (gen_shcompact_incoming_args ());
}
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = stack_usage;
}
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 634e44d15e8..c0f4e75590a 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -4522,7 +4522,7 @@ sparc_expand_prologue (void)
/* Advertise that the data calculated just above are now valid. */
sparc_prologue_data_valid_p = true;
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = actual_fsize;
if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && actual_fsize)
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c
index ca065ca44de..51a771563c6 100644
--- a/gcc/config/spu/spu.c
+++ b/gcc/config/spu/spu.c
@@ -2101,7 +2101,7 @@ spu_expand_prologue (void)
}
}
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_static_stack_size = total_size;
}
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 7de8fd096a8..f53d6107114 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -260,7 +260,7 @@ Objective-C and Objective-C++ Dialects}.
-Wredundant-decls @gol
-Wreturn-type -Wsequence-point -Wshadow @gol
-Wsign-compare -Wsign-conversion -Wstack-protector @gol
--Wstrict-aliasing -Wstrict-aliasing=n @gol
+-Wstack-usage=@var{len} -Wstrict-aliasing -Wstrict-aliasing=n @gol
-Wstrict-overflow -Wstrict-overflow=@var{n} @gol
-Wsuggest-attribute=@r{[}pure@r{|}const@r{|}noreturn@r{]} @gol
-Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand @gol
@@ -3924,6 +3924,37 @@ via @code{alloca}, variable-length arrays, or related constructs
is not included by the compiler when determining
whether or not to issue a warning.
+@item -Wstack-usage=@var{len}
+@opindex Wstack-usage
+Warn if the stack usage of a function might be larger than @var{len} bytes.
+The computation done to determine the stack usage is conservative.
+Any space allocated via @code{alloca}, variable-length arrays, or related
+constructs is included by the compiler when determining whether or not to
+issue a warning.
+
+The message is in keeping with the output of @option{-fstack-usage}.
+
+@itemize
+@item
+If the stack usage is fully static but exceeds the specified amount, it's:
+
+@smallexample
+  warning: stack usage is 1120 bytes
+@end smallexample
+@item
+If the stack usage is (partly) dynamic but bounded, it's:
+
+@smallexample
+  warning: stack usage might be 1648 bytes
+@end smallexample
+@item
+If the stack usage is (partly) dynamic and not bounded, it's:
+
+@smallexample
+  warning: stack usage might be unbounded
+@end smallexample
+@end itemize
+
@item -Wunsafe-loop-optimizations
@opindex Wunsafe-loop-optimizations
@opindex Wno-unsafe-loop-optimizations
diff --git a/gcc/explow.c b/gcc/explow.c
index 812897163e2..fe507877c90 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -1150,7 +1150,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
/* If stack usage info is requested, look into the size we are passed.
We need to do so this early to avoid the obfuscation that may be
introduced later by the various alignment operations. */
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
{
if (CONST_INT_P (size))
stack_usage_size = INTVAL (size);
@@ -1242,7 +1242,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
size = plus_constant (size, extra);
size = force_operand (size, NULL_RTX);
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
stack_usage_size += extra;
if (extra && size_align > extra_align)
@@ -1273,7 +1273,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
/* The above dynamic offset cannot be computed statically at this
point, but it will be possible to do so after RTL expansion is
done. Record how many times we will need to add it. */
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
current_function_dynamic_alloc_count++;
/* ??? Can we infer a minimum of STACK_BOUNDARY here? */
@@ -1298,7 +1298,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
{
size = round_push (size);
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
{
int align = crtl->preferred_stack_boundary / BITS_PER_UNIT;
stack_usage_size = (stack_usage_size + align - 1) / align * align;
@@ -1309,7 +1309,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
/* The size is supposed to be fully adjusted at this point so record it
if stack usage info is requested. */
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
{
current_function_dynamic_stack_size += stack_usage_size;
diff --git a/gcc/function.c b/gcc/function.c
index 4b022011743..c0350be5b17 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -1939,7 +1939,7 @@ instantiate_virtual_regs (void)
/* See allocate_dynamic_stack_space for the rationale. */
#ifdef SETJMP_VIA_SAVE_AREA
- if (flag_stack_usage && cfun->calls_setjmp)
+ if (flag_stack_usage_info && cfun->calls_setjmp)
{
int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
dynamic_offset = (dynamic_offset + align - 1) / align * align;
@@ -4465,7 +4465,7 @@ prepare_function_start (void)
init_expr ();
default_rtl_profile ();
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
{
cfun->su = ggc_alloc_cleared_stack_usage ();
cfun->su->static_stack_size = -1;
@@ -5939,7 +5939,7 @@ rest_of_handle_thread_prologue_and_epilogue (void)
thread_prologue_and_epilogue_insns ();
/* The stack usage info is finalized during prologue expansion. */
- if (flag_stack_usage)
+ if (flag_stack_usage_info)
output_stack_usage ();
return 0;
diff --git a/gcc/opts.c b/gcc/opts.c
index 356f093192f..f7355576928 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1422,6 +1422,11 @@ common_handle_option (struct gcc_options *opts,
opts->x_warn_frame_larger_than = value != -1;
break;
+ case OPT_Wstack_usage_:
+ opts->x_warn_stack_usage = value;
+ opts->x_flag_stack_usage_info = value != -1;
+ break;
+
case OPT_Wstrict_aliasing:
set_Wstrict_aliasing (opts, value);
break;
@@ -1643,6 +1648,11 @@ common_handle_option (struct gcc_options *opts,
/* Deferred. */
break;
+ case OPT_fstack_usage:
+ opts->x_flag_stack_usage = value;
+ opts->x_flag_stack_usage_info = value != 0;
+ break;
+
case OPT_ftree_vectorizer_verbose_:
vect_set_verbosity_level (opts, value);
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index af20a3ec650..7e1878504f7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-05-25 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/stack-usage-1.c: Adjust comment.
+ * gcc.dg/stack-usage-2.c: New test.
+
2011-05-25 Jakub Jelinek <jakub@redhat.com>
PR c++/49136
diff --git a/gcc/testsuite/gcc.dg/stack-usage-1.c b/gcc/testsuite/gcc.dg/stack-usage-1.c
index 321fec74d3a..f55168e9e44 100644
--- a/gcc/testsuite/gcc.dg/stack-usage-1.c
+++ b/gcc/testsuite/gcc.dg/stack-usage-1.c
@@ -2,7 +2,7 @@
/* { dg-options "-fstack-usage" } */
/* This is aimed at testing basic support for -fstack-usage in the back-ends.
- See the SPARC back-end for an example (grep flag_stack_usage in sparc.c).
+ See the SPARC back-end for example (grep flag_stack_usage_info in sparc.c).
Once it is implemented, adjust SIZE below so that the stack usage for the
function FOO is reported as 256 or 264 in the stack usage (.su) file.
Then check that this is the actual stack usage in the assembly file. */
diff --git a/gcc/testsuite/gcc.dg/stack-usage-2.c b/gcc/testsuite/gcc.dg/stack-usage-2.c
new file mode 100644
index 00000000000..d3c17a84d88
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/stack-usage-2.c
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-Wstack-usage=512" } */
+
+int foo1 (void)
+{
+ char arr[16];
+ arr[0] = 1;
+ return 0;
+} /* { dg-bogus "stack usage" } */
+
+int foo2 (void)
+{
+ char arr[1024];
+ arr[0] = 1;
+ return 0;
+} /* { dg-warning "stack usage is \[0-9\]* bytes" } */
+
+int foo3 (void)
+{
+ char arr[1024] __attribute__((aligned (512)));
+ arr[0] = 1;
+ /* Force dynamic realignment of argument pointer. */
+ __builtin_apply ((void (*)()) foo2, 0, 0);
+ return 0;
+
+} /* { dg-warning "stack usage might be \[0-9\]* bytes" } */
+
+int foo4 (int n)
+{
+ char arr[n];
+ arr[0] = 1;
+ return 0;
+} /* { dg-warning "stack usage might be unbounded" } */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index d0024273265..6c992cf21b7 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1048,14 +1048,12 @@ output_stack_usage (void)
};
HOST_WIDE_INT stack_usage = current_function_static_stack_size;
enum stack_usage_kind_type stack_usage_kind;
- expanded_location loc;
- const char *raw_id, *id;
if (stack_usage < 0)
{
if (!warning_issued)
{
- warning (0, "-fstack-usage not supported for this target");
+ warning (0, "stack usage computation not supported for this target");
warning_issued = true;
}
return;
@@ -1082,24 +1080,44 @@ output_stack_usage (void)
stack_usage += current_function_dynamic_stack_size;
}
- loc = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
+ if (flag_stack_usage)
+ {
+ expanded_location loc
+ = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
+ const char *raw_id, *id;
+
+ /* Strip the scope prefix if any. */
+ raw_id = lang_hooks.decl_printable_name (current_function_decl, 2);
+ id = strrchr (raw_id, '.');
+ if (id)
+ id++;
+ else
+ id = raw_id;
+
+ fprintf (stack_usage_file,
+ "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
+ lbasename (loc.file),
+ loc.line,
+ loc.column,
+ id,
+ stack_usage,
+ stack_usage_kind_str[stack_usage_kind]);
+ }
- /* Strip the scope prefix if any. */
- raw_id = lang_hooks.decl_printable_name (current_function_decl, 2);
- id = strrchr (raw_id, '.');
- if (id)
- id++;
- else
- id = raw_id;
-
- fprintf (stack_usage_file,
- "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n",
- lbasename (loc.file),
- loc.line,
- loc.column,
- id,
- stack_usage,
- stack_usage_kind_str[stack_usage_kind]);
+ if (warn_stack_usage >= 0)
+ {
+ if (stack_usage_kind == DYNAMIC)
+ warning (OPT_Wstack_usage_, "stack usage might be unbounded");
+ else if (stack_usage > warn_stack_usage)
+ {
+ if (stack_usage_kind == DYNAMIC_BOUNDED)
+ warning (OPT_Wstack_usage_, "stack usage might be %wd bytes",
+ stack_usage);
+ else
+ warning (OPT_Wstack_usage_, "stack usage is %wd bytes",
+ stack_usage);
+ }
+ }
}
/* Open an auxiliary output file. */