java-tree.h (LOCAL_VAR_OUT_OF_SCOPE_P): New.
authorAndrew Haley <aph@redhat.com>
Mon, 17 Nov 2003 17:39:05 +0000 (17:39 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Mon, 17 Nov 2003 17:39:05 +0000 (17:39 +0000)
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.

From-SVN: r73675

gcc/java/ChangeLog
gcc/java/decl.c
gcc/java/java-tree.h

index 142676756aab33c01a61c3dd4358013e3760040b..301a4a77371b9aca3eda3bb4a40bab5bb42c6026 100644 (file)
@@ -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
index e23cb120c3a86613e63ba4ea8a3cb92cf1d0b120..4b0c4963f3ac95f0e3603047cb8c55b28c55279f 100644 (file)
@@ -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,
index 7b5a397ecdbbd5bab909d8200b03b5687c095b2b..8c58bb70f8c878b073fec7b260bdbee56c5bc77c 100644 (file)
@@ -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.  */