From patchwork Thu Dec 15 20:58:58 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Marlier X-Patchwork-Id: 131733 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 EDB12B6FD1 for ; Fri, 16 Dec 2011 07:59:24 +1100 (EST) Received: (qmail 2260 invoked by alias); 15 Dec 2011 20:59:21 -0000 Received: (qmail 2245 invoked by uid 22791); 15 Dec 2011 20:59:19 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM X-Spam-Check-By: sourceware.org Received: from mail-qw0-f47.google.com (HELO mail-qw0-f47.google.com) (209.85.216.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 15 Dec 2011 20:59:01 +0000 Received: by qadb17 with SMTP id b17so566155qad.20 for ; Thu, 15 Dec 2011 12:59:00 -0800 (PST) Received: by 10.224.180.12 with SMTP id bs12mr4409133qab.70.1323982739956; Thu, 15 Dec 2011 12:58:59 -0800 (PST) Received: from d01.cs.rochester.edu ([128.151.67.209]) by mx.google.com with ESMTPS id r10sm14824034qaz.7.2011.12.15.12.58.58 (version=SSLv3 cipher=OTHER); Thu, 15 Dec 2011 12:58:59 -0800 (PST) Message-ID: <4EEA5F92.1000302@gmail.com> Date: Thu, 15 Dec 2011 15:58:58 -0500 From: Patrick Marlier User-Agent: Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20111115 Thunderbird/8.0 MIME-Version: 1.0 To: GCC Patches CC: rguenther@suse.de, dnovillo@google.com, Richard Henderson , Aldy Hernandez , Torvald Riegel Subject: [PATCH] PR51280 LTO/trans-mem ICE with TM builtins 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 In PR51280, LTO does ICE because the object file uses TM builtin but the TM is not enabled. In the patch, it displays a error message if the builtin is not defined and due to TM. I moved is_tm_builtin() from calls.c to trans-mem.c. I splitted it into 2 functions is_tm_builtin/is_tm_builtin_code. In is_tm_builtin_code, I added some missing builtins (TM_START, TM_GETTMCLONE_SAFE, TM_MALLOC, TM_CALLOC, TM_FREE). Finally, I declared them into tree.h to be usable in calls.c and tree-streamer-in.c. Bootstrapped and LTO/TM regtested on Linux/i686. (If ok, please commit it. Thanks.) Patrick Marlier. 2011-12-15 Patrick Marlier PR lto/51280 * tree.h (is_tm_builtin): Declare. (is_tm_builtin_code): Declare. * calls.c (is_tm_builtin): Move to... * trans-mem.c (is_tm_builtin): ...here. (is_tm_builtin_code): New, add missing builtins. * lto-streamer-in.c (streamer_get_builtin_tree): Use it. Index: tree.h =================================================================== --- tree.h (revision 182376) +++ tree.h (working copy) @@ -5871,6 +5871,8 @@ extern bool is_tm_safe (const_tree); extern bool is_tm_pure (const_tree); extern bool is_tm_may_cancel_outer (tree); extern bool is_tm_ending_fndecl (tree); +extern bool is_tm_builtin_code (enum built_in_function); +extern bool is_tm_builtin (const_tree); extern void record_tm_replacement (tree, tree); extern void tm_malloc_replacement (tree); Index: trans-mem.c =================================================================== --- trans-mem.c (revision 182376) +++ trans-mem.c (working copy) @@ -406,6 +406,83 @@ is_tm_abort (tree fndecl) && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_TM_ABORT); } +/* Return TRUE if FCODE is a TM builtin function. */ + +bool +is_tm_builtin_code (enum built_in_function fcode) +{ + switch (fcode) + { + case BUILT_IN_TM_START: + case BUILT_IN_TM_COMMIT: + case BUILT_IN_TM_COMMIT_EH: + case BUILT_IN_TM_ABORT: + case BUILT_IN_TM_IRREVOCABLE: + case BUILT_IN_TM_MEMCPY: + case BUILT_IN_TM_MEMMOVE: + case BUILT_IN_TM_MEMSET: + case BUILT_IN_TM_GETTMCLONE_IRR: + case BUILT_IN_TM_GETTMCLONE_SAFE: + case BUILT_IN_TM_MALLOC: + case BUILT_IN_TM_CALLOC: + case BUILT_IN_TM_FREE: + CASE_BUILT_IN_TM_STORE (1): + CASE_BUILT_IN_TM_STORE (2): + CASE_BUILT_IN_TM_STORE (4): + CASE_BUILT_IN_TM_STORE (8): + CASE_BUILT_IN_TM_STORE (FLOAT): + CASE_BUILT_IN_TM_STORE (DOUBLE): + CASE_BUILT_IN_TM_STORE (LDOUBLE): + CASE_BUILT_IN_TM_STORE (M64): + CASE_BUILT_IN_TM_STORE (M128): + CASE_BUILT_IN_TM_STORE (M256): + CASE_BUILT_IN_TM_LOAD (1): + CASE_BUILT_IN_TM_LOAD (2): + CASE_BUILT_IN_TM_LOAD (4): + CASE_BUILT_IN_TM_LOAD (8): + CASE_BUILT_IN_TM_LOAD (FLOAT): + CASE_BUILT_IN_TM_LOAD (DOUBLE): + CASE_BUILT_IN_TM_LOAD (LDOUBLE): + CASE_BUILT_IN_TM_LOAD (M64): + CASE_BUILT_IN_TM_LOAD (M128): + CASE_BUILT_IN_TM_LOAD (M256): + case BUILT_IN_TM_LOG: + case BUILT_IN_TM_LOG_1: + case BUILT_IN_TM_LOG_2: + case BUILT_IN_TM_LOG_4: + case BUILT_IN_TM_LOG_8: + case BUILT_IN_TM_LOG_FLOAT: + case BUILT_IN_TM_LOG_DOUBLE: + case BUILT_IN_TM_LOG_LDOUBLE: + case BUILT_IN_TM_LOG_M64: + case BUILT_IN_TM_LOG_M128: + case BUILT_IN_TM_LOG_M256: + return true; + default: + break; + } + return false; + +} + +/* Return TRUE if FNDECL is either a TM builtin or a TM cloned + function. Return FALSE otherwise. */ + +bool +is_tm_builtin (const_tree fndecl) +{ + if (fndecl == NULL) + return false; + + if (decl_is_tm_clone (fndecl)) + return true; + + if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL + && is_tm_builtin_code (DECL_FUNCTION_CODE (fndecl))) + return true; + return false; +} + /* Build a GENERIC tree for a user abort. This is called by front ends while transforming the __tm_abort statement. */ Index: calls.c =================================================================== --- calls.c (revision 182376) +++ calls.c (working copy) @@ -611,69 +611,6 @@ alloca_call_p (const_tree exp) return false; } -/* Return TRUE if FNDECL is either a TM builtin or a TM cloned - function. Return FALSE otherwise. */ - -static bool -is_tm_builtin (const_tree fndecl) -{ - if (fndecl == NULL) - return false; - - if (decl_is_tm_clone (fndecl)) - return true; - - if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL) - { - switch (DECL_FUNCTION_CODE (fndecl)) - { - case BUILT_IN_TM_COMMIT: - case BUILT_IN_TM_COMMIT_EH: - case BUILT_IN_TM_ABORT: - case BUILT_IN_TM_IRREVOCABLE: - case BUILT_IN_TM_GETTMCLONE_IRR: - case BUILT_IN_TM_MEMCPY: - case BUILT_IN_TM_MEMMOVE: - case BUILT_IN_TM_MEMSET: - CASE_BUILT_IN_TM_STORE (1): - CASE_BUILT_IN_TM_STORE (2): - CASE_BUILT_IN_TM_STORE (4): - CASE_BUILT_IN_TM_STORE (8): - CASE_BUILT_IN_TM_STORE (FLOAT): - CASE_BUILT_IN_TM_STORE (DOUBLE): - CASE_BUILT_IN_TM_STORE (LDOUBLE): - CASE_BUILT_IN_TM_STORE (M64): - CASE_BUILT_IN_TM_STORE (M128): - CASE_BUILT_IN_TM_STORE (M256): - CASE_BUILT_IN_TM_LOAD (1): - CASE_BUILT_IN_TM_LOAD (2): - CASE_BUILT_IN_TM_LOAD (4): - CASE_BUILT_IN_TM_LOAD (8): - CASE_BUILT_IN_TM_LOAD (FLOAT): - CASE_BUILT_IN_TM_LOAD (DOUBLE): - CASE_BUILT_IN_TM_LOAD (LDOUBLE): - CASE_BUILT_IN_TM_LOAD (M64): - CASE_BUILT_IN_TM_LOAD (M128): - CASE_BUILT_IN_TM_LOAD (M256): - case BUILT_IN_TM_LOG: - case BUILT_IN_TM_LOG_1: - case BUILT_IN_TM_LOG_2: - case BUILT_IN_TM_LOG_4: - case BUILT_IN_TM_LOG_8: - case BUILT_IN_TM_LOG_FLOAT: - case BUILT_IN_TM_LOG_DOUBLE: - case BUILT_IN_TM_LOG_LDOUBLE: - case BUILT_IN_TM_LOG_M64: - case BUILT_IN_TM_LOG_M128: - case BUILT_IN_TM_LOG_M256: - return true; - default: - break; - } - } - return false; -} - /* Detect flags (function attributes) from the function decl or type node. */ int Index: tree-streamer-in.c =================================================================== --- tree-streamer-in.c (revision 182376) +++ tree-streamer-in.c (working copy) @@ -1055,6 +1055,8 @@ streamer_get_builtin_tree (struct lto_input_block if (fcode >= END_BUILTINS) fatal_error ("machine independent builtin code out of range"); result = builtin_decl_explicit (fcode); + if (!result && !flag_tm && is_tm_builtin_code (fcode)) + fatal_error ("transactional memory builtin without support enabled"); gcc_assert (result); } else if (fclass == BUILT_IN_MD)