OSDN Git Service

* cp-tree.def (CLEANUP_STMT): Fix spelling in dumps.
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Sep 1999 23:14:49 +0000 (23:14 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Sep 1999 23:14:49 +0000 (23:14 +0000)
(TRY_BLOCK): Likewise.
(HANDLER): Likewise.
(START_CATCH_STMT): New tree node.
(SCOPE_STMT): Likewise.
* cp-tree.h (SCOPE_BEGIN_P): New macro.
(SCOPE_NULLIFIED_P): Likewise.
(struct lang_decl_flags): Add pending_inline_p.  Adjust dummy.
(struct lang_decl): Add saved_language_function.
(DECL_PENDING_INLINE_INFO): Adjust documentation.
(DECL_PENDING_INLINE_P): New macro.
(TYPE_TI_ARGS): Fix typo in comment.
(DECL_SAVED_TREE): Add to documentation.
(DECL_SAVED_FUNCTION_DATA): New macro.
(START_CATCH_TYPE): Likewise.
(SCOPE_END_P): New macro.
(declare_parm_level): Don't declare.
* decl.c (mark_lang_function): New function, split out from
mark_cp_function_context.
(save_function_data): New function.
(declare_parm_level): Remove.
(finish_function): Use save_function_data to squirrel away
important stuff for later use.
(mark_cp_function_context): Use mark_function_data.
(lang_mark_tree): Likewise.
* lex.c (begin_definition_of_inclass_inline): Set
DECL_PENDING_INLINE_P.
(store_pending_inline): Clear it.
* pt.c (tsubst_decl): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29488 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.def
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/lex.c
gcc/cp/pt.c

index 4bffedb..65e1b82 100644 (file)
@@ -1,3 +1,35 @@
+1999-09-17  Mark Mitchell  <mark@codesourcery.com>
+
+       * cp-tree.def (CLEANUP_STMT): Fix spelling in dumps.
+       (TRY_BLOCK): Likewise.
+       (HANDLER): Likewise.
+       (START_CATCH_STMT): New tree node.
+       (SCOPE_STMT): Likewise.
+       * cp-tree.h (SCOPE_BEGIN_P): New macro.
+       (SCOPE_NULLIFIED_P): Likewise.
+       (struct lang_decl_flags): Add pending_inline_p.  Adjust dummy.
+       (struct lang_decl): Add saved_language_function.
+       (DECL_PENDING_INLINE_INFO): Adjust documentation.
+       (DECL_PENDING_INLINE_P): New macro.
+       (TYPE_TI_ARGS): Fix typo in comment.
+       (DECL_SAVED_TREE): Add to documentation.
+       (DECL_SAVED_FUNCTION_DATA): New macro.
+       (START_CATCH_TYPE): Likewise.
+       (SCOPE_END_P): New macro.
+       (declare_parm_level): Don't declare.
+       * decl.c (mark_lang_function): New function, split out from
+       mark_cp_function_context.
+       (save_function_data): New function.
+       (declare_parm_level): Remove.
+       (finish_function): Use save_function_data to squirrel away
+       important stuff for later use.
+       (mark_cp_function_context): Use mark_function_data.
+       (lang_mark_tree): Likewise.
+       * lex.c (begin_definition_of_inclass_inline): Set
+       DECL_PENDING_INLINE_P.
+       (store_pending_inline): Clear it.
+       * pt.c (tsubst_decl): Likewise.
+
 1999-09-17  Nathan Sidwell  <nathan@acm.org>
 
        * call.c (perform_implicit_conversion): Deal with error_mark_node.
index 53e3e1a..c96ee36 100644 (file)
@@ -238,12 +238,22 @@ DEFTREECODE (SUBOBJECT, "subobject", 'e', 1)
 /* A CLEANUP_STMT marks the point at which a declaration is fully
    constructed.  If, after this point, the CLEANUP_DECL goes out of
    scope, the CLEANUP_EXPR must be run.  */
-DEFTREECODE (CLEANUP_STMT, "cleanup", 'e', 2)
+DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 2)
+/* A START_CATCH_STMT marks the beginning of a catch handler for the
+   the START_CATCH_TYPE.  If this is CATCH_ALL_TYPE, then the handler
+   catches all types.  */
+DEFTREECODE (START_CATCH_STMT, "start_catch_stmt", 'e', 0)
+/* A SCOPE_STMT marks the beginning or end of a scope.  If
+   SCOPE_BEGIN_P holds, then this is the start of a scope.  If
+   SCOPE_END_P holds, then this is the end of a scope.  If
+   SCOPE_NULLIFIED_P holds then there turned out to be no variables in
+   this scope.  */
+DEFTREECODE (SCOPE_STMT, "scope_stmt", 'e', 0)
 DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 2)
 DEFTREECODE (CASE_LABEL, "case_label", 'e', 2)
 DEFTREECODE (RETURN_INIT, "return_init", 'e', 2)
