aboutsummaryrefslogtreecommitdiff
path: root/gcc/explow.h
diff options
context:
space:
mode:
authorDominik Vogt <vogt@linux.vnet.ibm.com>2016-07-18 13:10:27 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2016-07-18 13:10:27 +0000
commit7072df0aae0c59ae437e5cc28e4e5e5777e930ba (patch)
treeeae0f0bf4792f63f3083251ebd6cbec79241a3cb /gcc/explow.h
parent54158a1aa94f7b75f59d6ca8d6ca7ebfc11e1673 (diff)
downloadgcc-7072df0aae0c59ae437e5cc28e4e5e5777e930ba.zip
gcc-7072df0aae0c59ae437e5cc28e4e5e5777e930ba.tar.gz
gcc-7072df0aae0c59ae437e5cc28e4e5e5777e930ba.tar.bz2
Allocate constant size dynamic stack space in the prologue
The attached patch fixes a warning during Linux kernel compilation on S/390 due to -mwarn-dynamicstack and runtime alignment of stack variables with constant size causing cfun->calls_alloca to be set (even if alloca is not used at all). The patched code places constant size runtime aligned variables in the "virtual stack vars" area instead of creating a "virtual stack dynamic" area. This behaviour is activated by defining #define ALLOCATE_DYNAMIC_STACK_SPACE_IN_PROLOGUE 1 in the backend; otherwise the old logic is used. The kernel uses runtime alignment for the page structure (aligned to 16 bytes), and apart from triggereing the alloca warning (-mwarn-dynamicstack), the current Gcc also generates inefficient code like aghi %r15,-160 # prologue: create stack frame lgr %r11,%r15 # prologue: generate frame pointer aghi %r15,-32 # space for dynamic stack which could be simplified to aghi %r15,-192 (if later optimization passes are able to get rid of the frame pointer). Is there a specific reason why the patched behaviour shouldn't be used for all platforms? -- As the placement of runtime aligned stack variables with constant size is done completely in the middleend, I don't see a way to fix this in the backend. gcc/ChangeLog: 2016-07-18 Dominik Vogt <vogt@linux.vnet.ibm.com> * cfgexpand.c (expand_stack_vars): Implement synamic stack space allocation in the prologue. * explow.c (get_dynamic_stack_base): New function to return an address expression for the dynamic stack base. (get_dynamic_stack_size): New function to do the required dynamic stack space size calculations. (allocate_dynamic_stack_space): Use new functions. (align_dynamic_address): Move some code from allocate_dynamic_stack_space to new function. * explow.h (get_dynamic_stack_base, get_dynamic_stack_size): Export. gcc/testsuite/ChangeLog: 2016-07-18 Dominik Vogt <vogt@linux.vnet.ibm.com> * gcc.target/s390/warn-dynamicstack-1.c: New test. * gcc.dg/stack-usage-2.c (foo3): Adapt expected warning. stack-layout-dynamic-1.c: New test. From-SVN: r238432
Diffstat (limited to 'gcc/explow.h')
-rw-r--r--gcc/explow.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/explow.h b/gcc/explow.h
index 52113db..e12f90c 100644
--- a/gcc/explow.h
+++ b/gcc/explow.h
@@ -87,6 +87,14 @@ extern void record_new_stack_level (void);
/* Allocate some space on the stack dynamically and return its address. */
extern rtx allocate_dynamic_stack_space (rtx, unsigned, unsigned, bool);
+/* Calculate the necessary size of a constant dynamic stack allocation from the
+ size of the variable area. */
+extern void get_dynamic_stack_size (rtx *, unsigned, unsigned, HOST_WIDE_INT *);
+
+/* Returns the address of the dynamic stack space without allocating it. */
+extern rtx get_dynamic_stack_base (HOST_WIDE_INT offset,
+ unsigned required_align);
+
/* Emit one stack probe at ADDRESS, an address within the stack. */
extern void emit_stack_probe (rtx);