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