From d760ae22b964995234e14e090ba179311382b90d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 27 Mar 2023 13:05:03 -0600 Subject: Add 128-bit integer support to the Rust parser This adds support for 128-bit integers to the Rust parser. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=21185 --- gdb/rust-parse.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'gdb/rust-parse.c') diff --git a/gdb/rust-parse.c b/gdb/rust-parse.c index eca98aa..6c7922d 100644 --- a/gdb/rust-parse.c +++ b/gdb/rust-parse.c @@ -69,7 +69,7 @@ static const char number_regex_text[] = #define INT_TEXT 5 #define INT_TYPE 6 "(0x[a-fA-F0-9_]+|0o[0-7_]+|0b[01_]+|[0-9][0-9_]*)" - "([iu](size|8|16|32|64))?" + "([iu](size|8|16|32|64|128))?" ")"; /* The number of subexpressions to allocate space for, including the "0th" whole match subexpression. */ @@ -126,7 +126,7 @@ enum token_type : int struct typed_val_int { - ULONGEST val; + gdb_mpz val; struct type *type; }; @@ -1007,7 +1007,6 @@ rust_parser::lex_number () /* Parse the number. */ if (is_integer) { - uint64_t value; int radix = 10; int offset = 0; @@ -1026,14 +1025,22 @@ rust_parser::lex_number () } } - const char *trailer; - value = strtoulst (number.c_str () + offset, &trailer, radix); - if (*trailer != '\0') - error (_("Integer literal is too large")); - if (implicit_i32 && value >= ((uint64_t) 1) << 31) - type = get_type ("i64"); + if (!current_int_val.val.set (number.c_str () + offset, radix)) + { + /* Shouldn't be possible. */ + error (_("Invalid integer")); + } + if (implicit_i32) + { + static gdb_mpz sixty_three_bit = gdb_mpz::pow (2, 63); + static gdb_mpz thirty_one_bit = gdb_mpz::pow (2, 31); + + if (current_int_val.val >= sixty_three_bit) + type = get_type ("i128"); + else if (current_int_val.val >= thirty_one_bit) + type = get_type ("i64"); + } - current_int_val.val = value; current_int_val.type = type; } else @@ -1556,9 +1563,11 @@ rust_parser::parse_field (operation_up &&lhs) break; case DECIMAL_INTEGER: - result = make_operation (current_int_val.val, - std::move (lhs)); - lex (); + { + int idx = current_int_val.val.as_integer (); + result = make_operation (idx, std::move (lhs)); + lex (); + } break; case INTEGER: @@ -1659,7 +1668,7 @@ rust_parser::parse_array_type () if (current_token != INTEGER && current_token != DECIMAL_INTEGER) error (_("integer expected")); - ULONGEST val = current_int_val.val; + ULONGEST val = current_int_val.val.as_integer (); lex (); require (']'); -- cgit v1.1