From patchwork Wed Apr 6 23:22:23 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Jambor X-Patchwork-Id: 90105 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id F042DB6F44 for ; Thu, 7 Apr 2011 09:26:03 +1000 (EST) Received: (qmail 30617 invoked by alias); 6 Apr 2011 23:26:00 -0000 Received: (qmail 30486 invoked by uid 22791); 6 Apr 2011 23:25:57 -0000 X-SWARE-Spam-Status: No, hits=-6.1 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI X-Spam-Check-By: sourceware.org Received: from cantor.suse.de (HELO mx1.suse.de) (195.135.220.2) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 06 Apr 2011 23:25:52 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 249955362F for ; Thu, 7 Apr 2011 01:25:49 +0200 (CEST) Resent-From: Martin Jambor Resent-Date: Thu, 7 Apr 2011 01:25:48 +0200 Resent-Message-ID: <20110406232548.GD27755@virgil.arch.suse.de> Resent-To: GCC Patches Message-Id: <20110406232245.532048483@virgil.suse.cz> User-Agent: quilt/0.48-16.4 Date: Thu, 07 Apr 2011 01:22:23 +0200 From: Martin Jambor To: GCC Patches Cc: Jan Hubicka Subject: [PATCH 3/7] cgraph_node -> cgraph_get_node with asserts References: <20110406232220.922143392@virgil.suse.cz> Content-Disposition: inline; filename=get_cgraph_force.diff X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 * 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);