From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd2d.google.com (mail-io1-xd2d.google.com [IPv6:2607:f8b0:4864:20::d2d]) by sourceware.org (Postfix) with ESMTPS id 3F6253858D26 for ; Tue, 8 Nov 2022 20:15:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3F6253858D26 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com Received: by mail-io1-xd2d.google.com with SMTP id r81so12392120iod.2 for ; Tue, 08 Nov 2022 12:15:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=dF8aNIPLcFN+sdrBMvmZvHagXvyykqKgbObEbYBCk7c=; b=kQh4kuXXynKHEUCma30/p1R39XLEF7hC7Nbjp3T7rH38uRGbBN9Z2+M/StAm+IETo/ J82yUwhb6TwTRZaWxAsQ0CIObbhD7BdJxYp585c+6arVN5Z8R3Qr8Of804q4iHMbHBrh 5sOcCpntGbwuHjPFTQ21/85s8m4xf/zGOiqvtxlXJvKgbVa+yLnas1bnByRCDuN8Z+eq BbNMF1192z4hxT7pYza4K4Rey2B0dh5r65k4FVFiJS96UQA5L5iCaiGLWv1iz9H1rRZy GdCpeVCsJsbU4vv/WwjiYNWrdnNQaD6TqkoDVp+ADp26c2iFPVPwOvc2tJivZjkwy0GT rfow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=dF8aNIPLcFN+sdrBMvmZvHagXvyykqKgbObEbYBCk7c=; b=RrcCmPSdt3JhWEHks7UMdVOTghV+DUlJ/yqpUzNhU2fWPWHENt6HYLUWySpvHQfUC2 oQWpapFhzDhh16Q5XMcgPXaH5tUyEBOWzjeC2sXlEOx/AygipOta7qmF1lWo7XgkmHEM 0RVmcVpFnCg/DxPEYK98k04ArppvBYQ1AwLjV6tcYYZUFU4pem3JwAtwzNCYy8OTcBxz kJVJVxGAvLDfGGrM+loNZiCTzzghpPC4+lnoF9JlvKmXidmY84+zsB58hCUsyWaTQNrz GwyBIC0RKtZdNtn4+HoagCCmv36JvEx3IozbzmQpxJYVmiQ5P7Gun+qm7q98Jb5rd27S TjfQ== X-Gm-Message-State: ACrzQf0Odhw8Yj9kCJdgiBgZMHJQhtN38wP13os2MgdMA3BhrmIy7Oic m7XFyvRu/WHePNh2bHkj/KJlhVOA9z/QBA== X-Google-Smtp-Source: AMsMyM5pR5IwZe5kzqAuJY3XgDaSnAP9BiQ3sFModHmOfmL8kGOPelC4pstAJeRNk6T+Tp/nxUbJ3Q== X-Received: by 2002:a02:3509:0:b0:375:ad65:cbae with SMTP id k9-20020a023509000000b00375ad65cbaemr12847669jaa.37.1667938501428; Tue, 08 Nov 2022 12:15:01 -0800 (PST) Received: from localhost.localdomain (97-122-76-186.hlrn.qwest.net. [97.122.76.186]) by smtp.gmail.com with ESMTPSA id i9-20020a92c949000000b002fc681a6ad8sm4159852ilq.78.2022.11.08.12.15.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Nov 2022 12:15:00 -0800 (PST) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Allow 'ptype/o' for assembly Date: Tue, 8 Nov 2022 13:14:52 -0700 Message-Id: <20221108201452.1255047-1-tromey@adacore.com> X-Mailer: git-send-email 2.34.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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