diff options
author | Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de> | 2005-03-12 22:44:44 +0100 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2005-03-12 22:44:44 +0100 |
commit | bae88af67e2175f50b8f278b373b911762249734 (patch) | |
tree | 28c0b703dc3ba7d95e02c234669e802d5c8227ef | |
parent | 7d3bf067e90674708a69c8b838b4ad7c2caf98c7 (diff) | |
download | gcc-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/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 37 | ||||
-rw-r--r-- | gcc/fortran/trans-array.h | 5 | ||||
-rw-r--r-- | gcc/fortran/trans-common.c | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 28 | ||||
-rw-r--r-- | gcc/fortran/trans.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/largeequiv_1.f90 | 13 |
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 |