* 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.
This commit is contained in:
Paul N. Hilfinger 2008-08-19 10:10:39 +00:00
parent f6a4a0ab9e
commit 690cc4ebad
6 changed files with 93 additions and 24 deletions

View File

@ -1,3 +1,28 @@
2008-08-19 Paul N. Hilfinger <hilfinger@adacore.com>
* 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 <pedro@codesourcery.com>
* bsd-uthread.c (bsd_uthread_close): New.

View File

@ -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 <typed_val> INT NULL_PTR CHARLIT
%token <typed_val_float> FLOAT
%token TRUEKEYWORD FALSEKEYWORD
%token COLONCOLON
%token <sval> STRING NAME DOT_ID
%type <bval> 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)
{

View File

@ -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));
}

View File

@ -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); }

View File

@ -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);

View File

@ -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;