X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fp-typeprint.c;h=f501aad549b97b7a206e24cf426e8e14556d47ac;hb=deeafabb678e59d8585be6d765c7fbd0e7060b6c;hp=54a761d464a0bb1bf6443f7de477802d483e4e4b;hpb=0df8b4180acb4890d058c92753dafcd4ff0a87d1;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/p-typeprint.c b/gdb/p-typeprint.c index 54a761d464..f501aad549 100644 --- a/gdb/p-typeprint.c +++ b/gdb/p-typeprint.c @@ -1,6 +1,5 @@ /* Support for printing Pascal types for GDB, the GNU debugger. - Copyright (C) 2000, 2001, 2002, 2006, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 2000-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -31,26 +30,25 @@ #include "language.h" #include "p-lang.h" #include "typeprint.h" - -#include "gdb_string.h" -#include +#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); + int, int, int, + const struct type_print_options *); static void pascal_type_print_derivation_info (struct ui_file *, struct type *); -void pascal_type_print_varspec_prefix (struct type *, struct ui_file *, - int, int); /* LEVEL is the depth to indent lines by. */ void pascal_print_type (struct type *type, const char *varstring, - struct ui_file *stream, int show, int level) + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) { enum type_code code; int demangled_args; @@ -58,12 +56,12 @@ pascal_print_type (struct type *type, const char *varstring, code = TYPE_CODE (type); if (show > 0) - CHECK_TYPEDEF (type); + type = check_typedef (type); if ((code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD)) { - pascal_type_print_varspec_prefix (type, stream, show, 0); + pascal_type_print_varspec_prefix (type, stream, show, 0, flags); } /* first the name */ fputs_filtered (varstring, stream); @@ -78,15 +76,16 @@ pascal_print_type (struct type *type, const char *varstring, if (!(code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD)) { - pascal_type_print_varspec_prefix (type, stream, show, 0); + pascal_type_print_varspec_prefix (type, stream, show, 0, flags); } - pascal_type_print_base (type, stream, show, level); + pascal_type_print_base (type, stream, show, level, flags); /* For demangled function names, we have the arglist as part of the name, so don't print an additional pair of ()'s. */ demangled_args = varstring ? strchr (varstring, '(') != NULL : 0; - pascal_type_print_varspec_suffix (type, stream, show, 0, demangled_args); + pascal_type_print_varspec_suffix (type, stream, show, 0, demangled_args, + flags); } @@ -98,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. @@ -132,7 +131,7 @@ pascal_print_typedef (struct type *type, struct symbol *new_symbol, static void pascal_type_print_derivation_info (struct ui_file *stream, struct type *type) { - char *name; + const char *name; int i; for (i = 0; i < TYPE_N_BASECLASSES (type); i++) @@ -141,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_NAME (TYPE_BASECLASS (type, i)); fprintf_filtered (stream, "%s", name ? name : "(null)"); } if (i > 0) @@ -153,11 +152,11 @@ pascal_type_print_derivation_info (struct ui_file *stream, struct type *type) /* Print the Pascal method arguments ARGS to the file STREAM. */ void -pascal_type_print_method_args (char *physname, char *methodname, +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) { @@ -173,8 +172,7 @@ pascal_type_print_method_args (char *physname, char *methodname, while (isdigit (physname[0])) { int len = 0; - int i; - char storec; + int i, j; char *argname; while (isdigit (physname[len])) @@ -183,10 +181,10 @@ pascal_type_print_method_args (char *physname, char *methodname, } i = strtol (physname, &argname, 0); physname += len; - storec = physname[i]; - physname[i] = 0; - fputs_filtered (physname, stream); - physname[i] = storec; + + for (j = 0; j < i; ++j) + fputc_filtered (physname[j], stream); + physname += i; if (physname[0] != 0) { @@ -207,7 +205,8 @@ pascal_type_print_method_args (char *physname, char *methodname, void pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, - int show, int passed_a_ptr) + int show, int passed_a_ptr, + const struct type_print_options *flags) { if (type == 0) return; @@ -221,14 +220,16 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, { case TYPE_CODE_PTR: fprintf_filtered (stream, "^"); - pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1); + pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, + flags); break; /* Pointer should be handled normally in pascal. */ 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_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) { fprintf_filtered (stream, "function "); } @@ -240,14 +241,15 @@ 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), - stream, 0, passed_a_ptr); + pascal_type_print_base (TYPE_SELF_TYPE (type), + stream, 0, passed_a_ptr, flags); fprintf_filtered (stream, "::"); } break; case TYPE_CODE_REF: - pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1); + pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, + flags); fprintf_filtered (stream, "&"); break; @@ -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_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) { fprintf_filtered (stream, "function "); } @@ -291,7 +294,6 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, case TYPE_CODE_SET: case TYPE_CODE_RANGE: case TYPE_CODE_STRING: - case TYPE_CODE_BITSTRING: case TYPE_CODE_COMPLEX: case TYPE_CODE_TYPEDEF: /* These types need no prefix. They are listed here so that @@ -304,7 +306,8 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, } static void -pascal_print_func_args (struct type *type, struct ui_file *stream) +pascal_print_func_args (struct type *type, struct ui_file *stream, + const struct type_print_options *flags) { int i, len = TYPE_NFIELDS (type); @@ -326,7 +329,7 @@ pascal_print_func_args (struct type *type, struct ui_file *stream) } */ pascal_print_type (TYPE_FIELD_TYPE (type, i), "" /* TYPE_FIELD_NAME seems invalid! */ - ,stream, -1, 0); + ,stream, -1, 0, flags); } 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_CODE (TYPE_TARGET_TYPE (type)) != 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. */ @@ -341,7 +371,8 @@ pascal_print_func_args (struct type *type, struct ui_file *stream) static void pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, int show, int passed_a_ptr, - int demangled_args) + int demangled_args, + const struct type_print_options *flags) { if (type == 0) return; @@ -364,37 +395,23 @@ 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); - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0); - pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, - passed_a_ptr, 0); - } + pascal_type_print_func_varspec_suffix (type, stream, show, + passed_a_ptr, 0, flags); break; case TYPE_CODE_PTR: case TYPE_CODE_REF: pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), - stream, 0, 1, 0); + stream, 0, 1, 0, flags); break; case TYPE_CODE_FUNC: if (passed_a_ptr) fprintf_filtered (stream, ")"); if (!demangled_args) - pascal_print_func_args (type, 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); - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0); - pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, - passed_a_ptr, 0); - } + pascal_print_func_args (type, stream, flags); + pascal_type_print_func_varspec_suffix (type, stream, show, + passed_a_ptr, 0, flags); break; case TYPE_CODE_UNDEF: @@ -410,7 +427,6 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, case TYPE_CODE_SET: case TYPE_CODE_RANGE: case TYPE_CODE_STRING: - case TYPE_CODE_BITSTRING: case TYPE_CODE_COMPLEX: case TYPE_CODE_TYPEDEF: /* These types do not need a suffix. They are listed so that @@ -440,11 +456,11 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, void pascal_type_print_base (struct type *type, struct ui_file *stream, int show, - int level) + int level, const struct type_print_options *flags) { int i; int len; - int lastval; + LONGEST lastval; enum { s_none, s_public, s_private, s_protected @@ -455,7 +471,7 @@ 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; } @@ -477,7 +493,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, return; } - CHECK_TYPEDEF (type); + type = check_typedef (type); switch (TYPE_CODE (type)) { @@ -486,7 +502,8 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, case TYPE_CODE_REF: /* case TYPE_CODE_FUNC: case TYPE_CODE_METHOD: */ - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); + pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level, + flags); break; case TYPE_CODE_ARRAY: @@ -496,7 +513,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, stream, show, level); pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); */ - pascal_print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0); + pascal_print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0, flags); break; case TYPE_CODE_FUNC: @@ -506,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 (type) != NULL) { - fputs_filtered (TYPE_TAG_NAME (type), stream); + fputs_filtered (TYPE_NAME (type), stream); fputs_filtered (" = ", stream); } if (HAVE_CPLUS_STRUCT (type)) @@ -522,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 (type) != NULL) { - fputs_filtered (TYPE_TAG_NAME (type), stream); + fputs_filtered (TYPE_NAME (type), stream); fputs_filtered (" = ", stream); } fprintf_filtered (stream, "case of "); @@ -534,10 +551,10 @@ 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 (type) == NULL) fprintf_filtered (stream, "{...}"); } - else if (show > 0 || TYPE_TAG_NAME (type) == NULL) + else if (show > 0 || TYPE_NAME (type) == NULL) { pascal_type_print_derivation_info (stream, type); @@ -564,7 +581,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, { 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; @@ -605,7 +622,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, fprintf_filtered (stream, "static "); pascal_print_type (TYPE_FIELD_TYPE (type, i), TYPE_FIELD_NAME (type, i), - stream, show - 1, level + 4); + stream, show - 1, level + 4, flags); if (!field_is_static (&TYPE_FIELD (type, i)) && TYPE_FIELD_PACKED (type, i)) { @@ -631,17 +648,17 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, { struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i); int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i); - char *method_name = TYPE_FN_FIELDLIST_NAME (type, i); + const char *method_name = TYPE_FN_FIELDLIST_NAME (type, i); /* this is GNU C++ specific how can we know constructor/destructor? It might work for GNU pascal. */ for (j = 0; j < len2; j++) { - char *physname = TYPE_FN_FIELD_PHYSNAME (f, j); + 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)) @@ -724,9 +741,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 (type) != NULL) { - fputs_filtered (TYPE_TAG_NAME (type), stream); + fputs_filtered (TYPE_NAME (type), stream); if (show > 0) fputs_filtered (" ", stream); } @@ -737,10 +754,10 @@ 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 (type) == NULL) fprintf_filtered (stream, "(...)"); } - else if (show > 0 || TYPE_TAG_NAME (type) == NULL) + else if (show > 0 || TYPE_NAME (type) == NULL) { fprintf_filtered (stream, "("); len = TYPE_NFIELDS (type); @@ -752,11 +769,12 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, fprintf_filtered (stream, ", "); wrap_here (" "); fputs_filtered (TYPE_FIELD_NAME (type, i), stream); - if (lastval != TYPE_FIELD_BITPOS (type, i)) + if (lastval != TYPE_FIELD_ENUMVAL (type, i)) { fprintf_filtered (stream, - " := %d", TYPE_FIELD_BITPOS (type, i)); - lastval = TYPE_FIELD_BITPOS (type, i); + " := %s", + plongest (TYPE_FIELD_ENUMVAL (type, i))); + lastval = TYPE_FIELD_ENUMVAL (type, i); } lastval++; } @@ -790,11 +808,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, case TYPE_CODE_SET: fputs_filtered ("set of ", stream); pascal_print_type (TYPE_INDEX_TYPE (type), "", stream, - show - 1, level); - break; - - case TYPE_CODE_BITSTRING: - fputs_filtered ("BitString", stream); + show - 1, level, flags); break; case TYPE_CODE_STRING: @@ -814,8 +828,9 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, { /* 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 (type)); } break; }