From c38bda5104e0011b1255752bec63cb4ffd76449d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 22 Jun 2023 09:00:13 -0600 Subject: [PATCH] Handle typedefs in no-op pretty printers The no-ops pretty-printers that were introduced for DAP have a classic gdb bug: they neglect to call check_typedef. This will cause some strange behavior; for example not showing the children of a variable whose type is a typedef of a structure type. This patch fixes the oversight. --- gdb/python/lib/gdb/printing.py | 23 ++++++++++++----------- gdb/testsuite/gdb.dap/scopes.c | 6 +++--- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/gdb/python/lib/gdb/printing.py b/gdb/python/lib/gdb/printing.py index 353427d000a..a668bd0e3fc 100644 --- a/gdb/python/lib/gdb/printing.py +++ b/gdb/python/lib/gdb/printing.py @@ -282,9 +282,9 @@ class NoOpScalarPrinter: class NoOpArrayPrinter: """A no-op pretty printer that wraps an array value.""" - def __init__(self, value): + def __init__(self, ty, value): self.value = value - (low, high) = self.value.type.range() + (low, high) = ty.range() self.low = low self.high = high # This is a convenience to the DAP code and perhaps other @@ -305,14 +305,15 @@ class NoOpArrayPrinter: class NoOpStructPrinter: """A no-op pretty printer that wraps a struct or union value.""" - def __init__(self, value): + def __init__(self, ty, value): + self.ty = ty self.value = value def to_string(self): return "" def children(self): - for field in self.value.type.fields(): + for field in self.ty.fields(): if field.name is not None: yield (field.name, self.value[field]) @@ -327,14 +328,14 @@ def make_visualizer(value): if result is not None: # Found a pretty-printer. pass - elif value.type.code == gdb.TYPE_CODE_ARRAY: - result = gdb.printing.NoOpArrayPrinter(value) - (low, high) = value.type.range() - result.n_children = high - low + 1 - elif value.type.code in (gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION): - result = gdb.printing.NoOpStructPrinter(value) else: - result = gdb.printing.NoOpScalarPrinter(value) + ty = value.type.strip_typedefs() + if ty.code == gdb.TYPE_CODE_ARRAY: + result = gdb.printing.NoOpArrayPrinter(ty, value) + elif ty.code in (gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION): + result = gdb.printing.NoOpStructPrinter(ty, value) + else: + result = gdb.printing.NoOpScalarPrinter(value) return result diff --git a/gdb/testsuite/gdb.dap/scopes.c b/gdb/testsuite/gdb.dap/scopes.c index a9ad4d8a53b..0453f866f7e 100644 --- a/gdb/testsuite/gdb.dap/scopes.c +++ b/gdb/testsuite/gdb.dap/scopes.c @@ -17,13 +17,13 @@ int main () { - struct dei_struct + typedef struct dei_struct { int x; int more[5]; - }; + } dei_type; - struct dei_struct dei = { 2, { 3, 5, 7, 11, 13 } }; + dei_type dei = { 2, { 3, 5, 7, 11, 13 } }; static int scalar = 23; -- 2.30.2