Hi, the patch below changes a number of calls to cgraph_node to calls to cgraph_get_node. These calls should never return NULL but because the callers do not immediately dereference the pointer they get, a NULL value would result in a segmentation fault at some later point, obscuring the real cause. Therefore I have added checking asserts to guard this does not happen.
Bootstrapped and tested separately on x86_64-linux without any problems, tests on other platforms (together with the other patches) in progress. OK for trunk? Thanks, Martin 2011-04-06 Martin Jambor <mjam...@suse.cz> * tree-inline.c (tree_function_versioning): Call cgraph_get_node instead of cgraph_node and assert it does not return NULL. * lto-streamer-in.c (lto_read_body): Likewise. * omp-low.c (new_omp_context): Likewise. (create_task_copyfn): Likewise. * tree-emutls.c (lower_emutls_function_body): Likewise. * matrix-reorg.c (transform_allocation_sites): Likewise. Index: src/gcc/tree-inline.c =================================================================== --- src.orig/gcc/tree-inline.c +++ src/gcc/tree-inline.c @@ -5001,8 +5001,10 @@ tree_function_versioning (tree old_decl, && TREE_CODE (new_decl) == FUNCTION_DECL); DECL_POSSIBLY_INLINED (old_decl) = 1; - old_version_node = cgraph_node (old_decl); - new_version_node = cgraph_node (new_decl); + old_version_node = cgraph_get_node (old_decl); + gcc_checking_assert (old_version_node); + new_version_node = cgraph_get_node (new_decl); + gcc_checking_assert (new_version_node); /* Output the inlining info for this abstract function, since it has been inlined. If we don't do this now, we can lose the information about the Index: src/gcc/lto-streamer-in.c =================================================================== --- src.orig/gcc/lto-streamer-in.c +++ src/gcc/lto-streamer-in.c @@ -1446,8 +1446,9 @@ lto_read_body (struct lto_file_decl_data { struct function *fn = DECL_STRUCT_FUNCTION (fn_decl); struct lto_in_decl_state *decl_state; - struct cgraph_node *node = cgraph_node (fn_decl); + struct cgraph_node *node = cgraph_get_node (fn_decl); + gcc_checking_assert (node); push_cfun (fn); init_tree_ssa (fn); Index: src/gcc/omp-low.c =================================================================== --- src.orig/gcc/omp-low.c +++ src/gcc/omp-low.c @@ -1209,7 +1209,8 @@ new_omp_context (gimple stmt, omp_contex { ctx->cb.src_fn = current_function_decl; ctx->cb.dst_fn = current_function_decl; - ctx->cb.src_node = cgraph_node (current_function_decl); + ctx->cb.src_node = cgraph_get_node (current_function_decl); + gcc_checking_assert (ctx->cb.src_node); ctx->cb.dst_node = ctx->cb.src_node; ctx->cb.src_cfun = cfun; ctx->cb.copy_decl = omp_copy_decl; @@ -6263,7 +6264,8 @@ create_task_copyfn (gimple task_stmt, om memset (&tcctx, '\0', sizeof (tcctx)); tcctx.cb.src_fn = ctx->cb.src_fn; tcctx.cb.dst_fn = child_fn; - tcctx.cb.src_node = cgraph_node (tcctx.cb.src_fn); + tcctx.cb.src_node = cgraph_get_node (tcctx.cb.src_fn); + gcc_checking_assert (tcctx.cb.src_node); tcctx.cb.dst_node = tcctx.cb.src_node; tcctx.cb.src_cfun = ctx->cb.src_cfun; tcctx.cb.copy_decl = task_copyfn_copy_decl; Index: src/gcc/tree-emutls.c =================================================================== --- src.orig/gcc/tree-emutls.c +++ src/gcc/tree-emutls.c @@ -619,7 +619,8 @@ lower_emutls_function_body (struct cgrap d.cfun_node = node; d.builtin_decl = built_in_decls[BUILT_IN_EMUTLS_GET_ADDRESS]; - d.builtin_node = cgraph_node (d.builtin_decl); + d.builtin_node = cgraph_get_node (d.builtin_decl); + gcc_checking_assert (d.builtin_node); FOR_EACH_BB (d.bb) { Index: src/gcc/matrix-reorg.c =================================================================== --- src.orig/gcc/matrix-reorg.c +++ src/gcc/matrix-reorg.c @@ -2169,7 +2169,8 @@ transform_allocation_sites (void **slot, update_ssa (TODO_update_ssa); /* Replace the malloc size argument in the malloc of level 0 to be the size of all the dimensions. */ - c_node = cgraph_node (mi->allocation_function_decl); + c_node = cgraph_get_node (mi->allocation_function_decl); + gcc_checking_assert (c_node); old_size_0 = gimple_call_arg (call_stmt_0, 0); tmp = force_gimple_operand_gsi (&gsi, mi->dimension_size[0], true, NULL, true, GSI_SAME_STMT); @@ -2218,7 +2219,8 @@ transform_allocation_sites (void **slot, if (!mi->free_stmts[i].stmt) continue; - c_node = cgraph_node (mi->free_stmts[i].func); + c_node = cgraph_get_node (mi->free_stmts[i].func); + gcc_checking_assert (c_node); gcc_assert (is_gimple_call (mi->free_stmts[i].stmt)); e = cgraph_edge (c_node, mi->free_stmts[i].stmt); gcc_assert (e);