* [PATCH] Remove set_sizetype
@ 2011-06-07 14:36 Richard Guenther
2011-06-09 12:38 ` Eric Botcazou
0 siblings, 1 reply; 5+ messages in thread
From: Richard Guenther @ 2011-06-07 14:36 UTC (permalink / raw)
To: gcc-patches
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;
}
\f
--- 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;
}
\f
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 ----
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Remove set_sizetype
2011-06-07 14:36 [PATCH] Remove set_sizetype Richard Guenther
@ 2011-06-09 12:38 ` Eric Botcazou
2011-06-09 13:08 ` Richard Guenther
0 siblings, 1 reply; 5+ messages in thread
From: Eric Botcazou @ 2011-06-09 12:38 UTC (permalink / raw)
To: gcc-patches, Richard Guenther
> 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).
Can you give a meaningful TYPE_NAME to sizetype? Ada dump files now read:
_GLOBAL.SZ0_discr31 (integer p0, integer p1)
{
return p1 <= p0 ? ((bitsizetype) ((<unnamed-unsigned:32>) p0 -
(<unnamed-unsigned:32>) p1) + 1) * 8 : 0;
}
and this isn't very pretty.
--
Eric Botcazou
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Remove set_sizetype
2011-06-09 12:38 ` Eric Botcazou
@ 2011-06-09 13:08 ` Richard Guenther
2011-06-09 15:56 ` Richard Guenther
0 siblings, 1 reply; 5+ messages in thread
From: Richard Guenther @ 2011-06-09 13:08 UTC (permalink / raw)
To: Eric Botcazou; +Cc: gcc-patches
On Thu, 9 Jun 2011, Eric Botcazou wrote:
> > 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).
>
> Can you give a meaningful TYPE_NAME to sizetype? Ada dump files now read:
>
> _GLOBAL.SZ0_discr31 (integer p0, integer p1)
> {
> return p1 <= p0 ? ((bitsizetype) ((<unnamed-unsigned:32>) p0 -
> (<unnamed-unsigned:32>) p1) + 1) * 8 : 0;
> }
>
> and this isn't very pretty.
It's on my todo - I need to fixup FEs to not expect a TYPE_DECL
everywhere.
Richard.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Remove set_sizetype
2011-06-09 13:08 ` Richard Guenther
@ 2011-06-09 15:56 ` Richard Guenther
2011-06-09 20:49 ` Eric Botcazou
0 siblings, 1 reply; 5+ messages in thread
From: Richard Guenther @ 2011-06-09 15:56 UTC (permalink / raw)
To: Eric Botcazou; +Cc: gcc-patches
On Thu, 9 Jun 2011, Richard Guenther wrote:
> On Thu, 9 Jun 2011, Eric Botcazou wrote:
>
> > > 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).
> >
> > Can you give a meaningful TYPE_NAME to sizetype? Ada dump files now read:
> >
> > _GLOBAL.SZ0_discr31 (integer p0, integer p1)
> > {
> > return p1 <= p0 ? ((bitsizetype) ((<unnamed-unsigned:32>) p0 -
> > (<unnamed-unsigned:32>) p1) + 1) * 8 : 0;
> > }
> >
> > and this isn't very pretty.
>
> It's on my todo - I need to fixup FEs to not expect a TYPE_DECL
> everywhere.
Like this, testing with the C family fixup.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard.
2011-06-09 Richard Guenther <rguenther@suse.de>
* stor-layout.c (initialize_sizetypes): Give names to all
sizetype kinds.
Index: gcc/stor-layout.c
===================================================================
--- gcc/stor-layout.c (revision 174841)
+++ gcc/stor-layout.c (working copy)
@@ -2215,8 +2215,7 @@ initialize_sizetypes (void)
/* 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_NAME (sizetype) = get_identifier ("sizetype");
TYPE_PRECISION (sizetype) = precision;
TYPE_UNSIGNED (sizetype) = 1;
TYPE_IS_SIZETYPE (sizetype) = 1;
@@ -2250,8 +2249,10 @@ initialize_sizetypes (void)
/* Create the signed variants of *sizetype. */
ssizetype = make_signed_type (TYPE_PRECISION (sizetype));
+ TYPE_NAME (ssizetype) = get_identifier ("ssizetype");
TYPE_IS_SIZETYPE (ssizetype) = 1;
sbitsizetype = make_signed_type (TYPE_PRECISION (bitsizetype));
+ TYPE_NAME (sbitsizetype) = get_identifier ("sbitsizetype");
TYPE_IS_SIZETYPE (sbitsizetype) = 1;
}
\f
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Remove set_sizetype
2011-06-09 15:56 ` Richard Guenther
@ 2011-06-09 20:49 ` Eric Botcazou
0 siblings, 0 replies; 5+ messages in thread
From: Eric Botcazou @ 2011-06-09 20:49 UTC (permalink / raw)
To: Richard Guenther; +Cc: gcc-patches
> 2011-06-09 Richard Guenther <rguenther@suse.de>
>
> * stor-layout.c (initialize_sizetypes): Give names to all
> sizetype kinds.
Thanks!
--
Eric Botcazou
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-06-09 20:03 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-07 14:36 [PATCH] Remove set_sizetype Richard Guenther
2011-06-09 12:38 ` Eric Botcazou
2011-06-09 13:08 ` Richard Guenther
2011-06-09 15:56 ` Richard Guenther
2011-06-09 20:49 ` Eric Botcazou
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).