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:
parent
c2264c8f78
commit
97e20099d3
8 changed files with 77 additions and 3 deletions
28
gdb/c-lang.c
28
gdb/c-lang.c
|
@ -816,6 +816,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override
|
||||
|
@ -966,6 +973,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override
|
||||
|
@ -1066,6 +1080,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override
|
||||
|
@ -1118,6 +1139,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override
|
||||
|
|
|
@ -144,6 +144,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override
|
||||
|
|
|
@ -451,6 +451,13 @@ struct language_defn
|
|||
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.
|
||||
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
|
||||
|
|
|
@ -266,6 +266,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override
|
||||
|
|
|
@ -953,6 +953,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override
|
||||
|
|
|
@ -107,6 +107,13 @@ public:
|
|||
|
||||
/* See language.h. */
|
||||
|
||||
bool can_print_type_offsets () const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* See language.h. */
|
||||
|
||||
void print_type (struct type *type, const char *varstring,
|
||||
struct ui_file *stream, int show, int level,
|
||||
const struct type_print_options *flags) const override;
|
||||
|
|
|
@ -469,3 +469,16 @@ with_test_prefix "with_hex_default" {
|
|||
# restore
|
||||
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 */" \
|
||||
" \}"]]
|
||||
|
|
|
@ -478,9 +478,7 @@ whatis_exp (const char *exp, int show)
|
|||
/* Filter out languages which don't implement the
|
||||
feature. */
|
||||
if (show > 0
|
||||
&& (current_language->la_language == language_c
|
||||
|| current_language->la_language == language_cplus
|
||||
|| current_language->la_language == language_rust))
|
||||
&& current_language->can_print_type_offsets ())
|
||||
{
|
||||
flags.print_offsets = 1;
|
||||
flags.print_typedefs = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue