From 64b62b62bad510a550d3f5eb42e32e160c01f2cd Mon Sep 17 00:00:00 2001 From: Moritz Sichert Date: Mon, 11 Jan 2021 15:55:20 +0100 Subject: [PATCH] Avoid fragile type lookups in GDB pretty printer Instead of using the type llvm::StringMapEntry<{stringified_value_type}> use only the base class llvm::StringMapEntryBase and calculate the offsets of the member variables manually. The approach with stringifying the name of the value type is pretty fragile as it can easily break with local and dependent types. Differential Revision: https://reviews.llvm.org/D94431 --- utils/gdb-scripts/prettyprinters.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/utils/gdb-scripts/prettyprinters.py b/utils/gdb-scripts/prettyprinters.py index 787269c7bb9..b774e336f2f 100644 --- a/utils/gdb-scripts/prettyprinters.py +++ b/utils/gdb-scripts/prettyprinters.py @@ -211,7 +211,7 @@ class StringMapPrinter: it = self.val['TheTable'] end = (it + self.val['NumBuckets']) value_ty = self.val.type.template_argument(0) - entry_ty = gdb.lookup_type('llvm::StringMapEntry<{}>'.format(value_ty.name)) + entry_base_ty = gdb.lookup_type('llvm::StringMapEntryBase') tombstone = gdb.parse_and_eval('llvm::StringMapImpl::TombstoneIntVal'); while it != end: @@ -220,15 +220,17 @@ class StringMapPrinter: it = it + 1 continue - entry_ptr = it_deref.cast(entry_ty.pointer()) + entry_ptr = it_deref.cast(entry_base_ty.pointer()) entry = entry_ptr.dereference() str_len = entry['keyLength'] - str_data = (entry_ptr + 1).cast(gdb.lookup_type('char').const().pointer()) + value_ptr = (entry_ptr + 1).cast(value_ty.pointer()) + str_data = (entry_ptr + 1).cast(gdb.lookup_type('uintptr_t')) + max(value_ty.sizeof, entry_base_ty.alignof) + str_data = str_data.cast(gdb.lookup_type('char').const().pointer()) string_ref = gdb.Value(struct.pack('PN', int(str_data), int(str_len)), gdb.lookup_type('llvm::StringRef')) yield 'key', string_ref - value = entry['second'] + value = value_ptr.dereference() yield 'value', value it = it + 1