[llvm] 9743183 - Add pretty printers for llvm::PointerIntPair and llvm::PointerUnion.
Christian Sigg via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 27 08:24:09 PST 2020
Author: Christian Sigg
Date: 2020-01-27T17:23:59+01:00
New Revision: 97431831e5690275a453567430d1153c47ba1585
URL: https://github.com/llvm/llvm-project/commit/97431831e5690275a453567430d1153c47ba1585
DIFF: https://github.com/llvm/llvm-project/commit/97431831e5690275a453567430d1153c47ba1585.diff
LOG: Add pretty printers for llvm::PointerIntPair and llvm::PointerUnion.
Reviewers: aprantl, dblaikie, jdoerfert, nicolasvasilache
Reviewed By: dblaikie
Subscribers: jpienaar, dexonsmith, merge_guards_bot, llvm-commits
Tags: #llvm, #clang, #lldb, #openmp
Differential Revision: https://reviews.llvm.org/D72557
Added:
Modified:
debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.cpp
debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.gdb
llvm/include/llvm/ADT/PointerIntPair.h
llvm/utils/gdb-scripts/prettyprinters.py
Removed:
################################################################################
diff --git a/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.cpp b/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.cpp
index 03cef4d977d5..bb0e02df6507 100644
--- a/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.cpp
+++ b/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.cpp
@@ -1,12 +1,15 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/PointerIntPair.h"
+#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/Error.h"
int Array[] = {1, 2, 3};
+auto IntPtr = reinterpret_cast<int *>(0xabc);
llvm::ArrayRef<int> ArrayRef(Array);
llvm::MutableArrayRef<int> MutableArrayRef(Array);
@@ -19,7 +22,7 @@ llvm::SmallVector<int, 5> SmallVector = {10, 11, 12};
llvm::SmallString<5> SmallString("foo");
llvm::StringRef StringRef = "bar";
llvm::Twine Twine = llvm::Twine(SmallString) + StringRef;
+llvm::PointerIntPair<int *, 1> PointerIntPair(IntPtr, 1);
+llvm::PointerUnion<float *, int *> PointerUnion(IntPtr);
-int main() {
- return 0;
-}
+int main() { return 0; }
diff --git a/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.gdb b/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.gdb
index 94213f941436..d6e8164d1223 100644
--- a/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.gdb
+++ b/debuginfo-tests/llvm-prettyprinters/gdb/prettyprinters.gdb
@@ -39,3 +39,10 @@ p StringRef
# CHECK: "\"foo\"\"bar\""
p Twine
+# CHECK: llvm::PointerIntPair<int *> = {pointer = 0xabc, value = 1}
+p PointerIntPair
+
+# CHECK: llvm::PointerUnion containing int * = {pointer = 0xabc}
+p PointerUnion
+
+
diff --git a/llvm/include/llvm/ADT/PointerIntPair.h b/llvm/include/llvm/ADT/PointerIntPair.h
index bcd7941798f2..cb8b202c48b7 100644
--- a/llvm/include/llvm/ADT/PointerIntPair.h
+++ b/llvm/include/llvm/ADT/PointerIntPair.h
@@ -147,7 +147,7 @@ struct PointerIntPairInfo {
"cannot use a pointer type that has all bits free");
static_assert(IntBits <= PtrTraits::NumLowBitsAvailable,
"PointerIntPair with integer size too large for pointer");
- enum : uintptr_t {
+ enum MaskAndShiftConstants : uintptr_t {
/// PointerBitMask - The bits that come from the pointer.
PointerBitMask =
~(uintptr_t)(((intptr_t)1 << PtrTraits::NumLowBitsAvailable) - 1),
diff --git a/llvm/utils/gdb-scripts/prettyprinters.py b/llvm/utils/gdb-scripts/prettyprinters.py
index 0a95b751b696..a994f08c7fd3 100644
--- a/llvm/utils/gdb-scripts/prettyprinters.py
+++ b/llvm/utils/gdb-scripts/prettyprinters.py
@@ -2,6 +2,7 @@
import sys
import gdb.printing
+import gdb.types
class Iterator:
def __iter__(self):
@@ -315,6 +316,55 @@ def string_from_twine_object(self, twine):
def to_string(self):
return self.string_from_twine_object(self._val)
+def make_printer(string = None, children = None, hint = None):
+ """Create a printer from the parameters."""
+ class Printer : pass
+ printer = Printer()
+ if string:
+ setattr(printer, 'to_string', lambda: string)
+ if children:
+ setattr(printer, 'children', lambda: children)
+ if hint:
+ setattr(printer, 'display_hint', lambda: hint)
+ return printer
+
+def get_pointer_int_pair(val):
+ """Get tuple from llvm::PointerIntPair."""
+ info_name = val.type.template_argument(4).strip_typedefs().name
+ try:
+ enum_type = gdb.lookup_type(info_name + '::MaskAndShiftConstants')
+ except gdb.error:
+ return (None, None)
+ enum_dict = gdb.types.make_enum_dict(enum_type)
+ ptr_mask = enum_dict[info_name + '::PointerBitMask']
+ int_shift = enum_dict[info_name + '::IntShift']
+ int_mask = enum_dict[info_name + '::IntMask']
+ pair_union = val['Value']
+ pointer = (pair_union & ptr_mask)
+ value = ((pair_union >> int_shift) & int_mask)
+ return (pointer, value)
+
+def make_pointer_int_pair_printer(val):
+ """Factory for an llvm::PointerIntPair printer."""
+ pointer, value = get_pointer_int_pair(val)
+ if not pointer or not value:
+ return None
+ pointer_type = val.type.template_argument(0)
+ value_type = val.type.template_argument(2)
+ string = 'llvm::PointerIntPair<%s>' % pointer_type
+ children = [('pointer', pointer.cast(pointer_type)),
+ ('value', value.cast(value_type))]
+ return make_printer(string, children)
+
+def make_pointer_union_printer(val):
+ """Factory for an llvm::PointerUnion printer."""
+ pointer, value = get_pointer_int_pair(val['Val'])
+ if not pointer or not value:
+ return None
+ pointer_type = val.type.template_argument(int(value))
+ string = 'llvm::PointerUnion containing %s' % pointer_type
+ return make_printer(string, [('pointer', pointer.cast(pointer_type))])
+
pp = gdb.printing.RegexpCollectionPrettyPrinter("LLVMSupport")
pp.add_printer('llvm::SmallString', '^llvm::SmallString<.*>$', SmallStringPrinter)
pp.add_printer('llvm::StringRef', '^llvm::StringRef$', StringRefPrinter)
@@ -324,4 +374,6 @@ def to_string(self):
pp.add_printer('llvm::Optional', '^llvm::Optional<.*>$', OptionalPrinter)
pp.add_printer('llvm::DenseMap', '^llvm::DenseMap<.*>$', DenseMapPrinter)
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)
gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)
More information about the llvm-commits
mailing list