projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
gdb/fortran: Handle dynamic string types when printing types
[deliverable/binutils-gdb.git]
/
gdb
/
f-typeprint.c
diff --git
a/gdb/f-typeprint.c
b/gdb/f-typeprint.c
index 027bcdde0f91254dc577afe25b082c69a502e20c..65ec93af9f419c03674bc6aa6e9bf4057934d656 100644
(file)
--- a/
gdb/f-typeprint.c
+++ b/
gdb/f-typeprint.c
@@
-1,6
+1,6
@@
/* Support for printing Fortran types for GDB, the GNU debugger.
/* Support for printing Fortran types for GDB, the GNU debugger.
- Copyright (C) 1986-20
19
Free Software Foundation, Inc.
+ Copyright (C) 1986-20
20
Free Software Foundation, Inc.
Contributed by Motorola. Adapted from the C version by Farooq Butt
(fmbutt@engage.sps.mot.com).
Contributed by Motorola. Adapted from the C version by Farooq Butt
(fmbutt@engage.sps.mot.com).
@@
-65,21
+65,21
@@
f_print_type (struct type *type, const char *varstring, struct ui_file *stream,
enum type_code code;
f_type_print_base (type, stream, show, level);
enum type_code code;
f_type_print_base (type, stream, show, level);
- code =
TYPE_CODE (type
);
+ code =
type->code (
);
if ((varstring != NULL && *varstring != '\0')
/* Need a space if going to print stars or brackets; but not if we
will print just a type name. */
|| ((show > 0
if ((varstring != NULL && *varstring != '\0')
/* Need a space if going to print stars or brackets; but not if we
will print just a type name. */
|| ((show > 0
- ||
TYPE_NAME (type
) == 0)
+ ||
type->name (
) == 0)
&& (code == TYPE_CODE_FUNC
|| code == TYPE_CODE_METHOD
|| code == TYPE_CODE_ARRAY
|| ((code == TYPE_CODE_PTR
|| code == TYPE_CODE_REF)
&& (code == TYPE_CODE_FUNC
|| code == TYPE_CODE_METHOD
|| code == TYPE_CODE_ARRAY
|| ((code == TYPE_CODE_PTR
|| code == TYPE_CODE_REF)
- && (TYPE_
CODE (TYPE_TARGET_TYPE (type)
) == TYPE_CODE_FUNC
- || (TYPE_
CODE (TYPE_TARGET_TYPE (type)
)
+ && (TYPE_
TARGET_TYPE (type)->code (
) == TYPE_CODE_FUNC
+ || (TYPE_
TARGET_TYPE (type)->code (
)
== TYPE_CODE_METHOD)
== TYPE_CODE_METHOD)
- || (TYPE_
CODE (TYPE_TARGET_TYPE (type)
)
+ || (TYPE_
TARGET_TYPE (type)->code (
)
== TYPE_CODE_ARRAY))))))
fputs_filtered (" ", stream);
f_type_print_varspec_prefix (type, stream, show, 0);
== TYPE_CODE_ARRAY))))))
fputs_filtered (" ", stream);
f_type_print_varspec_prefix (type, stream, show, 0);
@@
-114,12
+114,12
@@
f_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
if (type == 0)
return;
if (type == 0)
return;
- if (
TYPE_NAME (type
) && show <= 0)
+ if (
type->name (
) && show <= 0)
return;
QUIT;
return;
QUIT;
- switch (
TYPE_CODE (type
))
+ switch (
type->code (
))
{
case TYPE_CODE_PTR:
f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
{
case TYPE_CODE_PTR:
f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
@@
-178,12
+178,12
@@
f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
if (type == 0)
return;
if (type == 0)
return;
- if (
TYPE_NAME (type
) && show <= 0)
+ if (
type->name (
) && show <= 0)
return;
QUIT;
return;
QUIT;
- switch (
TYPE_CODE (type
))
+ switch (
type->code (
))
{
case TYPE_CODE_ARRAY:
arrayprint_recurse_level++;
{
case TYPE_CODE_ARRAY:
arrayprint_recurse_level++;
@@
-207,7
+207,7
@@
f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
print_rank_only = true;
}
print_rank_only = true;
}
- if (TYPE_
CODE (TYPE_TARGET_TYPE (type)
) == TYPE_CODE_ARRAY)
+ if (TYPE_
TARGET_TYPE (type)->code (
) == TYPE_CODE_ARRAY)
f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
0, 0, arrayprint_recurse_level,
print_rank_only);
f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
0, 0, arrayprint_recurse_level,
print_rank_only);
@@
-223,7
+223,7
@@
f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
/* Make sure that, if we have an assumed size array, we
print out a warning and print the upperbound as '*'. */
/* Make sure that, if we have an assumed size array, we
print out a warning and print the upperbound as '*'. */
- if (
TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)
)
+ if (
type->bounds ()->high.kind () == PROP_UNDEFINED
)
fprintf_filtered (stream, "*");
else
{
fprintf_filtered (stream, "*");
else
{
@@
-233,7
+233,7
@@
f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
}
}
}
}
- if (TYPE_
CODE (TYPE_TARGET_TYPE (type)
) != TYPE_CODE_ARRAY)
+ if (TYPE_
TARGET_TYPE (type)->code (
) != TYPE_CODE_ARRAY)
f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
0, 0, arrayprint_recurse_level,
print_rank_only);
f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
0, 0, arrayprint_recurse_level,
print_rank_only);
@@
-254,7
+254,7
@@
f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
case TYPE_CODE_FUNC:
{
case TYPE_CODE_FUNC:
{
- int i, nfields =
TYPE_NFIELDS (type
);
+ int i, nfields =
type->num_fields (
);
f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
passed_a_ptr, 0,
f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
passed_a_ptr, 0,
@@
-273,7
+273,7
@@
f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
fputs_filtered (", ", stream);
wrap_here (" ");
}
fputs_filtered (", ", stream);
wrap_here (" ");
}
- f_print_type (
TYPE_FIELD_TYPE (type, i
), "", stream, -1, 0, 0);
+ f_print_type (
type->field (i).type (
), "", stream, -1, 0, 0);
}
fprintf_filtered (stream, ")");
}
}
fprintf_filtered (stream, ")");
}
@@
-332,21
+332,21
@@
f_type_print_base (struct type *type, struct ui_file *stream, int show,
/* When SHOW is zero or less, and there is a valid type name, then always
just print the type name directly from the type. */
/* When SHOW is zero or less, and there is a valid type name, then always
just print the type name directly from the type. */
- if ((show <= 0) && (
TYPE_NAME (type
) != NULL))
+ if ((show <= 0) && (
type->name (
) != NULL))
{
const char *prefix = "";
{
const char *prefix = "";
- if (
TYPE_CODE (type
) == TYPE_CODE_UNION)
+ if (
type->code (
) == TYPE_CODE_UNION)
prefix = "Type, C_Union :: ";
prefix = "Type, C_Union :: ";
- else if (
TYPE_CODE (type
) == TYPE_CODE_STRUCT)
+ else if (
type->code (
) == TYPE_CODE_STRUCT)
prefix = "Type ";
prefix = "Type ";
- fprintfi_filtered (level, stream, "%s%s", prefix,
TYPE_NAME (type
));
+ fprintfi_filtered (level, stream, "%s%s", prefix,
type->name (
));
return;
}
return;
}
- if (
TYPE_CODE (type
) != TYPE_CODE_TYPEDEF)
+ if (
type->code (
) != TYPE_CODE_TYPEDEF)
type = check_typedef (type);
type = check_typedef (type);
- switch (
TYPE_CODE (type
))
+ switch (
type->code (
))
{
case TYPE_CODE_TYPEDEF:
f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
{
case TYPE_CODE_TYPEDEF:
f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
@@
-376,7
+376,7
@@
f_type_print_base (struct type *type, struct ui_file *stream, int show,
{
gdbarch *gdbarch = get_type_arch (type);
struct type *void_type = builtin_f_type (gdbarch)->builtin_void;
{
gdbarch *gdbarch = get_type_arch (type);
struct type *void_type = builtin_f_type (gdbarch)->builtin_void;
- fprintfi_filtered (level, stream, "%s",
TYPE_NAME (void_type
));
+ fprintfi_filtered (level, stream, "%s",
void_type->name (
));
}
break;
}
break;
@@
-399,54
+399,59
@@
f_type_print_base (struct type *type, struct ui_file *stream, int show,
through as TYPE_CODE_INT since dbxstclass.h is so
C-oriented, we must change these to "character" from "char". */
through as TYPE_CODE_INT since dbxstclass.h is so
C-oriented, we must change these to "character" from "char". */
- if (strcmp (
TYPE_NAME (type
), "char") == 0)
+ if (strcmp (
type->name (
), "char") == 0)
fprintfi_filtered (level, stream, "character");
else
goto default_case;
break;
case TYPE_CODE_STRING:
fprintfi_filtered (level, stream, "character");
else
goto default_case;
break;
case TYPE_CODE_STRING:
- /* Strings may have dynamic upperbounds (lengths) like arrays. */
+ /* Strings may have dynamic upperbounds (lengths) like arrays. We
+ check specifically for the PROP_CONST case to indicate that the
+ dynamic type has been resolved. If we arrive here having been
+ asked to print the type of a value with a dynamic type then the
+ bounds will not have been resolved. */
- if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
- fprintfi_filtered (level, stream, "character*(*)");
- else
+ if (type->bounds ()->high.kind () == PROP_CONST)
{
LONGEST upper_bound = f77_get_upperbound (type);
fprintf_filtered (stream, "character*%s", pulongest (upper_bound));
}
{
LONGEST upper_bound = f77_get_upperbound (type);
fprintf_filtered (stream, "character*%s", pulongest (upper_bound));
}
+ else
+ fprintfi_filtered (level, stream, "character*(*)");
break;
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
break;
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
- if (
TYPE_CODE (type
) == TYPE_CODE_UNION)
+ if (
type->code (
) == TYPE_CODE_UNION)
fprintfi_filtered (level, stream, "Type, C_Union :: ");
else
fprintfi_filtered (level, stream, "Type ");
fprintfi_filtered (level, stream, "Type, C_Union :: ");
else
fprintfi_filtered (level, stream, "Type ");
- fputs_filtered (
TYPE_NAME (type
), stream);
+ fputs_filtered (
type->name (
), stream);
/* According to the definition,
we only print structure elements in case show > 0. */
if (show > 0)
{
fputs_filtered ("\n", stream);
/* According to the definition,
we only print structure elements in case show > 0. */
if (show > 0)
{
fputs_filtered ("\n", stream);
- for (index = 0; index <
TYPE_NFIELDS (type
); index++)
+ for (index = 0; index <
type->num_fields (
); index++)
{
{
- f_type_print_base (
TYPE_FIELD_TYPE (type, index
), stream,
+ f_type_print_base (
type->field (index).type (
), stream,
show - 1, level + 4);
fputs_filtered (" :: ", stream);
show - 1, level + 4);
fputs_filtered (" :: ", stream);
- fputs_filtered (TYPE_FIELD_NAME (type, index), stream);
- f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index),
+ fputs_styled (TYPE_FIELD_NAME (type, index),
+ variable_name_style.style (), stream);
+ f_type_print_varspec_suffix (type->field (index).type (),
stream, show - 1, 0, 0, 0, false);
fputs_filtered ("\n", stream);
}
fprintfi_filtered (level, stream, "End Type ");
stream, show - 1, 0, 0, 0, false);
fputs_filtered ("\n", stream);
}
fprintfi_filtered (level, stream, "End Type ");
- fputs_filtered (
TYPE_NAME (type
), stream);
+ fputs_filtered (
type->name (
), stream);
}
break;
case TYPE_CODE_MODULE:
}
break;
case TYPE_CODE_MODULE:
- fprintfi_filtered (level, stream, "module %s",
TYPE_NAME (type
));
+ fprintfi_filtered (level, stream, "module %s",
type->name (
));
break;
default_case:
break;
default_case:
@@
-455,10
+460,10
@@
f_type_print_base (struct type *type, struct ui_file *stream, int show,
such as fundamental types. For these, just print whatever
the type name is, as recorded in the type itself. If there
is no type name, then complain. */
such as fundamental types. For these, just print whatever
the type name is, as recorded in the type itself. If there
is no type name, then complain. */
- if (
TYPE_NAME (type
) != NULL)
- fprintfi_filtered (level, stream, "%s",
TYPE_NAME (type
));
+ if (
type->name (
) != NULL)
+ fprintfi_filtered (level, stream, "%s",
type->name (
));
else
else
- error (_("Invalid type code (%d) in symbol table."),
TYPE_CODE (type
));
+ error (_("Invalid type code (%d) in symbol table."),
type->code (
));
break;
}
break;
}
This page took
0.03445 seconds
and
4
git commands to generate.