X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fp-typeprint.c;h=70a8308b047e2ef51cc06b808b033cb7310a6254;hb=53dff92cb56fb21dc81c183aa35a5a3ae8c06e32;hp=239869171f5a56124a0ae6031874144c44287f93;hpb=32d0add0a654c1204ab71dc8a55d9374538c4b33;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/p-typeprint.c b/gdb/p-typeprint.c index 239869171f..70a8308b04 100644 --- a/gdb/p-typeprint.c +++ b/gdb/p-typeprint.c @@ -1,5 +1,5 @@ /* Support for printing Pascal types for GDB, the GNU debugger. - Copyright (C) 2000-2015 Free Software Foundation, Inc. + Copyright (C) 2000-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -32,6 +32,7 @@ #include "typeprint.h" #include "gdb-demangle.h" #include +#include "cli/cli-style.h" static void pascal_type_print_varspec_suffix (struct type *, struct ui_file *, int, int, int, @@ -52,10 +53,10 @@ pascal_print_type (struct type *type, const char *varstring, enum type_code code; int demangled_args; - code = TYPE_CODE (type); + code = type->code (); if (show > 0) - CHECK_TYPEDEF (type); + type = check_typedef (type); if ((code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD)) @@ -96,11 +97,11 @@ void pascal_print_typedef (struct type *type, struct symbol *new_symbol, struct ui_file *stream) { - CHECK_TYPEDEF (type); + type = check_typedef (type); fprintf_filtered (stream, "type "); - fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new_symbol)); + fprintf_filtered (stream, "%s = ", new_symbol->print_name ()); type_print (type, "", stream, 0); - fprintf_filtered (stream, ";\n"); + fprintf_filtered (stream, ";"); } /* If TYPE is a derived type, then print out derivation information. @@ -139,7 +140,7 @@ pascal_type_print_derivation_info (struct ui_file *stream, struct type *type) fprintf_filtered (stream, "%s%s ", BASETYPE_VIA_PUBLIC (type, i) ? "public" : "private", BASETYPE_VIA_VIRTUAL (type, i) ? " virtual" : ""); - name = type_name_no_tag (TYPE_BASECLASS (type, i)); + name = TYPE_BASECLASS (type, i)->name (); fprintf_filtered (stream, "%s", name ? name : "(null)"); } if (i > 0) @@ -154,8 +155,8 @@ void pascal_type_print_method_args (const char *physname, const char *methodname, struct ui_file *stream) { - int is_constructor = (strncmp (physname, "__ct__", 6) == 0); - int is_destructor = (strncmp (physname, "__dt__", 6) == 0); + int is_constructor = (startswith (physname, "__ct__")); + int is_destructor = (startswith (physname, "__dt__")); if (is_constructor || is_destructor) { @@ -210,12 +211,12 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, if (type == 0) return; - if (TYPE_NAME (type) && show <= 0) + if (type->name () && show <= 0) return; QUIT; - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_PTR: fprintf_filtered (stream, "^"); @@ -227,7 +228,8 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, case TYPE_CODE_METHOD: if (passed_a_ptr) fprintf_filtered (stream, "("); - if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) + if (TYPE_TARGET_TYPE (type) != NULL + && TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID) { fprintf_filtered (stream, "function "); } @@ -239,7 +241,7 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, if (passed_a_ptr) { fprintf_filtered (stream, " "); - pascal_type_print_base (TYPE_DOMAIN_TYPE (type), + pascal_type_print_base (TYPE_SELF_TYPE (type), stream, 0, passed_a_ptr, flags); fprintf_filtered (stream, "::"); } @@ -255,7 +257,8 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, if (passed_a_ptr) fprintf_filtered (stream, "("); - if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) + if (TYPE_TARGET_TYPE (type) != NULL + && TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID) { fprintf_filtered (stream, "function "); } @@ -306,7 +309,7 @@ static void pascal_print_func_args (struct type *type, struct ui_file *stream, const struct type_print_options *flags) { - int i, len = TYPE_NFIELDS (type); + int i, len = type->num_fields (); if (len) { @@ -334,6 +337,33 @@ pascal_print_func_args (struct type *type, struct ui_file *stream, } } +/* Helper for pascal_type_print_varspec_suffix to print the suffix of + a function or method. */ + +static void +pascal_type_print_func_varspec_suffix (struct type *type, struct ui_file *stream, + int show, int passed_a_ptr, + int demangled_args, + const struct type_print_options *flags) +{ + if (TYPE_TARGET_TYPE (type) == NULL + || TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID) + { + fprintf_filtered (stream, " : "); + pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), + stream, 0, 0, flags); + + if (TYPE_TARGET_TYPE (type) == NULL) + type_print_unknown_return_type (stream); + else + pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0, + flags); + + pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + passed_a_ptr, 0, flags); + } +} + /* Print any array sizes, function arguments or close parentheses needed after the variable name (to describe its type). Args work like pascal_type_print_varspec_prefix. */ @@ -347,12 +377,12 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, if (type == 0) return; - if (TYPE_NAME (type) && show <= 0) + if (type->name () && show <= 0) return; QUIT; - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_ARRAY: if (passed_a_ptr) @@ -365,16 +395,8 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, pascal_type_print_method_args ("", "", stream); - if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) - { - fprintf_filtered (stream, " : "); - pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), - stream, 0, 0, flags); - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0, - flags); - pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, - passed_a_ptr, 0, flags); - } + pascal_type_print_func_varspec_suffix (type, stream, show, + passed_a_ptr, 0, flags); break; case TYPE_CODE_PTR: @@ -388,16 +410,8 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, fprintf_filtered (stream, ")"); if (!demangled_args) pascal_print_func_args (type, stream, flags); - if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) - { - fprintf_filtered (stream, " : "); - pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), - stream, 0, 0, flags); - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0, - flags); - pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, - passed_a_ptr, 0, flags); - } + pascal_type_print_func_varspec_suffix (type, stream, show, + passed_a_ptr, 0, flags); break; case TYPE_CODE_UNDEF: @@ -457,15 +471,15 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, wrap_here (" "); if (type == NULL) { - fputs_filtered ("", stream); + fputs_styled ("", metadata_style.style (), stream); return; } /* void pointer */ - if ((TYPE_CODE (type) == TYPE_CODE_PTR) - && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)) + if ((type->code () == TYPE_CODE_PTR) + && (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_VOID)) { - fputs_filtered (TYPE_NAME (type) ? TYPE_NAME (type) : "pointer", + fputs_filtered (type->name () ? type->name () : "pointer", stream); return; } @@ -473,15 +487,15 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, just print the type name directly from the type. */ if (show <= 0 - && TYPE_NAME (type) != NULL) + && type->name () != NULL) { - fputs_filtered (TYPE_NAME (type), stream); + fputs_filtered (type->name (), stream); return; } - CHECK_TYPEDEF (type); + type = check_typedef (type); - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_TYPEDEF: case TYPE_CODE_PTR: @@ -509,9 +523,9 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, only after args !! */ break; case TYPE_CODE_STRUCT: - if (TYPE_TAG_NAME (type) != NULL) + if (type->name () != NULL) { - fputs_filtered (TYPE_TAG_NAME (type), stream); + fputs_filtered (type->name (), stream); fputs_filtered (" = ", stream); } if (HAVE_CPLUS_STRUCT (type)) @@ -525,9 +539,9 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, goto struct_union; case TYPE_CODE_UNION: - if (TYPE_TAG_NAME (type) != NULL) + if (type->name () != NULL) { - fputs_filtered (TYPE_TAG_NAME (type), stream); + fputs_filtered (type->name (), stream); fputs_filtered (" = ", stream); } fprintf_filtered (stream, "case of "); @@ -537,15 +551,15 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, if (show < 0) { /* If we just printed a tag name, no need to print anything else. */ - if (TYPE_TAG_NAME (type) == NULL) + if (type->name () == NULL) fprintf_filtered (stream, "{...}"); } - else if (show > 0 || TYPE_TAG_NAME (type) == NULL) + else if (show > 0 || type->name () == NULL) { pascal_type_print_derivation_info (stream, type); fprintf_filtered (stream, "\n"); - if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0)) + if ((type->num_fields () == 0) && (TYPE_NFN_FIELDS (type) == 0)) { if (TYPE_STUB (type)) fprintfi_filtered (level + 4, stream, "\n"); @@ -562,12 +576,12 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, /* If there is a base class for this type, do not print the field that it occupies. */ - len = TYPE_NFIELDS (type); + len = type->num_fields (); for (i = TYPE_N_BASECLASSES (type); i < len; i++) { QUIT; /* Don't print out virtual function table. */ - if ((strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0) + if ((startswith (TYPE_FIELD_NAME (type, i), "_vptr")) && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5])) continue; @@ -604,12 +618,12 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, } print_spaces_filtered (level + 4, stream); - if (field_is_static (&TYPE_FIELD (type, i))) + if (field_is_static (&type->field (i))) fprintf_filtered (stream, "static "); pascal_print_type (TYPE_FIELD_TYPE (type, i), TYPE_FIELD_NAME (type, i), stream, show - 1, level + 4, flags); - if (!field_is_static (&TYPE_FIELD (type, i)) + if (!field_is_static (&type->field (i)) && TYPE_FIELD_PACKED (type, i)) { /* It is a bitfield. This code does not attempt @@ -643,8 +657,8 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, { const char *physname = TYPE_FN_FIELD_PHYSNAME (f, j); - int is_constructor = (strncmp (physname, "__ct__", 6) == 0); - int is_destructor = (strncmp (physname, "__dt__", 6) == 0); + int is_constructor = (startswith (physname, "__ct__")); + int is_destructor = (startswith (physname, "__dt__")); QUIT; if (TYPE_FN_FIELD_PROTECTED (f, j)) @@ -693,8 +707,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, fprintf_filtered (stream, "destructor "); } else if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0 - && TYPE_CODE (TYPE_TARGET_TYPE ( - TYPE_FN_FIELD_TYPE (f, j))) != TYPE_CODE_VOID) + && TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID) { fprintf_filtered (stream, "function "); } @@ -709,8 +722,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, stream); if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0 - && TYPE_CODE (TYPE_TARGET_TYPE ( - TYPE_FN_FIELD_TYPE (f, j))) != TYPE_CODE_VOID) + && TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID) { fputs_filtered (" : ", stream); type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)), @@ -727,9 +739,9 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, break; case TYPE_CODE_ENUM: - if (TYPE_TAG_NAME (type) != NULL) + if (type->name () != NULL) { - fputs_filtered (TYPE_TAG_NAME (type), stream); + fputs_filtered (type->name (), stream); if (show > 0) fputs_filtered (" ", stream); } @@ -740,13 +752,13 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, if (show < 0) { /* If we just printed a tag name, no need to print anything else. */ - if (TYPE_TAG_NAME (type) == NULL) + if (type->name () == NULL) fprintf_filtered (stream, "(...)"); } - else if (show > 0 || TYPE_TAG_NAME (type) == NULL) + else if (show > 0 || type->name () == NULL) { fprintf_filtered (stream, "("); - len = TYPE_NFIELDS (type); + len = type->num_fields (); lastval = 0; for (i = 0; i < len; i++) { @@ -806,16 +818,17 @@ pascal_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. */ - if (TYPE_NAME (type) != NULL) + if (type->name () != NULL) { - fputs_filtered (TYPE_NAME (type), stream); + fputs_filtered (type->name (), stream); } else { /* At least for dump_symtab, it is important that this not be an error (). */ - fprintf_filtered (stream, "", - TYPE_CODE (type)); + fprintf_styled (stream, metadata_style.style (), + "", + type->code ()); } break; }