From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH] Allow 'ptype/o' for assembly
Date: Tue, 8 Nov 2022 13:14:52 -0700 [thread overview]
Message-ID: <20221108201452.1255047-1-tromey@adacore.com> (raw)
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).
---
gdb/c-lang.c | 28 ++++++++++++++++++++++++
gdb/d-lang.c | 7 ++++++
gdb/language.h | 7 ++++++
gdb/objc-lang.c | 7 ++++++
gdb/opencl-lang.c | 7 ++++++
gdb/rust-lang.h | 7 ++++++
gdb/testsuite/gdb.base/ptype-offsets.exp | 13 +++++++++++
gdb/typeprint.c | 4 +---
8 files changed, 77 insertions(+), 3 deletions(-)
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index 36b4d1ae3dd..e15541f8175 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -816,6 +816,13 @@ class c_language : public language_defn
/* 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 @@ class cplus_language : public language_defn
/* 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 @@ class asm_language : public language_defn
/* 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 @@ class minimal_language : public language_defn
/* 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
diff --git a/gdb/d-lang.c b/gdb/d-lang.c
index d9591997c87..bb48af6d7c6 100644
--- a/gdb/d-lang.c
+++ b/gdb/d-lang.c
@@ -144,6 +144,13 @@ class d_language : public language_defn
/* 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
diff --git a/gdb/language.h b/gdb/language.h
index 871b00b3c94..c1c735ad9ae 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -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
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 1a1d6215475..3c2cbf401f0 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -266,6 +266,13 @@ class objc_language : public language_defn
/* 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
diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c
index e41db3dcbba..f7cf00c6919 100644
--- a/gdb/opencl-lang.c
+++ b/gdb/opencl-lang.c
@@ -953,6 +953,13 @@ class opencl_language : public language_defn
/* 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
diff --git a/gdb/rust-lang.h b/gdb/rust-lang.h
index f4c7b7fc1c8..a1d10263feb 100644
--- a/gdb/rust-lang.h
+++ b/gdb/rust-lang.h
@@ -107,6 +107,13 @@ class rust_language : public language_defn
/* 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;
diff --git a/gdb/testsuite/gdb.base/ptype-offsets.exp b/gdb/testsuite/gdb.base/ptype-offsets.exp
index eb41bafb3e6..b42fa4dac43 100644
--- a/gdb/testsuite/gdb.base/ptype-offsets.exp
+++ b/gdb/testsuite/gdb.base/ptype-offsets.exp
@@ -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 */" \
+ " \}"]]
diff --git a/gdb/typeprint.c b/gdb/typeprint.c
index 79043122b17..7a7ac6c314e 100644
--- a/gdb/typeprint.c
+++ b/gdb/typeprint.c
@@ -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;
--
2.34.3
next reply other threads:[~2022-11-08 20:15 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-08 20:14 Tom Tromey [this message]
2022-11-08 21:19 ` Keith Seitz
2022-11-09 15:28 ` Tom Tromey
2022-11-11 19:50 ` Philippe Waroquiers
2022-11-14 13:32 ` Tom Tromey
2022-11-14 20:05 ` Philippe Waroquiers
2022-11-09 14:47 ` Andrew Burgess
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221108201452.1255047-1-tromey@adacore.com \
--to=tromey@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).