From patchwork Sat Nov 20 08:52:55 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Janne Blomqvist X-Patchwork-Id: 72346 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 9EFF11007D2 for ; Sat, 20 Nov 2010 19:53:08 +1100 (EST) Received: (qmail 12396 invoked by alias); 20 Nov 2010 08:53:03 -0000 Received: (qmail 12334 invoked by uid 22791); 20 Nov 2010 08:53:02 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from mail-iw0-f175.google.com (HELO mail-iw0-f175.google.com) (209.85.214.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 20 Nov 2010 08:52:57 +0000 Received: by iwn38 with SMTP id 38so810836iwn.20 for ; Sat, 20 Nov 2010 00:52:55 -0800 (PST) MIME-Version: 1.0 Received: by 10.231.37.12 with SMTP id v12mr3399605ibd.69.1290243175572; Sat, 20 Nov 2010 00:52:55 -0800 (PST) Received: by 10.231.158.19 with HTTP; Sat, 20 Nov 2010 00:52:55 -0800 (PST) Date: Sat, 20 Nov 2010 10:52:55 +0200 Message-ID: Subject: [Patch, fortran] Fix sizetype and size_type_node in the Fortran frontend From: Janne Blomqvist To: Fortran List , GCC Patches 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, I've been looking a bit at improving our detection of overflow when allocating arrays (PR 28105), and I noticed that the definition of size_t is a bit messed up. sizetype is properly set to an unsigned type of the right size, but the expression is calculated in a bit needlessly complicated way. However, size_type_node is an alias for gfc_array_index_type which is a signed type. This is clearly wrong. The attached patch fixes this (the fix has taken inspiration from the java frontend, see java/decl.c). I went through all uses of size_type_node in the frontend, and they are all used for building calls to malloc/realloc/memset/memmove so size_type_node is the correct choice; also the openmp stuff uses it for calculating some size for reductions, this seems ok as well. However, this patch does introduce a small regression (which the testsuite doesn't test for), namely since size_type_node is now changed to an unsigned type, the overflow test which checks for size < 0 when allocating arrays is optimized away. This test is quite ad hoc, and has only a 50% chance of succeeding anyway. I assigned PR 28105 to myself and 'm working on coming up with a better way. Regtested on x86_64-unknown-linux-gnu, Ok for trunk? 2010-11-20 Janne Blomqvist * f95-lang.c (gfc_init_decl_processing): Set size_type_node as unsigned int of pointer size and set sizetype based on that. * trans-types.c (gfc_init_types): Don't set size_type_node to an unsigned type. diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c index 3ed500b..a3ac860 100644 --- a/gcc/fortran/f95-lang.c +++ b/gcc/fortran/f95-lang.c @@ -582,15 +582,10 @@ gfc_init_decl_processing (void) only use it for actual characters, not for INTEGER(1). Also, we want double_type_node to actually have double precision. */ build_common_tree_nodes (false); - /* x86_64 mingw32 has a sizetype of "unsigned long long", most other hosts - have a sizetype of "unsigned long". Therefore choose the correct size - in mostly target independent way. */ - if (TYPE_MODE (long_unsigned_type_node) == ptr_mode) - set_sizetype (long_unsigned_type_node); - else if (TYPE_MODE (long_long_unsigned_type_node) == ptr_mode) - set_sizetype (long_long_unsigned_type_node); - else - set_sizetype (long_unsigned_type_node); + + size_type_node = gfc_build_uint_type (POINTER_SIZE); + set_sizetype (size_type_node); + build_common_tree_nodes_2 (0); void_list_node = build_tree_list (NULL_TREE, void_type_node); diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 0571bd1..66dd99e 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -919,8 +919,6 @@ gfc_init_types (void) gfc_max_array_element_size = build_int_cst_wide (long_unsigned_type_node, lo, hi); - size_type_node = gfc_array_index_type; - boolean_type_node = gfc_get_logical_type (gfc_default_logical_kind); boolean_true_node = build_int_cst (boolean_type_node, 1); boolean_false_node = build_int_cst (boolean_type_node, 0);