Skip to content

Commit

Permalink
Added GDB pretty printer for StringMap
Browse files Browse the repository at this point in the history
Reviewed By: csigg, dblaikie

Differential Revision: https://reviews.llvm.org/D91183
  • Loading branch information
MoritzS authored and dwblaikie committed Nov 19, 2020
1 parent 523cc09 commit 5747380
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 3 deletions.
2 changes: 2 additions & 0 deletions debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp
Expand Up @@ -5,6 +5,7 @@
#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/Twine.h"
#include "llvm/ADT/ilist.h"
#include "llvm/Support/Error.h"
Expand All @@ -15,6 +16,7 @@ auto IntPtr = reinterpret_cast<int *>(0xabc);
llvm::ArrayRef<int> ArrayRef(Array);
llvm::MutableArrayRef<int> MutableArrayRef(Array);
llvm::DenseMap<int, int> DenseMap = {{4, 5}, {6, 7}};
llvm::StringMap<int> StringMap = {{"foo", 123}, {"bar", 456}};
llvm::Expected<int> ExpectedValue(8);
llvm::Expected<int> ExpectedError(llvm::createStringError({}, ""));
llvm::Optional<int> OptionalValue(9);
Expand Down
3 changes: 3 additions & 0 deletions debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.gdb
Expand Up @@ -40,6 +40,9 @@ p StringRef
# CHECK: "\"foo\"\"bar\""
p Twine

# CHECK: llvm::StringMap with 2 elements = {["foo"] = 123, ["bar"] = 456}
p StringMap

# CHECK: {pointer = 0xabc, value = 1}
p PointerIntPair

Expand Down
8 changes: 5 additions & 3 deletions llvm/include/llvm/ADT/StringMap.h
Expand Up @@ -78,10 +78,12 @@ class StringMapImpl {
void init(unsigned Size);

public:
static constexpr uintptr_t TombstoneIntVal =
static_cast<uintptr_t>(-1)
<< PointerLikeTypeTraits<StringMapEntryBase *>::NumLowBitsAvailable;

static StringMapEntryBase *getTombstoneVal() {
uintptr_t Val = static_cast<uintptr_t>(-1);
Val <<= PointerLikeTypeTraits<StringMapEntryBase *>::NumLowBitsAvailable;
return reinterpret_cast<StringMapEntryBase *>(Val);
return reinterpret_cast<StringMapEntryBase *>(TombstoneIntVal);
}

unsigned getNumBuckets() const { return NumBuckets; }
Expand Down
40 changes: 40 additions & 0 deletions llvm/utils/gdb-scripts/prettyprinters.py
@@ -1,4 +1,5 @@
from __future__ import print_function
import struct
import sys

import gdb.printing
Expand Down Expand Up @@ -200,6 +201,44 @@ def to_string(self):
def display_hint(self):
return 'map'

class StringMapPrinter:
"Print a StringMap"

def __init__(self, val):
self.val = val

def children(self):
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))
tombstone = gdb.parse_and_eval('llvm::StringMapImpl::TombstoneIntVal');

while it != end:
it_deref = it.dereference()
if it_deref == 0 or it_deref == tombstone:
it = it + 1
continue

entry_ptr = it_deref.cast(entry_ty.pointer())
entry = entry_ptr.dereference()

str_len = entry['keyLength']
str_data = (entry_ptr + 1).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']
yield 'value', value

it = it + 1

def to_string(self):
return 'llvm::StringMap with %d elements' % (self.val['NumItems'])

def display_hint(self):
return 'map'

class TwinePrinter:
"Print a Twine"

Expand Down Expand Up @@ -442,6 +481,7 @@ def children(self):
pp.add_printer('llvm::Expected', '^llvm::Expected<.*>$', ExpectedPrinter)
pp.add_printer('llvm::Optional', '^llvm::Optional<.*>$', OptionalPrinter)
pp.add_printer('llvm::DenseMap', '^llvm::DenseMap<.*>$', DenseMapPrinter)
pp.add_printer('llvm::StringMap', '^llvm::StringMap<.*>$', StringMapPrinter)
pp.add_printer('llvm::Twine', '^llvm::Twine$', TwinePrinter)
pp.add_printer('llvm::PointerIntPair', '^llvm::PointerIntPair<.*>$', make_pointer_int_pair_printer)
pp.add_printer('llvm::PointerUnion', '^llvm::PointerUnion<.*>$', make_pointer_union_printer)
Expand Down

0 comments on commit 5747380

Please sign in to comment.