mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
gdb/fortran: fix complex type in Fortran builtin types
Before this patch things like (gdb) ptype complex*8 complex*16 (gdb) ptype complex*4 complex*8 were possible in GDB, which seems confusing for a user. The reason is a mixup in the implementation of the Fortran COMPLEX type. In Fortran the "*X" after a type would normally (I don't think this is language required) specify the type's size in memory. For the COMPLEX type the kind parameters usually (at least for GNU, Intel, Flang) specify not the size of the whole type but the size of the individual two REALs used to form the COMPLEX. Thus, a COMPLEX*4 will usually consist of two REAL*4s. Internally this type was represented by a builtin_complex_s8 - but here I think the s8 actually meant the raw size of the type. This is confusing and I renamed the types (e.g. builting_complex_s8 became builtin_complex_s4 according to its most common useage) and their printed names to their language equivalent. Additionally, I added the default COMPLEX type "COMPLEX" being the same as a COMPLEX*4 (as is normally the case) and removed the latter. I added a few tests for this new behavior as well. The new behavior is (gdb) ptype complex*8 complex*8 (gdb) ptype complex*4 complex*4
This commit is contained in:
parent
c08ec64081
commit
4e436fdabe
26
gdb/f-exp.y
26
gdb/f-exp.y
@ -171,7 +171,7 @@ static int parse_number (struct parser_state *, const char *, int,
|
||||
%token LOGICAL_S8_KEYWORD
|
||||
%token LOGICAL_KEYWORD REAL_KEYWORD REAL_S8_KEYWORD REAL_S16_KEYWORD
|
||||
%token COMPLEX_KEYWORD
|
||||
%token COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD COMPLEX_S32_KEYWORD
|
||||
%token COMPLEX_S4_KEYWORD COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD
|
||||
%token BOOL_AND BOOL_OR BOOL_NOT
|
||||
%token SINGLE DOUBLE PRECISION
|
||||
%token <lval> CHARACTER
|
||||
@ -778,21 +778,21 @@ typebase /* Implements (approximately): (type-qualifier)* type-specifier */
|
||||
| REAL_S16_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_real_s16; }
|
||||
| COMPLEX_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex_s8; }
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex; }
|
||||
| COMPLEX_S4_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex; }
|
||||
| COMPLEX_S8_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex_s8; }
|
||||
| COMPLEX_S16_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex_s16; }
|
||||
| COMPLEX_S32_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex_s32; }
|
||||
| SINGLE PRECISION
|
||||
{ $$ = parse_f_type (pstate)->builtin_real;}
|
||||
| DOUBLE PRECISION
|
||||
{ $$ = parse_f_type (pstate)->builtin_real_s8;}
|
||||
| SINGLE COMPLEX_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex_s8;}
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex;}
|
||||
| DOUBLE COMPLEX_KEYWORD
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex_s16;}
|
||||
{ $$ = parse_f_type (pstate)->builtin_complex_s8;}
|
||||
;
|
||||
|
||||
nonempty_typelist
|
||||
@ -1020,14 +1020,14 @@ convert_to_kind_type (struct type *basetype, int kind)
|
||||
if (kind == 1)
|
||||
return parse_f_type (pstate)->builtin_character;
|
||||
}
|
||||
else if (basetype == parse_f_type (pstate)->builtin_complex_s8)
|
||||
else if (basetype == parse_f_type (pstate)->builtin_complex)
|
||||
{
|
||||
if (kind == 4)
|
||||
return parse_f_type (pstate)->builtin_complex_s8;
|
||||
return parse_f_type (pstate)->builtin_complex;
|
||||
else if (kind == 8)
|
||||
return parse_f_type (pstate)->builtin_complex_s16;
|
||||
return parse_f_type (pstate)->builtin_complex_s8;
|
||||
else if (kind == 16)
|
||||
return parse_f_type (pstate)->builtin_complex_s32;
|
||||
return parse_f_type (pstate)->builtin_complex_s16;
|
||||
}
|
||||
else if (basetype == parse_f_type (pstate)->builtin_real)
|
||||
{
|
||||
@ -1130,18 +1130,18 @@ static const struct f77_boolean_val boolean_values[] =
|
||||
static const struct token f77_keywords[] =
|
||||
{
|
||||
/* Historically these have always been lowercase only in GDB. */
|
||||
{ "complex", COMPLEX_KEYWORD, OP_NULL, true },
|
||||
{ "complex_4", COMPLEX_S4_KEYWORD, OP_NULL, true },
|
||||
{ "complex_8", COMPLEX_S8_KEYWORD, OP_NULL, true },
|
||||
{ "complex_16", COMPLEX_S16_KEYWORD, OP_NULL, true },
|
||||
{ "complex_32", COMPLEX_S32_KEYWORD, OP_NULL, true },
|
||||
{ "character", CHARACTER, OP_NULL, true },
|
||||
{ "integer_2", INT_S2_KEYWORD, OP_NULL, true },
|
||||
{ "logical_1", LOGICAL_S1_KEYWORD, OP_NULL, true },
|
||||
{ "logical_2", LOGICAL_S2_KEYWORD, OP_NULL, true },
|
||||
{ "logical_8", LOGICAL_S8_KEYWORD, OP_NULL, true },
|
||||
{ "complex_8", COMPLEX_S8_KEYWORD, OP_NULL, true },
|
||||
{ "integer", INT_KEYWORD, OP_NULL, true },
|
||||
{ "logical", LOGICAL_KEYWORD, OP_NULL, true },
|
||||
{ "real_16", REAL_S16_KEYWORD, OP_NULL, true },
|
||||
{ "complex", COMPLEX_KEYWORD, OP_NULL, true },
|
||||
{ "sizeof", SIZEOF, OP_NULL, true },
|
||||
{ "real_8", REAL_S8_KEYWORD, OP_NULL, true },
|
||||
{ "real", REAL_KEYWORD, OP_NULL, true },
|
||||
|
16
gdb/f-lang.c
16
gdb/f-lang.c
@ -1565,8 +1565,8 @@ f_language::language_arch_info (struct gdbarch *gdbarch,
|
||||
add (builtin->builtin_real);
|
||||
add (builtin->builtin_real_s8);
|
||||
add (builtin->builtin_real_s16);
|
||||
add (builtin->builtin_complex);
|
||||
add (builtin->builtin_complex_s8);
|
||||
add (builtin->builtin_complex_s16);
|
||||
add (builtin->builtin_void);
|
||||
|
||||
lai->set_string_char_type (builtin->builtin_character);
|
||||
@ -1665,17 +1665,17 @@ build_fortran_types (struct gdbarch *gdbarch)
|
||||
builtin_f_type->builtin_real_s16
|
||||
= arch_type (gdbarch, TYPE_CODE_ERROR, 128, "real*16");
|
||||
|
||||
builtin_f_type->builtin_complex
|
||||
= init_complex_type ("complex*4", builtin_f_type->builtin_real);
|
||||
builtin_f_type->builtin_complex_s8
|
||||
= init_complex_type ("complex*8", builtin_f_type->builtin_real);
|
||||
builtin_f_type->builtin_complex_s16
|
||||
= init_complex_type ("complex*16", builtin_f_type->builtin_real_s8);
|
||||
= init_complex_type ("complex*8", builtin_f_type->builtin_real_s8);
|
||||
|
||||
if (builtin_f_type->builtin_real_s16->code () == TYPE_CODE_ERROR)
|
||||
builtin_f_type->builtin_complex_s32
|
||||
= arch_type (gdbarch, TYPE_CODE_ERROR, 256, "complex*32");
|
||||
builtin_f_type->builtin_complex_s16
|
||||
= arch_type (gdbarch, TYPE_CODE_ERROR, 256, "complex*16");
|
||||
else
|
||||
builtin_f_type->builtin_complex_s32
|
||||
= init_complex_type ("complex*32", builtin_f_type->builtin_real_s16);
|
||||
builtin_f_type->builtin_complex_s16
|
||||
= init_complex_type ("complex*16", builtin_f_type->builtin_real_s16);
|
||||
|
||||
return builtin_f_type;
|
||||
}
|
||||
|
@ -329,9 +329,9 @@ struct builtin_f_type
|
||||
struct type *builtin_real;
|
||||
struct type *builtin_real_s8;
|
||||
struct type *builtin_real_s16;
|
||||
struct type *builtin_complex;
|
||||
struct type *builtin_complex_s8;
|
||||
struct type *builtin_complex_s16;
|
||||
struct type *builtin_complex_s32;
|
||||
struct type *builtin_void;
|
||||
};
|
||||
|
||||
|
@ -76,7 +76,7 @@ proc test_float_literal_types_accepted {} {
|
||||
proc test_primitive_types_known {} {
|
||||
foreach type {void character logical*1 integer*1 integer*2 integer*8 \
|
||||
logical*2 logical*8 integer logical*4 real \
|
||||
real*8 real*16} {
|
||||
real*8 real*16 complex*4 complex*8 complex*16} {
|
||||
gdb_test "ptype $type" [string_to_regexp "type = $type"]
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user