From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25088 invoked by alias); 1 Jun 2011 11:34:22 -0000 Received: (qmail 24399 invoked by uid 22791); 1 Jun 2011 11:34:20 -0000 X-SWARE-Spam-Status: No, hits=-5.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,T_RP_MATCHES_RCVD 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, 01 Jun 2011 11:34:04 +0000 Received: from relay1.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 E336874609; Wed, 1 Jun 2011 13:34:02 +0200 (CEST) Date: Wed, 01 Jun 2011 11:34:00 -0000 From: Richard Guenther To: gcc-patches@gcc.gnu.org Cc: fortran@gcc.gnu.org, java@gcc.gnu.org Subject: [PATCH][all-langs] Defer size_t and sizetype setting to the middle-end Message-ID: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact java-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: java-owner@gcc.gnu.org X-SW-Source: 2011-06/txt/msg00000.txt.bz2 This patch defers the control over size_t and sizetype to the middle-end which in turn consults the target. This removes various inconsistencies for frontends that do not seem to care about size_t and will allow simplifying the global tree initialization. Bootstrapped on x86_64-unknown-linux-gnu for all languages, testing in progress. Ok for trunk? (the change is worthwhile from an LTO and middle-end perspective and I'll apply leeway to frontends that appear to be unmaintained - hello Java) Thanks, Richard. 2011-06-01 Richard Guenther * tree.c (build_common_tree_nodes): Also initialize size_type_node. Call set_sizetype from here. c-family/ * c-common.c (c_common_nodes_and_builtins): Do not set size_type_node or call set_sizetype. go/ * go-lang.c (go_langhook_init): Do not set size_type_node or call set_sizetype. fortran/ * f95-lang.c (gfc_init_decl_processing): Do not set size_type_node or call set_sizetype. java/ * decl.c (java_init_decl_processing): Properly initialize size_type_node. lto/ * lto-lang.c (lto_init): Do not set size_type_node or call set_sizetype. ada/ * gcc-interface/misc.c (gnat_init): Do not set size_type_node or call set_sizetype. Index: gcc/tree.c =================================================================== --- gcc/tree.c (revision 174520) +++ gcc/tree.c (working copy) @@ -9142,6 +9142,7 @@ build_common_tree_nodes (bool signed_cha int128_unsigned_type_node = make_unsigned_type (128); } #endif + /* Define a boolean type. This type only represents boolean values but may be larger than char depending on the value of BOOL_TYPE_SIZE. Front ends which want to override this size (i.e. Java) can redefine @@ -9151,6 +9152,17 @@ build_common_tree_nodes (bool signed_cha TYPE_MAX_VALUE (boolean_type_node) = build_int_cst (boolean_type_node, 1); TYPE_PRECISION (boolean_type_node) = 1; + /* Define what type to use for size_t. */ + if (strcmp (SIZE_TYPE, "unsigned int") == 0) + size_type_node = unsigned_type_node; + else if (strcmp (SIZE_TYPE, "long unsigned int") == 0) + size_type_node = long_unsigned_type_node; + else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0) + size_type_node = long_long_unsigned_type_node; + else + gcc_unreachable (); + set_sizetype (size_type_node); + /* Fill in the rest of the sized types. Reuse existing type nodes when possible. */ intQI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (QImode), 0); Index: gcc/c-family/c-common.c =================================================================== --- gcc/c-family/c-common.c (revision 174520) +++ gcc/c-family/c-common.c (working copy) @@ -4666,13 +4666,7 @@ c_common_nodes_and_builtins (void) TYPE_DECL, NULL_TREE, widest_unsigned_literal_type_node)); - /* `unsigned long' is the standard type for sizeof. - Note that stddef.h uses `unsigned long', - and this must agree, even if long and int are the same size. */ - size_type_node = - TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE))); signed_size_type_node = c_common_signed_type (size_type_node); - set_sizetype (size_type_node); pid_type_node = TREE_TYPE (identifier_global_value (get_identifier (PID_TYPE))); Index: gcc/go/go-lang.c =================================================================== --- gcc/go/go-lang.c (revision 174520) +++ gcc/go/go-lang.c (working copy) @@ -87,15 +87,6 @@ go_langhook_init (void) { build_common_tree_nodes (false); - /* The sizetype may be "unsigned long" or "unsigned long long". */ - if (TYPE_MODE (long_unsigned_type_node) == ptr_mode) - size_type_node = long_unsigned_type_node; - else if (TYPE_MODE (long_long_unsigned_type_node) == ptr_mode) - size_type_node = long_long_unsigned_type_node; - else - size_type_node = long_unsigned_type_node; - set_sizetype (size_type_node); - build_common_tree_nodes_2 (0); /* We must create the gogo IR after calling build_common_tree_nodes Index: gcc/fortran/f95-lang.c =================================================================== --- gcc/fortran/f95-lang.c (revision 174520) +++ gcc/fortran/f95-lang.c (working copy) @@ -590,9 +590,6 @@ gfc_init_decl_processing (void) want double_type_node to actually have double precision. */ build_common_tree_nodes (false); - 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); Index: gcc/java/decl.c =================================================================== --- gcc/java/decl.c (revision 174520) +++ gcc/java/decl.c (working copy) @@ -606,7 +606,14 @@ java_init_decl_processing (void) /* This is not a java type, however tree-dfa requires a definition for size_type_node. */ - size_type_node = make_unsigned_type (POINTER_SIZE); + if (strcmp (SIZE_TYPE, "unsigned int") == 0) + size_type_node = make_unsigned_type (INT_TYPE_SIZE); + else if (strcmp (SIZE_TYPE, "long unsigned int") == 0) + size_type_node = make_unsigned_type (LONG_TYPE_SIZE); + else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0) + size_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE); + else + gcc_unreachable (); set_sizetype (size_type_node); /* Define these next since types below may used them. */ Index: gcc/lto/lto-lang.c =================================================================== --- gcc/lto/lto-lang.c (revision 174520) +++ gcc/lto/lto-lang.c (working copy) @@ -1087,17 +1087,6 @@ lto_init (void) /* Create the basic integer types. */ build_common_tree_nodes (flag_signed_char); - /* Tell the middle end what type to use for the size of objects. */ - if (strcmp (SIZE_TYPE, "unsigned int") == 0) - size_type_node = unsigned_type_node; - else if (strcmp (SIZE_TYPE, "long unsigned int") == 0) - size_type_node = long_unsigned_type_node; - else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0) - size_type_node = long_long_unsigned_type_node; - else - gcc_unreachable (); - set_sizetype (size_type_node); - /* The global tree for the main identifier is filled in by language-specific front-end initialization that is not run in the LTO back-end. It appears that all languages that perform such Index: gcc/ada/gcc-interface/misc.c =================================================================== --- gcc/ada/gcc-interface/misc.c (revision 174520) +++ gcc/ada/gcc-interface/misc.c (working copy) @@ -309,17 +309,6 @@ gnat_init (void) matter since we'll use the explicit `unsigned char' for Character. */ build_common_tree_nodes (flag_signed_char); - /* In Ada, we use the unsigned type corresponding to the width of Pmode as - SIZETYPE. In most cases when ptr_mode and Pmode differ, C will use the - width of ptr_mode for SIZETYPE, but we get better code using the width - of Pmode. Note that, although we manipulate negative offsets for some - internal constructs and rely on compile time overflow detection in size - computations, using unsigned types for SIZETYPEs is fine since they are - treated specially by the middle-end, in particular sign-extended. */ - size_type_node = gnat_type_for_mode (Pmode, 1); - set_sizetype (size_type_node); - TYPE_NAME (sizetype) = get_identifier ("size_type"); - /* In Ada, we use an unsigned 8-bit type for the default boolean type. */ boolean_type_node = make_unsigned_type (8); TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);