diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py --- a/lldb/examples/synthetic/gnu_libstdcpp.py +++ b/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): diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/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( diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/Makefile new file mode 100644 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/TestDataFormatterGenericDeque.py new file mode 100644 --- /dev/null +++ b/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 diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/main.cpp new file mode 100644 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/deque/main.cpp @@ -0,0 +1,40 @@ +#include + +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 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 empty; + std::deque deque_1 = {1}; + std::deque deque_3 = {3, 1, 2}; + + std::deque deque_200_small; + deque_200_small = fill>(deque_200_small); + + std::deque deque_200_large; + deque_200_large = fill>(deque_200_large); + + return empty.size() + deque_1.front() + deque_3.front(); // break here +}