[PATCH] Remove set_sizetype

Richard Guenther rguenther@suse.de
Tue Jun 7 14:36:00 GMT 2011


Now that there is a single place left to call set_sizetype we can
remove it and initialize sizetypes properly from the start
(in initialize_sizetypes).

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2011-06-07  Richard Guenther  <rguenther@suse.de>

	* stor-layout.c (initialize_sizetypes): Initialize all
	sizetypes based on target definitions.
	(set_sizetype): Remove.
	* tree.c (build_common_tree_nodes): Do not call set_sizetype.
	* tree.h (set_sizetype): Remove.

Index: gcc/stor-layout.c
===================================================================
*** gcc/stor-layout.c.orig	2011-06-06 12:26:32.000000000 +0200
--- gcc/stor-layout.c	2011-06-07 15:04:44.000000000 +0200
*************** make_accum_type (int precision, int unsi
*** 2189,2281 ****
    return type;
  }
  
! /* Initialize sizetype and bitsizetype to a reasonable and temporary
!    value to enable integer types to be created.  */
  
  void
  initialize_sizetypes (void)
  {
!   tree t = make_node (INTEGER_TYPE);
!   int precision = GET_MODE_BITSIZE (SImode);
  
!   SET_TYPE_MODE (t, SImode);
!   TYPE_ALIGN (t) = GET_MODE_ALIGNMENT (SImode);
!   TYPE_IS_SIZETYPE (t) = 1;
!   TYPE_UNSIGNED (t) = 1;
!   TYPE_SIZE (t) = build_int_cst (t, precision);
!   TYPE_SIZE_UNIT (t) = build_int_cst (t, GET_MODE_SIZE (SImode));
!   TYPE_PRECISION (t) = precision;
! 
!   set_min_and_max_values_for_integral_type (t, precision,
  					    /*is_unsigned=*/true);
- 
-   sizetype = t;
-   bitsizetype = build_distinct_type_copy (t);
- }
- 
- /* Make sizetype a version of TYPE, and initialize *sizetype accordingly.
-    We do this by overwriting the stub sizetype and bitsizetype nodes created
-    by initialize_sizetypes.  This makes sure that (a) anything stubby about
-    them no longer exists and (b) any INTEGER_CSTs created with such a type,
-    remain valid.  */
- 
- void
- set_sizetype (tree type)
- {
-   tree t, max;
-   int oprecision = TYPE_PRECISION (type);
-   /* The *bitsizetype types use a precision that avoids overflows when
-      calculating signed sizes / offsets in bits.  However, when
-      cross-compiling from a 32 bit to a 64 bit host, we are limited to 64 bit
-      precision.  */
-   int precision
-     = MIN (oprecision + BITS_PER_UNIT_LOG + 1, MAX_FIXED_MODE_SIZE);
-   precision
-     = GET_MODE_PRECISION (smallest_mode_for_size (precision, MODE_INT));
-   if (precision > HOST_BITS_PER_WIDE_INT * 2)
-     precision = HOST_BITS_PER_WIDE_INT * 2;
- 
-   /* sizetype must be an unsigned type.  */
-   gcc_assert (TYPE_UNSIGNED (type));
- 
-   t = build_distinct_type_copy (type);
-   /* We want to use sizetype's cache, as we will be replacing that type.  */
-   TYPE_CACHED_VALUES (t) = TYPE_CACHED_VALUES (sizetype);
-   TYPE_CACHED_VALUES_P (t) = TYPE_CACHED_VALUES_P (sizetype);
-   TYPE_UID (t) = TYPE_UID (sizetype);
-   TYPE_IS_SIZETYPE (t) = 1;
- 
-   /* Replace our original stub sizetype.  */
-   memcpy (sizetype, t, tree_size (sizetype));
-   TYPE_MAIN_VARIANT (sizetype) = sizetype;
-   TYPE_CANONICAL (sizetype) = sizetype;
- 
    /* sizetype is unsigned but we need to fix TYPE_MAX_VALUE so that it is
       sign-extended in a way consistent with force_fit_type.  */
-   max = TYPE_MAX_VALUE (sizetype);
    TYPE_MAX_VALUE (sizetype)
!     = double_int_to_tree (sizetype, tree_to_double_int (max));
  
!   t = make_node (INTEGER_TYPE);
!   TYPE_NAME (t) = get_identifier ("bit_size_type");
!   /* We want to use bitsizetype's cache, as we will be replacing that type.  */
!   TYPE_CACHED_VALUES (t) = TYPE_CACHED_VALUES (bitsizetype);
!   TYPE_CACHED_VALUES_P (t) = TYPE_CACHED_VALUES_P (bitsizetype);
!   TYPE_PRECISION (t) = precision;
!   TYPE_UID (t) = TYPE_UID (bitsizetype);
!   TYPE_IS_SIZETYPE (t) = 1;
! 
!   /* Replace our original stub bitsizetype.  */
!   memcpy (bitsizetype, t, tree_size (bitsizetype));
!   TYPE_MAIN_VARIANT (bitsizetype) = bitsizetype;
!   TYPE_CANONICAL (bitsizetype) = bitsizetype;
! 
!   fixup_unsigned_type (bitsizetype);
  
    /* Create the signed variants of *sizetype.  */
!   ssizetype = make_signed_type (oprecision);
    TYPE_IS_SIZETYPE (ssizetype) = 1;
!   sbitsizetype = make_signed_type (precision);
    TYPE_IS_SIZETYPE (sbitsizetype) = 1;
  }
  
--- 2189,2257 ----
    return type;
  }
  
