mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 03:46:53 -05:00
C _BitInt support [PR102989]
This patch adds the C FE support, c-family support, small libcpp change so that 123wb and 42uwb suffixes are handled plus glimits.h change to define BITINT_MAXWIDTH macro. The previous patches really do nothing without this, which enables all the support. 2023-09-06 Jakub Jelinek <jakub@redhat.com> PR c/102989 gcc/ * glimits.h (BITINT_MAXWIDTH): Define if __BITINT_MAXWIDTH__ is predefined. gcc/c-family/ * c-common.cc (c_common_reswords): Add _BitInt as keyword. (unsafe_conversion_p): Handle BITINT_TYPE like INTEGER_TYPE. (c_common_signed_or_unsigned_type): Handle BITINT_TYPE. (c_common_truthvalue_conversion, c_common_get_alias_set, check_builtin_function_arguments): Handle BITINT_TYPE like INTEGER_TYPE. (sync_resolve_size): Add ORIG_FORMAT argument. If FETCH && !ORIG_FORMAT, type is BITINT_TYPE, return -1 if size isn't one of 1, 2, 4, 8 or 16 or if it is 16 but TImode is not supported. (atomic_bitint_fetch_using_cas_loop): New function. (resolve_overloaded_builtin): Adjust sync_resolve_size caller. If -1 is returned, use atomic_bitint_fetch_using_cas_loop to lower it. Formatting fix. (keyword_begins_type_specifier): Handle RID_BITINT. * c-common.h (enum rid): Add RID_BITINT enumerator. * c-cppbuiltin.cc (c_cpp_builtins): For C call targetm.c.bitint_type_info and predefine __BITINT_MAXWIDTH__ and for -fbuilding-libgcc also __LIBGCC_BITINT_LIMB_WIDTH__ and __LIBGCC_BITINT_ORDER__ macros if _BitInt is supported. * c-lex.cc (interpret_integer): Handle CPP_N_BITINT. * c-pretty-print.cc (c_pretty_printer::simple_type_specifier, c_pretty_printer::direct_abstract_declarator, c_pretty_printer::direct_declarator, c_pretty_printer::declarator): Handle BITINT_TYPE. (pp_c_integer_constant): Handle printing of large precision wide_ints which would buffer overflow digit_buffer. * c-warn.cc (conversion_warning, warnings_for_convert_and_check, warnings_for_convert_and_check): Handle BITINT_TYPE like INTEGER_TYPE. gcc/c/ * c-convert.cc (c_convert): Handle BITINT_TYPE like INTEGER_TYPE. * c-decl.cc (check_bitfield_type_and_width): Allow BITINT_TYPE bit-fields. (finish_struct): Prefer to use BITINT_TYPE for BITINT_TYPE bit-fields if possible. (declspecs_add_type): Formatting fixes. Handle cts_bitint. Adjust for added union in *specs. Handle RID_BITINT. (finish_declspecs): Handle cts_bitint. Adjust for added union in *specs. * c-parser.cc (c_keyword_starts_typename, c_token_starts_declspecs, c_parser_declspecs, c_parser_gnu_attribute_any_word): Handle RID_BITINT. (c_parser_omp_clause_schedule): Handle BITINT_TYPE like INTEGER_TYPE. * c-tree.h (enum c_typespec_keyword): Mention _BitInt in comment. Add cts_bitint enumerator. (struct c_declspecs): Move int_n_idx and floatn_nx_idx into a union and add bitint_prec there as well. * c-typeck.cc (c_common_type, comptypes_internal): Handle BITINT_TYPE. (perform_integral_promotions): Promote BITINT_TYPE bit-fields to their declared type. (build_array_ref, build_unary_op, build_conditional_expr, build_c_cast, convert_for_assignment, digest_init, build_binary_op): Handle BITINT_TYPE. * c-fold.cc (c_fully_fold_internal): Handle BITINT_TYPE like INTEGER_TYPE. * c-aux-info.cc (gen_type): Handle BITINT_TYPE. libcpp/ * expr.cc (interpret_int_suffix): Handle wb and WB suffixes. * include/cpplib.h (CPP_N_BITINT): Define.
This commit is contained in:
@@ -327,9 +327,9 @@ static unsigned int
|
||||
interpret_int_suffix (cpp_reader *pfile, const uchar *s, size_t len)
|
||||
{
|
||||
size_t orig_len = len;
|
||||
size_t u, l, i, z;
|
||||
size_t u, l, i, z, wb;
|
||||
|
||||
u = l = i = z = 0;
|
||||
u = l = i = z = wb = 0;
|
||||
|
||||
while (len--)
|
||||
switch (s[len])
|
||||
@@ -343,11 +343,23 @@ interpret_int_suffix (cpp_reader *pfile, const uchar *s, size_t len)
|
||||
if (l == 2 && s[len] != s[len + 1])
|
||||
return 0;
|
||||
break;
|
||||
case 'b':
|
||||
if (len == 0 || s[len - 1] != 'w')
|
||||
return 0;
|
||||
wb++;
|
||||
len--;
|
||||
break;
|
||||
case 'B':
|
||||
if (len == 0 || s[len - 1] != 'W')
|
||||
return 0;
|
||||
wb++;
|
||||
len--;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (l > 2 || u > 1 || i > 1 || z > 1)
|
||||
if (l > 2 || u > 1 || i > 1 || z > 1 || wb > 1)
|
||||
return 0;
|
||||
|
||||
if (z)
|
||||
@@ -358,6 +370,14 @@ interpret_int_suffix (cpp_reader *pfile, const uchar *s, size_t len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (wb)
|
||||
{
|
||||
if (CPP_OPTION (pfile, cplusplus))
|
||||
return 0;
|
||||
if (l > 0 || i > 0 || z > 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (i)
|
||||
{
|
||||
if (!CPP_OPTION (pfile, ext_numeric_literals))
|
||||
@@ -376,7 +396,8 @@ interpret_int_suffix (cpp_reader *pfile, const uchar *s, size_t len)
|
||||
| (u ? CPP_N_UNSIGNED : 0)
|
||||
| ((l == 0) ? CPP_N_SMALL
|
||||
: (l == 1) ? CPP_N_MEDIUM : CPP_N_LARGE)
|
||||
| (z ? CPP_N_SIZE_T : 0));
|
||||
| (z ? CPP_N_SIZE_T : 0)
|
||||
| (wb ? CPP_N_BITINT : 0));
|
||||
}
|
||||
|
||||
/* Return the classification flags for an int suffix. */
|
||||
|
||||
@@ -1284,6 +1284,7 @@ struct cpp_num
|
||||
|
||||
#define CPP_N_SIZE_T 0x2000000 /* C++23 size_t literal. */
|
||||
#define CPP_N_BFLOAT16 0x4000000 /* std::bfloat16_t type. */
|
||||
#define CPP_N_BITINT 0x8000000 /* C2X _BitInt literal. */
|
||||
|
||||
#define CPP_N_WIDTH_FLOATN_NX 0xF0000000 /* _FloatN / _FloatNx value
|
||||
of N, divided by 16. */
|
||||
|
||||
Reference in New Issue
Block a user