ipa-utils.h (method_class_type): Remove.
authorJan Hubicka <hubicka@ucw.cz>
Sun, 24 May 2015 06:13:44 +0000 (08:13 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 24 May 2015 06:13:44 +0000 (06:13 +0000)
* ipa-utils.h (method_class_type): Remove.
* cgraphunit.c (walk_polymorphic_call_targets): Use TYPE_METHOD_BASETYPE.
* ipa-devirt.c (type_in_anonymous_namespace_p): Check that it is called
on main variants only.
(method_class_type): Remove.
(update_type_inheritance_graph): Use TYPE_METHOD_BASETYPE.
(build_type_inheritance_graph): Likewise.
* ipa-icf.c (sem_function::equals_wpa): Likewise.
* pa-polymorphic-call.c (decl_maybe_in_construction_p,
check_stmt_for_type_change): Use TYPE_METHOD_BASETYPE.

From-SVN: r223629

gcc/ChangeLog
gcc/cgraphunit.c
gcc/ipa-devirt.c
gcc/ipa-icf.c
gcc/ipa-polymorphic-call.c
gcc/ipa-utils.h
gcc/ipa.c
gcc/tree.c

index ef9b0f6ff4734aa9d2ccfe13f8852183571d4ba7..33f58654417699399e2970bacfbd4befbae2f060 100644 (file)
@@ -1,3 +1,16 @@
+2015-05-22  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-utils.h (method_class_type): Remove.
+       * cgraphunit.c (walk_polymorphic_call_targets): Use TYPE_METHOD_BASETYPE.
+       * ipa-devirt.c (type_in_anonymous_namespace_p): Check that it is called
+       on main variants only.
+       (method_class_type): Remove.
+       (update_type_inheritance_graph): Use TYPE_METHOD_BASETYPE.
+       (build_type_inheritance_graph): Likewise.
+       * ipa-icf.c (sem_function::equals_wpa): Likewise.
+       * pa-polymorphic-call.c (decl_maybe_in_construction_p, 
+       check_stmt_for_type_change): Use TYPE_METHOD_BASETYPE.
+
 2015-05-22  Jan Hubicka  <hubicka@ucw.cz>
 
        * tree.c (prototype_p, virtual_method_call_p, obj_type_ref_class,
index 757f03d281bde0c772d5a7c8646527f198c86a67..8d97163cf991e91d9bf8cefd65c006082771aab4 100644 (file)
@@ -866,9 +866,8 @@ walk_polymorphic_call_targets (hash_set<void *> *reachable_call_targets,
                  (TREE_TYPE (targets[i]->decl))
                   == METHOD_TYPE
              && !type_in_anonymous_namespace_p
-                  (method_class_type
-                    (TREE_TYPE (targets[i]->decl))))
-         enqueue_node (targets[i]);
+                  (TYPE_METHOD_BASETYPE (TREE_TYPE (targets[i]->decl))))
+           enqueue_node (targets[i]);
        }
     }
 
index 09c3b5b045586ef42ded142369ddb8fb3030f1c2..77ecd0d2d8311b47f958e71530efce38036c6fea 100644 (file)
@@ -2279,18 +2279,6 @@ dump_type_inheritance_graph (FILE *f)
     }
 }
 
-/* Given method type T, return type of class it belongs to.
-   Look up this pointer and get its type.    */
-
-tree
-method_class_type (const_tree t)
-{
-  tree first_parm_type = TREE_VALUE (TYPE_ARG_TYPES (t));
-  gcc_assert (TREE_CODE (t) == METHOD_TYPE);
-
-  return TREE_TYPE (first_parm_type);
-}
-
 /* Initialize IPA devirt and build inheritance tree graph.  */
 
 void
@@ -2314,8 +2302,7 @@ build_type_inheritance_graph (void)
     if (is_a <cgraph_node *> (n)
        && DECL_VIRTUAL_P (n->decl)
        && n->real_symbol_p ())
