aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>2005-03-12 22:44:44 +0100
committerTobias Schlüter <tobi@gcc.gnu.org>2005-03-12 22:44:44 +0100
commitbae88af67e2175f50b8f278b373b911762249734 (patch)
tree28c0b703dc3ba7d95e02c234669e802d5c8227ef
parent7d3bf067e90674708a69c8b838b4ad7c2caf98c7 (diff)
downloadgcc-bae88af67e2175f50b8f278b373b911762249734.zip
gcc-bae88af67e2175f50b8f278b373b911762249734.tar.gz
gcc-bae88af67e2175f50b8f278b373b911762249734.tar.bz2
re PR fortran/20361 (-fmax-stack-var-size=N not working for equivalence)
fortran/ PR fortran/20361 * trans-array.c (gfc_stack_space_left): Remove unused variable. (gfc_can_put_var_on_stack): Move to trans-decl.c, remove #if 0'ed code. * trans-array.h (gfc_stack_space_left, gfc_can_put_var_on_stack): Remove declaration / prototype. * trans-common.c (build_equiv_decl): Give union a name. Check if it can be put on the stack. * trans-decl.c (gfc_stack_space_left): Move function here. (gfc_build_qualified_array): Fix comment typo. * trans.h (gfc_put_var_on_stack): Add prototype. testsuite/ PR fortran/20361 * gfortran.dg/largeequiv_1.f90: New test. From-SVN: r96352
-rw-r--r--gcc/fortran/ChangeLog14
-rw-r--r--gcc/fortran/trans-array.c37
-rw-r--r--gcc/fortran/trans-array.h5
-rw-r--r--gcc/fortran/trans-common.c9
-rw-r--r--gcc/fortran/trans-decl.c28
-rw-r--r--gcc/fortran/trans.h3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/largeequiv_1.f9013
8 files changed, 69 insertions, 45 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 63b9cd1..5107891 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,17 @@
+2005-03-12 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ PR fortran/20361
+ * trans-array.c (gfc_stack_space_left): Remove unused variable.
+ (gfc_can_put_var_on_stack): Move to trans-decl.c, remove #if 0'ed
+ code.
+ * trans-array.h (gfc_stack_space_left, gfc_can_put_var_on_stack):
+ Remove declaration / prototype.
+ * trans-common.c (build_equiv_decl): Give union a name. Check if
+ it can be put on the stack.
+ * trans-decl.c (gfc_stack_space_left): Move function here.
+ (gfc_build_qualified_array): Fix comment typo.
+ * trans.h (gfc_put_var_on_stack): Add prototype.
+
2005-03-11 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* Make-lang.in (fortran-warn): Set to $(STRICT_WARN) -Wno-error.
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index a97bcc5..bd77eb4 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -99,43 +99,6 @@ static gfc_ss *gfc_walk_subexpr (gfc_ss *, gfc_expr *);
static gfc_ss gfc_ss_terminator_var;
gfc_ss * const gfc_ss_terminator = &gfc_ss_terminator_var;
-unsigned HOST_WIDE_INT gfc_stack_space_left;
-
-
-/* Returns true if a variable of specified size should go on the stack. */
-
-int
-gfc_can_put_var_on_stack (tree size)
-{
- unsigned HOST_WIDE_INT low;
-
- if (!INTEGER_CST_P (size))
- return 0;
-
- if (gfc_option.flag_max_stack_var_size < 0)
- return 1;
-
- if (TREE_INT_CST_HIGH (size) != 0)
- return 0;
-
- low = TREE_INT_CST_LOW (size);
- if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
- return 0;
-
-/* TODO: Set a per-function stack size limit. */
-#if 0
- /* We should be a bit more clever with array temps. */
- if (gfc_option.flag_max_function_vars_size >= 0)
- {
- if (low > gfc_stack_space_left)
- return 0;
-
- gfc_stack_space_left -= low;
- }
-#endif
-
- return 1;
-}
static tree
gfc_array_dataptr_type (tree desc)
diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index b440769..faaaf5a 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -95,11 +95,6 @@ tree gfc_conv_array_stride (tree, int);
tree gfc_conv_array_lbound (tree, int);
tree gfc_conv_array_ubound (tree, int);
-/* The remaining space available for stack variables. */
-extern unsigned HOST_WIDE_INT gfc_stack_space_left;
-/* Returns true if a variable of specified size should go on the stack. */
-int gfc_can_put_var_on_stack (tree);
-
/* Build expressions for accessing components of an array descriptor. */
tree gfc_conv_descriptor_data (tree);
tree gfc_conv_descriptor_offset (tree);
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index 35ea801..c62d68d 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -252,6 +252,8 @@ static tree
build_equiv_decl (tree union_type, bool is_init)
{
tree decl;
+ char name[15];
+ static int serial = 0;
if (is_init)
{
@@ -260,10 +262,13 @@ build_equiv_decl (tree union_type, bool is_init)
return decl;
}
- decl = build_decl (VAR_DECL, NULL, union_type);
+ snprintf (name, sizeof (name), "equiv.%d", serial++);
+ decl = build_decl (VAR_DECL, get_identifier (name), union_type);
DECL_ARTIFICIAL (decl) = 1;
+ DECL_IGNORED_P (decl) = 1;
- DECL_COMMON (decl) = 1;
+ if (!gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl)))
+ TREE_STATIC (decl) = 1;
TREE_ADDRESSABLE (decl) = 1;
TREE_USED (decl) = 1;
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index b81b986..08dd72a 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -317,6 +317,32 @@ gfc_sym_mangled_function_id (gfc_symbol * sym)
}
+/* Returns true if a variable of specified size should go on the stack. */
+
+int
+gfc_can_put_var_on_stack (tree size)
+{
+ unsigned HOST_WIDE_INT low;
+
+ if (!INTEGER_CST_P (size))
+ return 0;
+
+ if (gfc_option.flag_max_stack_var_size < 0)
+ return 1;
+
+ if (TREE_INT_CST_HIGH (size) != 0)
+ return 0;
+
+ low = TREE_INT_CST_LOW (size);
+ if (low > (unsigned HOST_WIDE_INT) gfc_option.flag_max_stack_var_size)
+ return 0;
+
+/* TODO: Set a per-function stack size limit. */
+
+ return 1;
+}
+
+
/* Finish processing of a declaration and install its initial value. */
static void
@@ -533,7 +559,7 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym)
/* For some dummy arguments we don't use the actual argument directly.
- Instead we create a local decl and use that. This allows us to preform
+ Instead we create a local decl and use that. This allows us to perform
initialization, and construct full type information. */
static tree
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index f16e23c..aad878f 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -391,6 +391,9 @@ void gfc_shadow_sym (gfc_symbol *, tree, gfc_saved_var *);
/* Restore the original variable. */
void gfc_restore_sym (gfc_symbol *, gfc_saved_var *);
+/* Returns true if a variable of specified size should go on the stack. */
+int gfc_can_put_var_on_stack (tree);
+
/* Allocate the lang-spcific part of a decl node. */
void gfc_allocate_lang_decl (tree);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d7c751d..cdef890 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-03-12 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ PR fortran/20361
+ * gfortran.dg/largeequiv_1.f90: New test.
+
2005-03-12 Geoffrey Keating <geoffk@apple.com>
* gcc.dg/ucnid-1.c: New.
diff --git a/gcc/testsuite/gfortran.dg/largeequiv_1.f90 b/gcc/testsuite/gfortran.dg/largeequiv_1.f90
new file mode 100644
index 0000000..39b1f81
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/largeequiv_1.f90
@@ -0,0 +1,13 @@
+! { dg-do run }
+! PR 20361 : We didn't check if a large equivalence actually fit on
+! the stack, and therefore segfaulted at execution time
+subroutine test
+integer i(1000000), j
+equivalence (i(50), j)
+
+j = 1
+if (i(50) /= j) call abort()
+end subroutine test
+
+call test
+end