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 <[email protected]>
Approved-By: Keith Seitz <[email protected]>
/* 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
/* 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
/* 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
/* 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
/* 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
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
/* 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
/* 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
/* 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;
# 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 */" \
+ " \}"]]
/* 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;