xref: /llvm-project/llvm/unittests/DebugInfo/DWARF/DWARFAcceleratorTableTest.cpp (revision a8b4c11f9d51f3d735f76c98367c87d6ff328a32)
116a0313eSIgor Kudrin //===- DWARFAcceleratorTableTest.cpp --------------------------------------===//
216a0313eSIgor Kudrin //
316a0313eSIgor Kudrin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
416a0313eSIgor Kudrin // See https://llvm.org/LICENSE.txt for license information.
516a0313eSIgor Kudrin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
616a0313eSIgor Kudrin //
716a0313eSIgor Kudrin //===----------------------------------------------------------------------===//
816a0313eSIgor Kudrin 
916a0313eSIgor Kudrin #include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
1016a0313eSIgor Kudrin #include "llvm/DebugInfo/DWARF/DWARFContext.h"
11*a8b4c11fSFelipe de Azevedo Piovezan #include "llvm/ObjectYAML/DWARFEmitter.h"
12dba683ccSPavel Labath #include "llvm/Testing/Support/Error.h"
1316a0313eSIgor Kudrin #include "gtest/gtest.h"
1416a0313eSIgor Kudrin 
1516a0313eSIgor Kudrin using namespace llvm;
1616a0313eSIgor Kudrin 
ExtractDebugNames(StringRef NamesSecData,StringRef StrSecData)17dba683ccSPavel Labath static Error ExtractDebugNames(StringRef NamesSecData, StringRef StrSecData) {
18dba683ccSPavel Labath   DWARFDataExtractor NamesExtractor(NamesSecData,
1916a0313eSIgor Kudrin                                     /*isLittleEndian=*/true,
2016a0313eSIgor Kudrin                                     /*AddrSize=*/4);
2116a0313eSIgor Kudrin   DataExtractor StrExtractor(StrSecData,
2216a0313eSIgor Kudrin                              /*isLittleEndian=*/true,
2316a0313eSIgor Kudrin                              /*AddrSize=*/4);
2416a0313eSIgor Kudrin   DWARFDebugNames Table(NamesExtractor, StrExtractor);
25dba683ccSPavel Labath   return Table.extract();
2616a0313eSIgor Kudrin }
2716a0313eSIgor Kudrin 
28dba683ccSPavel Labath namespace {
29dba683ccSPavel Labath 
TEST(DWARFDebugNames,ReservedUnitLength)3016a0313eSIgor Kudrin TEST(DWARFDebugNames, ReservedUnitLength) {
3116a0313eSIgor Kudrin   static const char NamesSecData[64] =
3216a0313eSIgor Kudrin       "\xf0\xff\xff\xff"; // Reserved unit length value
33dba683ccSPavel Labath   EXPECT_THAT_ERROR(
34dba683ccSPavel Labath       ExtractDebugNames(StringRef(NamesSecData, sizeof(NamesSecData)),
35dba683ccSPavel Labath                         StringRef()),
36dba683ccSPavel Labath       FailedWithMessage("parsing .debug_names header at 0x0: unsupported "
37dba683ccSPavel Labath                         "reserved unit length of value 0xfffffff0"));
3816a0313eSIgor Kudrin }
3916a0313eSIgor Kudrin 
TEST(DWARFDebugNames,TooSmallForDWARF64)4016a0313eSIgor Kudrin TEST(DWARFDebugNames, TooSmallForDWARF64) {
4116a0313eSIgor Kudrin   // DWARF64 header takes at least 44 bytes.
4216a0313eSIgor Kudrin   static const char NamesSecData[43] = "\xff\xff\xff\xff"; // DWARF64 mark
43dba683ccSPavel Labath   EXPECT_THAT_ERROR(
44dba683ccSPavel Labath       ExtractDebugNames(StringRef(NamesSecData, sizeof(NamesSecData)),
45dba683ccSPavel Labath                         StringRef()),
46dba683ccSPavel Labath       FailedWithMessage("parsing .debug_names header at 0x0: unexpected end of "
4704aea769SPavel Labath                         "data at offset 0x2b while reading [0x28, 0x2c)"));
4816a0313eSIgor Kudrin }
4916a0313eSIgor Kudrin 
TEST(DWARFDebugNames,BasicTestEntries)50*a8b4c11fSFelipe de Azevedo Piovezan TEST(DWARFDebugNames, BasicTestEntries) {
51*a8b4c11fSFelipe de Azevedo Piovezan   const char *Yamldata = R"(
52*a8b4c11fSFelipe de Azevedo Piovezan --- !ELF
53*a8b4c11fSFelipe de Azevedo Piovezan   debug_str:
54*a8b4c11fSFelipe de Azevedo Piovezan     - 'NameType1'
55*a8b4c11fSFelipe de Azevedo Piovezan     - 'NameType2'
56*a8b4c11fSFelipe de Azevedo Piovezan 
57*a8b4c11fSFelipe de Azevedo Piovezan   debug_names:
58*a8b4c11fSFelipe de Azevedo Piovezan     Abbreviations:
59*a8b4c11fSFelipe de Azevedo Piovezan     - Code:   0x1
60*a8b4c11fSFelipe de Azevedo Piovezan       Tag: DW_TAG_namespace
61*a8b4c11fSFelipe de Azevedo Piovezan       Indices:
62*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_compile_unit
63*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_data4
64*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_die_offset
65*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
66*a8b4c11fSFelipe de Azevedo Piovezan     Entries:
67*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to NameType1
68*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x1
69*a8b4c11fSFelipe de Azevedo Piovezan       Values:
70*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Compile unit
71*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # DIE Offset
72*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0xa  # strp to NameType2
73*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x1
74*a8b4c11fSFelipe de Azevedo Piovezan       Values:
75*a8b4c11fSFelipe de Azevedo Piovezan         - 0x1      # Compile unit
76*a8b4c11fSFelipe de Azevedo Piovezan         - 0x1      # DIE Offset
77*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to NameType1
78*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x1
79*a8b4c11fSFelipe de Azevedo Piovezan       Values:
80*a8b4c11fSFelipe de Azevedo Piovezan         - 0x2     # Compile unit
81*a8b4c11fSFelipe de Azevedo Piovezan         - 0x2     # DIE Offset
82*a8b4c11fSFelipe de Azevedo Piovezan 
83*a8b4c11fSFelipe de Azevedo Piovezan )";
84*a8b4c11fSFelipe de Azevedo Piovezan 
85*a8b4c11fSFelipe de Azevedo Piovezan   Expected<StringMap<std::unique_ptr<MemoryBuffer>>> Sections =
86*a8b4c11fSFelipe de Azevedo Piovezan       DWARFYAML::emitDebugSections(Yamldata,
87*a8b4c11fSFelipe de Azevedo Piovezan                                    /*IsLittleEndian=*/true,
88*a8b4c11fSFelipe de Azevedo Piovezan                                    /*Is64BitAddrSize=*/true);
89*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(Sections, Succeeded());
90*a8b4c11fSFelipe de Azevedo Piovezan   auto Ctx = DWARFContext::create(*Sections, 4, /*isLittleEndian=*/true);
91*a8b4c11fSFelipe de Azevedo Piovezan   const DWARFDebugNames &DebugNames = Ctx->getDebugNames();
92*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_NE(DebugNames.begin(), DebugNames.end());
93*a8b4c11fSFelipe de Azevedo Piovezan   const DWARFDebugNames::NameIndex &NameIndex = *DebugNames.begin();
94*a8b4c11fSFelipe de Azevedo Piovezan 
95*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(NameIndex.getNameCount(), 2u);
96*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(NameIndex.getBucketCount(), 0u);
97*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(NameIndex.getCUCount(), 1u);
98*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(NameIndex.getCUOffset(0), 0u);
99*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(NameIndex.getForeignTUCount(), 0u);
100*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(NameIndex.getLocalTUCount(), 0u);
101*a8b4c11fSFelipe de Azevedo Piovezan 
102*a8b4c11fSFelipe de Azevedo Piovezan   // Check "NameEntries": there should be one per unique name.
103*a8b4c11fSFelipe de Azevedo Piovezan   // These are indexed starting on 1.
104*a8b4c11fSFelipe de Azevedo Piovezan   DWARFDebugNames::NameTableEntry FirstEntry = NameIndex.getNameTableEntry(1);
105*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(FirstEntry.getString(), StringRef("NameType1"));
106*a8b4c11fSFelipe de Azevedo Piovezan   DWARFDebugNames::NameTableEntry SecondEntry = NameIndex.getNameTableEntry(2);
107*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(SecondEntry.getString(), StringRef("NameType2"));
108*a8b4c11fSFelipe de Azevedo Piovezan 
109*a8b4c11fSFelipe de Azevedo Piovezan   SmallVector<DWARFDebugNames::Entry> FirstNameEntries =
110*a8b4c11fSFelipe de Azevedo Piovezan       to_vector_of<DWARFDebugNames::Entry>(NameIndex.equal_range("NameType1"));
111*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(FirstNameEntries.size(), 2u);
112*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(FirstNameEntries[0].getCUIndex(), 0u);
113*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(FirstNameEntries[1].getCUIndex(), 0x2);
114*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(FirstNameEntries[0].getDIEUnitOffset(), 0x0);
115*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(FirstNameEntries[1].getDIEUnitOffset(), 0x2);
116*a8b4c11fSFelipe de Azevedo Piovezan 
117*a8b4c11fSFelipe de Azevedo Piovezan   SmallVector<DWARFDebugNames::Entry> SecondNameEntries =
118*a8b4c11fSFelipe de Azevedo Piovezan       to_vector_of<DWARFDebugNames::Entry>(NameIndex.equal_range("NameType2"));
119*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(SecondNameEntries.size(), 1u);
120*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(SecondNameEntries[0].getCUIndex(), 0x1);
121*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(SecondNameEntries[0].getDIEUnitOffset(), 0x1);
122*a8b4c11fSFelipe de Azevedo Piovezan }
123*a8b4c11fSFelipe de Azevedo Piovezan 
TEST(DWARFDebugNames,ParentEntries)124*a8b4c11fSFelipe de Azevedo Piovezan TEST(DWARFDebugNames, ParentEntries) {
125*a8b4c11fSFelipe de Azevedo Piovezan   const char *Yamldata = R"(
126*a8b4c11fSFelipe de Azevedo Piovezan --- !ELF
127*a8b4c11fSFelipe de Azevedo Piovezan   debug_str:
128*a8b4c11fSFelipe de Azevedo Piovezan     - 'Name1'
129*a8b4c11fSFelipe de Azevedo Piovezan     - 'Name2'
130*a8b4c11fSFelipe de Azevedo Piovezan     - 'Name3'
131*a8b4c11fSFelipe de Azevedo Piovezan     - 'Name4'
132*a8b4c11fSFelipe de Azevedo Piovezan   debug_names:
133*a8b4c11fSFelipe de Azevedo Piovezan     Abbreviations:
134*a8b4c11fSFelipe de Azevedo Piovezan     - Code:   0x11
135*a8b4c11fSFelipe de Azevedo Piovezan       Tag: DW_TAG_namespace
136*a8b4c11fSFelipe de Azevedo Piovezan       Indices:
137*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_parent
138*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_flag_present
139*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_die_offset
140*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
141*a8b4c11fSFelipe de Azevedo Piovezan     - Code:   0x22
142*a8b4c11fSFelipe de Azevedo Piovezan       Tag: DW_TAG_namespace
143*a8b4c11fSFelipe de Azevedo Piovezan       Indices:
144*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_parent
145*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
146*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_die_offset
147*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
148*a8b4c11fSFelipe de Azevedo Piovezan     - Code:   0x33
149*a8b4c11fSFelipe de Azevedo Piovezan       Tag: DW_TAG_namespace
150*a8b4c11fSFelipe de Azevedo Piovezan       Indices:
151*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_die_offset
152*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_ref4
153*a8b4c11fSFelipe de Azevedo Piovezan     Entries:
154*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to Name1
155*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x11
156*a8b4c11fSFelipe de Azevedo Piovezan       Values:
157*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Die offset
158*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x6  # strp to Name2
159*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x22
160*a8b4c11fSFelipe de Azevedo Piovezan       Values:
161*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Parent = First entry
162*a8b4c11fSFelipe de Azevedo Piovezan         - 0x1      # Die offset
163*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0xc  # strp to Name3
164*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x22
165*a8b4c11fSFelipe de Azevedo Piovezan       Values:
166*a8b4c11fSFelipe de Azevedo Piovezan         - 0x6      # Parent = Second entry
167*a8b4c11fSFelipe de Azevedo Piovezan         - 0x1      # Die offset
168*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x12  # strp to Name4
169*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x33
170*a8b4c11fSFelipe de Azevedo Piovezan       Values:
171*a8b4c11fSFelipe de Azevedo Piovezan         - 0x1      # Die offset
172*a8b4c11fSFelipe de Azevedo Piovezan )";
173*a8b4c11fSFelipe de Azevedo Piovezan 
174*a8b4c11fSFelipe de Azevedo Piovezan   Expected<StringMap<std::unique_ptr<MemoryBuffer>>> Sections =
175*a8b4c11fSFelipe de Azevedo Piovezan       DWARFYAML::emitDebugSections(Yamldata,
176*a8b4c11fSFelipe de Azevedo Piovezan                                    /*IsLittleEndian=*/true,
177*a8b4c11fSFelipe de Azevedo Piovezan                                    /*Is64BitAddrSize=*/true);
178*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(Sections, Succeeded());
179*a8b4c11fSFelipe de Azevedo Piovezan   auto Ctx = DWARFContext::create(*Sections, 4, /*isLittleEndian=*/true);
180*a8b4c11fSFelipe de Azevedo Piovezan   const DWARFDebugNames &DebugNames = Ctx->getDebugNames();
181*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_NE(DebugNames.begin(), DebugNames.end());
182*a8b4c11fSFelipe de Azevedo Piovezan   const DWARFDebugNames::NameIndex &NameIndex = *DebugNames.begin();
183*a8b4c11fSFelipe de Azevedo Piovezan 
184*a8b4c11fSFelipe de Azevedo Piovezan   SmallVector<DWARFDebugNames::Entry> Name1Entries =
185*a8b4c11fSFelipe de Azevedo Piovezan       to_vector_of<DWARFDebugNames::Entry>(NameIndex.equal_range("Name1"));
186*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(Name1Entries.size(), 1u);
187*a8b4c11fSFelipe de Azevedo Piovezan   Expected<std::optional<DWARFDebugNames::Entry>> Name1Parent =
188*a8b4c11fSFelipe de Azevedo Piovezan       Name1Entries[0].getParentDIEEntry();
189*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(Name1Parent, Succeeded());
190*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(*Name1Parent, std::nullopt); // Name1 has no parent
191*a8b4c11fSFelipe de Azevedo Piovezan 
192*a8b4c11fSFelipe de Azevedo Piovezan   SmallVector<DWARFDebugNames::Entry> Name2Entries =
193*a8b4c11fSFelipe de Azevedo Piovezan       to_vector_of<DWARFDebugNames::Entry>(NameIndex.equal_range("Name2"));
194*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(Name2Entries.size(), 1u);
195*a8b4c11fSFelipe de Azevedo Piovezan   Expected<std::optional<DWARFDebugNames::Entry>> Name2Parent =
196*a8b4c11fSFelipe de Azevedo Piovezan       Name2Entries[0].getParentDIEEntry();
197*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(Name2Parent, Succeeded());
198*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ((**Name2Parent).getDIEUnitOffset(), 0x0); // Name2 parent == Name1
199*a8b4c11fSFelipe de Azevedo Piovezan 
200*a8b4c11fSFelipe de Azevedo Piovezan   SmallVector<DWARFDebugNames::Entry> Name3Entries =
201*a8b4c11fSFelipe de Azevedo Piovezan       to_vector_of<DWARFDebugNames::Entry>(NameIndex.equal_range("Name3"));
202*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(Name3Entries.size(), 1u);
203*a8b4c11fSFelipe de Azevedo Piovezan   Expected<std::optional<DWARFDebugNames::Entry>> Name3Parent =
204*a8b4c11fSFelipe de Azevedo Piovezan       Name3Entries[0].getParentDIEEntry();
205*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(Name3Parent, Succeeded());
206*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ((**Name3Parent).getDIEUnitOffset(), 0x1); // Name3 parent == Name2
207*a8b4c11fSFelipe de Azevedo Piovezan 
208*a8b4c11fSFelipe de Azevedo Piovezan   SmallVector<DWARFDebugNames::Entry> Name4Entries =
209*a8b4c11fSFelipe de Azevedo Piovezan       to_vector_of<DWARFDebugNames::Entry>(NameIndex.equal_range("Name4"));
210*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_EQ(Name4Entries.size(), 1u);
211*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_FALSE(Name4Entries[0].hasParentInformation());
212*a8b4c11fSFelipe de Azevedo Piovezan }
213*a8b4c11fSFelipe de Azevedo Piovezan 
TEST(DWARFDebugNames,InvalidAbbrevCode)214*a8b4c11fSFelipe de Azevedo Piovezan TEST(DWARFDebugNames, InvalidAbbrevCode) {
215*a8b4c11fSFelipe de Azevedo Piovezan   const char *Yamldata = R"(
216*a8b4c11fSFelipe de Azevedo Piovezan --- !ELF
217*a8b4c11fSFelipe de Azevedo Piovezan   debug_str:
218*a8b4c11fSFelipe de Azevedo Piovezan     - 'NameType1'
219*a8b4c11fSFelipe de Azevedo Piovezan 
220*a8b4c11fSFelipe de Azevedo Piovezan   debug_names:
221*a8b4c11fSFelipe de Azevedo Piovezan     Abbreviations:
222*a8b4c11fSFelipe de Azevedo Piovezan     - Code:   0x1
223*a8b4c11fSFelipe de Azevedo Piovezan       Tag: DW_TAG_namespace
224*a8b4c11fSFelipe de Azevedo Piovezan       Indices:
225*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_compile_unit
226*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_data4
227*a8b4c11fSFelipe de Azevedo Piovezan     Entries:
228*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to NameType1
229*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x123456
230*a8b4c11fSFelipe de Azevedo Piovezan       Values:
231*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Compile unit
232*a8b4c11fSFelipe de Azevedo Piovezan )";
233*a8b4c11fSFelipe de Azevedo Piovezan 
234*a8b4c11fSFelipe de Azevedo Piovezan   Expected<StringMap<std::unique_ptr<MemoryBuffer>>> Sections =
235*a8b4c11fSFelipe de Azevedo Piovezan       DWARFYAML::emitDebugSections(Yamldata,
236*a8b4c11fSFelipe de Azevedo Piovezan                                    /*IsLittleEndian=*/true,
237*a8b4c11fSFelipe de Azevedo Piovezan                                    /*Is64BitAddrSize=*/true);
238*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(
239*a8b4c11fSFelipe de Azevedo Piovezan       Sections,
240*a8b4c11fSFelipe de Azevedo Piovezan       FailedWithMessage("did not find an Abbreviation for this code"));
241*a8b4c11fSFelipe de Azevedo Piovezan }
242*a8b4c11fSFelipe de Azevedo Piovezan 
TEST(DWARFDebugNames,InvalidNumOfValues)243*a8b4c11fSFelipe de Azevedo Piovezan TEST(DWARFDebugNames, InvalidNumOfValues) {
244*a8b4c11fSFelipe de Azevedo Piovezan   const char *Yamldata = R"(
245*a8b4c11fSFelipe de Azevedo Piovezan --- !ELF
246*a8b4c11fSFelipe de Azevedo Piovezan   debug_str:
247*a8b4c11fSFelipe de Azevedo Piovezan     - 'NameType1'
248*a8b4c11fSFelipe de Azevedo Piovezan 
249*a8b4c11fSFelipe de Azevedo Piovezan   debug_names:
250*a8b4c11fSFelipe de Azevedo Piovezan     Abbreviations:
251*a8b4c11fSFelipe de Azevedo Piovezan     - Code:   0x1
252*a8b4c11fSFelipe de Azevedo Piovezan       Tag: DW_TAG_namespace
253*a8b4c11fSFelipe de Azevedo Piovezan       Indices:
254*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_compile_unit
255*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_data4
256*a8b4c11fSFelipe de Azevedo Piovezan     Entries:
257*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to NameType1
258*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x1
259*a8b4c11fSFelipe de Azevedo Piovezan       Values:
260*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Compile unit
261*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Compile unit
262*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Compile unit
263*a8b4c11fSFelipe de Azevedo Piovezan )";
264*a8b4c11fSFelipe de Azevedo Piovezan 
265*a8b4c11fSFelipe de Azevedo Piovezan   Expected<StringMap<std::unique_ptr<MemoryBuffer>>> Sections =
266*a8b4c11fSFelipe de Azevedo Piovezan       DWARFYAML::emitDebugSections(Yamldata,
267*a8b4c11fSFelipe de Azevedo Piovezan                                    /*IsLittleEndian=*/true,
268*a8b4c11fSFelipe de Azevedo Piovezan                                    /*Is64BitAddrSize=*/true);
269*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(
270*a8b4c11fSFelipe de Azevedo Piovezan       Sections, FailedWithMessage(
271*a8b4c11fSFelipe de Azevedo Piovezan                     "mismatch between provided and required number of values"));
272*a8b4c11fSFelipe de Azevedo Piovezan }
273*a8b4c11fSFelipe de Azevedo Piovezan 
TEST(DWARFDebugNames,UnsupportedForm)274*a8b4c11fSFelipe de Azevedo Piovezan TEST(DWARFDebugNames, UnsupportedForm) {
275*a8b4c11fSFelipe de Azevedo Piovezan   const char *Yamldata = R"(
276*a8b4c11fSFelipe de Azevedo Piovezan --- !ELF
277*a8b4c11fSFelipe de Azevedo Piovezan   debug_str:
278*a8b4c11fSFelipe de Azevedo Piovezan     - 'NameType1'
279*a8b4c11fSFelipe de Azevedo Piovezan 
280*a8b4c11fSFelipe de Azevedo Piovezan   debug_names:
281*a8b4c11fSFelipe de Azevedo Piovezan     Abbreviations:
282*a8b4c11fSFelipe de Azevedo Piovezan     - Code:   0x1
283*a8b4c11fSFelipe de Azevedo Piovezan       Tag: DW_TAG_namespace
284*a8b4c11fSFelipe de Azevedo Piovezan       Indices:
285*a8b4c11fSFelipe de Azevedo Piovezan         - Idx:   DW_IDX_compile_unit
286*a8b4c11fSFelipe de Azevedo Piovezan           Form:  DW_FORM_strx
287*a8b4c11fSFelipe de Azevedo Piovezan     Entries:
288*a8b4c11fSFelipe de Azevedo Piovezan     - Name:   0x0  # strp to NameType1
289*a8b4c11fSFelipe de Azevedo Piovezan       Code:   0x1
290*a8b4c11fSFelipe de Azevedo Piovezan       Values:
291*a8b4c11fSFelipe de Azevedo Piovezan         - 0x0      # Compile unit
292*a8b4c11fSFelipe de Azevedo Piovezan )";
293*a8b4c11fSFelipe de Azevedo Piovezan 
294*a8b4c11fSFelipe de Azevedo Piovezan   Expected<StringMap<std::unique_ptr<MemoryBuffer>>> Sections =
295*a8b4c11fSFelipe de Azevedo Piovezan       DWARFYAML::emitDebugSections(Yamldata,
296*a8b4c11fSFelipe de Azevedo Piovezan                                    /*IsLittleEndian=*/true,
297*a8b4c11fSFelipe de Azevedo Piovezan                                    /*Is64BitAddrSize=*/true);
298*a8b4c11fSFelipe de Azevedo Piovezan   ASSERT_THAT_EXPECTED(
299*a8b4c11fSFelipe de Azevedo Piovezan       Sections,
300*a8b4c11fSFelipe de Azevedo Piovezan       FailedWithMessage("unsupported Form for YAML debug_names emitter"));
301*a8b4c11fSFelipe de Azevedo Piovezan }
30216a0313eSIgor Kudrin } // end anonymous namespace
303