xref: /llvm-project/lldb/unittests/SymbolFile/DWARF/DWARFDebugNamesIndexTest.cpp (revision 91f4a84a1504e718e4f4d4eef5db7713dc30a030)
1*91f4a84aSFelipe de Azevedo Piovezan //===-- DWARFDIETest.cpp ----------------------------------------------=---===//
2*91f4a84aSFelipe de Azevedo Piovezan //
3*91f4a84aSFelipe de Azevedo Piovezan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*91f4a84aSFelipe de Azevedo Piovezan // See https://llvm.org/LICENSE.txt for license information.
5*91f4a84aSFelipe de Azevedo Piovezan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*91f4a84aSFelipe de Azevedo Piovezan //
7*91f4a84aSFelipe de Azevedo Piovezan //===----------------------------------------------------------------------===//
8*91f4a84aSFelipe de Azevedo Piovezan 
9*91f4a84aSFelipe de Azevedo Piovezan #include "Plugins/SymbolFile/DWARF/DWARFDIE.h"
10*91f4a84aSFelipe de Azevedo Piovezan #include "Plugins/SymbolFile/DWARF/DWARFDebugInfo.h"
11*91f4a84aSFelipe de Azevedo Piovezan #include "Plugins/SymbolFile/DWARF/DWARFDeclContext.h"
12*91f4a84aSFelipe de Azevedo Piovezan #include "Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.h"
13*91f4a84aSFelipe de Azevedo Piovezan #include "TestingSupport/Symbol/YAMLModuleTester.h"
14*91f4a84aSFelipe de Azevedo Piovezan #include "llvm/ADT/STLExtras.h"
15*91f4a84aSFelipe de Azevedo Piovezan #include "gmock/gmock.h"
16*91f4a84aSFelipe de Azevedo Piovezan #include "gtest/gtest.h"
17*91f4a84aSFelipe de Azevedo Piovezan 
18*91f4a84aSFelipe de Azevedo Piovezan using namespace lldb;
19*91f4a84aSFelipe de Azevedo Piovezan using namespace lldb_private;
20*91f4a84aSFelipe de Azevedo Piovezan using namespace lldb_private::plugin::dwarf;
21*91f4a84aSFelipe de Azevedo Piovezan using StringRef = llvm::StringRef;
22*91f4a84aSFelipe de Azevedo Piovezan 
23*91f4a84aSFelipe de Azevedo Piovezan static void
check_num_matches(DebugNamesDWARFIndex & index,int expected_num_matches,llvm::ArrayRef<DWARFDeclContext::Entry> ctx_entries)24*91f4a84aSFelipe de Azevedo Piovezan check_num_matches(DebugNamesDWARFIndex &index, int expected_num_matches,
25*91f4a84aSFelipe de Azevedo Piovezan                   llvm::ArrayRef<DWARFDeclContext::Entry> ctx_entries) {
26*91f4a84aSFelipe de Azevedo Piovezan   DWARFDeclContext ctx(ctx_entries);
27*91f4a84aSFelipe de Azevedo Piovezan   int num_matches = 0;
28*91f4a84aSFelipe de Azevedo Piovezan 
29*91f4a84aSFelipe de Azevedo Piovezan   index.GetFullyQualifiedType(ctx, [&](DWARFDIE die) {
30*91f4a84aSFelipe de Azevedo Piovezan     num_matches++;
31*91f4a84aSFelipe de Azevedo Piovezan     return true;
32*91f4a84aSFelipe de Azevedo Piovezan   });
33*91f4a84aSFelipe de Azevedo Piovezan   ASSERT_EQ(num_matches, expected_num_matches);
34*91f4a84aSFelipe de Azevedo Piovezan }
35*91f4a84aSFelipe de Azevedo Piovezan 
make_entry(const char * c)36*91f4a84aSFelipe de Azevedo Piovezan static DWARFDeclContext::Entry make_entry(const char *c) {
37*91f4a84aSFelipe de Azevedo Piovezan   return DWARFDeclContext::Entry(dwarf::DW_TAG_class_type, c);
38*91f4a84aSFelipe de Azevedo Piovezan }
39*91f4a84aSFelipe de Azevedo Piovezan 
TEST(DWARFDebugNamesIndexTest,FullyQualifiedQueryWithIDXParent)40*91f4a84aSFelipe de Azevedo Piovezan TEST(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithIDXParent) {
41*91f4a84aSFelipe de Azevedo Piovezan   const char *yamldata = R"(
42*91f4a84aSFelipe de Azevedo Piovezan --- !ELF
43*91f4a84aSFelipe de Azevedo Piovezan FileHeader:
44*91f4a84aSFelipe de Azevedo Piovezan   Class:   ELFCLASS64
45*91f4a84aSFelipe de Azevedo Piovezan   Data:    ELFDATA2LSB
46*91f4a84aSFelipe de Azevedo Piovezan   Type:    ET_EXEC
47*91f4a84aSFelipe de Azevedo Piovezan   Machine: EM_386
48*91f4a84aSFelipe de Azevedo Piovezan DWARF:
49*91f4a84aSFelipe de Azevedo Piovezan   debug_str:
50*91f4a84aSFelipe de Azevedo Piovezan     - '1'
51*91f4a84aSFelipe de Azevedo Piovezan     - '2'
52*91f4a84aSFelipe de Azevedo Piovezan     - '3'
53*91f4a84aSFelipe de Azevedo Piovezan   debug_abbrev:
54*91f4a84aSFelipe de Azevedo Piovezan     - Table:
55*91f4a84aSFelipe de Azevedo Piovezan         # We intentionally don't nest types in debug_info: if the nesting is not
56*91f4a84aSFelipe de Azevedo Piovezan         # inferred from debug_names, we want the test to fail.
57*91f4a84aSFelipe de Azevedo Piovezan         - Code:            0x1
58*91f4a84aSFelipe de Azevedo Piovezan           Tag:             DW_TAG_compile_unit
59*91f4a84aSFelipe de Azevedo Piovezan           Children:        DW_CHILDREN_yes
60*91f4a84aSFelipe de Azevedo Piovezan         - Code:            0x2
61*91f4a84aSFelipe de Azevedo Piovezan           Tag:             DW_TAG_class_type
62*91f4a84aSFelipe de Azevedo Piovezan           Children:        DW_CHILDREN_no
63*91f4a84aSFelipe de Azevedo Piovezan           Attributes:
64*91f4a84aSFelipe de Azevedo Piovezan             - Attribute:       DW_AT_name
65*91f4a84aSFelipe de Azevedo Piovezan               Form:            DW_FORM_strp
66*91f4a84aSFelipe de Azevedo Piovezan   debug_info:
67*91f4a84aSFelipe de Azevedo Piovezan     - Version:         4
68*91f4a84aSFelipe de Azevedo Piovezan       AddrSize:        8
69*91f4a84aSFelipe de Azevedo Piovezan       Entries:
70*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x1
71*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x2
72*91f4a84aSFelipe de Azevedo Piovezan           Values:
73*91f4a84aSFelipe de Azevedo Piovezan             - Value:       0x0 # Name "1"
74*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x2
75*91f4a84aSFelipe de Azevedo Piovezan           Values:
76*91f4a84aSFelipe de Azevedo Piovezan             - Value:       0x2 # Name "2"
77*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x2
78*91f4a84aSFelipe de Azevedo Piovezan           Values:
79*91f4a84aSFelipe de Azevedo Piovezan             - Value:       0x4 # Name "3"
80*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x0
81*91f4a84aSFelipe de Azevedo Piovezan   debug_names:
82*91f4a84aSFelipe de Azevedo Piovezan     Abbreviations:
83*91f4a84aSFelipe de Azevedo Piovezan     - Code:   0x11
84*91f4a84aSFelipe de Azevedo Piovezan       Tag: DW_TAG_class_type
85*91f4a84aSFelipe de Azevedo Piovezan       Indices:
86*91f4a84aSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_parent
87*91f4a84aSFelipe de Azevedo Piovezan           Form:  DW_FORM_flag_present
88*91f4a84aSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_die_offset
89*91f4a84aSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
90*91f4a84aSFelipe de Azevedo Piovezan     - Code:   0x22
91*91f4a84aSFelipe de Azevedo Piovezan       Tag: DW_TAG_class_type
92*91f4a84aSFelipe de Azevedo Piovezan       Indices:
93*91f4a84aSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_parent
94*91f4a84aSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
95*91f4a84aSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_die_offset
96*91f4a84aSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
97*91f4a84aSFelipe de Azevedo Piovezan     Entries:
98*91f4a84aSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to Name1
99*91f4a84aSFelipe de Azevedo Piovezan       Code:   0x11
100*91f4a84aSFelipe de Azevedo Piovezan       Values:
101*91f4a84aSFelipe de Azevedo Piovezan         - 0xc      # Die offset to entry named "1"
102*91f4a84aSFelipe de Azevedo Piovezan     - Name:   0x2  # strp to Name2
103*91f4a84aSFelipe de Azevedo Piovezan       Code:   0x22
104*91f4a84aSFelipe de Azevedo Piovezan       Values:
105*91f4a84aSFelipe de Azevedo Piovezan         - 0x0      # Parent = First entry ("1")
106*91f4a84aSFelipe de Azevedo Piovezan         - 0x11     # Die offset to entry named "1:2"
107*91f4a84aSFelipe de Azevedo Piovezan     - Name:   0x4  # strp to Name3
108*91f4a84aSFelipe de Azevedo Piovezan       Code:   0x22
109*91f4a84aSFelipe de Azevedo Piovezan       Values:
110*91f4a84aSFelipe de Azevedo Piovezan         - 0x6      # Parent = Second entry ("1::2")
111*91f4a84aSFelipe de Azevedo Piovezan         - 0x16     # Die offset to entry named "1::2::3"
112*91f4a84aSFelipe de Azevedo Piovezan     - Name:   0x4  # strp to Name3
113*91f4a84aSFelipe de Azevedo Piovezan       Code:   0x11
114*91f4a84aSFelipe de Azevedo Piovezan       Values:
115*91f4a84aSFelipe de Azevedo Piovezan         - 0x16     # Die offset to entry named "3"
116*91f4a84aSFelipe de Azevedo Piovezan )";
117*91f4a84aSFelipe de Azevedo Piovezan 
118*91f4a84aSFelipe de Azevedo Piovezan   YAMLModuleTester t(yamldata);
119*91f4a84aSFelipe de Azevedo Piovezan   auto *symbol_file =
120*91f4a84aSFelipe de Azevedo Piovezan       llvm::cast<SymbolFileDWARF>(t.GetModule()->GetSymbolFile());
121*91f4a84aSFelipe de Azevedo Piovezan   auto *index = static_cast<DebugNamesDWARFIndex *>(symbol_file->getIndex());
122*91f4a84aSFelipe de Azevedo Piovezan   ASSERT_NE(index, nullptr);
123*91f4a84aSFelipe de Azevedo Piovezan 
124*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 1, {make_entry("1")});
125*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 1, {make_entry("2"), make_entry("1")});
126*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 1,
127*91f4a84aSFelipe de Azevedo Piovezan                     {make_entry("3"), make_entry("2"), make_entry("1")});
128*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 0, {make_entry("2")});
129*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 1, {make_entry("3")});
130*91f4a84aSFelipe de Azevedo Piovezan }
131*91f4a84aSFelipe de Azevedo Piovezan 
TEST(DWARFDebugNamesIndexTest,FullyQualifiedQueryWithoutIDXParent)132*91f4a84aSFelipe de Azevedo Piovezan TEST(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithoutIDXParent) {
133*91f4a84aSFelipe de Azevedo Piovezan   const char *yamldata = R"(
134*91f4a84aSFelipe de Azevedo Piovezan --- !ELF
135*91f4a84aSFelipe de Azevedo Piovezan FileHeader:
136*91f4a84aSFelipe de Azevedo Piovezan   Class:   ELFCLASS64
137*91f4a84aSFelipe de Azevedo Piovezan   Data:    ELFDATA2LSB
138*91f4a84aSFelipe de Azevedo Piovezan   Type:    ET_EXEC
139*91f4a84aSFelipe de Azevedo Piovezan   Machine: EM_386
140*91f4a84aSFelipe de Azevedo Piovezan DWARF:
141*91f4a84aSFelipe de Azevedo Piovezan   debug_str:
142*91f4a84aSFelipe de Azevedo Piovezan     - '1'
143*91f4a84aSFelipe de Azevedo Piovezan     - '2'
144*91f4a84aSFelipe de Azevedo Piovezan   debug_abbrev:
145*91f4a84aSFelipe de Azevedo Piovezan     - Table:
146*91f4a84aSFelipe de Azevedo Piovezan         - Code:            0x1
147*91f4a84aSFelipe de Azevedo Piovezan           Tag:             DW_TAG_compile_unit
148*91f4a84aSFelipe de Azevedo Piovezan           Children:        DW_CHILDREN_yes
149*91f4a84aSFelipe de Azevedo Piovezan         - Code:            0x2
150*91f4a84aSFelipe de Azevedo Piovezan           Tag:             DW_TAG_class_type
151*91f4a84aSFelipe de Azevedo Piovezan           Children:        DW_CHILDREN_yes
152*91f4a84aSFelipe de Azevedo Piovezan           Attributes:
153*91f4a84aSFelipe de Azevedo Piovezan             - Attribute:       DW_AT_name
154*91f4a84aSFelipe de Azevedo Piovezan               Form:            DW_FORM_strp
155*91f4a84aSFelipe de Azevedo Piovezan         - Code:            0x3
156*91f4a84aSFelipe de Azevedo Piovezan           Tag:             DW_TAG_class_type
157*91f4a84aSFelipe de Azevedo Piovezan           Children:        DW_CHILDREN_no
158*91f4a84aSFelipe de Azevedo Piovezan           Attributes:
159*91f4a84aSFelipe de Azevedo Piovezan             - Attribute:       DW_AT_name
160*91f4a84aSFelipe de Azevedo Piovezan               Form:            DW_FORM_strp
161*91f4a84aSFelipe de Azevedo Piovezan   debug_info:
162*91f4a84aSFelipe de Azevedo Piovezan     - Version:         4
163*91f4a84aSFelipe de Azevedo Piovezan       AddrSize:        8
164*91f4a84aSFelipe de Azevedo Piovezan       Entries:
165*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x1
166*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x2
167*91f4a84aSFelipe de Azevedo Piovezan           Values:
168*91f4a84aSFelipe de Azevedo Piovezan             - Value:       0x0 # Name "1"
169*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x3
170*91f4a84aSFelipe de Azevedo Piovezan           Values:
171*91f4a84aSFelipe de Azevedo Piovezan             - Value:       0x2 # Name "2"
172*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x0
173*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x3
174*91f4a84aSFelipe de Azevedo Piovezan           Values:
175*91f4a84aSFelipe de Azevedo Piovezan             - Value:       0x2 # Name "2"
176*91f4a84aSFelipe de Azevedo Piovezan         - AbbrCode:        0x0
177*91f4a84aSFelipe de Azevedo Piovezan   debug_names:
178*91f4a84aSFelipe de Azevedo Piovezan     Abbreviations:
179*91f4a84aSFelipe de Azevedo Piovezan     - Code:   0x1
180*91f4a84aSFelipe de Azevedo Piovezan       Tag: DW_TAG_class_type
181*91f4a84aSFelipe de Azevedo Piovezan       Indices:
182*91f4a84aSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_die_offset
183*91f4a84aSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
184*91f4a84aSFelipe de Azevedo Piovezan     Entries:
185*91f4a84aSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to Name1
186*91f4a84aSFelipe de Azevedo Piovezan       Code:   0x1
187*91f4a84aSFelipe de Azevedo Piovezan       Values:
188*91f4a84aSFelipe de Azevedo Piovezan         - 0xc      # Die offset to entry named "1"
189*91f4a84aSFelipe de Azevedo Piovezan     - Name:   0x2  # strp to Name2
190*91f4a84aSFelipe de Azevedo Piovezan       Code:   0x1
191*91f4a84aSFelipe de Azevedo Piovezan       Values:
192*91f4a84aSFelipe de Azevedo Piovezan         - 0x11     # Die offset to entry named "1::2"
193*91f4a84aSFelipe de Azevedo Piovezan     - Name:   0x2  # strp to Name2
194*91f4a84aSFelipe de Azevedo Piovezan       Code:   0x1
195*91f4a84aSFelipe de Azevedo Piovezan       Values:
196*91f4a84aSFelipe de Azevedo Piovezan         - 0x17     # Die offset to entry named "2"
197*91f4a84aSFelipe de Azevedo Piovezan )";
198*91f4a84aSFelipe de Azevedo Piovezan 
199*91f4a84aSFelipe de Azevedo Piovezan   YAMLModuleTester t(yamldata);
200*91f4a84aSFelipe de Azevedo Piovezan   auto *symbol_file =
201*91f4a84aSFelipe de Azevedo Piovezan       llvm::cast<SymbolFileDWARF>(t.GetModule()->GetSymbolFile());
202*91f4a84aSFelipe de Azevedo Piovezan   auto *index = static_cast<DebugNamesDWARFIndex *>(symbol_file->getIndex());
203*91f4a84aSFelipe de Azevedo Piovezan   ASSERT_NE(index, nullptr);
204*91f4a84aSFelipe de Azevedo Piovezan 
205*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 1, {make_entry("1")});
206*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 1, {make_entry("2"), make_entry("1")});
207*91f4a84aSFelipe de Azevedo Piovezan   check_num_matches(*index, 1, {make_entry("2")});
208*91f4a84aSFelipe de Azevedo Piovezan }
209