Add GDB pretty printers for llvm::ilist, llvm::simple_ilist, and llvm::ilist_node.

Reviewers: dblaikie

Reviewed By: dblaikie

Subscribers: merge_guards_bot, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D72589

GitOrigin-RevId: a03ec58da60c044dc3be7cbb0fcd7912769b05ef
diff --git a/llvm-prettyprinters/gdb/prettyprinters.cpp b/llvm-prettyprinters/gdb/prettyprinters.cpp
index bb0e02d..ed556ec 100644
--- a/llvm-prettyprinters/gdb/prettyprinters.cpp
+++ b/llvm-prettyprinters/gdb/prettyprinters.cpp
@@ -6,6 +6,7 @@
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/Twine.h"
+#include "llvm/ADT/ilist.h"
 #include "llvm/Support/Error.h"
 
 int Array[] = {1, 2, 3};
@@ -25,4 +26,25 @@
 llvm::PointerIntPair<int *, 1> PointerIntPair(IntPtr, 1);
 llvm::PointerUnion<float *, int *> PointerUnion(IntPtr);
 
+using IlistTag = llvm::ilist_tag<struct A>;
+using SimpleIlistTag = llvm::ilist_tag<struct B>;
+struct IlistNode : llvm::ilist_node<IlistNode, IlistTag>,
+                   llvm::ilist_node<IlistNode, SimpleIlistTag> {
+  int Value;
+};
+auto Ilist = [] {
+  llvm::ilist<IlistNode, IlistTag> Result;
+  for (int I : {13, 14, 15}) {
+    Result.push_back(new IlistNode);
+    Result.back().Value = I;
+  }
+  return Result;
+}();
+auto SimpleIlist = []() {
+  llvm::simple_ilist<IlistNode, SimpleIlistTag> Result;
+  for (auto &Node : Ilist)
+    Result.push_front(Node);
+  return Result;
+}();
+
 int main() { return 0; }
diff --git a/llvm-prettyprinters/gdb/prettyprinters.gdb b/llvm-prettyprinters/gdb/prettyprinters.gdb
index d6e8164..12baa6e 100644
--- a/llvm-prettyprinters/gdb/prettyprinters.gdb
+++ b/llvm-prettyprinters/gdb/prettyprinters.gdb
@@ -45,4 +45,85 @@
 # CHECK: llvm::PointerUnion containing int * = {pointer = 0xabc}
 p PointerUnion
 
+# Switch to print pretty adds newlines to the following statements.
+set print pretty
 
+# CHECK: {
+# CHECK:   [0] = {
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<A> >> = {
+# CHECK:       prev = [[Ilist_Sentinel:0x.*]] <Ilist>,
+# CHECK:       next = [[Node_14:0x.*]]
+# CHECK:     },
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<B> >> = {
+# CHECK:       prev = [[Node_14]],
+# CHECK:       next = [[SimpleIlist_Sentinel:0x.*]] <SimpleIlist>
+# CHECK:     },
+# CHECK:     members of IlistNode:
+# CHECK:     Value = 13
+# CHECK:   },
+# CHECK:   [1] = {
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<A> >> = {
+# CHECK:       prev = [[Node_13:0x.*]],
+# CHECK:       next = [[Node_15:0x.*]]
+# CHECK:     },
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<B> >> = {
+# CHECK:       prev = [[Node_15]],
+# CHECK:       next = [[Node_13]]
+# CHECK:     },
+# CHECK:     members of IlistNode:
+# CHECK:     Value = 14
+# CHECK:   },
+# CHECK:   [2] = {
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<A> >> = {
+# CHECK:       prev = [[Node_14]],
+# CHECK:       next = [[Ilist_Sentinel]] <Ilist>
+# CHECK:     },
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<B> >> = {
+# CHECK:       prev = [[SimpleIlist_Sentinel]] <SimpleIlist>,
+# CHECK:       next = [[Node_14]]
+# CHECK:     },
+# CHECK:     members of IlistNode:
+# CHECK:     Value = 15
+# CHECK:   }
+# CHECK: }
+p Ilist
+
+# CHECK: {
+# CHECK:   [0] = {
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<A> >> = {
+# CHECK:       prev = [[Node_14]],
+# CHECK:       next = [[Ilist_Sentinel]] <Ilist>
+# CHECK:     },
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<B> >> = {
+# CHECK:       prev = [[SimpleIlist_Sentinel]] <SimpleIlist>,
+# CHECK:       next = [[Node_14]]
+# CHECK:     },
+# CHECK:     members of IlistNode:
+# CHECK:     Value = 15
+# CHECK:   },
+# CHECK:   [1] = {
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<A> >> = {
+# CHECK:       prev = [[Node_13]],
+# CHECK:       next = [[Node_15]]
+# CHECK:     },
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<B> >> = {
+# CHECK:       prev = [[Node_15]],
+# CHECK:       next = [[Node_13]]
+# CHECK:     },
+# CHECK:     members of IlistNode:
+# CHECK:     Value = 14
+# CHECK:   },
+# CHECK:   [2] = {
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<A> >> = {
+# CHECK:       prev = [[Ilist_Sentinel]] <Ilist>,
+# CHECK:       next = [[Node_14]]
+# CHECK:     },
+# CHECK:     <llvm::ilist_node<IlistNode, llvm::ilist_tag<B> >> = {
+# CHECK:       prev = [[Node_14]],
+# CHECK:       next = [[SimpleIlist_Sentinel]] <SimpleIlist>
+# CHECK:     },
+# CHECK:     members of IlistNode:
+# CHECK:     Value = 13
+# CHECK:   }
+# CHECK: }
+p SimpleIlist