diff options
author | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-11-17 17:39:05 +0000 |
---|---|---|
committer | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-11-17 17:39:05 +0000 |
commit | f6875e9cc74abd2ec3b000074accd89b2b7f53d7 (patch) | |
tree | 96d693db1f60c111e9a3672d73aabfa2c5980216 /gcc | |
parent | 25de73d538fa5bd4b0d2fa83b5d875c63b56f5bd (diff) | |
download | ppe42-gcc-f6875e9cc74abd2ec3b000074accd89b2b7f53d7.tar.gz ppe42-gcc-f6875e9cc74abd2ec3b000074accd89b2b7f53d7.zip |
2003-09-12 Andrew Haley <aph@redhat.com>
* java-tree.h (LOCAL_VAR_OUT_OF_SCOPE_P): New.
(struct lang_decl_var:freed): New variable.
* decl.c (poplevel): Mark local vars that have gone out of scope.
(push_jvm_slot): Don't use the RTL of a var that has gone out of
scope.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73675 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/java/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/java/decl.c | 22 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 4 |
3 files changed, 27 insertions, 7 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 142676756aa..301a4a77371 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,11 @@ +2003-09-12 Andrew Haley <aph@redhat.com> + + * java-tree.h (LOCAL_VAR_OUT_OF_SCOPE_P): New. + (struct lang_decl_var:freed): New variable. + * decl.c (poplevel): Mark local vars that have gone out of scope. + (push_jvm_slot): Don't use the RTL of a var that has gone out of + scope. + 2003-11-16 Jason Merrill <jason@redhat.com> * Make-lang.in (java.tags): Create TAGS.sub files in each directory diff --git a/gcc/java/decl.c b/gcc/java/decl.c index e23cb120c3a..4b0c4963f3a 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -116,7 +116,8 @@ push_jvm_slot (int index, tree decl) tmp = TREE_VEC_ELT (decl_map, index); while (tmp != NULL_TREE) { - if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp))) + if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp)) + && ! LOCAL_VAR_OUT_OF_SCOPE_P (tmp)) rtl = DECL_RTL_IF_SET (tmp); if (rtl != NULL) break; @@ -1266,6 +1267,7 @@ poplevel (int keep, int reverse, int functionbody) tree block = 0; tree decl; int block_previously_created; + { #if defined(DEBUG_JAVA_BINDING_LEVELS) binding_depth--; @@ -1306,12 +1308,13 @@ poplevel (int keep, int reverse, int functionbody) && DECL_INITIAL (decl) != 0 && TREE_ADDRESSABLE (decl)) { - /* If this decl was copied from a file-scope decl - on account of a block-scope extern decl, - propagate TREE_ADDRESSABLE to the file-scope decl. - - DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is - true, since then the decl goes through save_for_inline_copying. */ + /* If this decl was copied from a file-scope decl on account + of a block-scope extern decl, propagate TREE_ADDRESSABLE + to the file-scope decl. + + DECL_ABSTRACT_ORIGIN can be set to itself if + warn_return_type is true, since then the decl goes + through save_for_inline_copying. */ if (DECL_ABSTRACT_ORIGIN (decl) != 0 && DECL_ABSTRACT_ORIGIN (decl) != decl) TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1; @@ -1322,6 +1325,11 @@ poplevel (int keep, int reverse, int functionbody) pop_function_context (); } } + else if (TREE_CODE (decl) == VAR_DECL + && DECL_LANG_SPECIFIC (decl) != NULL + && DECL_LOCAL_SLOT_NUMBER (decl)) + LOCAL_VAR_OUT_OF_SCOPE_P (decl) = 1; + } /* If there were any declarations in that level, or if this level is a function body, diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 7b5a397ecdb..8c58bb70f8c 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -947,6 +947,9 @@ union lang_tree_node /* True if NODE is a class initialization flag. */ #define LOCAL_CLASS_INITIALIZATION_FLAG_P(NODE) \ (DECL_LANG_SPECIFIC (NODE) && LOCAL_CLASS_INITIALIZATION_FLAG(NODE)) +/* True if NODE is a variable that is out of scope. */ +#define LOCAL_VAR_OUT_OF_SCOPE_P(NODE) \ + (DECL_LANG_SPECIFIC(NODE)->u.v.freed) /* Create a DECL_LANG_SPECIFIC if necessary. */ #define MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC(T) \ if (DECL_LANG_SPECIFIC (T) == NULL) \ @@ -1031,6 +1034,7 @@ struct lang_decl_var GTY(()) tree wfl; /* Original wfl */ unsigned int final_iud : 1; /* Final initialized upon declaration */ unsigned int cif : 1; /* True: decl is a class initialization flag */ + unsigned int freed; /* Decl is no longer in scope. */ }; /* This is what 'lang_decl' really points to. */ |