]> gcc.gnu.org Git - gcc.git/commitdiff
class.c (check_methods, [...]): Guard VINDEX checks by FUNCTION_DECL check.
authorJan Hubicka <hubicka@ucw.cz>
Tue, 24 Jun 2014 23:14:26 +0000 (01:14 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 24 Jun 2014 23:14:26 +0000 (23:14 +0000)
* class.c (check_methods, create_vtable_ptr, determine_key_method,
add_vcall_offset_vtbl_entries_1): Guard VINDEX checks by FUNCTION_DECL check.
* cp-tree.h (lang_decl_ns): Add ns_using and ns_users.
(DECL_NAMESPACE_USING, DECL_NAMESPACE_USERS): Use lang_decl_ns.
(DECL_NAMESPACE_ASSOCIATIONS): Use DECL_INITIAL.
(DECL_TEMPLATE_INSTANTIATIONS): Use DECL_SIZE_UNIT.
* tree.c (find_decls_types_r): Do not check DECL_VINDEX for TYPE_DECL.
* tree.h (DECL_VINDEX, DECL_SAVED_TREE): Restrict to DECL_FUNCTION.
* tree-core.h (tree_decl_non_common): Move saved_tree and vindex...
(tree_function_decl): ... here.
* tree-streamer-out.c (write_ts_decl_non_common_tree_pointers): Move
streaming of vindex to ...
(write_ts_function_decl_tree_pointers): ... here.

* tree-streamer-in.c (lto_input_ts_decl_non_common_tree_pointers):
Do not stream DECL_VINDEX.
(lto_input_ts_function_decl_tree_pointers): Stream it here.

* lto.c (mentions_vars_p_decl_non_common): Move DECL_VINDEX check to ..
(mentions_vars_p_function): ... here.
(compare_tree_sccs_1): Update VINDEX checks.
(lto_fixup_prevailing_decls): Likewise.

From-SVN: r211960

12 files changed:
gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/lto-streamer-out.c
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/tree-core.h
gcc/tree-streamer-in.c
gcc/tree-streamer-out.c
gcc/tree.c
gcc/tree.h

index c8cc0b403b1f3bd302115b738462344981884bab..85503f1580e8072e2fe339cecb1ccbeedfa8eeb3 100644 (file)
@@ -1,3 +1,16 @@
+2014-06-24  Jan Hubicka  <hubicka@ucw.cz>
+
+       * tree.c (find_decls_types_r): Do not check DECL_VINDEX for TYPE_DECL.
+       * tree.h (DECL_VINDEX, DECL_SAVED_TREE): Restrict to DECL_FUNCTION.
+       * tree-core.h (tree_decl_non_common): Move saved_tree and vindex...
+       (tree_function_decl): ... here.
+       * tree-streamer-out.c (write_ts_decl_non_common_tree_pointers): Move
+       streaming of vindex to ...
+       (write_ts_function_decl_tree_pointers): ... here.
+       * tree-streamer-in.c (lto_input_ts_decl_non_common_tree_pointers):
+       Do not stream DECL_VINDEX.
+       (lto_input_ts_function_decl_tree_pointers): Stream it here.
+
 2014-06-24  Catherine Moore  <clm@codesourcery.com>
            Sandra Loosemore  <sandra@codesourcery.com>
 
index f9f0eabf1d206cde73a74a1fdd0c43d7a839f02a..d3d2835ed9f0bdae94fca167588a00179679ee4e 100644 (file)
@@ -1,3 +1,12 @@
+2014-06-24  Jan Hubicka  <hubicka@ucw.cz>
+
+       * class.c (check_methods, create_vtable_ptr, determine_key_method,
+       add_vcall_offset_vtbl_entries_1): Guard VINDEX checks by FUNCTION_DECL check.
+       * cp-tree.h (lang_decl_ns): Add ns_using and ns_users.
+       (DECL_NAMESPACE_USING, DECL_NAMESPACE_USERS): Use lang_decl_ns.
+       (DECL_NAMESPACE_ASSOCIATIONS): Use DECL_INITIAL.
+       (DECL_TEMPLATE_INSTANTIATIONS): Use DECL_SIZE_UNIT.
+
 2014-06-24  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/33972
index 1a7529e806c7e07bd795f0c32bc0defe07662991..743ad510a7685409bb417dc1216cc87f982f62c1 100644 (file)
@@ -4356,11 +4356,11 @@ check_methods (tree t)
   for (x = TYPE_METHODS (t); x; x = DECL_CHAIN (x))
     {
       check_for_override (x, t);
-      if (DECL_PURE_VIRTUAL_P (x) && ! DECL_VINDEX (x))
+      if (DECL_PURE_VIRTUAL_P (x) && (TREE_CODE (x) != FUNCTION_DECL || ! DECL_VINDEX (x)))
        error ("initializer specified for non-virtual method %q+D", x);
       /* The name of the field is the original field name
         Save this in auxiliary field for later overloading.  */
-      if (DECL_VINDEX (x))
+      if (TREE_CODE (x) == FUNCTION_DECL && DECL_VINDEX (x))
        {
          TYPE_POLYMORPHIC_P (t) = 1;
          if (DECL_PURE_VIRTUAL_P (x))
@@ -5658,7 +5658,8 @@ create_vtable_ptr (tree t, tree* virtuals_p)
 
   /* Collect the virtual functions declared in T.  */
   for (fn = TYPE_METHODS (t); fn; fn = DECL_CHAIN (fn))
-    if (DECL_VINDEX (fn) && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn)
+    if (TREE_CODE (fn) == FUNCTION_DECL
+       && DECL_VINDEX (fn) && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn)
        && TREE_CODE (DECL_VINDEX (fn)) != INTEGER_CST)
       {
        tree new_virtual = make_node (TREE_LIST);
@@ -6327,7 +6328,8 @@ determine_key_method (tree type)
      this function until the end of the translation unit.  */
   for (method = TYPE_METHODS (type); method != NULL_TREE;
        method = DECL_CHAIN (method))
-    if (DECL_VINDEX (method) != NULL_TREE
+    if (TREE_CODE (method) == FUNCTION_DECL
+       && DECL_VINDEX (method) != NULL_TREE
        && ! DECL_DECLARED_INLINE_P (method)
        && ! DECL_PURE_VIRTUAL_P (method))
       {
@@ -9140,7 +9142,7 @@ add_vcall_offset_vtbl_entries_1 (tree binfo, vtbl_init_data* vid)
   for (orig_fn = TYPE_METHODS (BINFO_TYPE (binfo));
        orig_fn;
        orig_fn = DECL_CHAIN (orig_fn))
-    if (DECL_VINDEX (orig_fn))
+    if (TREE_CODE (orig_fn) == FUNCTION_DECL && DECL_VINDEX (orig_fn))
       add_vcall_offset (orig_fn, binfo, vid);
 }
 
index 71298efe504cd0d0f1ef098f929a95220960562f..c1bd7cfdf68e2688b5ee283df0fa783d25b59b61 100644 (file)
@@ -2048,6 +2048,8 @@ struct GTY(()) lang_decl_fn {
 struct GTY(()) lang_decl_ns {
   struct lang_decl_base base;
   cp_binding_level *level;
+  tree ns_using;
+  tree ns_users;
 };
 
 /* DECL_LANG_SPECIFIC for parameters.  */
@@ -2580,16 +2582,16 @@ struct GTY(()) lang_decl {
 /* For a NAMESPACE_DECL: the list of using namespace directives
    The PURPOSE is the used namespace, the value is the namespace
    that is the common ancestor.  */
-#define DECL_NAMESPACE_USING(NODE) DECL_VINDEX (NAMESPACE_DECL_CHECK (NODE))
+#define DECL_NAMESPACE_USING(NODE) (LANG_DECL_NS_CHECK (NODE)->ns_using)
 
 /* In a NAMESPACE_DECL, the DECL_INITIAL is used to record all users
    of a namespace, to record the transitive closure of using namespace.  */
-#define DECL_NAMESPACE_USERS(NODE) DECL_INITIAL (NAMESPACE_DECL_CHECK (NODE))
+#define DECL_NAMESPACE_USERS(NODE) (LANG_DECL_NS_CHECK (NODE)->ns_users)
 
 /* In a NAMESPACE_DECL, the list of namespaces which have associated
    themselves with this one.  */
 #define DECL_NAMESPACE_ASSOCIATIONS(NODE) \
-  (NAMESPACE_DECL_CHECK (NODE)->decl_non_common.saved_tree)
+  DECL_INITIAL (NAMESPACE_DECL_CHECK (NODE))
 
 /* In a NAMESPACE_DECL, points to the original namespace if this is
    a namespace alias.  */
@@ -3784,7 +3786,7 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
 
    This list is not used for other templates.  */
 #define DECL_TEMPLATE_INSTANTIATIONS(NODE) \
-  DECL_VINDEX (TEMPLATE_DECL_CHECK (NODE))
+  DECL_SIZE_UNIT (TEMPLATE_DECL_CHECK (NODE))
 
 /* For a class template, this list contains the partial
    specializations of this template.  (Full specializations are not
index 3af53735d523d282bd60b287534f3175d0f61572..cb47b0023c942380240bb3734a5d7a59a5b5ce81 100644 (file)
@@ -528,7 +528,6 @@ DFS_write_tree_body (struct output_block *ob,
     {
       if (TREE_CODE (expr) == TYPE_DECL)
        DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
-      DFS_follow_tree_edge (DECL_VINDEX (expr));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
@@ -549,6 +548,7 @@ DFS_write_tree_body (struct output_block *ob,
 
   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
     {
+      DFS_follow_tree_edge (DECL_VINDEX (expr));
       DFS_follow_tree_edge (DECL_FUNCTION_PERSONALITY (expr));
       /* Do not DECL_FUNCTION_SPECIFIC_TARGET.  They will be regenerated.  */
       DFS_follow_tree_edge (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr));
@@ -961,7 +961,6 @@ hash_tree (struct streamer_tree_cache_d *cache, tree t)
     {
       if (code == TYPE_DECL)
        visit (DECL_ORIGINAL_TYPE (t));
-      visit (DECL_VINDEX (t));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
@@ -981,6 +980,7 @@ hash_tree (struct streamer_tree_cache_d *cache, tree t)
 
   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
     {
+      visit (DECL_VINDEX (t));
       visit (DECL_FUNCTION_PERSONALITY (t));
       /* Do not follow DECL_FUNCTION_SPECIFIC_TARGET.  */
       visit (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t));
index 83a684e07a57a3fb88c18ec6f4a6cefa66eb9bc8..5911a0628619842eb5458613ca98f9d60590ba03 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-24  Jan Hubicka  <hubicka@ucw.cz>
+
+       * lto.c (mentions_vars_p_decl_non_common): Move DECL_VINDEX check to ..
+       (mentions_vars_p_function): ... here.
+       (compare_tree_sccs_1): Update VINDEX checks.
+       (lto_fixup_prevailing_decls): Likewise.
+
 2014-06-24  Trevor Saunders  <tsaunders@mozilla.com>
 
        * lto.c (canonical_type_hash_cache): Use hash_map instead of
index 5c4acc5e469ed0109a258ced4a626c68c2a7076a..f5ed5c31a8c2fcca44cc145b954a30fd4b264f8e 100644 (file)
@@ -777,7 +777,6 @@ mentions_vars_p_decl_non_common (tree t)
     return true;
   CHECK_NO_VAR (DECL_ARGUMENT_FLD (t));
   CHECK_NO_VAR (DECL_RESULT_FLD (t));
-  CHECK_NO_VAR (DECL_VINDEX (t));
   return false;
 }
 
@@ -788,6 +787,7 @@ mentions_vars_p_function (tree t)
 {
   if (mentions_vars_p_decl_non_common (t))
     return true;
+  CHECK_NO_VAR (DECL_VINDEX (t));
   CHECK_VAR (DECL_FUNCTION_PERSONALITY (t));
   return false;
 }
@@ -1512,7 +1512,6 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map)
        }
       else if (code == TYPE_DECL)
        compare_tree_edges (DECL_ORIGINAL_TYPE (t1), DECL_ORIGINAL_TYPE (t2));
-      compare_tree_edges (DECL_VINDEX (t1), DECL_VINDEX (t2));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
@@ -1538,6 +1537,7 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map)
     {
       compare_tree_edges (DECL_FUNCTION_PERSONALITY (t1),
                          DECL_FUNCTION_PERSONALITY (t2));
+      compare_tree_edges (DECL_VINDEX (t1), DECL_VINDEX (t2));
       /* DECL_FUNCTION_SPECIFIC_TARGET is not yet created.  We compare
          the attribute list instead.  */
       compare_tree_edges (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t1),
@@ -2714,10 +2714,12 @@ lto_fixup_prevailing_decls (tree t)
        {
          LTO_NO_PREVAIL (DECL_ARGUMENT_FLD (t));
          LTO_NO_PREVAIL (DECL_RESULT_FLD (t));
-         LTO_NO_PREVAIL (DECL_VINDEX (t));
        }
       if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
-       LTO_SET_PREVAIL (DECL_FUNCTION_PERSONALITY (t));
+       {
+         LTO_SET_PREVAIL (DECL_FUNCTION_PERSONALITY (t));
+         LTO_NO_PREVAIL (DECL_VINDEX (t));
+       }
       if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
        {
          LTO_SET_PREVAIL (DECL_FIELD_OFFSET (t));
index a2c88f92cb528117533fd64949cfb62b86de48fb..78067d563129694e042a9fb080a173f156ed7008 100644 (file)
@@ -1494,14 +1494,10 @@ struct GTY(()) tree_var_decl {
 
 struct GTY(()) tree_decl_non_common {
   struct tree_decl_with_vis common;
-  /* C++ uses this in namespaces.  */
-  tree saved_tree;
   /* C++ uses this in templates.  */
   tree arguments;
   /* Almost all FE's use this.  */
   tree result;
-  /* C++ uses this in namespaces and function_decls.  */
-  tree vindex;
 };
 
 /* FUNCTION_DECL inherits from DECL_NON_COMMON because of the use of the
@@ -1521,6 +1517,11 @@ struct GTY(()) tree_function_decl {
   tree function_specific_target;       /* target options */
   tree function_specific_optimization; /* optimization options */
 
+  /* Generic function body.  */
+  tree saved_tree;
+  /* Index within a virtual table.  */
+  tree vindex;
+
   /* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
      DECL_FUNCTION_CODE.  Otherwise unused.
      ???  The bitfield needs to be able to hold all target function
index 83b6a691619c4193178045a8acb5ff5cd9c15a9f..ee1c955f159bf901425bfa5050d9590015158aed 100644 (file)
@@ -726,7 +726,6 @@ lto_input_ts_decl_non_common_tree_pointers (struct lto_input_block *ib,
 {
   if (TREE_CODE (expr) == TYPE_DECL)
     DECL_ORIGINAL_TYPE (expr) = stream_read_tree (ib, data_in);
-  DECL_VINDEX (expr) = stream_read_tree (ib, data_in);
 }
 
 
@@ -773,8 +772,8 @@ static void
 lto_input_ts_function_decl_tree_pointers (struct lto_input_block *ib,
                                          struct data_in *data_in, tree expr)
 {
-  /* DECL_STRUCT_FUNCTION is handled by lto_input_function.  FIXME lto,
-     maybe it should be handled here?  */
+  DECL_VINDEX (expr) = stream_read_tree (ib, data_in);
+  /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body.  */
   DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in);
   /* DECL_FUNCTION_SPECIFIC_TARGET is regenerated from attributes.  */
   DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, data_in);
index d4d0f1b9d87671b5628c15d2c1e92d09b00de4d7..52e714ef29ebec81aea578f993061f13af88e658 100644 (file)
@@ -638,7 +638,6 @@ write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
 {
   if (TREE_CODE (expr) == TYPE_DECL)
     stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
-  stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
 }
 
 
@@ -682,6 +681,7 @@ static void
 write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
                                      bool ref_p)
 {
+  stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  FIXME lto,
      maybe it should be handled here?  */
   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
index ac4012c04b7b0572cf57a4f190783116e007553b..6937f6ec64a6ab4c32f501764cc9153c6b80997c 100644 (file)
@@ -5306,7 +5306,6 @@ find_decls_types_r (tree *tp, int *ws, void *data)
       else if (TREE_CODE (t) == TYPE_DECL)
        {
          fld_worklist_push (DECL_ARGUMENT_FLD (t), fld);
-         fld_worklist_push (DECL_VINDEX (t), fld);
          fld_worklist_push (DECL_ORIGINAL_TYPE (t), fld);
        }
       else if (TREE_CODE (t) == FIELD_DECL)
index 41de5c1eeb18de9cede6fb796101ffedce79769a..a435c3a12c204ce4608fab51fda9acaab6d14a71 100644 (file)
@@ -2470,10 +2470,9 @@ extern void decl_fini_priority_insert (tree, priority_type);
    is the FUNCTION_DECL which this FUNCTION_DECL will replace as a virtual
    function.  When the class is laid out, this pointer is changed
    to an INTEGER_CST node which is suitable for use as an index
-   into the virtual function table.
-   C++ also uses this field in namespaces, hence the DECL_NON_COMMON_CHECK.  */
+   into the virtual function table. */
 #define DECL_VINDEX(NODE) \
-  (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.vindex)
+  (FUNCTION_DECL_CHECK (NODE)->function_decl.vindex)
 
 /* In FUNCTION_DECL, holds the decl for the return value.  */
 #define DECL_RESULT(NODE) (FUNCTION_DECL_CHECK (NODE)->decl_non_common.result)
@@ -2485,7 +2484,7 @@ extern void decl_fini_priority_insert (tree, priority_type);
 /* In a FUNCTION_DECL, the saved representation of the body of the
    entire function.  */
 #define DECL_SAVED_TREE(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->decl_non_common.saved_tree)
+  (FUNCTION_DECL_CHECK (NODE)->function_decl.saved_tree)
 
 /* Nonzero in a FUNCTION_DECL means this function should be treated
    as if it were a malloc, meaning it returns a pointer that is
This page took 0.127592 seconds and 5 git commands to generate.