-DEFTREECODE (TRY_BLOCK, "try_stmt", 'e', 2)
-DEFTREECODE (HANDLER, "catch_stmt", 'e', 2)
+DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2)
+DEFTREECODE (HANDLER, "handler", 'e', 2)
 
 /* A STMT_EXPR represents a statement-expression.  The
    STMT_EXPR_STMT is the statement given by the expression.  */
index 5ae16e7..57a7ad5 100644 (file)
@@ -40,6 +40,7 @@ Boston, MA 02111-1307, USA.  */
       ICS_USER_FLAG (in _CONV)
       CLEANUP_P (in TRY_BLOCK)
       AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR)
+      SCOPE_BEGIN_P (in SCOPE_STMT)
    1: IDENTIFIER_VIRTUAL_P.
       TI_PENDING_TEMPLATE_FLAG.
       TEMPLATE_PARMS_FOR_INLINE.
@@ -64,6 +65,7 @@ Boston, MA 02111-1307, USA.  */
       (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
       ICS_BAD_FLAG (in _CONV)
       FN_TRY_BLOCK_P (in TRY_BLOCK)
+      SCOPE_NULLIFIED_P (in SCOPE_STMT)
    4: BINFO_NEW_VTABLE_MARKED.
       TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
           or FIELD_DECL).
@@ -1505,7 +1507,8 @@ struct lang_decl_flags
 
   unsigned bitfield : 1;
   unsigned defined_in_class : 1;
-  unsigned dummy : 6;
+  unsigned pending_inline_p : 1;
+  unsigned dummy : 5;
 
   tree access;
   tree context;
@@ -1533,6 +1536,7 @@ struct lang_decl
   {
     tree sorted_fields;
     struct pending_inline *pending_inline_info;
+    struct language_function *saved_language_function;
   } u;
 };
 
@@ -1717,10 +1721,16 @@ struct lang_decl
 /* Points back to the decl which caused this lang_decl to be allocated.  */
 #define DECL_MAIN_VARIANT(NODE) (DECL_LANG_SPECIFIC(NODE)->main_decl_variant)
 
-/* For a FUNCTION_DECL: if this function was declared inline inside of
-   a class declaration, this is where the text for the function is
-   squirreled away.  */
-#define DECL_PENDING_INLINE_INFO(NODE) (DECL_LANG_SPECIFIC(NODE)->u.pending_inline_info)
+/* In a FUNCTION_DECL, this is nonzero if this function was defined in
+   the class definition.  We have saved away the text of the function,
+   but have not yet processed it.  */
+#define DECL_PENDING_INLINE_P(NODE) \
+  (DECL_LANG_SPECIFIC (NODE)->decl_flags.pending_inline_p)
+   
+/* If DECL_PENDING_INLINE_P holds, this is the saved text of the
+   function.  */
+#define DECL_PENDING_INLINE_INFO(NODE) \
+  (DECL_LANG_SPECIFIC(NODE)->u.pending_inline_info)
 
 /* For a TYPE_DECL: if this function has many fields, we'll sort them
    and put them into a TREE_VEC. */
@@ -1804,7 +1814,7 @@ struct lang_decl
 #define TYPE_TI_TEMPLATE(NODE)                 \
   (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE)))
 
-/* Like DECL_TI_ARGS, but for an ENUMERAL_, RECORD_, or UNION_TYPE.  */
+/* Like DECL_TI_ARGS, but for an ENUMERAL_, RECORD_, or UNION_TYPE.  */
 #define TYPE_TI_ARGS(NODE)                     \
   (TI_ARGS (TYPE_TEMPLATE_INFO (NODE)))
 
@@ -1815,11 +1825,16 @@ struct lang_decl
    the class definition is complete.  */
 #define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE)
 
