Hi, currently sizetype precision (cf store-layout.c:initialize_sizetypes) is the same as size_t. This is an issue on VMS, where size_t is 'unsigned int', but we'd like to have a 64 bit sizetype for Ada. My understanding is that ISO-C doesn't require size_t precision to match the one of void *.
We can't really lie about size_t because it is exposed in API (such as writev). I don't see any reason (other than historic one) to have an exact match between sizetype and size_t. So this patch adds an hook to allow targets to define sizetype. I initially thought about using Pmode precision for sizetype precision, but there are a few machines (m32c, sh, h8300) where the precisions aren't the same. I don't know wether this is on purpose or unintentional. Manually tested on ia64 and alpha vms. Not yet regression tested on a more common machine. Comments are welcome, Tristan. 2012-03-16 Tristan Gingold <ging...@adacore.com> * target.def (sizetype_cdecl): New hook. * stor-layout.c (initialize_sizetypes): Use sizetype_cdecl hook to get sizetype name. * targhooks.c (default_sizetype_cdecl): New function. * targhooks.h (default_sizetype_cdecl): New prototype. * doc/tm.texi.in (Type Layout): Add TARGET_SIZETYPE_CDECL hook. * doc/tm.texi: Regenerate. * config/vms/vms.h (SIZE_TYPE): Always unsigned int. diff --git a/gcc/config/vms/vms.h b/gcc/config/vms/vms.h index e11b1bf..dc44441 100644 --- a/gcc/config/vms/vms.h +++ b/gcc/config/vms/vms.h @@ -58,14 +58,12 @@ extern void vms_c_register_includes (const char *, const char *, int); #define POINTER_SIZE (flag_vms_pointer_size == VMS_POINTER_SIZE_NONE ? 32 : 64) #define POINTERS_EXTEND_UNSIGNED 0 -/* FIXME: It should always be a 32 bit type. */ +/* Always 32 bits. */ #undef SIZE_TYPE -#define SIZE_TYPE (flag_vms_pointer_size == VMS_POINTER_SIZE_NONE ? \ - "unsigned int" : "long long unsigned int") -/* ???: Defined as a 'int' by dec-c, but obstack.h doesn't like it. */ +#define SIZE_TYPE "unsigned int" #undef PTRDIFF_TYPE #define PTRDIFF_TYPE (flag_vms_pointer_size == VMS_POINTER_SIZE_NONE ? \ "int" : "long long int") #define C_COMMON_OVERRIDE_OPTIONS vms_c_common_override_options () diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 69f8aba..48d7b60 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -1651,6 +1651,12 @@ for the result of subtracting two pointers. The typedef name If you don't define this macro, the default is @code{"long int"}. @end defmac +@deftypefn {Target Hook} {const char *} TARGET_SIZETYPE_CDECL (void) +This hooks should return the corresponding C declaration for the internal@code{sizetype} type, from which are also derived @code{bitsizetype} and thesigned variant. + +If you don't define it, the default is @code{SIZE_TYPE}. +@end deftypefn + @defmac WCHAR_TYPE A C expression for a string describing the name of the data type to use for wide characters. The typedef name @code{wchar_t} is defined using diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index c24cf1e..0028b76 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -1639,6 +1639,8 @@ for the result of subtracting two pointers. The typedef name If you don't define this macro, the default is @code{"long int"}. @end defmac +@hook TARGET_SIZETYPE_CDECL + @defmac WCHAR_TYPE A C expression for a string describing the name of the data type to use for wide characters. The typedef name @code{wchar_t} is defined using diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 264edd7..d77abc2 100644 diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 7c7fabc..5ed0f12 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -2383,15 +2383,16 @@ void initialize_sizetypes (void) { int precision, bprecision; + const char *sizetype_name = targetm.sizetype_cdecl (); /* Get sizetypes precision from the SIZE_TYPE target macro. */ - if (strcmp (SIZE_TYPE, "unsigned int") == 0) + if (strcmp (sizetype_name, "unsigned int") == 0) precision = INT_TYPE_SIZE; - else if (strcmp (SIZE_TYPE, "long unsigned int") == 0) + else if (strcmp (sizetype_name, "long unsigned int") == 0) precision = LONG_TYPE_SIZE; - else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0) + else if (strcmp (sizetype_name, "long long unsigned int") == 0) precision = LONG_LONG_TYPE_SIZE; - else if (strcmp (SIZE_TYPE, "short unsigned int") == 0) + else if (strcmp (sizetype_name, "short unsigned int") == 0) precision = SHORT_TYPE_SIZE; else gcc_unreachable (); diff --git a/gcc/target.def b/gcc/target.def index d658b11..bde3388 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -2674,6 +2674,19 @@ DEFHOOKPOD @code{bool} @code{true}.", unsigned char, 1) +/* The corresponding C declaration for the internal 'sizetype' type, from which + are also derived 'bitsizetype' and the signed variant. The default is + SIZE_TYPE. */ +DEFHOOK +(sizetype_cdecl, + "This hooks should return the corresponding C declaration for the internal\ +@code{sizetype} type, from which are also derived @code{bitsizetype} and the\ +signed variant.\n\ +\n\ +If you don't define it, the default is @code{SIZE_TYPE}.", + const char *, (void), + default_sizetype_cdecl) + /* Leave the boolean fields at the end. */ /* True if we can create zeroed data by switching to a BSS section diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 8e3d74e..d490384 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -1340,6 +1340,15 @@ default_get_reg_raw_mode(int regno) return reg_raw_mode[regno]; } +/* To be used by almost any targets, except when size_t precision is less than + pointers precision. */ + +const char * +default_sizetype_cdecl (void) +{ + return SIZE_TYPE; +} + /* Return true if the state of option OPTION should be stored in PCH files and checked by default_pch_valid_p. Store the option's current state in STATE if so. */ diff --git a/gcc/targhooks.h b/gcc/targhooks.h index 8618115..41f44f8 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -47,6 +47,7 @@ extern unsigned HOST_WIDE_INT default_shift_truncation_mask (enum machine_mode); extern unsigned int default_min_divisions_for_recip_mul (enum machine_mode); extern int default_mode_rep_extended (enum machine_mode, enum machine_mode); +extern const char *default_sizetype_cdecl (void); extern tree default_stack_protect_guard (void); extern tree default_external_stack_protect_fail (void);