Allow 'ptype/o' for assembly

PR exp/28359 points out that 'ptype/o' does not work when the current
language is "asm".

I tracked this down to a hard-coded list of languages in typeprint.c.
This patch replaces this list with a method on 'language_defn'
instead.  If all languages are ever updated to have this feature, the
method could be removed; but in the meantime this lets each language
control what happens.

I looked at having each print_type method simply modify the flags
itself, but this doesn't work very well with the feature that disables
method-printing by default (but allows it via a flag).

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28359
Approved-By: Andrew Burgess <aburgess@redhat.com>
Approved-By: Keith Seitz <keiths@redhat.com>
This commit is contained in:
Tom Tromey
2022-11-07 11:12:35 -07:00
parent c2264c8f78
commit 97e20099d3
8 changed files with 77 additions and 3 deletions

View File

@ -816,6 +816,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override const struct type_print_options *flags) const override
@ -966,6 +973,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override const struct type_print_options *flags) const override
@ -1066,6 +1080,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override const struct type_print_options *flags) const override
@ -1118,6 +1139,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override const struct type_print_options *flags) const override

View File

@ -144,6 +144,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override const struct type_print_options *flags) const override

View File

@ -451,6 +451,13 @@ struct language_defn
return nullptr; return nullptr;
} }
/* Return true if this class' implementation of print_type can
handle the /o modifier. */
virtual bool can_print_type_offsets () const
{
return false;
}
/* Print TYPE to STREAM using syntax appropriate for this language. /* Print TYPE to STREAM using syntax appropriate for this language.
LEVEL is the depth to indent lines by. VARSTRING, if not NULL or the LEVEL is the depth to indent lines by. VARSTRING, if not NULL or the
empty string, is the name of a variable and TYPE should be printed in empty string, is the name of a variable and TYPE should be printed in

View File

@ -266,6 +266,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override const struct type_print_options *flags) const override

View File

@ -953,6 +953,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override const struct type_print_options *flags) const override

View File

@ -107,6 +107,13 @@ public:
/* See language.h. */ /* See language.h. */
bool can_print_type_offsets () const override
{
return true;
}
/* See language.h. */
void print_type (struct type *type, const char *varstring, void 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) const override; const struct type_print_options *flags) const override;

View File

@ -469,3 +469,16 @@ with_test_prefix "with_hex_default" {
# restore # restore
gdb_test_no_output "set print type hex off" gdb_test_no_output "set print type hex off"
} }
gdb_test_no_output "set language asm"
gdb_test "ptype/o struct tuv" \
[string_to_regexp [multi_line \
"/* offset | size */ type = struct tuv \{" \
"/* 0 | 4 */ int a1;" \
"/* XXX 4-byte hole */" \
"/* 8 | 8 */ signed char *a2;" \
"/* 16 | 4 */ int a3;" \
"/* XXX 4-byte padding */" \
"" \
" /* total size (bytes): 24 */" \
" \}"]]

View File

@ -478,9 +478,7 @@ whatis_exp (const char *exp, int show)
/* Filter out languages which don't implement the /* Filter out languages which don't implement the
feature. */ feature. */
if (show > 0 if (show > 0
&& (current_language->la_language == language_c && current_language->can_print_type_offsets ())
|| current_language->la_language == language_cplus
|| current_language->la_language == language_rust))
{ {
flags.print_offsets = 1; flags.print_offsets = 1;
flags.print_typedefs = 0; flags.print_typedefs = 0;