-/* In a template FUNCTION_DECL, the tree structure that will be
-   substituted into to obtain instantiations.  */
+/* In a FUNCTION_DECL, the saved representation of the body of the
+   entire function.  Usually a COMPOUND_STMT, but this may also be a
+   RETURN_INIT, CTOR_INITIALIZER, or TRY_BLOCK.  */
 #define DECL_SAVED_TREE(NODE) \
   (DECL_LANG_SPECIFIC ((NODE))->saved_tree)
 
+/* In a FUNCTION_DECL, the saved language-specific per-function data.  */
+#define DECL_SAVED_FUNCTION_DATA(NODE) \
+  (DECL_LANG_SPECIFIC ((NODE))->u.saved_language_function)
+
 #define COMPOUND_STMT_NO_SCOPE(NODE)   TREE_LANG_FLAG_0 (NODE)
 #define NEW_EXPR_USE_GLOBAL(NODE)      TREE_LANG_FLAG_0 (NODE)
 #define DELETE_EXPR_USE_GLOBAL(NODE)   TREE_LANG_FLAG_0 (NODE)
@@ -2446,8 +2461,21 @@ extern int flag_new_for_scope;
 #define SUBOBJECT_CLEANUP(NODE) TREE_OPERAND (NODE, 0)
 #define CLEANUP_DECL(NODE)      TREE_OPERAND (NODE, 0)
 #define CLEANUP_EXPR(NODE)      TREE_OPERAND (NODE, 1)
+#define START_CATCH_TYPE(NODE)  TREE_TYPE (NODE)
 #define LABEL_STMT_LABEL(NODE)  TREE_OPERAND (NODE, 0)
 
+/* Nonzero if this SCOPE_STMT is for the beginning of a scope.  */
+#define SCOPE_BEGIN_P(NODE) \
+  (TREE_LANG_FLAG_0 ((NODE))) 
+
+/* Nonzero if this SCOPE_STMT is for the end of a scope.  */
+#define SCOPE_END_P(NODE) \
+  (!SCOPE_BEGIN_P ((NODE)))
+
+/* Nonzero for a SCOPE_STMT if there were no variables in this scope.  */
+#define SCOPE_NULLIFIED_P(NODE) \
+  (TREE_LANG_FLAG_3 ((NODE)))
+
 /* Nonzero for an ASM_STMT if the assembly statement is volatile.  */
 #define ASM_VOLATILE_P(NODE)                   \
   (ASM_CV_QUAL ((NODE)) != NULL_TREE)
@@ -3106,14 +3134,12 @@ extern int toplevel_bindings_p                  PROTO((void));
 extern int namespace_bindings_p                        PROTO((void));
 extern void keep_next_level                    PROTO((int));
 extern int kept_level_p                                PROTO((void));
-extern void declare_parm_level                 PROTO((void));
 extern void declare_pseudo_global_level                PROTO((void));
 extern int pseudo_global_level_p               PROTO((void));
 extern void set_class_shadows                  PROTO((tree));
 extern void pushlevel                          PROTO((int));
 extern void note_level_for_for                 PROTO((void));
 extern void pushlevel_temporary                        PROTO((int));
-extern tree poplevel                           PROTO((int, int, int));
 extern void resume_level                       PROTO((struct binding_level *));
 extern void delete_block                       PROTO((tree));
 extern void insert_block                       PROTO((tree));
index d2e41d5..b888eb0 100644 (file)
@@ -175,6 +175,8 @@ static void pop_cp_function_context PROTO((struct function *));
 static void mark_binding_level PROTO((void *));
 static void mark_cp_function_context PROTO((struct function *));
 static void mark_saved_scope PROTO((void *));
+static void mark_lang_function PROTO((struct language_function *));
+static void save_function_data PROTO((tree));
 static void check_function_type PROTO((tree));
 static void destroy_local_static PROTO((tree));
 static void destroy_local_var PROTO((tree));
@@ -787,14 +789,6 @@ kept_level_p ()
              && !current_binding_level->tag_transparent));
 }
 
-/* Identify this binding level as a level of parameters.  */
-
-void
-declare_parm_level ()
-{
-  current_binding_level->parm_flag = 1;
-}
-
 void
 declare_pseudo_global_level ()
 {
@@ -13245,6 +13239,43 @@ store_return_init (decl)
 }
 
 \f
