xref: /llvm-project/llvm/unittests/ObjectYAML/DWARFYAMLTest.cpp (revision 67ba5c507af2264ff79e4948b976477929436e86)
18f9ca561SXing GUO //===- DWARFYAMLTest.cpp - Tests for DWARFYAML.cpp ------------------------===//
28f9ca561SXing GUO //
38f9ca561SXing GUO // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48f9ca561SXing GUO // See https://llvm.org/LICENSE.txt for license information.
58f9ca561SXing GUO // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68f9ca561SXing GUO //
78f9ca561SXing GUO //===----------------------------------------------------------------------===//
88f9ca561SXing GUO 
98f9ca561SXing GUO #include "llvm/ObjectYAML/DWARFYAML.h"
108f9ca561SXing GUO #include "llvm/ObjectYAML/DWARFEmitter.h"
11b6f08b7cSXing GUO #include "llvm/Support/Error.h"
12b6f08b7cSXing GUO #include "llvm/Support/SourceMgr.h"
13b6f08b7cSXing GUO #include "llvm/Support/YAMLTraits.h"
148f9ca561SXing GUO #include "llvm/Testing/Support/Error.h"
158f9ca561SXing GUO #include "gtest/gtest.h"
168f9ca561SXing GUO 
178f9ca561SXing GUO using namespace llvm;
188f9ca561SXing GUO 
parseDWARFYAML(StringRef Yaml,T & Data)19683a1bb2SXing GUO template <class T> static Error parseDWARFYAML(StringRef Yaml, T &Data) {
20b6f08b7cSXing GUO   SMDiagnostic GenerateDiag;
21b6f08b7cSXing GUO   yaml::Input YIn(
22b6f08b7cSXing GUO       Yaml, /*Ctxt=*/nullptr,
23b6f08b7cSXing GUO       [](const SMDiagnostic &Diag, void *DiagContext) {
24b6f08b7cSXing GUO         *static_cast<SMDiagnostic *>(DiagContext) = Diag;
25b6f08b7cSXing GUO       },
26b6f08b7cSXing GUO       &GenerateDiag);
27b6f08b7cSXing GUO 
28b6f08b7cSXing GUO   YIn >> Data;
29b6f08b7cSXing GUO   if (YIn.error())
30b6f08b7cSXing GUO     return createStringError(YIn.error(), GenerateDiag.getMessage());
31b6f08b7cSXing GUO 
32683a1bb2SXing GUO   return Error::success();
33b6f08b7cSXing GUO }
34b6f08b7cSXing GUO 
TEST(DebugAddrSection,TestParseDebugAddrYAML)358f9ca561SXing GUO TEST(DebugAddrSection, TestParseDebugAddrYAML) {
368f9ca561SXing GUO   StringRef Yaml = R"(
378f9ca561SXing GUO debug_addr:
388f9ca561SXing GUO   - Format:  DWARF64
398f9ca561SXing GUO     Length:  0x1234
408f9ca561SXing GUO     Version: 5
418f9ca561SXing GUO )";
42683a1bb2SXing GUO   DWARFYAML::Data Data;
43683a1bb2SXing GUO   EXPECT_THAT_ERROR(parseDWARFYAML(Yaml, Data), Succeeded());
448f9ca561SXing GUO }
458f9ca561SXing GUO 
TEST(DebugAddrSection,TestMissingVersion)468f9ca561SXing GUO TEST(DebugAddrSection, TestMissingVersion) {
478f9ca561SXing GUO   StringRef Yaml = R"(
48683a1bb2SXing GUO Format: DWARF64
498f9ca561SXing GUO Length: 0x1234
508f9ca561SXing GUO )";
51683a1bb2SXing GUO   DWARFYAML::AddrTableEntry AddrTableEntry;
52683a1bb2SXing GUO   EXPECT_THAT_ERROR(parseDWARFYAML(Yaml, AddrTableEntry),
538f9ca561SXing GUO                     FailedWithMessage("missing required key 'Version'"));
548f9ca561SXing GUO }
558f9ca561SXing GUO 
TEST(DebugAddrSection,TestUnexpectedKey)568f9ca561SXing GUO TEST(DebugAddrSection, TestUnexpectedKey) {
578f9ca561SXing GUO   StringRef Yaml = R"(
58683a1bb2SXing GUO Format:  DWARF64
598f9ca561SXing GUO Length:  0x1234
608f9ca561SXing GUO Version: 5
618f9ca561SXing GUO Blah:    unexpected
628f9ca561SXing GUO )";
63683a1bb2SXing GUO   DWARFYAML::AddrTableEntry AddrTableEntry;
64683a1bb2SXing GUO   EXPECT_THAT_ERROR(parseDWARFYAML(Yaml, AddrTableEntry),
658f9ca561SXing GUO                     FailedWithMessage("unknown key 'Blah'"));
668f9ca561SXing GUO }
67b6f08b7cSXing GUO 
TEST(DebugPubSection,TestDebugPubSection)68b6f08b7cSXing GUO TEST(DebugPubSection, TestDebugPubSection) {
69b6f08b7cSXing GUO   StringRef Yaml = R"(
70b6f08b7cSXing GUO debug_pubnames:
71b7d5d1ecSXing GUO   Length:        0x1234
72b6f08b7cSXing GUO   Version:       2
73b6f08b7cSXing GUO   UnitOffset:    0x4321
74b6f08b7cSXing GUO   UnitSize:      0x00
75b6f08b7cSXing GUO   Entries:
76b6f08b7cSXing GUO     - DieOffset:  0x1234
77b6f08b7cSXing GUO       Name:       abc
78b6f08b7cSXing GUO     - DieOffset:  0x4321
79b6f08b7cSXing GUO       Name:       def
80b6f08b7cSXing GUO debug_pubtypes:
81b7d5d1ecSXing GUO   Length:        0x1234
82b6f08b7cSXing GUO   Version:       2
83b6f08b7cSXing GUO   UnitOffset:    0x4321
84b6f08b7cSXing GUO   UnitSize:      0x00
85b6f08b7cSXing GUO   Entries:
86b6f08b7cSXing GUO     - DieOffset:  0x1234
87b6f08b7cSXing GUO       Name:       abc
88b6f08b7cSXing GUO     - DieOffset:  0x4321
89b6f08b7cSXing GUO       Name:       def
90b6f08b7cSXing GUO )";
91683a1bb2SXing GUO   DWARFYAML::Data Data;
92683a1bb2SXing GUO   ASSERT_THAT_ERROR(parseDWARFYAML(Yaml, Data), Succeeded());
93b6f08b7cSXing GUO 
943361a364SKazu Hirata   ASSERT_TRUE(Data.PubNames.has_value());
95*67ba5c50SFangrui Song   DWARFYAML::PubSection PubNames = *Data.PubNames;
96b6f08b7cSXing GUO 
97b6f08b7cSXing GUO   ASSERT_EQ(PubNames.Entries.size(), 2u);
98b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)PubNames.Entries[0].DieOffset, 0x1234u);
99b6f08b7cSXing GUO   EXPECT_EQ(PubNames.Entries[0].Name, "abc");
100b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)PubNames.Entries[1].DieOffset, 0x4321u);
101b6f08b7cSXing GUO   EXPECT_EQ(PubNames.Entries[1].Name, "def");
102b6f08b7cSXing GUO 
1033361a364SKazu Hirata   ASSERT_TRUE(Data.PubTypes.has_value());
104*67ba5c50SFangrui Song   DWARFYAML::PubSection PubTypes = *Data.PubTypes;
105b6f08b7cSXing GUO 
106b6f08b7cSXing GUO   ASSERT_EQ(PubTypes.Entries.size(), 2u);
107b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)PubTypes.Entries[0].DieOffset, 0x1234u);
108b6f08b7cSXing GUO   EXPECT_EQ(PubTypes.Entries[0].Name, "abc");
109b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)PubTypes.Entries[1].DieOffset, 0x4321u);
110b6f08b7cSXing GUO   EXPECT_EQ(PubTypes.Entries[1].Name, "def");
111b6f08b7cSXing GUO }
112b6f08b7cSXing GUO 
TEST(DebugPubSection,TestUnexpectedDescriptor)113b6f08b7cSXing GUO TEST(DebugPubSection, TestUnexpectedDescriptor) {
114b6f08b7cSXing GUO   StringRef Yaml = R"(
115b6f08b7cSXing GUO debug_pubnames:
116b7d5d1ecSXing GUO   Length:        0x1234
117b6f08b7cSXing GUO   Version:       2
118b6f08b7cSXing GUO   UnitOffset:    0x4321
119b6f08b7cSXing GUO   UnitSize:      0x00
120b6f08b7cSXing GUO   Entries:
121b6f08b7cSXing GUO     - DieOffset:  0x1234
122b6f08b7cSXing GUO       Descriptor: 0x12
123b6f08b7cSXing GUO       Name:       abcd
124b6f08b7cSXing GUO )";
125683a1bb2SXing GUO   DWARFYAML::Data Data;
126683a1bb2SXing GUO   EXPECT_THAT_ERROR(parseDWARFYAML(Yaml, Data),
127b6f08b7cSXing GUO                     FailedWithMessage("unknown key 'Descriptor'"));
128b6f08b7cSXing GUO }
129b6f08b7cSXing GUO 
TEST(DebugGNUPubSection,TestDebugGNUPubSections)130b6f08b7cSXing GUO TEST(DebugGNUPubSection, TestDebugGNUPubSections) {
131b6f08b7cSXing GUO   StringRef Yaml = R"(
132b6f08b7cSXing GUO debug_gnu_pubnames:
133b7d5d1ecSXing GUO   Length:        0x1234
134b6f08b7cSXing GUO   Version:       2
135b6f08b7cSXing GUO   UnitOffset:    0x4321
136b6f08b7cSXing GUO   UnitSize:      0x00
137b6f08b7cSXing GUO   Entries:
138b6f08b7cSXing GUO     - DieOffset:  0x1234
139b6f08b7cSXing GUO       Descriptor: 0x12
140b6f08b7cSXing GUO       Name:       abc
141b6f08b7cSXing GUO     - DieOffset:  0x4321
142b6f08b7cSXing GUO       Descriptor: 0x34
143b6f08b7cSXing GUO       Name:       def
144b6f08b7cSXing GUO debug_gnu_pubtypes:
145b7d5d1ecSXing GUO   Length:        0x1234
146b6f08b7cSXing GUO   Version:       2
147b6f08b7cSXing GUO   UnitOffset:    0x4321
148b6f08b7cSXing GUO   UnitSize:      0x00
149b6f08b7cSXing GUO   Entries:
150b6f08b7cSXing GUO     - DieOffset:  0x1234
151b6f08b7cSXing GUO       Descriptor: 0x12
152b6f08b7cSXing GUO       Name:       abc
153b6f08b7cSXing GUO     - DieOffset:  0x4321
154b6f08b7cSXing GUO       Descriptor: 0x34
155b6f08b7cSXing GUO       Name:       def
156b6f08b7cSXing GUO )";
157683a1bb2SXing GUO   DWARFYAML::Data Data;
158683a1bb2SXing GUO   ASSERT_THAT_ERROR(parseDWARFYAML(Yaml, Data), Succeeded());
159b6f08b7cSXing GUO 
1603361a364SKazu Hirata   ASSERT_TRUE(Data.GNUPubNames.has_value());
161*67ba5c50SFangrui Song   DWARFYAML::PubSection GNUPubNames = *Data.GNUPubNames;
162b6f08b7cSXing GUO 
163b6f08b7cSXing GUO   ASSERT_EQ(GNUPubNames.Entries.size(), 2u);
164b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)GNUPubNames.Entries[0].DieOffset, 0x1234u);
165b6f08b7cSXing GUO   EXPECT_EQ((uint8_t)GNUPubNames.Entries[0].Descriptor, 0x12);
166b6f08b7cSXing GUO   EXPECT_EQ(GNUPubNames.Entries[0].Name, "abc");
167b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)GNUPubNames.Entries[1].DieOffset, 0x4321u);
168b6f08b7cSXing GUO   EXPECT_EQ((uint8_t)GNUPubNames.Entries[1].Descriptor, 0x34);
169b6f08b7cSXing GUO   EXPECT_EQ(GNUPubNames.Entries[1].Name, "def");
170b6f08b7cSXing GUO 
1713361a364SKazu Hirata   ASSERT_TRUE(Data.GNUPubTypes.has_value());
172*67ba5c50SFangrui Song   DWARFYAML::PubSection GNUPubTypes = *Data.GNUPubTypes;
173b6f08b7cSXing GUO 
174b6f08b7cSXing GUO   ASSERT_EQ(GNUPubTypes.Entries.size(), 2u);
175b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)GNUPubTypes.Entries[0].DieOffset, 0x1234u);
176b6f08b7cSXing GUO   EXPECT_EQ((uint8_t)GNUPubTypes.Entries[0].Descriptor, 0x12);
177b6f08b7cSXing GUO   EXPECT_EQ(GNUPubTypes.Entries[0].Name, "abc");
178b6f08b7cSXing GUO   EXPECT_EQ((uint32_t)GNUPubTypes.Entries[1].DieOffset, 0x4321u);
179b6f08b7cSXing GUO   EXPECT_EQ((uint8_t)GNUPubTypes.Entries[1].Descriptor, 0x34);
180b6f08b7cSXing GUO   EXPECT_EQ(GNUPubTypes.Entries[1].Name, "def");
181b6f08b7cSXing GUO }
182b6f08b7cSXing GUO 
TEST(DebugGNUPubSection,TestMissingDescriptor)183b6f08b7cSXing GUO TEST(DebugGNUPubSection, TestMissingDescriptor) {
184b6f08b7cSXing GUO   StringRef Yaml = R"(
185b6f08b7cSXing GUO debug_gnu_pubnames:
186b7d5d1ecSXing GUO   Length:        0x1234
187b6f08b7cSXing GUO   Version:       2
188b6f08b7cSXing GUO   UnitOffset:    0x4321
189b6f08b7cSXing GUO   UnitSize:      0x00
190b6f08b7cSXing GUO   Entries:
191b6f08b7cSXing GUO     - DieOffset: 0x1234
192b6f08b7cSXing GUO       Name:      abcd
193b6f08b7cSXing GUO )";
194683a1bb2SXing GUO   DWARFYAML::Data Data;
195683a1bb2SXing GUO   EXPECT_THAT_ERROR(parseDWARFYAML(Yaml, Data),
196b6f08b7cSXing GUO                     FailedWithMessage("missing required key 'Descriptor'"));
197b6f08b7cSXing GUO }
198