danilashtefan updated this revision to Diff 389700.
danilashtefan added a comment.

As we discussed offline, I add the print tests, since SBValue.GetValue() 
doesn't work for complex structures


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D114008/new/

https://reviews.llvm.org/D114008

Files:
  lldb/examples/synthetic/gnu_libstdcpp.py
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
  
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/Makefile
  
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py
  
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/main.cpp

Index: lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/main.cpp
@@ -0,0 +1,40 @@
+#include <deque>
+
+struct Foo_small {
+  int a;
+  int b;
+  int c;
+
+  Foo_small(int a, int b, int c) : a(a), b(b), c(c) {}
+};
+
+struct Foo_large {
+  int a;
+  int b;
+  int c;
+  char d[1000] = {0};
+
+  Foo_large(int a, int b, int c) : a(a), b(b), c(c) {}
+};
+
+template <typename T> T fill(T deque) {
+  for (int i = 0; i < 100; i++) {
+    deque.push_back({i, i + 1, i + 2});
+    deque.push_front({-i, -(i + 1), -(i + 2)});
+  }
+  return deque;
+}
+
+int main() {
+  std::deque<int> empty;
+  std::deque<int> deque_1 = {1};
+  std::deque<int> deque_3 = {3, 1, 2};
+
+  std::deque<Foo_small> deque_200_small;
+  deque_200_small = fill<std::deque<Foo_small>>(deque_200_small);
+
+  std::deque<Foo_large> deque_200_large;
+  deque_200_large = fill<std::deque<Foo_large>>(deque_200_large);
+
+  return empty.size() + deque_1.front() + deque_3.front(); // break here
+}
Index: lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py
@@ -0,0 +1,204 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+USE_LIBSTDCPP = "USE_LIBSTDCPP"
+USE_LIBCPP = "USE_LIBCPP"
+
+class GenericDequeDataFormatterTestCase(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    def findVariable(self, name):
+        var = self.frame().FindVariable(name)
+        self.assertTrue(var.IsValid())
+        return var
+
+    def getVariableType(self, name):
+        var = self.findVariable(name)
+        return var.GetType().GetDisplayTypeName()
+
+    def check_size(self, var_name, size):
+        var = self.findVariable(var_name)
+        self.assertEqual(var.GetNumChildren(), size)
+        
+
+    def do_test(self, stdlib_type):
+        self.build()
+        lldbutil.run_to_source_breakpoint(self, "break here",
+                                          lldb.SBFileSpec("main.cpp"))
+
+        self.expect_expr("empty", result_children=[])
+        self.expect_expr("deque_1", result_children=[
+            ValueCheck(name="[0]", value="1"),
+        ])
+        self.expect_expr("deque_3", result_children=[
+            ValueCheck(name="[0]", value="3"),
+            ValueCheck(name="[1]", value="1"),
+            ValueCheck(name="[2]", value="2")
+        ])
+
+        self.check_size("deque_200_small", 200)
+
+        # SBValue.GetValue() doesn't work for complex structures, so the only way to test formatter is printing
+        children = "[0] = (a = -99, b = -100, c = -101)\n[1] = (a = -98, b = -99, c = -100)\n[2] = (a = -97, b = -98, c = -99)\n[3] = (a = -96, b = -97, c = -98)\n" \
+        "[4] = (a = -95, b = -96, c = -97)\n[5] = (a = -94, b = -95, c = -96)\n[6] = (a = -93, b = -94, c = -95)\n"\
+        "[7] = (a = -92, b = -93, c = -94)\n[8] = (a = -91, b = -92, c = -93)\n[9] = (a = -90, b = -91, c = -92)\n"\
+        "[10] = (a = -89, b = -90, c = -91)\n[11] = (a = -88, b = -89, c = -90)\n[12] = (a = -87, b = -88, c = -89)\n"\
+        "[13] = (a = -86, b = -87, c = -88)\n[14] = (a = -85, b = -86, c = -87)\n[15] = (a = -84, b = -85, c = -86)\n"\
+        "[16] = (a = -83, b = -84, c = -85)\n[17] = (a = -82, b = -83, c = -84)\n[18] = (a = -81, b = -82, c = -83)\n"\
+        "[19] = (a = -80, b = -81, c = -82)\n[20] = (a = -79, b = -80, c = -81)\n[21] = (a = -78, b = -79, c = -80)\n"\
+        "[22] = (a = -77, b = -78, c = -79)\n[23] = (a = -76, b = -77, c = -78)\n[24] = (a = -75, b = -76, c = -77)\n"\
+        "[25] = (a = -74, b = -75, c = -76)\n[26] = (a = -73, b = -74, c = -75)\n[27] = (a = -72, b = -73, c = -74)\n"\
+        "[28] = (a = -71, b = -72, c = -73)\n[29] = (a = -70, b = -71, c = -72)\n[30] = (a = -69, b = -70, c = -71)\n"\
+        "[31] = (a = -68, b = -69, c = -70)\n[32] = (a = -67, b = -68, c = -69)\n[33] = (a = -66, b = -67, c = -68)\n"\
+        "[34] = (a = -65, b = -66, c = -67)\n[35] = (a = -64, b = -65, c = -66)\n[36] = (a = -63, b = -64, c = -65)\n"\
+        "[37] = (a = -62, b = -63, c = -64)\n[38] = (a = -61, b = -62, c = -63)\n[39] = (a = -60, b = -61, c = -62)\n"\
+        "[40] = (a = -59, b = -60, c = -61)\n[41] = (a = -58, b = -59, c = -60)\n[42] = (a = -57, b = -58, c = -59)\n"\
+        "[43] = (a = -56, b = -57, c = -58)\n[44] = (a = -55, b = -56, c = -57)\n[45] = (a = -54, b = -55, c = -56)\n"\
+        "[46] = (a = -53, b = -54, c = -55)\n[47] = (a = -52, b = -53, c = -54)\n[48] = (a = -51, b = -52, c = -53)\n"\
+        "[49] = (a = -50, b = -51, c = -52)\n[50] = (a = -49, b = -50, c = -51)\n[51] = (a = -48, b = -49, c = -50)\n"\
+        "[52] = (a = -47, b = -48, c = -49)\n[53] = (a = -46, b = -47, c = -48)\n[54] = (a = -45, b = -46, c = -47)\n"\
+        "[55] = (a = -44, b = -45, c = -46)\n[56] = (a = -43, b = -44, c = -45)\n[57] = (a = -42, b = -43, c = -44)\n"\
+        "[58] = (a = -41, b = -42, c = -43)\n[59] = (a = -40, b = -41, c = -42)\n[60] = (a = -39, b = -40, c = -41)\n"\
+        "[61] = (a = -38, b = -39, c = -40)\n[62] = (a = -37, b = -38, c = -39)\n[63] = (a = -36, b = -37, c = -38)\n"\
+        "[64] = (a = -35, b = -36, c = -37)\n[65] = (a = -34, b = -35, c = -36)\n[66] = (a = -33, b = -34, c = -35)\n"\
+        "[67] = (a = -32, b = -33, c = -34)\n[68] = (a = -31, b = -32, c = -33)\n[69] = (a = -30, b = -31, c = -32)\n"\
+        "[70] = (a = -29, b = -30, c = -31)\n[71] = (a = -28, b = -29, c = -30)\n[72] = (a = -27, b = -28, c = -29)\n"\
+        "[73] = (a = -26, b = -27, c = -28)\n[74] = (a = -25, b = -26, c = -27)\n[75] = (a = -24, b = -25, c = -26)\n"\
+        "[76] = (a = -23, b = -24, c = -25)\n[77] = (a = -22, b = -23, c = -24)\n[78] = (a = -21, b = -22, c = -23)\n"\
+        "[79] = (a = -20, b = -21, c = -22)\n[80] = (a = -19, b = -20, c = -21)\n[81] = (a = -18, b = -19, c = -20)\n"\
+        "[82] = (a = -17, b = -18, c = -19)\n[83] = (a = -16, b = -17, c = -18)\n[84] = (a = -15, b = -16, c = -17)\n"\
+        "[85] = (a = -14, b = -15, c = -16)\n[86] = (a = -13, b = -14, c = -15)\n[87] = (a = -12, b = -13, c = -14)\n"\
+        "[88] = (a = -11, b = -12, c = -13)\n[89] = (a = -10, b = -11, c = -12)\n[90] = (a = -9, b = -10, c = -11)\n"\
+        "[91] = (a = -8, b = -9, c = -10)\n[92] = (a = -7, b = -8, c = -9)\n[93] = (a = -6, b = -7, c = -8)\n"\
+        "[94] = (a = -5, b = -6, c = -7)\n[95] = (a = -4, b = -5, c = -6)\n[96] = (a = -3, b = -4, c = -5)\n"\
+        "[97] = (a = -2, b = -3, c = -4)\n[98] = (a = -1, b = -2, c = -3)\n[99] = (a = 0, b = -1, c = -2)\n"\
+        "[100] = (a = 0, b = 1, c = 2)\n[101] = (a = 1, b = 2, c = 3)\n[102] = (a = 2, b = 3, c = 4)\n"\
+        "[103] = (a = 3, b = 4, c = 5)\n[104] = (a = 4, b = 5, c = 6)\n[105] = (a = 5, b = 6, c = 7)\n"\
+        "[106] = (a = 6, b = 7, c = 8)\n[107] = (a = 7, b = 8, c = 9)\n[108] = (a = 8, b = 9, c = 10)\n"\
+        "[109] = (a = 9, b = 10, c = 11)\n[110] = (a = 10, b = 11, c = 12)\n[111] = (a = 11, b = 12, c = 13)\n"\
+        "[112] = (a = 12, b = 13, c = 14)\n[113] = (a = 13, b = 14, c = 15)\n[114] = (a = 14, b = 15, c = 16)\n"\
+        "[115] = (a = 15, b = 16, c = 17)\n[116] = (a = 16, b = 17, c = 18)\n[117] = (a = 17, b = 18, c = 19)\n"\
+        "[118] = (a = 18, b = 19, c = 20)\n[119] = (a = 19, b = 20, c = 21)\n[120] = (a = 20, b = 21, c = 22)\n"\
+        "[121] = (a = 21, b = 22, c = 23)\n[122] = (a = 22, b = 23, c = 24)\n[123] = (a = 23, b = 24, c = 25)\n"\
+        "[124] = (a = 24, b = 25, c = 26)\n[125] = (a = 25, b = 26, c = 27)\n[126] = (a = 26, b = 27, c = 28)\n"\
+        "[127] = (a = 27, b = 28, c = 29)\n[128] = (a = 28, b = 29, c = 30)\n[129] = (a = 29, b = 30, c = 31)\n"\
+        "[130] = (a = 30, b = 31, c = 32)\n[131] = (a = 31, b = 32, c = 33)\n[132] = (a = 32, b = 33, c = 34)\n"\
+        "[133] = (a = 33, b = 34, c = 35)\n[134] = (a = 34, b = 35, c = 36)\n[135] = (a = 35, b = 36, c = 37)\n"\
+        "[136] = (a = 36, b = 37, c = 38)\n[137] = (a = 37, b = 38, c = 39)\n[138] = (a = 38, b = 39, c = 40)\n"\
+        "[139] = (a = 39, b = 40, c = 41)\n[140] = (a = 40, b = 41, c = 42)\n[141] = (a = 41, b = 42, c = 43)\n"\
+        "[142] = (a = 42, b = 43, c = 44)\n[143] = (a = 43, b = 44, c = 45)\n[144] = (a = 44, b = 45, c = 46)\n"\
+        "[145] = (a = 45, b = 46, c = 47)\n[146] = (a = 46, b = 47, c = 48)\n[147] = (a = 47, b = 48, c = 49)\n"\
+        "[148] = (a = 48, b = 49, c = 50)\n[149] = (a = 49, b = 50, c = 51)\n[150] = (a = 50, b = 51, c = 52)\n"\
+        "[151] = (a = 51, b = 52, c = 53)\n[152] = (a = 52, b = 53, c = 54)\n[153] = (a = 53, b = 54, c = 55)\n"\
+        "[154] = (a = 54, b = 55, c = 56)\n[155] = (a = 55, b = 56, c = 57)\n[156] = (a = 56, b = 57, c = 58)\n"\
+        "[157] = (a = 57, b = 58, c = 59)\n[158] = (a = 58, b = 59, c = 60)\n[159] = (a = 59, b = 60, c = 61)\n"\
+        "[160] = (a = 60, b = 61, c = 62)\n[161] = (a = 61, b = 62, c = 63)\n[162] = (a = 62, b = 63, c = 64)\n"\
+        "[163] = (a = 63, b = 64, c = 65)\n[164] = (a = 64, b = 65, c = 66)\n[165] = (a = 65, b = 66, c = 67)\n"\
+        "[166] = (a = 66, b = 67, c = 68)\n[167] = (a = 67, b = 68, c = 69)\n[168] = (a = 68, b = 69, c = 70)\n"\
+        "[169] = (a = 69, b = 70, c = 71)\n[170] = (a = 70, b = 71, c = 72)\n[171] = (a = 71, b = 72, c = 73)\n"\
+        "[172] = (a = 72, b = 73, c = 74)\n[173] = (a = 73, b = 74, c = 75)\n[174] = (a = 74, b = 75, c = 76)\n"\
+        "[175] = (a = 75, b = 76, c = 77)\n[176] = (a = 76, b = 77, c = 78)\n[177] = (a = 77, b = 78, c = 79)\n"\
+        "[178] = (a = 78, b = 79, c = 80)\n[179] = (a = 79, b = 80, c = 81)\n[180] = (a = 80, b = 81, c = 82)\n"\
+        "[181] = (a = 81, b = 82, c = 83)\n[182] = (a = 82, b = 83, c = 84)\n[183] = (a = 83, b = 84, c = 85)\n"\
+        "[184] = (a = 84, b = 85, c = 86)\n[185] = (a = 85, b = 86, c = 87)\n[186] = (a = 86, b = 87, c = 88)\n"\
+        "[187] = (a = 87, b = 88, c = 89)\n[188] = (a = 88, b = 89, c = 90)\n[189] = (a = 89, b = 90, c = 91)\n"\
+        "[190] = (a = 90, b = 91, c = 92)\n[191] = (a = 91, b = 92, c = 93)\n[192] = (a = 92, b = 93, c = 94)\n"\
+        "[193] = (a = 93, b = 94, c = 95)\n[194] = (a = 94, b = 95, c = 96)\n[195] = (a = 95, b = 96, c = 97)\n"\
+        "[196] = (a = 96, b = 97, c = 98)\n[197] = (a = 97, b = 98, c = 99)\n[198] = (a = 98, b = 99, c = 100)\n"
+        "[199] = (a = 99, b = 100, c = 101)"
+
+        array_children = children.split("\n")
+
+        self.expect("frame variable deque_200_small", matching=True,
+                     substrs = array_children)
+        
+        self.check_size("deque_200_large", 200)
+
+        d_elem=""
+        for i in range(999):
+            d_elem = d_elem + '\\0'
+
+        children = "[0] = (a = -99, b = -100, c = -101, d = \"" + d_elem +"\")" + "\n[1] = (a = -98, b = -99, c = -100, d = \"" + d_elem +"\")" + "\n[2] = (a = -97, b = -98, c = -99, d = \"" + d_elem +"\")" + "\n[3] = (a = -96, b = -97, c = -98, d = \"" + d_elem +"\")" + "\n" \
+        "[4] = (a = -95, b = -96, c = -97, d = \"" + d_elem +"\")" + "\n[5] = (a = -94, b = -95, c = -96, d = \"" + d_elem +"\")" + "\n[6] = (a = -93, b = -94, c = -95, d = \"" + d_elem +"\")" + "\n"\
+        "[7] = (a = -92, b = -93, c = -94, d = \"" + d_elem +"\")" + "\n[8] = (a = -91, b = -92, c = -93, d = \"" + d_elem +"\")" + "\n[9] = (a = -90, b = -91, c = -92, d = \"" + d_elem +"\")" + "\n"\
+        "[10] = (a = -89, b = -90, c = -91, d = \"" + d_elem +"\")" + "\n[11] = (a = -88, b = -89, c = -90, d = \"" + d_elem +"\")" + "\n[12] = (a = -87, b = -88, c = -89, d = \"" + d_elem +"\")" + "\n"\
+        "[13] = (a = -86, b = -87, c = -88, d = \"" + d_elem +"\")" + "\n[14] = (a = -85, b = -86, c = -87, d = \"" + d_elem +"\")" + "\n[15] = (a = -84, b = -85, c = -86, d = \"" + d_elem +"\")" + "\n"\
+        "[16] = (a = -83, b = -84, c = -85, d = \"" + d_elem +"\")" + "\n[17] = (a = -82, b = -83, c = -84, d = \"" + d_elem +"\")" + "\n[18] = (a = -81, b = -82, c = -83, d = \"" + d_elem +"\")" + "\n"\
+        "[19] = (a = -80, b = -81, c = -82, d = \"" + d_elem +"\")" + "\n[20] = (a = -79, b = -80, c = -81, d = \"" + d_elem +"\")" + "\n[21] = (a = -78, b = -79, c = -80, d = \"" + d_elem +"\")" + "\n"\
+        "[22] = (a = -77, b = -78, c = -79, d = \"" + d_elem +"\")" + "\n[23] = (a = -76, b = -77, c = -78, d = \"" + d_elem +"\")" + "\n[24] = (a = -75, b = -76, c = -77, d = \"" + d_elem +"\")" + "\n"\
+        "[25] = (a = -74, b = -75, c = -76, d = \"" + d_elem +"\")" + "\n[26] = (a = -73, b = -74, c = -75, d = \"" + d_elem +"\")" + "\n[27] = (a = -72, b = -73, c = -74, d = \"" + d_elem +"\")" + "\n"\
+        "[28] = (a = -71, b = -72, c = -73, d = \"" + d_elem +"\")" + "\n[29] = (a = -70, b = -71, c = -72, d = \"" + d_elem +"\")" + "\n[30] = (a = -69, b = -70, c = -71, d = \"" + d_elem +"\")" + "\n"\
+        "[31] = (a = -68, b = -69, c = -70, d = \"" + d_elem +"\")" + "\n[32] = (a = -67, b = -68, c = -69, d = \"" + d_elem +"\")" + "\n[33] = (a = -66, b = -67, c = -68, d = \"" + d_elem +"\")" + "\n"\
+        "[34] = (a = -65, b = -66, c = -67, d = \"" + d_elem +"\")" + "\n[35] = (a = -64, b = -65, c = -66, d = \"" + d_elem +"\")" + "\n[36] = (a = -63, b = -64, c = -65, d = \"" + d_elem +"\")" + "\n"\
+        "[37] = (a = -62, b = -63, c = -64, d = \"" + d_elem +"\")" + "\n[38] = (a = -61, b = -62, c = -63, d = \"" + d_elem +"\")" + "\n[39] = (a = -60, b = -61, c = -62, d = \"" + d_elem +"\")" + "\n"\
+        "[40] = (a = -59, b = -60, c = -61, d = \"" + d_elem +"\")" + "\n[41] = (a = -58, b = -59, c = -60, d = \"" + d_elem +"\")" + "\n[42] = (a = -57, b = -58, c = -59, d = \"" + d_elem +"\")" + "\n"\
+        "[43] = (a = -56, b = -57, c = -58, d = \"" + d_elem +"\")" + "\n[44] = (a = -55, b = -56, c = -57, d = \"" + d_elem +"\")" + "\n[45] = (a = -54, b = -55, c = -56, d = \"" + d_elem +"\")" + "\n"\
+        "[46] = (a = -53, b = -54, c = -55, d = \"" + d_elem +"\")" + "\n[47] = (a = -52, b = -53, c = -54, d = \"" + d_elem +"\")" + "\n[48] = (a = -51, b = -52, c = -53, d = \"" + d_elem +"\")" + "\n"\
+        "[49] = (a = -50, b = -51, c = -52, d = \"" + d_elem +"\")" + "\n[50] = (a = -49, b = -50, c = -51, d = \"" + d_elem +"\")" + "\n[51] = (a = -48, b = -49, c = -50, d = \"" + d_elem +"\")" + "\n"\
+        "[52] = (a = -47, b = -48, c = -49, d = \"" + d_elem +"\")" + "\n[53] = (a = -46, b = -47, c = -48, d = \"" + d_elem +"\")" + "\n[54] = (a = -45, b = -46, c = -47, d = \"" + d_elem +"\")" + "\n"\
+        "[55] = (a = -44, b = -45, c = -46, d = \"" + d_elem +"\")" + "\n[56] = (a = -43, b = -44, c = -45, d = \"" + d_elem +"\")" + "\n[57] = (a = -42, b = -43, c = -44, d = \"" + d_elem +"\")" + "\n"\
+        "[58] = (a = -41, b = -42, c = -43, d = \"" + d_elem +"\")" + "\n[59] = (a = -40, b = -41, c = -42, d = \"" + d_elem +"\")" + "\n[60] = (a = -39, b = -40, c = -41, d = \"" + d_elem +"\")" + "\n"\
+        "[61] = (a = -38, b = -39, c = -40, d = \"" + d_elem +"\")" + "\n[62] = (a = -37, b = -38, c = -39, d = \"" + d_elem +"\")" + "\n[63] = (a = -36, b = -37, c = -38, d = \"" + d_elem +"\")" + "\n"\
+        "[64] = (a = -35, b = -36, c = -37, d = \"" + d_elem +"\")" + "\n[65] = (a = -34, b = -35, c = -36, d = \"" + d_elem +"\")" + "\n[66] = (a = -33, b = -34, c = -35, d = \"" + d_elem +"\")" + "\n"\
+        "[67] = (a = -32, b = -33, c = -34, d = \"" + d_elem +"\")" + "\n[68] = (a = -31, b = -32, c = -33, d = \"" + d_elem +"\")" + "\n[69] = (a = -30, b = -31, c = -32, d = \"" + d_elem +"\")" + "\n"\
+        "[70] = (a = -29, b = -30, c = -31, d = \"" + d_elem +"\")" + "\n[71] = (a = -28, b = -29, c = -30, d = \"" + d_elem +"\")" + "\n[72] = (a = -27, b = -28, c = -29, d = \"" + d_elem +"\")" + "\n"\
+        "[73] = (a = -26, b = -27, c = -28, d = \"" + d_elem +"\")" + "\n[74] = (a = -25, b = -26, c = -27, d = \"" + d_elem +"\")" + "\n[75] = (a = -24, b = -25, c = -26, d = \"" + d_elem +"\")" + "\n"\
+        "[76] = (a = -23, b = -24, c = -25, d = \"" + d_elem +"\")" + "\n[77] = (a = -22, b = -23, c = -24, d = \"" + d_elem +"\")" + "\n[78] = (a = -21, b = -22, c = -23, d = \"" + d_elem +"\")" + "\n"\
+        "[79] = (a = -20, b = -21, c = -22, d = \"" + d_elem +"\")" + "\n[80] = (a = -19, b = -20, c = -21, d = \"" + d_elem +"\")" + "\n[81] = (a = -18, b = -19, c = -20, d = \"" + d_elem +"\")" + "\n"\
+        "[82] = (a = -17, b = -18, c = -19, d = \"" + d_elem +"\")" + "\n[83] = (a = -16, b = -17, c = -18, d = \"" + d_elem +"\")" + "\n[84] = (a = -15, b = -16, c = -17, d = \"" + d_elem +"\")" + "\n"\
+        "[85] = (a = -14, b = -15, c = -16, d = \"" + d_elem +"\")" + "\n[86] = (a = -13, b = -14, c = -15, d = \"" + d_elem +"\")" + "\n[87] = (a = -12, b = -13, c = -14, d = \"" + d_elem +"\")" + "\n"\
+        "[88] = (a = -11, b = -12, c = -13, d = \"" + d_elem +"\")" + "\n[89] = (a = -10, b = -11, c = -12, d = \"" + d_elem +"\")" + "\n[90] = (a = -9, b = -10, c = -11, d = \"" + d_elem +"\")" + "\n"\
+        "[91] = (a = -8, b = -9, c = -10, d = \"" + d_elem +"\")" + "\n[92] = (a = -7, b = -8, c = -9, d = \"" + d_elem +"\")" + "\n[93] = (a = -6, b = -7, c = -8, d = \"" + d_elem +"\")" + "\n"\
+        "[94] = (a = -5, b = -6, c = -7, d = \"" + d_elem +"\")" + "\n[95] = (a = -4, b = -5, c = -6, d = \"" + d_elem +"\")" + "\n[96] = (a = -3, b = -4, c = -5, d = \"" + d_elem +"\")" + "\n"\
+        "[97] = (a = -2, b = -3, c = -4, d = \"" + d_elem +"\")" + "\n[98] = (a = -1, b = -2, c = -3, d = \"" + d_elem +"\")" + "\n[99] = (a = 0, b = -1, c = -2, d = \"" + d_elem +"\")" + "\n"\
+        "[100] = (a = 0, b = 1, c = 2, d = \"" + d_elem +"\")" + "\n[101] = (a = 1, b = 2, c = 3, d = \"" + d_elem +"\")" + "\n[102] = (a = 2, b = 3, c = 4, d = \"" + d_elem +"\")" + "\n"\
+        "[103] = (a = 3, b = 4, c = 5, d = \"" + d_elem +"\")" + "\n[104] = (a = 4, b = 5, c = 6, d = \"" + d_elem +"\")" + "\n[105] = (a = 5, b = 6, c = 7, d = \"" + d_elem +"\")" + "\n"\
+        "[106] = (a = 6, b = 7, c = 8, d = \"" + d_elem +"\")" + "\n[107] = (a = 7, b = 8, c = 9, d = \"" + d_elem +"\")" + "\n[108] = (a = 8, b = 9, c = 10, d = \"" + d_elem +"\")" + "\n"\
+        "[109] = (a = 9, b = 10, c = 11, d = \"" + d_elem +"\")" + "\n[110] = (a = 10, b = 11, c = 12, d = \"" + d_elem +"\")" + "\n[111] = (a = 11, b = 12, c = 13, d = \"" + d_elem +"\")" + "\n"\
+        "[112] = (a = 12, b = 13, c = 14, d = \"" + d_elem +"\")" + "\n[113] = (a = 13, b = 14, c = 15, d = \"" + d_elem +"\")" + "\n[114] = (a = 14, b = 15, c = 16, d = \"" + d_elem +"\")" + "\n"\
+        "[115] = (a = 15, b = 16, c = 17, d = \"" + d_elem +"\")" + "\n[116] = (a = 16, b = 17, c = 18, d = \"" + d_elem +"\")" + "\n[117] = (a = 17, b = 18, c = 19, d = \"" + d_elem +"\")" + "\n"\
+        "[118] = (a = 18, b = 19, c = 20, d = \"" + d_elem +"\")" + "\n[119] = (a = 19, b = 20, c = 21, d = \"" + d_elem +"\")" + "\n[120] = (a = 20, b = 21, c = 22, d = \"" + d_elem +"\")" + "\n"\
+        "[121] = (a = 21, b = 22, c = 23, d = \"" + d_elem +"\")" + "\n[122] = (a = 22, b = 23, c = 24, d = \"" + d_elem +"\")" + "\n[123] = (a = 23, b = 24, c = 25, d = \"" + d_elem +"\")" + "\n"\
+        "[124] = (a = 24, b = 25, c = 26, d = \"" + d_elem +"\")" + "\n[125] = (a = 25, b = 26, c = 27, d = \"" + d_elem +"\")" + "\n[126] = (a = 26, b = 27, c = 28, d = \"" + d_elem +"\")" + "\n"\
+        "[127] = (a = 27, b = 28, c = 29, d = \"" + d_elem +"\")" + "\n[128] = (a = 28, b = 29, c = 30, d = \"" + d_elem +"\")" + "\n[129] = (a = 29, b = 30, c = 31, d = \"" + d_elem +"\")" + "\n"\
+        "[130] = (a = 30, b = 31, c = 32, d = \"" + d_elem +"\")" + "\n[131] = (a = 31, b = 32, c = 33, d = \"" + d_elem +"\")" + "\n[132] = (a = 32, b = 33, c = 34, d = \"" + d_elem +"\")" + "\n"\
+        "[133] = (a = 33, b = 34, c = 35, d = \"" + d_elem +"\")" + "\n[134] = (a = 34, b = 35, c = 36, d = \"" + d_elem +"\")" + "\n[135] = (a = 35, b = 36, c = 37, d = \"" + d_elem +"\")" + "\n"\
+        "[136] = (a = 36, b = 37, c = 38, d = \"" + d_elem +"\")" + "\n[137] = (a = 37, b = 38, c = 39, d = \"" + d_elem +"\")" + "\n[138] = (a = 38, b = 39, c = 40, d = \"" + d_elem +"\")" + "\n"\
+        "[139] = (a = 39, b = 40, c = 41, d = \"" + d_elem +"\")" + "\n[140] = (a = 40, b = 41, c = 42, d = \"" + d_elem +"\")" + "\n[141] = (a = 41, b = 42, c = 43, d = \"" + d_elem +"\")" + "\n"\
+        "[142] = (a = 42, b = 43, c = 44, d = \"" + d_elem +"\")" + "\n[143] = (a = 43, b = 44, c = 45, d = \"" + d_elem +"\")" + "\n[144] = (a = 44, b = 45, c = 46, d = \"" + d_elem +"\")" + "\n"\
+        "[145] = (a = 45, b = 46, c = 47, d = \"" + d_elem +"\")" + "\n[146] = (a = 46, b = 47, c = 48, d = \"" + d_elem +"\")" + "\n[147] = (a = 47, b = 48, c = 49, d = \"" + d_elem +"\")" + "\n"\
+        "[148] = (a = 48, b = 49, c = 50, d = \"" + d_elem +"\")" + "\n[149] = (a = 49, b = 50, c = 51, d = \"" + d_elem +"\")" + "\n[150] = (a = 50, b = 51, c = 52, d = \"" + d_elem +"\")" + "\n"\
+        "[151] = (a = 51, b = 52, c = 53, d = \"" + d_elem +"\")" + "\n[152] = (a = 52, b = 53, c = 54, d = \"" + d_elem +"\")" + "\n[153] = (a = 53, b = 54, c = 55, d = \"" + d_elem +"\")" + "\n"\
+        "[154] = (a = 54, b = 55, c = 56, d = \"" + d_elem +"\")" + "\n[155] = (a = 55, b = 56, c = 57, d = \"" + d_elem +"\")" + "\n[156] = (a = 56, b = 57, c = 58, d = \"" + d_elem +"\")" + "\n"\
+        "[157] = (a = 57, b = 58, c = 59, d = \"" + d_elem +"\")" + "\n[158] = (a = 58, b = 59, c = 60, d = \"" + d_elem +"\")" + "\n[159] = (a = 59, b = 60, c = 61, d = \"" + d_elem +"\")" + "\n"\
+        "[160] = (a = 60, b = 61, c = 62, d = \"" + d_elem +"\")" + "\n[161] = (a = 61, b = 62, c = 63, d = \"" + d_elem +"\")" + "\n[162] = (a = 62, b = 63, c = 64, d = \"" + d_elem +"\")" + "\n"\
+        "[163] = (a = 63, b = 64, c = 65, d = \"" + d_elem +"\")" + "\n[164] = (a = 64, b = 65, c = 66, d = \"" + d_elem +"\")" + "\n[165] = (a = 65, b = 66, c = 67, d = \"" + d_elem +"\")" + "\n"\
+        "[166] = (a = 66, b = 67, c = 68, d = \"" + d_elem +"\")" + "\n[167] = (a = 67, b = 68, c = 69, d = \"" + d_elem +"\")" + "\n[168] = (a = 68, b = 69, c = 70, d = \"" + d_elem +"\")" + "\n"\
+        "[169] = (a = 69, b = 70, c = 71, d = \"" + d_elem +"\")" + "\n[170] = (a = 70, b = 71, c = 72, d = \"" + d_elem +"\")" + "\n[171] = (a = 71, b = 72, c = 73, d = \"" + d_elem +"\")" + "\n"\
+        "[172] = (a = 72, b = 73, c = 74, d = \"" + d_elem +"\")" + "\n[173] = (a = 73, b = 74, c = 75, d = \"" + d_elem +"\")" + "\n[174] = (a = 74, b = 75, c = 76, d = \"" + d_elem +"\")" + "\n"\
+        "[175] = (a = 75, b = 76, c = 77, d = \"" + d_elem +"\")" + "\n[176] = (a = 76, b = 77, c = 78, d = \"" + d_elem +"\")" + "\n[177] = (a = 77, b = 78, c = 79, d = \"" + d_elem +"\")" + "\n"\
+        "[178] = (a = 78, b = 79, c = 80, d = \"" + d_elem +"\")" + "\n[179] = (a = 79, b = 80, c = 81, d = \"" + d_elem +"\")" + "\n[180] = (a = 80, b = 81, c = 82, d = \"" + d_elem +"\")" + "\n"\
+        "[181] = (a = 81, b = 82, c = 83, d = \"" + d_elem +"\")" + "\n[182] = (a = 82, b = 83, c = 84, d = \"" + d_elem +"\")" + "\n[183] = (a = 83, b = 84, c = 85, d = \"" + d_elem +"\")" + "\n"\
+        "[184] = (a = 84, b = 85, c = 86, d = \"" + d_elem +"\")" + "\n[185] = (a = 85, b = 86, c = 87, d = \"" + d_elem +"\")" + "\n[186] = (a = 86, b = 87, c = 88, d = \"" + d_elem +"\")" + "\n"\
+        "[187] = (a = 87, b = 88, c = 89, d = \"" + d_elem +"\")" + "\n[188] = (a = 88, b = 89, c = 90, d = \"" + d_elem +"\")" + "\n[189] = (a = 89, b = 90, c = 91, d = \"" + d_elem +"\")" + "\n"\
+        "[190] = (a = 90, b = 91, c = 92, d = \"" + d_elem +"\")" + "\n[191] = (a = 91, b = 92, c = 93, d = \"" + d_elem +"\")" + "\n[192] = (a = 92, b = 93, c = 94, d = \"" + d_elem +"\")" + "\n"\
+        "[193] = (a = 93, b = 94, c = 95, d = \"" + d_elem +"\")" + "\n[194] = (a = 94, b = 95, c = 96, d = \"" + d_elem +"\")" + "\n[195] = (a = 95, b = 96, c = 97, d = \"" + d_elem +"\")" + "\n"\
+        "[196] = (a = 96, b = 97, c = 98, d = \"" + d_elem +"\")" + "\n[197] = (a = 97, b = 98, c = 99, d = \"" + d_elem +"\")" + "\n[198] = (a = 98, b = 99, c = 100, d = \"" + d_elem +"\")" + "\n"
+        "[199] = (a = 99, b = 100, c = 101), d = \"" + d_elem +"\")"
+
+        
+        array_children = children.split("\n")
+
+        self.expect("frame variable deque_200_large", matching=True,
+                     substrs = array_children)
+    
+    @add_test_categories(["libstdcxx"])
+    def test_libstdcpp(self):
+        self.do_test(USE_LIBSTDCPP)
+
+    @add_test_categories(["libc++"])
+    def test_libcpp(self):
+         self.do_test(USE_LIBCPP)
\ No newline at end of file
Index: lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
===================================================================
--- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -918,6 +918,11 @@
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
+  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
+      RegularExpression("^std::deque<.+>(( )?&)?$"),
+      SyntheticChildrenSP(new ScriptedSyntheticChildren(
+          stl_deref_flags,
+          "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
       RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
@@ -946,6 +951,10 @@
       RegularExpression("^std::set<.+> >(( )?&)?$"),
       TypeSummaryImplSP(
           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
+      RegularExpression("^std::deque<.+>(( )?&)?$"),
+      TypeSummaryImplSP(
+          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
       RegularExpression("^std::multimap<.+> >(( )?&)?$"),
       TypeSummaryImplSP(
Index: lldb/examples/synthetic/gnu_libstdcpp.py
===================================================================
--- lldb/examples/synthetic/gnu_libstdcpp.py
+++ lldb/examples/synthetic/gnu_libstdcpp.py
@@ -8,6 +8,137 @@
 # You are encouraged to look at the STL implementation for your platform
 # before relying on these formatters to do the right thing for your setup
 
+class StdDequeSynthProvider:
+    def __init__(self, valobj, d):
+        self.valobj = valobj
+        self.pointer_size = self.valobj.GetProcess().GetAddressByteSize()
+        self.count = None
+        self.block_size = -1
+        self.element_size = -1
+        self.find_block_size()
+ 
+ 
+    def find_block_size(self):
+        # in order to use the deque we must have the block size, or else
+        # it's impossible to know what memory addresses are valid
+        self.element_type = self.valobj.GetType().GetTemplateArgumentType(0)
+        if not self.element_type.IsValid():
+            return
+        self.element_size = self.element_type.GetByteSize()
+        # The block size (i.e. number of elements per subarray) is defined in
+        # this piece of code, so we need to replicate it.
+        #
+        # #define _GLIBCXX_DEQUE_BUF_SIZE 512
+        #
+        # return (__size < _GLIBCXX_DEQUE_BUF_SIZE
+        #   ? size_t(_GLIBCXX_DEQUE_BUF_SIZE / __size) : size_t(1));
+        if self.element_size < 512:
+            self.block_size = 512 // self.element_size
+        else:
+            self.block_size = 1
+ 
+    def num_children(self):
+        if self.count is None:
+            return 0
+        return self.count
+ 
+    def has_children(self):
+        return True
+ 
+    def get_child_index(self, name):
+        try:
+            return int(name.lstrip('[').rstrip(']'))
+        except:
+            return -1
+ 
+    def get_child_at_index(self, index):
+        if index < 0 or self.count is None:
+            return None
+        if index >= self.num_children():
+            return None
+        try:
+            name = '[' + str(index) + ']'
+            # We first look for the element in the first subarray,
+            # which might be incomplete.
+            if index < self.first_node_size:
+                # The following statement is valid because self.first_elem is the pointer
+                # to the first element
+                return self.first_elem.CreateChildAtOffset(name, index * self.element_size, self.element_type)
+ 
+            # Now the rest of the subarrays except for maybe the last one
+            # are going to be complete, so the final expression is simpler
+            i, j = divmod(index - self.first_node_size, self.block_size)
+ 
+            # We first move to the beginning of the node/subarray were our element is
+            node = self.start_node.CreateChildAtOffset(
+                '',
+                (1 + i) * self.valobj.GetProcess().GetAddressByteSize(),
+                self.element_type.GetPointerType())
+            return node.CreateChildAtOffset(name, j * self.element_size, self.element_type)
+ 
+        except:
+            return None
+ 
+    def update(self):
+        logger = lldb.formatters.Logger.Logger()
+        self.count = 0
+        try:
+            # A deque is effectively a two-dim array, with fixed width.
+            # However, only a subset of this memory contains valid data
+            # since a deque may have some slack at the front and back in
+            # order to have O(1) insertion at both ends.
+            # The rows in active use are delimited by '_M_start' and
+            # '_M_finish'.
+            #
+            # To find the elements that are actually constructed, the 'start'
+            # variable tells which element in this NxM array is the 0th
+            # one.
+            if self.block_size < 0 or self.element_size < 0:
+                return False
+ 
+            count = 0
+ 
+            impl = self.valobj.GetChildMemberWithName('_M_impl')
+ 
+            # we calculate the size of the first node (i.e. first internal array)
+            self.start = impl.GetChildMemberWithName('_M_start')
+            self.start_node = self.start.GetChildMemberWithName('_M_node')
+            first_node_address = self.start_node.GetValueAsUnsigned(0)
+            first_node_last_elem = self.start.GetChildMemberWithName('_M_last').GetValueAsUnsigned(0)
+            self.first_elem = self.start.GetChildMemberWithName('_M_cur')
+            first_node_first_elem = self.first_elem.GetValueAsUnsigned(0)
+ 
+ 
+            finish = impl.GetChildMemberWithName('_M_finish')
+            last_node_address = finish.GetChildMemberWithName('_M_node').GetValueAsUnsigned(0)
+            last_node_first_elem = finish.GetChildMemberWithName('_M_first').GetValueAsUnsigned(0)
+            last_node_last_elem = finish.GetChildMemberWithName('_M_cur').GetValueAsUnsigned(0)
+ 
+            if first_node_first_elem == 0 or first_node_last_elem == 0 or first_node_first_elem > first_node_last_elem:
+                return False
+            if last_node_first_elem == 0 or last_node_last_elem == 0 or last_node_first_elem > last_node_last_elem:
+                return False
+ 
+ 
+            if last_node_address == first_node_address:
+                self.first_node_size = (last_node_last_elem - first_node_first_elem) // self.element_size
+                count += self.first_node_size
+            else:
+                self.first_node_size = (first_node_last_elem - first_node_first_elem) // self.element_size
+                count += self.first_node_size
+ 
+                # we calculate the size of the last node
+                finish = impl.GetChildMemberWithName('_M_finish')
+                last_node_address = finish.GetChildMemberWithName('_M_node').GetValueAsUnsigned(0)
+                count += (last_node_last_elem - last_node_first_elem) // self.element_size
+ 
+                # we calculate the size of the intermediate nodes
+                num_intermediate_nodes = (last_node_address - first_node_address - 1) // self.valobj.GetProcess().GetAddressByteSize()
+                count += self.block_size * num_intermediate_nodes
+            self.count = count
+        except:
+            pass
+        return False
 
 class AbstractListSynthProvider:
     def __init__(self, valobj, dict, has_prev):
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to