! /* Initialize sizetypes so layout_type can use them.  */
  
  void
  initialize_sizetypes (void)
  {
!   int precision, bprecision;
  
!   /* Get sizetypes precision from the SIZE_TYPE target macro.  */
!   if (strcmp (SIZE_TYPE, "unsigned int") == 0)
!     precision = INT_TYPE_SIZE;
!   else if (strcmp (SIZE_TYPE, "long unsigned int") == 0)
!     precision = LONG_TYPE_SIZE;
!   else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0)
!     precision = LONG_LONG_TYPE_SIZE;
!   else
!     gcc_unreachable ();
! 
!   bprecision
!     = MIN (precision + BITS_PER_UNIT_LOG + 1, MAX_FIXED_MODE_SIZE);
!   bprecision
!     = GET_MODE_PRECISION (smallest_mode_for_size (bprecision, MODE_INT));
!   if (bprecision > HOST_BITS_PER_WIDE_INT * 2)
!     bprecision = HOST_BITS_PER_WIDE_INT * 2;
! 
!   /* Create stubs for sizetype and bitsizetype so we can create constants.  */
!   sizetype = make_node (INTEGER_TYPE);
!   /* ???  We can't set a name for sizetype because it appears in C diagnostics
!      and pp_c_type_specifier doesn't deal with IDENTIFIER_NODE TYPE_NAMEs.  */
!   TYPE_PRECISION (sizetype) = precision;
!   TYPE_UNSIGNED (sizetype) = 1;
!   TYPE_IS_SIZETYPE (sizetype) = 1;
!   bitsizetype = make_node (INTEGER_TYPE);
!   TYPE_NAME (bitsizetype) = get_identifier ("bitsizetype");
!   TYPE_PRECISION (bitsizetype) = bprecision;
!   TYPE_UNSIGNED (bitsizetype) = 1;
!   TYPE_IS_SIZETYPE (bitsizetype) = 1;
! 
!   /* Now layout both types manually.  */
!   SET_TYPE_MODE (sizetype, smallest_mode_for_size (precision, MODE_INT));
!   TYPE_ALIGN (sizetype) = GET_MODE_ALIGNMENT (TYPE_MODE (sizetype));
!   TYPE_SIZE (sizetype) = bitsize_int (precision);
!   TYPE_SIZE_UNIT (sizetype) = size_int (GET_MODE_SIZE (TYPE_MODE (sizetype)));
!   set_min_and_max_values_for_integral_type (sizetype, precision,
  					    /*is_unsigned=*/true);
    /* sizetype is unsigned but we need to fix TYPE_MAX_VALUE so that it is
       sign-extended in a way consistent with force_fit_type.  */
    TYPE_MAX_VALUE (sizetype)
!     = double_int_to_tree (sizetype,
! 			  tree_to_double_int (TYPE_MAX_VALUE (sizetype)));
  
!   SET_TYPE_MODE (bitsizetype, smallest_mode_for_size (bprecision, MODE_INT));
!   TYPE_ALIGN (bitsizetype) = GET_MODE_ALIGNMENT (TYPE_MODE (bitsizetype));
!   TYPE_SIZE (bitsizetype) = bitsize_int (bprecision);
!   TYPE_SIZE_UNIT (bitsizetype)
!     = size_int (GET_MODE_SIZE (TYPE_MODE (bitsizetype)));
!   set_min_and_max_values_for_integral_type (bitsizetype, bprecision,
! 					    /*is_unsigned=*/true);
!   /* ???  TYPE_MAX_VALUE is not properly sign-extended.  */
  
    /* Create the signed variants of *sizetype.  */
!   ssizetype = make_signed_type (TYPE_PRECISION (sizetype));
    TYPE_IS_SIZETYPE (ssizetype) = 1;
!   sbitsizetype = make_signed_type (TYPE_PRECISION (bitsizetype));
    TYPE_IS_SIZETYPE (sbitsizetype) = 1;
  }
  
Index: gcc/tree.c
===================================================================
*** gcc/tree.c.orig	2011-06-07 15:02:12.000000000 +0200
--- gcc/tree.c	2011-06-07 15:05:08.000000000 +0200
*************** make_or_reuse_accum_type (unsigned size,
*** 9098,9105 ****
  }
  
  /* Create nodes for all integer types (and error_mark_node) using the sizes
!    of C datatypes.  The caller should call set_sizetype soon after calling
!    this function to select one of the types as sizetype.  */
  
  void
  build_common_tree_nodes (bool signed_char)
--- 9098,9104 ----
  }
  
  /* Create nodes for all integer types (and error_mark_node) using the sizes
!    of C datatypes.  */
  
  void
  build_common_tree_nodes (bool signed_char)
*************** build_common_tree_nodes (bool signed_cha
*** 9161,9167 ****
      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.  */
--- 9160,9165 ----
*************** build_common_tree_nodes (bool signed_cha
*** 9182,9188 ****
    access_private_node = get_identifier ("private");
  }
  
! /* Call this function after calling build_common_tree_nodes and set_sizetype.
     It will create several other common tree nodes.  */
  
  void
--- 9180,9186 ----
    access_private_node = get_identifier ("private");
  }
  
! /* Call this function after calling build_common_tree_nodes.
     It will create several other common tree nodes.  */
  
  void
Index: gcc/tree.h
===================================================================
*** gcc/tree.h.orig	2011-05-31 11:10:22.000000000 +0200
--- gcc/tree.h	2011-06-07 15:03:56.000000000 +0200
*************** extern tree signed_or_unsigned_type_for
*** 4291,4297 ****
  extern tree signed_type_for (tree);
  extern tree unsigned_type_for (tree);
  extern void initialize_sizetypes (void);
- extern void set_sizetype (tree);
  extern void fixup_unsigned_type (tree);
  extern tree build_pointer_type_for_mode (tree, enum machine_mode, bool);
  extern tree build_pointer_type (tree);
--- 4291,4296 ----



More information about the Gcc-patches mailing list