+/* We have finished doing semantic analysis on DECL, but have not yet
+   generated RTL for its body.  Save away our current state, so that
+   when we want to generate RTL later we know what to do.  */
+
+static void
+save_function_data (decl)
+     tree decl;
+{
+  struct language_function *f;
+
+  /* Save the language-specific per-function data so that we can
+     get it back when we really expand this function.  */
+  my_friendly_assert (!DECL_PENDING_INLINE_P (decl),
+                     19990908);
+      
+  /* Make a copy.  */
+  f = ((struct language_function *) 
+       xmalloc (sizeof (struct language_function)));
+  bcopy ((char *) cp_function_chain, (char *) f,
+        sizeof (struct language_function));
+  DECL_SAVED_FUNCTION_DATA (decl) = f;
+
+  /* Clear out the bits we don't need.  */
+  f->x_base_init_list = NULL_TREE;
+  f->x_member_init_list = NULL_TREE;
+  f->x_last_tree = NULL_TREE;
+  f->x_last_expr_type = NULL_TREE;
+  f->x_last_dtor_insn = NULL_RTX;
+  f->x_last_parm_cleanup_insn = NULL_RTX;
+  f->x_result_rtx = NULL_RTX;
+  f->x_named_label_uses = NULL;
+  f->bindings = NULL;
+
+  /* When we get back here again, we will be expanding.  */
+  f->x_expanding_p = 1;
+}
+
 /* Finish up a function declaration and compile that function
    all the way to assembler language output.  The free the storage
    for the function definition.
@@ -13725,6 +13756,10 @@ finish_function (lineno, flags)
   /* Undo the call to push_momentary in start_function.  */
   pop_momentary ();
 
+  /* Save away current state, if appropriate.  */
+  if (!expanding_p && !processing_template_decl)
+    save_function_data (fndecl);
+
   if (expand_p)
     {
       int returns_null;
@@ -14294,12 +14329,12 @@ pop_cp_function_context (f)
   f->language = 0;
 }
 
-void
-mark_cp_function_context (f)
-     struct function *f;
-{
-  struct language_function *p = f->language;
+/* Mark P for GC.  */
 
+static void
+mark_lang_function (p)
+     struct language_function *p;
+{
   if (!p)
     return;
 
@@ -14321,6 +14356,14 @@ mark_cp_function_context (f)
   mark_binding_level (&p->bindings);
 }
 
+/* Mark the language-specific data in F for GC.  */
+
+void
+mark_cp_function_context (f)
+     struct function *f;
+{
+  mark_lang_function (f->language);
+}
 
 int
 in_function_p ()
@@ -14388,6 +14431,9 @@ lang_mark_tree (t)
              ggc_mark_tree (ld->saved_tree);
              if (TREE_CODE (t) == TYPE_DECL)
                ggc_mark_tree (ld->u.sorted_fields);
+             else if (TREE_CODE (t) == FUNCTION_DECL
+                      && !DECL_PENDING_INLINE_P (t))
+               mark_lang_function (DECL_SAVED_FUNCTION_DATA (t));
            }
        }
     }
index e1a0c09..e714dff 100644 (file)
@@ -1288,6 +1288,7 @@ begin_definition_of_inclass_inline (pi)
   /* Pass back a handle to the rest of the inline functions, so that they
      can be processed later.  */
   DECL_PENDING_INLINE_INFO (pi->fndecl) = 0;
+  DECL_PENDING_INLINE_P (pi->fndecl) = 0;
   interface_unknown = pi->interface == 1;
   interface_only  = pi->interface == 0;
 }
@@ -1510,6 +1511,7 @@ store_pending_inline (decl, t)
 {
   t->fndecl = decl;
   DECL_PENDING_INLINE_INFO (decl) = t;
+  DECL_PENDING_INLINE_P (decl) = 1;
 
   /* Because we use obstacks, we must process these in precise order.  */
   t->next = pending_inlines;
index c4d829f..7652422 100644 (file)
@@ -5874,6 +5874,7 @@ tsubst_decl (t, args, type, in_decl)
        DECL_DEFER_OUTPUT (r) = 0;
        TREE_CHAIN (r) = NULL_TREE;
        DECL_PENDING_INLINE_INFO (r) = 0;
+       DECL_PENDING_INLINE_P (r) = 0;
        TREE_USED (r) = 0;
 
        /* Set up the DECL_TEMPLATE_INFO for R and compute its mangled