[llvm] f3ad6eb - Change to individual pretty printer classes, remove generic `make_printer`.
Christian Sigg via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 11 07:04:13 PDT 2020
Author: Christian Sigg
Date: 2020-03-11T15:04:03+01:00
New Revision: f3ad6eb5d3d07f8e1ddb380b2b6806edd3dc84f6
URL: https://github.com/llvm/llvm-project/commit/f3ad6eb5d3d07f8e1ddb380b2b6806edd3dc84f6
DIFF: https://github.com/llvm/llvm-project/commit/f3ad6eb5d3d07f8e1ddb380b2b6806edd3dc84f6.diff
LOG: Change to individual pretty printer classes, remove generic `make_printer`.
Summary: Follow-up from D72589.
Reviewers: dblaikie
Reviewed By: dblaikie
Subscribers: merge_guards_bot, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D73609
Added:
Modified:
debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp
debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.gdb
llvm/utils/gdb-scripts/prettyprinters.py
Removed:
################################################################################
diff --git a/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp b/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp
index 7e0f193a3ff2..04c84cd149b8 100644
--- a/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp
+++ b/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp
@@ -24,7 +24,13 @@ 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);
+
+struct alignas(8) Z {};
+llvm::PointerUnion<Z *, int *> PointerUnion(IntPtr);
+
+// No members which instantiate PointerUnionUIntTraits<Z *> (e.g. get<T *>())
+// are called, and this instance will therefore be raw-printed.
+llvm::PointerUnion<Z *, float *> RawPrintingPointerUnion(nullptr);
using IlistTag = llvm::ilist_tag<struct A>;
using SimpleIlistTag = llvm::ilist_tag<struct B>;
diff --git a/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.gdb b/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.gdb
index c02c03c1b1c7..fa1e2aada6cd 100644
--- a/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.gdb
+++ b/debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.gdb
@@ -1,4 +1,4 @@
-# RUN: gdb -q -batch -n -iex 'source %llvm_src_root/utils/gdb-scripts/prettyprinters.py' -x %s %llvm_tools_dir/check-gdb-llvm-support | FileCheck %s
+# RUN: gdb -q -batch -n -iex 'source %llvm_src_root/utils/gdb-scripts/prettyprinters.py' -x %s %llvm_tools_dir/check-gdb-llvm-support | FileCheck %s --dump-input-on-failure
break main
run
@@ -39,12 +39,15 @@ p StringRef
# CHECK: "\"foo\"\"bar\""
p Twine
-# CHECK: llvm::PointerIntPair<int *> = {pointer = 0xabc, value = 1}
+# CHECK: {pointer = 0xabc, value = 1}
p PointerIntPair
-# CHECK: llvm::PointerUnion containing int * = {pointer = 0xabc}
+# CHECK: Containing int * = {pointer = 0xabc}
p PointerUnion
+# CHECK: PointerUnionMembers<llvm::PointerUnion<Z*, float*>,
+p RawPrintingPointerUnion
+
# Switch to print pretty adds newlines to the following statements.
set print pretty
diff --git a/llvm/utils/gdb-scripts/prettyprinters.py b/llvm/utils/gdb-scripts/prettyprinters.py
index 963be1771a49..1a61321aa97b 100644
--- a/llvm/utils/gdb-scripts/prettyprinters.py
+++ b/llvm/utils/gdb-scripts/prettyprinters.py
@@ -316,25 +316,12 @@ 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)
+ # Note: this throws a gdb.error if the info type is not used (by means of a
+ # call to getPointer() or similar) in the current translation unit.
+ enum_type = gdb.lookup_type(info_name + '::MaskAndShiftConstants')
enum_dict = gdb.types.make_enum_dict(enum_type)
ptr_mask = enum_dict[info_name + '::PointerBitMask']
int_shift = enum_dict[info_name + '::IntShift']
@@ -344,26 +331,48 @@ def get_pointer_int_pair(val):
value = ((pair_union >> int_shift) & int_mask)
return (pointer, value)
+class PointerIntPairPrinter:
+ """Print a PointerIntPair."""
+
+ def __init__(self, pointer, value):
+ self.pointer = pointer
+ self.value = value
+
+ def children(self):
+ yield ('pointer', self.pointer)
+ yield ('value', self.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
+ try:
+ pointer, value = get_pointer_int_pair(val)
+ except gdb.error:
+ return None # If PointerIntPair cannot be analyzed, print as raw value.
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)
+ return PointerIntPairPrinter(pointer.cast(pointer_type),
+ value.cast(value_type))
+
+class PointerUnionPrinter:
+ """Print a PointerUnion."""
+
+ def __init__(self, pointer):
+ self.pointer = pointer
+
+ def children(self):
+ yield ('pointer', self.pointer)
+
+ def to_string(self):
+ return "Containing %s" % self.pointer.type
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
+ try:
+ pointer, value = get_pointer_int_pair(val['Val'])
+ except gdb.error:
+ return None # If PointerIntPair cannot be analyzed, print as raw value.
pointer_type = val.type.template_argument(int(value))
- string = 'llvm::PointerUnion containing %s' % pointer_type
- return make_printer(string, [('pointer', pointer.cast(pointer_type))])
+ return PointerUnionPrinter(pointer.cast(pointer_type))
class IlistNodePrinter:
"""Print an llvm::ilist_node object."""
More information about the llvm-commits
mailing list