From 690cc4ebad2e274c2a3fa2720bccbc7f7c4cbdc7 Mon Sep 17 00:00:00 2001 From: "Paul N. Hilfinger" Date: Tue, 19 Aug 2008 10:10:39 +0000 Subject: [PATCH] * ada-lang.c (discrete_type_high_bound,discrete_type_low_bound): Change API to return LONGEST values rather than struct values. (ada_evaluate_subexp): Change to use new API of discrete_type_low_bound and discrete_type_high_bound. (to_fixed_range_type): Create a range type in cases where argument is base type and its limits are representable as ints. (ada_is_modular_type): Correct so that base type must be integral. * ada-lex.l (TRUEKEYWORD,FALSEKEYWORD): Make 'true' and 'false' keywords when they appear alone, since we are phasing out direct representation of these identifiers in ebugging data. * ada-exp.y: Define 'true' and 'false' as primaries. (type_boolean): New function. (type_int,type_long,type_long_long,type_floattype_double) (type_long_double): Remove uses of current_gdbarch for consistency with type_boolean. (write_int): Change comment to indicate that it might write boolean constant as well. * ada-typeprint.c (ada_print_type): Print '(false, true)' for boolean type, since will no longer be represented as enumerated type in debugging data. * ada-valprint.c (print_optional_low_bound): Handle boolean case as well. --- gdb/ChangeLog | 25 ++++++++++++++++++++++++ gdb/ada-exp.y | 29 +++++++++++++++++++++------- gdb/ada-lang.c | 46 ++++++++++++++++++++++++++++----------------- gdb/ada-lex.l | 10 ++++++++++ gdb/ada-typeprint.c | 3 +++ gdb/ada-valprint.c | 4 ++++ 6 files changed, 93 insertions(+), 24 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b201340997c..e9e8b13a7b2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,28 @@ +2008-08-19 Paul N. Hilfinger + + * ada-lang.c (discrete_type_high_bound,discrete_type_low_bound): Change + API to return LONGEST values rather than struct values. + (ada_evaluate_subexp): Change to use new API of discrete_type_low_bound + and discrete_type_high_bound. + (to_fixed_range_type): Create a range type in cases where + argument is base type and its limits are representable as ints. + (ada_is_modular_type): Correct so that base type must be integral. + * ada-lex.l (TRUEKEYWORD,FALSEKEYWORD): Make 'true' and 'false' + keywords when they appear alone, since we are phasing out + direct representation of these identifiers in ebugging data. + * ada-exp.y: Define 'true' and 'false' as primaries. + (type_boolean): New function. + (type_int,type_long,type_long_long,type_floattype_double) + (type_long_double): Remove uses of current_gdbarch for consistency + with type_boolean. + (write_int): Change comment to indicate that it might write boolean + constant as well. + * ada-typeprint.c (ada_print_type): Print '(false, true)' for boolean + type, since will no longer be represented as enumerated type in + debugging data. + * ada-valprint.c (print_optional_low_bound): Handle boolean case + as well. + 2008-08-18 Pedro Alves * bsd-uthread.c (bsd_uthread_close): New. diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y index 53107a855c3..c146baf1e2b 100644 --- a/gdb/ada-exp.y +++ b/gdb/ada-exp.y @@ -153,6 +153,8 @@ static struct type *type_long_double (void); static struct type *type_char (void); +static struct type *type_boolean (void); + static struct type *type_system_address (void); %} @@ -180,6 +182,7 @@ static struct type *type_system_address (void); %token INT NULL_PTR CHARLIT %token FLOAT +%token TRUEKEYWORD FALSEKEYWORD %token COLONCOLON %token STRING NAME DOT_ID %type block @@ -602,6 +605,12 @@ primary : STRING } ; +primary : TRUEKEYWORD + { write_int (1, type_boolean ()); } + | FALSEKEYWORD + { write_int (0, type_boolean ()); } + ; + primary : NEW NAME { error (_("NEW not implemented.")); } ; @@ -820,7 +829,7 @@ write_var_from_sym (struct block *orig_left_context, write_exp_elt_opcode (OP_VAR_VALUE); } -/* Write integer constant ARG of type TYPE. */ +/* Write integer or boolean constant ARG of type TYPE. */ static void write_int (LONGEST arg, struct type *type) @@ -1455,37 +1464,37 @@ convert_char_literal (struct type *type, LONGEST val) static struct type * type_int (void) { - return builtin_type (current_gdbarch)->builtin_int; + return builtin_type_int; } static struct type * type_long (void) { - return builtin_type (current_gdbarch)->builtin_long; + return builtin_type_long; } static struct type * type_long_long (void) { - return builtin_type (current_gdbarch)->builtin_long_long; + return builtin_type_long_long; } static struct type * type_float (void) { - return builtin_type (current_gdbarch)->builtin_float; + return builtin_type_float; } static struct type * type_double (void) { - return builtin_type (current_gdbarch)->builtin_double; + return builtin_type_double; } static struct type * type_long_double (void) { - return builtin_type (current_gdbarch)->builtin_long_double; + return builtin_type_long_double; } static struct type * @@ -1494,6 +1503,12 @@ type_char (void) return language_string_char_type (current_language, current_gdbarch); } +static struct type * +type_boolean (void) +{ + return builtin_type_bool; +} + static struct type * type_system_address (void) { diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 63f1a41c09b..a725a063d56 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -621,39 +621,40 @@ min_of_type (struct type *t) } /* The largest value in the domain of TYPE, a discrete type, as an integer. */ -static struct value * +static LONGEST discrete_type_high_bound (struct type *type) { switch (TYPE_CODE (type)) { case TYPE_CODE_RANGE: - return value_from_longest (TYPE_TARGET_TYPE (type), - TYPE_HIGH_BOUND (type)); + return TYPE_HIGH_BOUND (type); case TYPE_CODE_ENUM: - return - value_from_longest (type, - TYPE_FIELD_BITPOS (type, - TYPE_NFIELDS (type) - 1)); + return TYPE_FIELD_BITPOS (type, TYPE_NFIELDS (type) - 1); + case TYPE_CODE_BOOL: + return 1; + case TYPE_CODE_CHAR: case TYPE_CODE_INT: - return value_from_longest (type, max_of_type (type)); + return max_of_type (type); default: error (_("Unexpected type in discrete_type_high_bound.")); } } /* The largest value in the domain of TYPE, a discrete type, as an integer. */ -static struct value * +static LONGEST discrete_type_low_bound (struct type *type) { switch (TYPE_CODE (type)) { case TYPE_CODE_RANGE: - return value_from_longest (TYPE_TARGET_TYPE (type), - TYPE_LOW_BOUND (type)); + return TYPE_LOW_BOUND (type); case TYPE_CODE_ENUM: - return value_from_longest (type, TYPE_FIELD_BITPOS (type, 0)); + return TYPE_FIELD_BITPOS (type, 0); + case TYPE_CODE_BOOL: + return 0; + case TYPE_CODE_CHAR: case TYPE_CODE_INT: - return value_from_longest (type, min_of_type (type)); + return min_of_type (type); default: error (_("Unexpected type in discrete_type_low_bound.")); } @@ -8977,9 +8978,11 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, default: error (_("unexpected attribute encountered")); case OP_ATR_FIRST: - return discrete_type_low_bound (range_type); + return value_from_longest + (range_type, discrete_type_low_bound (range_type)); case OP_ATR_LAST: - return discrete_type_high_bound (range_type); + return value_from_longest + (range_type, discrete_type_high_bound (range_type)); case OP_ATR_LENGTH: error (_("the 'length attribute applies only to array types")); } @@ -9500,7 +9503,16 @@ to_fixed_range_type (char *name, struct value *dval, struct objfile *objfile) subtype_info = strstr (name, "___XD"); if (subtype_info == NULL) - return raw_type; + { + LONGEST L = discrete_type_low_bound (raw_type); + LONGEST U = discrete_type_high_bound (raw_type); + if (L < INT_MIN || U > INT_MAX) + return raw_type; + else + return create_range_type (alloc_type (objfile), raw_type, + discrete_type_low_bound (raw_type), + discrete_type_high_bound (raw_type)); + } else { static char *name_buf = NULL; @@ -9587,7 +9599,7 @@ ada_is_modular_type (struct type *type) struct type *subranged_type = base_type (type); return (subranged_type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE - && TYPE_CODE (subranged_type) != TYPE_CODE_ENUM + && TYPE_CODE (subranged_type) == TYPE_CODE_INT && TYPE_UNSIGNED (subranged_type)); } diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l index cd6de8cadcf..e4713a23d22 100644 --- a/gdb/ada-lex.l +++ b/gdb/ada-lex.l @@ -178,6 +178,16 @@ rem { return REM; } then { return THEN; } xor { return XOR; } + /* BOOLEAN "KEYWORDS" */ + + /* True and False are not keywords in Ada, but rather enumeration constants. + However, the boolean type is no longer represented as an enum, so True + and False are no longer defined in symbol tables. We compromise by + making them keywords (when bare). */ + +true { return TRUEKEYWORD; } +false { return FALSEKEYWORD; } + /* ATTRIBUTES */ {TICK}[a-zA-Z][a-zA-Z]+ { return processAttribute (yytext+1); } diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 4b1f9ffc90d..f4c3723d235 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -813,6 +813,9 @@ ada_print_type (struct type *type0, char *varstring, struct ui_file *stream, case TYPE_CODE_ARRAY: print_array_type (type, stream, show, level); break; + case TYPE_CODE_BOOL: + fprintf_filtered (stream, "(false, true)"); + break; case TYPE_CODE_INT: if (ada_is_fixed_point_type (type)) print_fixed_point_type (type, stream); diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index f09df209d0d..277ea9c4bab 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -112,6 +112,10 @@ print_optional_low_bound (struct ui_file *stream, struct type *type) switch (TYPE_CODE (index_type)) { + case TYPE_CODE_BOOL: + if (low_bound == 0) + return 0; + break; case TYPE_CODE_ENUM: if (low_bound == TYPE_FIELD_BITPOS (index_type, 0)) return 0; -- 2.30.2