/* 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.
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
-
-/* Local non-gdb includes. */
-#include "bfd.h"
-#include "c-lang.h"
-#include "cli/cli-style.h"
-#include "cp-abi.h"
-#include "cp-support.h"
-#include "demangle.h"
-#include "expression.h"
#include "gdb_obstack.h"
-#include "gdbcore.h"
-#include "gdbtypes.h"
-#include "language.h"
+#include "bfd.h" /* Binary File Description. */
#include "symtab.h"
+#include "gdbtypes.h"
+#include "expression.h"
+#include "value.h"
+#include "gdbcore.h"
#include "target.h"
+#include "language.h"
+#include "demangle.h"
+#include "c-lang.h"
+#include "cli/cli-style.h"
#include "typeprint.h"
-#include "value.h"
+#include "cp-abi.h"
+#include "cp-support.h"
/* A list of access specifiers used for printing. */
/* 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,
if (code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD)
fputs_styled (varstring, function_name_style.style (), stream);
else
- fputs_filtered (varstring, stream);
+ 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. */
{
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.
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");
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:
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:
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;
{
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;
}
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);
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))
{
if (TYPE_STUB (type))
fprintfi_filtered (level + 4, stream,
- _("<incomplete type>\n"));
+ _("%p[<incomplete type>%p]\n"),
+ metadata_style.style ().ptr (), nullptr);
else
fprintfi_filtered (level + 4, stream,
- _("<no data fields>\n"));
+ _("%p[<no data fields>%p]\n"),
+ metadata_style.style ().ptr (), nullptr);
}
/* Start off with no specific section type, so we can print
{
/* Keep GDB from crashing here. */
fprintf_filtered (stream,
- _("<undefined type> %s;\n"),
+ _("%p[<undefined type>%p] %s;\n"),
+ metadata_style.style ().ptr (), nullptr,
TYPE_FN_FIELD_PHYSNAME (f, j));
break;
}
&local_flags);
}
else
- fprintf_filtered (stream,
- _("<badly mangled name '%s'>"),
- mangled_name);
+ fprintf_styled (stream, metadata_style.style (),
+ _("<badly mangled name '%s'>"),
+ mangled_name);
}
else
{
if (type == NULL)
{
- fputs_filtered (_("<type unknown>"), stream);
+ fputs_styled (_("<type unknown>"), metadata_style.style (), stream);
return;
}
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
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, _("<unnamed typedef>"));
+ fprintf_styled (stream, metadata_style.style (),
+ _("<unnamed typedef>"));
break;
case TYPE_CODE_FUNC:
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 ");
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",
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)
{
if (TYPE_STUB (type))
fprintfi_filtered (level + 4, stream,
- _("<incomplete type>\n"));
+ _("%p[<incomplete type>%p]\n"),
+ metadata_style.style ().ptr (), nullptr);
else
fprintfi_filtered (level + 4, stream,
- _("<no data fields>\n"));
+ _("%p[<no data fields>%p]\n"),
+ metadata_style.style ().ptr (), nullptr);
}
len = TYPE_NFIELDS (type);
for (i = 0; i < len; i++)
case TYPE_CODE_RANGE:
/* This should not occur. */
- fprintf_filtered (stream, _("<range type>"));
+ fprintf_styled (stream, metadata_style.style (), _("<range type>"));
break;
case TYPE_CODE_NAMESPACE:
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, _("<invalid type code %d>"),
- TYPE_CODE (type));
+ fprintf_styled (stream, metadata_style.style (),
+ _("<invalid type code %d>"), TYPE_CODE (type));
}
break;
}