X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fc-typeprint.c;h=aaf9e0dfe0a1a70a5dbae4edfb96c80f168688fa;hb=b4991d292edd84c16bd2050bd071198ceae764fe;hp=5e7e672e02d24a7edf0a1905020dbf504f7f7a04;hpb=42a4f53d2bf8938c2aeda9f52be7a20534b214a9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index 5e7e672e02..aaf9e0dfe0 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -1,5 +1,5 @@ /* Support for printing C and C++ types for GDB, the GNU debugger. - Copyright (C) 1986-2019 Free Software Foundation, Inc. + Copyright (C) 1986-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -28,6 +28,7 @@ #include "language.h" #include "demangle.h" #include "c-lang.h" +#include "cli/cli-style.h" #include "typeprint.h" #include "cp-abi.h" #include "cp-support.h" @@ -57,7 +58,7 @@ static void c_type_print_varspec_prefix (struct type *, /* Print "const", "volatile", or address space modifiers. */ static void c_type_print_modifier (struct type *, struct ui_file *, - int, int); + int, int, enum language); static void c_type_print_base_1 (struct type *type, struct ui_file *stream, int show, int level, enum language language, @@ -83,14 +84,14 @@ print_name_maybe_canonical (const char *name, const struct type_print_options *flags, struct ui_file *stream) { - std::string s; + gdb::unique_xmalloc_ptr s; if (!flags->raw) s = cp_canonicalize_string_full (name, find_typedef_for_canonicalize, (void *) flags); - fputs_filtered (!s.empty () ? s.c_str () : name, stream); + fputs_filtered (s != nullptr ? s.get () : name, stream); } @@ -115,6 +116,7 @@ c_print_type_1 (struct type *type, type = check_typedef (type); local_name = typedef_hash_table::find_typedef (flags, type); + code = TYPE_CODE (type); if (local_name != NULL) { fputs_filtered (local_name, stream); @@ -124,7 +126,6 @@ c_print_type_1 (struct type *type, else { c_type_print_base_1 (type, stream, show, level, language, flags, podata); - code = TYPE_CODE (type); 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. */ @@ -144,7 +145,10 @@ c_print_type_1 (struct type *type, if (varstring != NULL) { - fputs_filtered (varstring, stream); + if (code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD) + fputs_styled (varstring, function_name_style.style (), stream); + else + fputs_styled (varstring, variable_name_style.style (), stream); /* For demangled function names, we have the arglist as part of the name, so don't print an additional pair of ()'s. */ @@ -201,13 +205,13 @@ c_print_typedef (struct type *type, { type = check_typedef (type); fprintf_filtered (stream, "typedef "); - type_print (type, "", stream, 0); + type_print (type, "", stream, -1); if (TYPE_NAME ((SYMBOL_TYPE (new_symbol))) == 0 || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))), - SYMBOL_LINKAGE_NAME (new_symbol)) != 0 + new_symbol->linkage_name ()) != 0 || TYPE_CODE (SYMBOL_TYPE (new_symbol)) == TYPE_CODE_TYPEDEF) - fprintf_filtered (stream, " %s", SYMBOL_PRINT_NAME (new_symbol)); - fprintf_filtered (stream, ";\n"); + fprintf_filtered (stream, " %s", new_symbol->print_name ()); + fprintf_filtered (stream, ";"); } /* If TYPE is a derived type, then print out derivation information. @@ -333,7 +337,9 @@ cp_type_print_method_args (struct type *mtype, const char *prefix, fprintf_filtered (stream, " volatile"); if (TYPE_RESTRICT (domain)) - fprintf_filtered (stream, " restrict"); + fprintf_filtered (stream, (language == language_cplus + ? " __restrict__" + : " restrict")); if (TYPE_ATOMIC (domain)) fprintf_filtered (stream, " _Atomic"); @@ -379,7 +385,7 @@ c_type_print_varspec_prefix (struct type *type, stream, show, 1, 1, language, flags, podata); fprintf_filtered (stream, "*"); - c_type_print_modifier (type, stream, 1, need_post_space); + c_type_print_modifier (type, stream, 1, need_post_space, language); break; case TYPE_CODE_MEMBERPTR: @@ -416,7 +422,7 @@ c_type_print_varspec_prefix (struct type *type, stream, show, 1, 0, language, flags, podata); fprintf_filtered (stream, TYPE_CODE(type) == TYPE_CODE_REF ? "&" : "&&"); - c_type_print_modifier (type, stream, 1, need_post_space); + c_type_print_modifier (type, stream, 1, need_post_space, language); break; case TYPE_CODE_METHOD: @@ -477,7 +483,8 @@ c_type_print_varspec_prefix (struct type *type, static void c_type_print_modifier (struct type *type, struct ui_file *stream, - int need_pre_space, int need_post_space) + int need_pre_space, int need_post_space, + enum language language) { int did_print_modifier = 0; const char *address_space_id; @@ -505,7 +512,9 @@ c_type_print_modifier (struct type *type, struct ui_file *stream, { if (did_print_modifier || need_pre_space) fprintf_filtered (stream, " "); - fprintf_filtered (stream, "restrict"); + fprintf_filtered (stream, (language == language_cplus + ? "__restrict__" + : "restrict")); did_print_modifier = 1; } @@ -876,15 +885,14 @@ c_type_print_template_args (const struct type_print_options *flags, if (first) { wrap_here (" "); - fprintf_filtered (stream, _("[with %s = "), - SYMBOL_LINKAGE_NAME (sym)); + fprintf_filtered (stream, _("[with %s = "), sym->linkage_name ()); first = 0; } else { fputs_filtered (", ", stream); wrap_here (" "); - fprintf_filtered (stream, "%s = ", SYMBOL_LINKAGE_NAME (sym)); + fprintf_filtered (stream, "%s = ", sym->linkage_name ()); } c_print_type (SYMBOL_TYPE (sym), "", stream, -1, 0, flags); @@ -1047,7 +1055,7 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream, hash_holder.reset (local_flags.local_typedefs); } - c_type_print_modifier (type, stream, 0, 1); + c_type_print_modifier (type, stream, 0, 1, language); if (TYPE_CODE (type) == TYPE_CODE_UNION) fprintf_filtered (stream, "union "); else if (TYPE_DECLARED_CLASS (type)) @@ -1112,10 +1120,12 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream, { if (TYPE_STUB (type)) fprintfi_filtered (level + 4, stream, - _("\n")); + _("%p[%p]\n"), + metadata_style.style ().ptr (), nullptr); else fprintfi_filtered (level + 4, stream, - _("\n")); + _("%p[%p]\n"), + metadata_style.style ().ptr (), nullptr); } /* Start off with no specific section type, so we can print @@ -1273,7 +1283,8 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream, { /* Keep GDB from crashing here. */ fprintf_filtered (stream, - _(" %s;\n"), + _("%p[%p] %s;\n"), + metadata_style.style ().ptr (), nullptr, TYPE_FN_FIELD_PHYSNAME (f, j)); break; } @@ -1321,9 +1332,9 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream, &local_flags); } else - fprintf_filtered (stream, - _(""), - mangled_name); + fprintf_styled (stream, metadata_style.style (), + _(""), + mangled_name); } else { @@ -1461,7 +1472,7 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, if (type == NULL) { - fputs_filtered (_(""), stream); + fputs_styled (_(""), metadata_style.style (), stream); return; } @@ -1471,7 +1482,7 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, if (show <= 0 && TYPE_NAME (type) != NULL) { - c_type_print_modifier (type, stream, 0, 1); + c_type_print_modifier (type, stream, 0, 1, language); /* If we have "typedef struct foo {. . .} bar;" do we want to print it as "struct foo" or as "bar"? Pick the latter for @@ -1507,7 +1518,8 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, couldn't resolve TYPE_TARGET_TYPE. Not much we can do. */ gdb_assert (TYPE_NAME (type) == NULL); gdb_assert (TYPE_TARGET_TYPE (type) == NULL); - fprintf_filtered (stream, _("")); + fprintf_styled (stream, metadata_style.style (), + _("")); break; case TYPE_CODE_FUNC: @@ -1535,7 +1547,7 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, break; case TYPE_CODE_ENUM: - c_type_print_modifier (type, stream, 0, 1); + c_type_print_modifier (type, stream, 0, 1, language); fprintf_filtered (stream, "enum "); if (TYPE_DECLARED_CLASS (type)) fprintf_filtered (stream, "class "); @@ -1588,7 +1600,8 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, if (i) fprintf_filtered (stream, ", "); wrap_here (" "); - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); if (lastval != TYPE_FIELD_ENUMVAL (type, i)) { fprintf_filtered (stream, " = %s", @@ -1607,7 +1620,7 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, local_flags.local_typedefs = NULL; - c_type_print_modifier (type, stream, 0, 1); + c_type_print_modifier (type, stream, 0, 1, language); fprintf_filtered (stream, "flag "); print_name_maybe_canonical (TYPE_NAME (type), flags, stream); if (show > 0) @@ -1618,10 +1631,12 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, { if (TYPE_STUB (type)) fprintfi_filtered (level + 4, stream, - _("\n")); + _("%p[%p]\n"), + metadata_style.style ().ptr (), nullptr); else fprintfi_filtered (level + 4, stream, - _("\n")); + _("%p[%p]\n"), + metadata_style.style ().ptr (), nullptr); } len = TYPE_NFIELDS (type); for (i = 0; i < len; i++) @@ -1664,7 +1679,7 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, case TYPE_CODE_RANGE: /* This should not occur. */ - fprintf_filtered (stream, _("")); + fprintf_styled (stream, metadata_style.style (), _("")); break; case TYPE_CODE_NAMESPACE: @@ -1679,15 +1694,15 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, type name, then complain. */ if (TYPE_NAME (type) != NULL) { - c_type_print_modifier (type, stream, 0, 1); + c_type_print_modifier (type, stream, 0, 1, language); print_name_maybe_canonical (TYPE_NAME (type), flags, 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 (type)); } break; }