> I concede that my understanding of the C++ front-end inner workings
> are quite narrow and so the folling is basically a suggestion. But it
> seems to me that at a few places where C++ queries the call graph for
> a node, the lazy node creation is not necessary. If a maintainer can
> verify and approve (parts of) this after the big patch is committed,
> it would be a nice cleanup too.
>
> Thanks,
>
> Martin
>
>
> Index: src/gcc/cp/class.c
> ===================================================================
> --- src.orig/gcc/cp/class.c 2011-03-18 19:34:07.000000000 +0100
> +++ src/gcc/cp/class.c 2011-03-18 19:34:38.000000000 +0100
> @@ -8405,7 +8405,7 @@ cp_fold_obj_type_ref (tree ref, tree kno
> DECL_VINDEX (fndecl)));
> #endif
>
> - cgraph_get_create_node (fndecl)->local.vtable_method = true;
> + cgraph_get_node (fndecl)->local.vtable_method = true;
I believe that vtable_method is ugly hack to work around the fact that we was
not able to optimize away functions that has address taken. Perhaps this can
just be removed now?
>
> return build_address (fndecl);
> }
> Index: src/gcc/cp/decl2.c
> ===================================================================
> --- src.orig/gcc/cp/decl2.c 2011-03-18 19:34:07.000000000 +0100
> +++ src/gcc/cp/decl2.c 2011-03-18 19:34:39.000000000 +0100
> @@ -3375,12 +3375,12 @@ cxx_callgraph_analyze_expr (tree *tp, in
> case PTRMEM_CST:
> if (TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
> cgraph_mark_address_taken_node (
> - cgraph_get_create_node (PTRMEM_CST_MEMBER (t)));
> + cgraph_do_get_node (PTRMEM_CST_MEMBER (t)));
I believe this si not safe in general, since it happens at cgraph construction
time.
However perhaps all of those are gimplified away now?
> break;
> case BASELINK:
> if (TREE_CODE (BASELINK_FUNCTIONS (t)) == FUNCTION_DECL)
> cgraph_mark_address_taken_node (
> - cgraph_get_create_node (BASELINK_FUNCTIONS (t)));
> + cgraph_do_get_node (BASELINK_FUNCTIONS (t)));
> break;
> case VAR_DECL:
> if (DECL_CONTEXT (t)
> @@ -3893,7 +3893,7 @@ cp_write_global_declarations (void)
> if (!DECL_EXTERNAL (decl)
> && decl_needed_p (decl)
> && !TREE_ASM_WRITTEN (decl)
> - && !cgraph_get_create_node (decl)->local.finalized)
> + && !cgraph_get_node (decl)->local.finalized)
> {
> /* We will output the function; no longer consider it in this
> loop. */
> Index: src/gcc/cp/method.c
> ===================================================================
> --- src.orig/gcc/cp/method.c 2011-03-18 19:34:07.000000000 +0100
> +++ src/gcc/cp/method.c 2011-03-18 19:34:40.000000000 +0100
> @@ -260,7 +260,7 @@ make_alias_for_thunk (tree function)
> if (!flag_syntax_only)
> {
> struct cgraph_node *aliasn;
> - aliasn = cgraph_same_body_alias (cgraph_get_create_node (function),
> + aliasn = cgraph_same_body_alias (cgraph_do_get_node (function),
> alias, function);
> DECL_ASSEMBLER_NAME (function);
> gcc_assert (aliasn != NULL);
> @@ -379,7 +379,7 @@ use_thunk (tree thunk_fndecl, bool emit_
> a = nreverse (t);
> DECL_ARGUMENTS (thunk_fndecl) = a;
> TREE_ASM_WRITTEN (thunk_fndecl) = 1;
> - cgraph_add_thunk (cgraph_get_create_node (function), thunk_fndecl,
> function,
> + cgraph_add_thunk (cgraph_do_get_node (function), thunk_fndecl, function,
These two ought t be safe.
> this_adjusting, fixed_offset, virtual_value,
> virtual_offset, alias);
>
> Index: src/gcc/cp/optimize.c
> ===================================================================
> --- src.orig/gcc/cp/optimize.c 2011-03-18 19:34:07.000000000 +0100
> +++ src/gcc/cp/optimize.c 2011-03-18 19:34:40.000000000 +0100
> @@ -309,8 +309,9 @@ maybe_clone_body (tree fn)
> && (!DECL_ONE_ONLY (fns[0])
> || (HAVE_COMDAT_GROUP
> && DECL_WEAK (fns[0])))
> - && cgraph_same_body_alias (cgraph_get_create_node (fns[0]), clone,
> - fns[0]))
> + && (flag_syntax_only
> + || cgraph_same_body_alias (cgraph_do_get_node (fns[0]), clone,
> + fns[0])))
Same here, the node we are producing alias of should exist.
> {
> alias = true;
> if (DECL_ONE_ONLY (fns[0]))
> @@ -424,8 +425,8 @@ maybe_clone_body (tree fn)
> /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
> virtual, it goes into the same comdat group as well. */
> DECL_COMDAT_GROUP (fns[2]) = comdat_group;
> - base_dtor_node = cgraph_get_create_node (fns[0]);
> - deleting_dtor_node = cgraph_get_create_node (fns[2]);
> + base_dtor_node = cgraph_get_node (fns[0]);
> + deleting_dtor_node = cgraph_get_node (fns[2]);
> gcc_assert (base_dtor_node->same_comdat_group == NULL);
> gcc_assert (deleting_dtor_node->same_comdat_group == NULL);
do_get_node here?
I am not at all sure why function we are cloning should have a node attached
given
that it is an abstract function. Or do I miss something?
Honza
> base_dtor_node->same_comdat_group = deleting_dtor_node;