-      get_odr_type (TYPE_MAIN_VARIANT (method_class_type (TREE_TYPE (n->decl))),
-                   true);
+      get_odr_type (TYPE_METHOD_BASETYPE (TREE_TYPE (n->decl)), true);
 
     /* Look also for virtual tables of types that do not define any methods.
  
@@ -3446,8 +3433,7 @@ update_type_inheritance_graph (void)
     if (DECL_VIRTUAL_P (n->decl)
        && !n->definition
        && n->real_symbol_p ())
-      get_odr_type (method_class_type (TYPE_MAIN_VARIANT (TREE_TYPE (n->decl))),
-                                      true);
+      get_odr_type (TYPE_METHOD_BASETYPE (TREE_TYPE (n->decl)), true);
   timevar_pop (TV_IPA_INHERITANCE);
 }
 
index e7a317ab79db450d80b29ae925c9023dc54e263a..190cd4c43d9232f1d910596c9b8aa38f3c62a7c3 100644 (file)
@@ -663,8 +663,8 @@ sem_function::equals_wpa (sem_item *item,
       if (TREE_CODE (TREE_TYPE (item->decl)) != METHOD_TYPE)
         return return_false_with_msg ("DECL_CXX_CONSTURCTOR type mismatch");
       else if (!func_checker::compatible_polymorphic_types_p
-                (method_class_type (TREE_TYPE (decl)),
-                 method_class_type (TREE_TYPE (item->decl)), false))
+                (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
+                 TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
         return return_false_with_msg ("ctor polymorphic type mismatch");
     }
 
@@ -753,8 +753,8 @@ sem_function::equals_wpa (sem_item *item,
       if (TREE_CODE (TREE_TYPE (decl)) != TREE_CODE (TREE_TYPE (item->decl)))
        return return_false_with_msg ("METHOD_TYPE and FUNCTION_TYPE mismatch");
       if (!func_checker::compatible_polymorphic_types_p
-          (method_class_type (TREE_TYPE (decl)),
-           method_class_type (TREE_TYPE (item->decl)), false))
+          (TYPE_METHOD_BASETYPE (TREE_TYPE (decl)),
+           TYPE_METHOD_BASETYPE (TREE_TYPE (item->decl)), false))
        return return_false_with_msg ("THIS pointer ODR type mismatch");
     }
 
@@ -2722,14 +2722,14 @@ sem_item_optimizer::update_hash_by_addr_refs ()
        {
          if (TREE_CODE (TREE_TYPE (m_items[i]->decl)) == METHOD_TYPE
              && contains_polymorphic_type_p
-                  (method_class_type (TREE_TYPE (m_items[i]->decl)))
+                  (TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl)))
              && (DECL_CXX_CONSTRUCTOR_P (m_items[i]->decl)
                  || (static_cast<sem_function *> (m_items[i])->param_used_p (0)
                      && static_cast<sem_function *> (m_items[i])
                           ->compare_polymorphic_p ())))
             {
                tree class_type
-                 = method_class_type (TREE_TYPE (m_items[i]->decl));
+                 = TYPE_METHOD_BASETYPE (TREE_TYPE (m_items[i]->decl));
                inchash::hash hstate (m_items[i]->hash);
 
                if (TYPE_NAME (class_type)
index 083648d7e4213969179d77b9293e9473d2a69590..b69f54184d076beda22428427ffacc8bb3bdf630 100644 (file)
@@ -588,7 +588,7 @@ decl_maybe_in_construction_p (tree base, tree outer_type,
        block = BLOCK_SUPERCONTEXT (block))
     if (tree fn = inlined_polymorphic_ctor_dtor_block_p (block, check_clones))
       {
-       tree type = TYPE_MAIN_VARIANT (method_class_type (TREE_TYPE (fn)));
+       tree type = TYPE_METHOD_BASETYPE (TREE_TYPE (fn));
 
        if (!outer_type || !types_odr_comparable (type, outer_type))
          {
@@ -618,7 +618,7 @@ decl_maybe_in_construction_p (tree base, tree outer_type,
                  && !DECL_CXX_DESTRUCTOR_P (function)))
            return false;
        }
-      tree type = TYPE_MAIN_VARIANT (method_class_type (TREE_TYPE (function)));
+      tree type = TYPE_METHOD_BASETYPE (TREE_TYPE (function));
       if (!outer_type || !types_odr_comparable (type, outer_type))
        {
          if (TREE_CODE (type) == RECORD_TYPE
@@ -1399,7 +1399,7 @@ check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
          && gimple_call_num_args (stmt))
       {
        tree op = walk_ssa_copies (gimple_call_arg (stmt, 0));
-       tree type = method_class_type (TREE_TYPE (fn));
+       tree type = TYPE_METHOD_BASETYPE (TREE_TYPE (fn));
        HOST_WIDE_INT offset = 0, size, max_size;
 
        if (dump_file)
index 46c82dafd80f99dd7137a43337ef2b538d4e1e91..a171c5645080a8ed04e4c732c73c348ced11cf55 100644 (file)
@@ -72,7 +72,6 @@ void dump_possible_polymorphic_call_targets (FILE *, tree, HOST_WIDE_INT,
 bool possible_polymorphic_call_target_p (tree, HOST_WIDE_INT,
                                         const ipa_polymorphic_call_context &,
                                         struct cgraph_node *);
-tree method_class_type (const_tree);
 tree inlined_polymorphic_ctor_dtor_block_p (tree, bool);
 bool decl_maybe_in_construction_p (tree, tree, gimple, tree);
 tree vtable_pointer_value_to_binfo (const_tree);
index b3752de5e1b9c537a309e5ad43ef27d775d1e729..eb6fd41a696f59904aae22a46b54f97cd02267c2 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -197,7 +197,7 @@ walk_polymorphic_call_targets (hash_set<void *> *reachable_call_targets,
             unused.  */
          if (TREE_CODE (TREE_TYPE (n->decl)) == METHOD_TYPE
              && type_in_anonymous_namespace_p
-                   (method_class_type (TREE_TYPE (n->decl))))
+                   (TYPE_METHOD_BASETYPE (TREE_TYPE (n->decl))))
            continue;
 
           symtab_node *body = n->function_symbol ();
index 320a343da0d13963d58d35eb7fbe7acaa13aaf7b..caffa59d015a53127d5155ef659d6ab054cb0b6f 100644 (file)
@@ -13262,7 +13262,15 @@ verify_type (const_tree t)
        }
     }
   
-
+  /* ipa-devirt makes an assumption that TYPE_METHOD_BASETYPE is always
+     TYPE_MAIN_VARIANT and it would be odd to add methods only to variatns
+     of a type. */
+  if (TREE_CODE (t) == METHOD_TYPE
+      && TYPE_MAIN_VARIANT (TYPE_METHOD_BASETYPE (t)) != TYPE_METHOD_BASETYPE (t))
+    {
+       error ("TYPE_METHOD_BASETYPE is not main variant");
+       error_found = true;
+    }
 
   if (error_found)
     {