blob: a4109a34097f4ec947d2b09d52d112b7a176fb75 [file] [log] [blame]
Greg Clayton3462a422016-12-08 01:03:48 +00001//===- llvm/unittest/DebugInfo/DWARFFormValueTest.cpp ---------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Jasper0f778692016-12-08 12:45:29 +000010#include "DwarfGenerator.h"
Greg Clayton3462a422016-12-08 01:03:48 +000011#include "llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h"
12#include "llvm/DebugInfo/DWARF/DWARFContext.h"
Greg Claytonc8c10322016-12-13 18:25:19 +000013#include "llvm/DebugInfo/DWARF/DWARFDie.h"
Greg Clayton3462a422016-12-08 01:03:48 +000014#include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
15#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
16#include "llvm/Support/Dwarf.h"
17#include "llvm/Support/Host.h"
18#include "llvm/Support/TargetSelect.h"
19#include "gtest/gtest.h"
20#include <climits>
21
22using namespace llvm;
23using namespace dwarf;
24
25namespace {
26
27void initLLVMIfNeeded() {
28 static bool gInitialized = false;
29 if (!gInitialized) {
30 gInitialized = true;
31 InitializeAllTargets();
32 InitializeAllTargetMCs();
33 InitializeAllAsmPrinters();
34 InitializeAllAsmParsers();
35 }
36}
37
38Triple getHostTripleForAddrSize(uint8_t AddrSize) {
39 Triple PT(Triple::normalize(LLVM_HOST_TRIPLE));
40
41 if (AddrSize == 8 && PT.isArch32Bit())
42 return PT.get64BitArchVariant();
43 if (AddrSize == 4 && PT.isArch64Bit())
44 return PT.get32BitArchVariant();
45 return PT;
46}
47
48/// Take any llvm::Expected and check and handle any errors.
49///
50/// \param Expected a llvm::Excepted instance to check.
51/// \returns true if there were errors, false otherwise.
52template <typename T>
53static bool HandleExpectedError(T &Expected) {
Greg Clayton3462a422016-12-08 01:03:48 +000054 std::string ErrorMsg;
55 handleAllErrors(Expected.takeError(), [&](const llvm::ErrorInfoBase &EI) {
56 ErrorMsg = EI.message();
57 });
Greg Claytonfd461fe2016-12-08 02:11:03 +000058 if (!ErrorMsg.empty()) {
59 ::testing::AssertionFailure() << "error: " << ErrorMsg;
60 return true;
61 }
62 return false;
Greg Clayton3462a422016-12-08 01:03:48 +000063}
64
65template <uint16_t Version, class AddrType, class RefAddrType>
66void TestAllForms() {
67 // Test that we can decode all DW_FORM values correctly.
68
69 const uint8_t AddrSize = sizeof(AddrType);
70 const AddrType AddrValue = (AddrType)0x0123456789abcdefULL;
71 const uint8_t BlockData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
72 const uint32_t BlockSize = sizeof(BlockData);
73 const RefAddrType RefAddr = 0x12345678;
74 const uint8_t Data1 = 0x01U;
75 const uint16_t Data2 = 0x2345U;
76 const uint32_t Data4 = 0x6789abcdU;
77 const uint64_t Data8 = 0x0011223344556677ULL;
78 const uint64_t Data8_2 = 0xAABBCCDDEEFF0011ULL;
79 const int64_t SData = INT64_MIN;
Victor Leschukcbddae72017-01-10 21:18:26 +000080 const int64_t ICSData = INT64_MAX; // DW_FORM_implicit_const SData
Greg Clayton3462a422016-12-08 01:03:48 +000081 const uint64_t UData[] = {UINT64_MAX - 1, UINT64_MAX - 2, UINT64_MAX - 3,
82 UINT64_MAX - 4, UINT64_MAX - 5, UINT64_MAX - 6,
83 UINT64_MAX - 7, UINT64_MAX - 8, UINT64_MAX - 9};
84#define UDATA_1 18446744073709551614ULL
85 const uint32_t Dwarf32Values[] = {1, 2, 3, 4, 5, 6, 7, 8};
86 const char *StringValue = "Hello";
87 const char *StrpValue = "World";
88 initLLVMIfNeeded();
89 Triple Triple = getHostTripleForAddrSize(AddrSize);
90 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
91 if (HandleExpectedError(ExpectedDG))
92 return;
93 dwarfgen::Generator *DG = ExpectedDG.get().get();
94 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
95 dwarfgen::DIE CUDie = CU.getUnitDIE();
96 uint16_t Attr = DW_AT_lo_user;
97
98 //----------------------------------------------------------------------
99 // Test address forms
100 //----------------------------------------------------------------------
101 const auto Attr_DW_FORM_addr = static_cast<dwarf::Attribute>(Attr++);
102 CUDie.addAttribute(Attr_DW_FORM_addr, DW_FORM_addr, AddrValue);
103
104 //----------------------------------------------------------------------
105 // Test block forms
106 //----------------------------------------------------------------------
107 const auto Attr_DW_FORM_block = static_cast<dwarf::Attribute>(Attr++);
108 CUDie.addAttribute(Attr_DW_FORM_block, DW_FORM_block, BlockData, BlockSize);
109
110 const auto Attr_DW_FORM_block1 = static_cast<dwarf::Attribute>(Attr++);
111 CUDie.addAttribute(Attr_DW_FORM_block1, DW_FORM_block1, BlockData, BlockSize);
112
113 const auto Attr_DW_FORM_block2 = static_cast<dwarf::Attribute>(Attr++);
114 CUDie.addAttribute(Attr_DW_FORM_block2, DW_FORM_block2, BlockData, BlockSize);
115
116 const auto Attr_DW_FORM_block4 = static_cast<dwarf::Attribute>(Attr++);
117 CUDie.addAttribute(Attr_DW_FORM_block4, DW_FORM_block4, BlockData, BlockSize);
118
119 //----------------------------------------------------------------------
120 // Test data forms
121 //----------------------------------------------------------------------
122 const auto Attr_DW_FORM_data1 = static_cast<dwarf::Attribute>(Attr++);
123 CUDie.addAttribute(Attr_DW_FORM_data1, DW_FORM_data1, Data1);
124
125 const auto Attr_DW_FORM_data2 = static_cast<dwarf::Attribute>(Attr++);
126 CUDie.addAttribute(Attr_DW_FORM_data2, DW_FORM_data2, Data2);
127
128 const auto Attr_DW_FORM_data4 = static_cast<dwarf::Attribute>(Attr++);
129 CUDie.addAttribute(Attr_DW_FORM_data4, DW_FORM_data4, Data4);
130
131 const auto Attr_DW_FORM_data8 = static_cast<dwarf::Attribute>(Attr++);
132 CUDie.addAttribute(Attr_DW_FORM_data8, DW_FORM_data8, Data8);
133
134 //----------------------------------------------------------------------
135 // Test string forms
136 //----------------------------------------------------------------------
137 const auto Attr_DW_FORM_string = static_cast<dwarf::Attribute>(Attr++);
138 CUDie.addAttribute(Attr_DW_FORM_string, DW_FORM_string, StringValue);
139
140 const auto Attr_DW_FORM_strp = static_cast<dwarf::Attribute>(Attr++);
141 CUDie.addAttribute(Attr_DW_FORM_strp, DW_FORM_strp, StrpValue);
142
143 //----------------------------------------------------------------------
144 // Test reference forms
145 //----------------------------------------------------------------------
146 const auto Attr_DW_FORM_ref_addr = static_cast<dwarf::Attribute>(Attr++);
147 CUDie.addAttribute(Attr_DW_FORM_ref_addr, DW_FORM_ref_addr, RefAddr);
148
149 const auto Attr_DW_FORM_ref1 = static_cast<dwarf::Attribute>(Attr++);
150 CUDie.addAttribute(Attr_DW_FORM_ref1, DW_FORM_ref1, Data1);
151
152 const auto Attr_DW_FORM_ref2 = static_cast<dwarf::Attribute>(Attr++);
153 CUDie.addAttribute(Attr_DW_FORM_ref2, DW_FORM_ref2, Data2);
154
155 const auto Attr_DW_FORM_ref4 = static_cast<dwarf::Attribute>(Attr++);
156 CUDie.addAttribute(Attr_DW_FORM_ref4, DW_FORM_ref4, Data4);
157
158 const auto Attr_DW_FORM_ref8 = static_cast<dwarf::Attribute>(Attr++);
159 CUDie.addAttribute(Attr_DW_FORM_ref8, DW_FORM_ref8, Data8);
160
161 const auto Attr_DW_FORM_ref_sig8 = static_cast<dwarf::Attribute>(Attr++);
162 CUDie.addAttribute(Attr_DW_FORM_ref_sig8, DW_FORM_ref_sig8, Data8_2);
163
164 const auto Attr_DW_FORM_ref_udata = static_cast<dwarf::Attribute>(Attr++);
165 CUDie.addAttribute(Attr_DW_FORM_ref_udata, DW_FORM_ref_udata, UData[0]);
166
167 //----------------------------------------------------------------------
168 // Test flag forms
169 //----------------------------------------------------------------------
170 const auto Attr_DW_FORM_flag_true = static_cast<dwarf::Attribute>(Attr++);
171 CUDie.addAttribute(Attr_DW_FORM_flag_true, DW_FORM_flag, true);
172
173 const auto Attr_DW_FORM_flag_false = static_cast<dwarf::Attribute>(Attr++);
174 CUDie.addAttribute(Attr_DW_FORM_flag_false, DW_FORM_flag, false);
175
176 const auto Attr_DW_FORM_flag_present = static_cast<dwarf::Attribute>(Attr++);
177 CUDie.addAttribute(Attr_DW_FORM_flag_present, DW_FORM_flag_present);
178
179 //----------------------------------------------------------------------
180 // Test SLEB128 based forms
181 //----------------------------------------------------------------------
182 const auto Attr_DW_FORM_sdata = static_cast<dwarf::Attribute>(Attr++);
183 CUDie.addAttribute(Attr_DW_FORM_sdata, DW_FORM_sdata, SData);
184
Victor Leschukcbddae72017-01-10 21:18:26 +0000185 const auto Attr_DW_FORM_implicit_const =
186 static_cast<dwarf::Attribute>(Attr++);
187 if (Version >= 5)
188 CUDie.addAttribute(Attr_DW_FORM_implicit_const, DW_FORM_implicit_const,
189 ICSData);
190
Greg Clayton3462a422016-12-08 01:03:48 +0000191 //----------------------------------------------------------------------
192 // Test ULEB128 based forms
193 //----------------------------------------------------------------------
194 const auto Attr_DW_FORM_udata = static_cast<dwarf::Attribute>(Attr++);
195 CUDie.addAttribute(Attr_DW_FORM_udata, DW_FORM_udata, UData[0]);
196
197 //----------------------------------------------------------------------
198 // Test DWARF32/DWARF64 forms
199 //----------------------------------------------------------------------
200 const auto Attr_DW_FORM_GNU_ref_alt = static_cast<dwarf::Attribute>(Attr++);
201 CUDie.addAttribute(Attr_DW_FORM_GNU_ref_alt, DW_FORM_GNU_ref_alt,
202 Dwarf32Values[0]);
203
204 const auto Attr_DW_FORM_sec_offset = static_cast<dwarf::Attribute>(Attr++);
205 CUDie.addAttribute(Attr_DW_FORM_sec_offset, DW_FORM_sec_offset,
206 Dwarf32Values[1]);
207
208 //----------------------------------------------------------------------
209 // Add an address at the end to make sure we can decode this value
210 //----------------------------------------------------------------------
211 const auto Attr_Last = static_cast<dwarf::Attribute>(Attr++);
212 CUDie.addAttribute(Attr_Last, DW_FORM_addr, AddrValue);
213
214 //----------------------------------------------------------------------
215 // Generate the DWARF
216 //----------------------------------------------------------------------
217 StringRef FileBytes = DG->generate();
218 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
219 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
220 EXPECT_TRUE((bool)Obj);
221 DWARFContextInMemory DwarfContext(*Obj.get());
222 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
223 EXPECT_EQ(NumCUs, 1u);
224 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
Greg Claytonc8c10322016-12-13 18:25:19 +0000225 auto DieDG = U->getUnitDIE(false);
226 EXPECT_TRUE(DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000227
228 //----------------------------------------------------------------------
229 // Test address forms
230 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000231 EXPECT_EQ(DieDG.getAttributeValueAsAddress(Attr_DW_FORM_addr).getValueOr(0),
Greg Clayton3462a422016-12-08 01:03:48 +0000232 AddrValue);
233
234 //----------------------------------------------------------------------
235 // Test block forms
236 //----------------------------------------------------------------------
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000237 Optional<DWARFFormValue> FormValue;
Greg Clayton3462a422016-12-08 01:03:48 +0000238 ArrayRef<uint8_t> ExtractedBlockData;
239 Optional<ArrayRef<uint8_t>> BlockDataOpt;
240
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000241 FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block);
242 EXPECT_TRUE((bool)FormValue);
243 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000244 EXPECT_TRUE(BlockDataOpt.hasValue());
245 ExtractedBlockData = BlockDataOpt.getValue();
246 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
247 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
248
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000249 FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block1);
250 EXPECT_TRUE((bool)FormValue);
251 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000252 EXPECT_TRUE(BlockDataOpt.hasValue());
253 ExtractedBlockData = BlockDataOpt.getValue();
254 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
255 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
256
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000257 FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block2);
258 EXPECT_TRUE((bool)FormValue);
259 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000260 EXPECT_TRUE(BlockDataOpt.hasValue());
261 ExtractedBlockData = BlockDataOpt.getValue();
262 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
263 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
264
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000265 FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block4);
266 EXPECT_TRUE((bool)FormValue);
267 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000268 EXPECT_TRUE(BlockDataOpt.hasValue());
269 ExtractedBlockData = BlockDataOpt.getValue();
270 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
271 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
272
273 //----------------------------------------------------------------------
274 // Test data forms
275 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000276 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_data1)
277 .getValueOr(0),
278 Data1);
279 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_data2)
280 .getValueOr(0),
281 Data2);
282 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_data4)
283 .getValueOr(0),
284 Data4);
285 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_data8)
286 .getValueOr(0),
287 Data8);
Greg Clayton3462a422016-12-08 01:03:48 +0000288
289 //----------------------------------------------------------------------
290 // Test string forms
291 //----------------------------------------------------------------------
292 const char *ExtractedStringValue =
Greg Claytonc8c10322016-12-13 18:25:19 +0000293 DieDG.getAttributeValueAsString(Attr_DW_FORM_string, nullptr);
Greg Clayton3462a422016-12-08 01:03:48 +0000294 EXPECT_TRUE(ExtractedStringValue != nullptr);
295 EXPECT_TRUE(strcmp(StringValue, ExtractedStringValue) == 0);
296
297 const char *ExtractedStrpValue =
Greg Claytonc8c10322016-12-13 18:25:19 +0000298 DieDG.getAttributeValueAsString(Attr_DW_FORM_strp, nullptr);
Greg Clayton3462a422016-12-08 01:03:48 +0000299 EXPECT_TRUE(ExtractedStrpValue != nullptr);
300 EXPECT_TRUE(strcmp(StrpValue, ExtractedStrpValue) == 0);
301
302 //----------------------------------------------------------------------
303 // Test reference forms
304 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000305 EXPECT_EQ(
306 DieDG.getAttributeValueAsReference(Attr_DW_FORM_ref_addr).getValueOr(0),
307 RefAddr);
308 EXPECT_EQ(DieDG.getAttributeValueAsReference(Attr_DW_FORM_ref1).getValueOr(0),
Greg Clayton3462a422016-12-08 01:03:48 +0000309 Data1);
Greg Claytond1efea82017-01-11 17:43:37 +0000310 EXPECT_EQ(DieDG.getAttributeValueAsReference(Attr_DW_FORM_ref2).getValueOr(0),
Greg Clayton3462a422016-12-08 01:03:48 +0000311 Data2);
Greg Claytond1efea82017-01-11 17:43:37 +0000312 EXPECT_EQ(DieDG.getAttributeValueAsReference(Attr_DW_FORM_ref4).getValueOr(0),
Greg Clayton3462a422016-12-08 01:03:48 +0000313 Data4);
Greg Claytond1efea82017-01-11 17:43:37 +0000314 EXPECT_EQ(DieDG.getAttributeValueAsReference(Attr_DW_FORM_ref8).getValueOr(0),
Greg Clayton3462a422016-12-08 01:03:48 +0000315 Data8);
Greg Claytond1efea82017-01-11 17:43:37 +0000316 EXPECT_EQ(
317 DieDG.getAttributeValueAsReference(Attr_DW_FORM_ref_sig8).getValueOr(0),
318 Data8_2);
319 EXPECT_EQ(
320 DieDG.getAttributeValueAsReference(Attr_DW_FORM_ref_udata).getValueOr(0),
321 UData[0]);
Greg Clayton3462a422016-12-08 01:03:48 +0000322
323 //----------------------------------------------------------------------
324 // Test flag forms
325 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000326 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_flag_true)
327 .getValueOr(0),
Greg Clayton3462a422016-12-08 01:03:48 +0000328 1ULL);
Greg Claytond1efea82017-01-11 17:43:37 +0000329 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_flag_false)
330 .getValueOr(1),
Greg Clayton3462a422016-12-08 01:03:48 +0000331 0ULL);
Greg Claytond1efea82017-01-11 17:43:37 +0000332 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_flag_present)
333 .getValueOr(0ULL),
Greg Clayton3462a422016-12-08 01:03:48 +0000334 1ULL);
335
Greg Clayton3462a422016-12-08 01:03:48 +0000336 //----------------------------------------------------------------------
337 // Test SLEB128 based forms
338 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000339 EXPECT_EQ(
340 DieDG.getAttributeValueAsSignedConstant(Attr_DW_FORM_sdata).getValueOr(0),
341 SData);
Victor Leschukcbddae72017-01-10 21:18:26 +0000342 if (Version >= 5)
Greg Claytond1efea82017-01-11 17:43:37 +0000343 EXPECT_EQ(
344 DieDG.getAttributeValueAsSignedConstant(Attr_DW_FORM_implicit_const)
345 .getValueOr(0),
346 ICSData);
Greg Clayton3462a422016-12-08 01:03:48 +0000347
348 //----------------------------------------------------------------------
349 // Test ULEB128 based forms
350 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000351 EXPECT_EQ(DieDG.getAttributeValueAsUnsignedConstant(Attr_DW_FORM_udata)
352 .getValueOr(0),
353 UData[0]);
Greg Clayton3462a422016-12-08 01:03:48 +0000354
355 //----------------------------------------------------------------------
356 // Test DWARF32/DWARF64 forms
357 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000358 EXPECT_EQ(DieDG.getAttributeValueAsReference(Attr_DW_FORM_GNU_ref_alt)
359 .getValueOr(0),
360 Dwarf32Values[0]);
361 EXPECT_EQ(DieDG.getAttributeValueAsSectionOffset(Attr_DW_FORM_sec_offset)
362 .getValueOr(0),
363 Dwarf32Values[1]);
Greg Clayton3462a422016-12-08 01:03:48 +0000364
365 //----------------------------------------------------------------------
366 // Add an address at the end to make sure we can decode this value
367 //----------------------------------------------------------------------
Greg Claytond1efea82017-01-11 17:43:37 +0000368 EXPECT_EQ(DieDG.getAttributeValueAsAddress(Attr_Last).getValueOr(0),
369 AddrValue);
Greg Clayton3462a422016-12-08 01:03:48 +0000370}
371
372TEST(DWARFDebugInfo, TestDWARF32Version2Addr4AllForms) {
373 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
374 // addresses.
375 typedef uint32_t AddrType;
376 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
377 typedef AddrType RefAddrType;
378 TestAllForms<2, AddrType, RefAddrType>();
379}
380
381TEST(DWARFDebugInfo, TestDWARF32Version2Addr8AllForms) {
382 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
383 // addresses.
384 typedef uint64_t AddrType;
385 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
386 typedef AddrType RefAddrType;
387 TestAllForms<2, AddrType, RefAddrType>();
388}
389
390TEST(DWARFDebugInfo, TestDWARF32Version3Addr4AllForms) {
391 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
392 // addresses.
393 typedef uint32_t AddrType;
394 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later.
395 typedef uint32_t RefAddrType;
396 TestAllForms<3, AddrType, RefAddrType>();
397}
398
399TEST(DWARFDebugInfo, TestDWARF32Version3Addr8AllForms) {
400 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
401 // addresses.
402 typedef uint64_t AddrType;
403 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
404 typedef uint32_t RefAddrType;
405 TestAllForms<3, AddrType, RefAddrType>();
406}
407
408TEST(DWARFDebugInfo, TestDWARF32Version4Addr4AllForms) {
409 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
410 // addresses.
411 typedef uint32_t AddrType;
412 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
413 typedef uint32_t RefAddrType;
414 TestAllForms<4, AddrType, RefAddrType>();
415}
416
417TEST(DWARFDebugInfo, TestDWARF32Version4Addr8AllForms) {
418 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
419 // addresses.
420 typedef uint64_t AddrType;
421 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
422 typedef uint32_t RefAddrType;
423 TestAllForms<4, AddrType, RefAddrType>();
424}
425
Victor Leschukcbddae72017-01-10 21:18:26 +0000426TEST(DWARFDebugInfo, TestDWARF32Version5Addr4AllForms) {
427 // Test that we can decode all forms for DWARF32, version 5, with 4 byte
428 // addresses.
429 typedef uint32_t AddrType;
430 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
431 typedef uint32_t RefAddrType;
432 TestAllForms<5, AddrType, RefAddrType>();
433}
434
435TEST(DWARFDebugInfo, TestDWARF32Version5Addr8AllForms) {
436 // Test that we can decode all forms for DWARF32, version 5, with 8 byte
437 // addresses.
438 typedef uint64_t AddrType;
439 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
440 typedef uint32_t RefAddrType;
441 TestAllForms<5, AddrType, RefAddrType>();
442}
443
Greg Clayton3462a422016-12-08 01:03:48 +0000444template <uint16_t Version, class AddrType> void TestChildren() {
445 // Test that we can decode DW_FORM_ref_addr values correctly in DWARF 2 with
446 // 4 byte addresses. DW_FORM_ref_addr values should be 4 bytes when using
447 // 8 byte addresses.
448
449 const uint8_t AddrSize = sizeof(AddrType);
450 initLLVMIfNeeded();
451 Triple Triple = getHostTripleForAddrSize(AddrSize);
452 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
453 if (HandleExpectedError(ExpectedDG))
454 return;
455 dwarfgen::Generator *DG = ExpectedDG.get().get();
456 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
457 dwarfgen::DIE CUDie = CU.getUnitDIE();
458
459 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
460 CUDie.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
461
462 dwarfgen::DIE SubprogramDie = CUDie.addChild(DW_TAG_subprogram);
463 SubprogramDie.addAttribute(DW_AT_name, DW_FORM_strp, "main");
464 SubprogramDie.addAttribute(DW_AT_low_pc, DW_FORM_addr, 0x1000U);
465 SubprogramDie.addAttribute(DW_AT_high_pc, DW_FORM_addr, 0x2000U);
466
467 dwarfgen::DIE IntDie = CUDie.addChild(DW_TAG_base_type);
468 IntDie.addAttribute(DW_AT_name, DW_FORM_strp, "int");
469 IntDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
470 IntDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
471
472 dwarfgen::DIE ArgcDie = SubprogramDie.addChild(DW_TAG_formal_parameter);
473 ArgcDie.addAttribute(DW_AT_name, DW_FORM_strp, "argc");
474 // ArgcDie.addAttribute(DW_AT_type, DW_FORM_ref4, IntDie);
475 ArgcDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, IntDie);
476
477 StringRef FileBytes = DG->generate();
478 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
479 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
480 EXPECT_TRUE((bool)Obj);
481 DWARFContextInMemory DwarfContext(*Obj.get());
482
483 // Verify the number of compile units is correct.
484 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
485 EXPECT_EQ(NumCUs, 1u);
486 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
487
488 // Get the compile unit DIE is valid.
Greg Claytonc8c10322016-12-13 18:25:19 +0000489 auto DieDG = U->getUnitDIE(false);
490 EXPECT_TRUE(DieDG.isValid());
491 // DieDG.dump(llvm::outs(), U, UINT32_MAX);
Greg Clayton3462a422016-12-08 01:03:48 +0000492
493 // Verify the first child of the compile unit DIE is our subprogram.
Greg Claytonc8c10322016-12-13 18:25:19 +0000494 auto SubprogramDieDG = DieDG.getFirstChild();
495 EXPECT_TRUE(SubprogramDieDG.isValid());
496 EXPECT_EQ(SubprogramDieDG.getTag(), DW_TAG_subprogram);
Greg Clayton3462a422016-12-08 01:03:48 +0000497
498 // Verify the first child of the subprogram is our formal parameter.
Greg Claytonc8c10322016-12-13 18:25:19 +0000499 auto ArgcDieDG = SubprogramDieDG.getFirstChild();
500 EXPECT_TRUE(ArgcDieDG.isValid());
501 EXPECT_EQ(ArgcDieDG.getTag(), DW_TAG_formal_parameter);
Greg Clayton3462a422016-12-08 01:03:48 +0000502
503 // Verify our formal parameter has a NULL tag sibling.
Greg Claytonc8c10322016-12-13 18:25:19 +0000504 auto NullDieDG = ArgcDieDG.getSibling();
505 EXPECT_TRUE(NullDieDG.isValid());
506 if (NullDieDG) {
507 EXPECT_EQ(NullDieDG.getTag(), DW_TAG_null);
508 EXPECT_TRUE(!NullDieDG.getSibling().isValid());
509 EXPECT_TRUE(!NullDieDG.getFirstChild().isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000510 }
511
512 // Verify the sibling of our subprogram is our integer base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000513 auto IntDieDG = SubprogramDieDG.getSibling();
514 EXPECT_TRUE(IntDieDG.isValid());
515 EXPECT_EQ(IntDieDG.getTag(), DW_TAG_base_type);
Greg Clayton3462a422016-12-08 01:03:48 +0000516
517 // Verify the sibling of our subprogram is our integer base is a NULL tag.
Greg Claytonc8c10322016-12-13 18:25:19 +0000518 NullDieDG = IntDieDG.getSibling();
519 EXPECT_TRUE(NullDieDG.isValid());
520 if (NullDieDG) {
521 EXPECT_EQ(NullDieDG.getTag(), DW_TAG_null);
522 EXPECT_TRUE(!NullDieDG.getSibling().isValid());
523 EXPECT_TRUE(!NullDieDG.getFirstChild().isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000524 }
525}
526
527TEST(DWARFDebugInfo, TestDWARF32Version2Addr4Children) {
528 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
529 // addresses.
530 typedef uint32_t AddrType;
531 TestChildren<2, AddrType>();
532}
533
534TEST(DWARFDebugInfo, TestDWARF32Version2Addr8Children) {
535 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
536 // addresses.
537 typedef uint64_t AddrType;
538 TestChildren<2, AddrType>();
539}
540
541TEST(DWARFDebugInfo, TestDWARF32Version3Addr4Children) {
542 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
543 // addresses.
544 typedef uint32_t AddrType;
545 TestChildren<3, AddrType>();
546}
547
548TEST(DWARFDebugInfo, TestDWARF32Version3Addr8Children) {
549 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
550 // addresses.
551 typedef uint64_t AddrType;
552 TestChildren<3, AddrType>();
553}
554
555TEST(DWARFDebugInfo, TestDWARF32Version4Addr4Children) {
556 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
557 // addresses.
558 typedef uint32_t AddrType;
559 TestChildren<4, AddrType>();
560}
561
562TEST(DWARFDebugInfo, TestDWARF32Version4Addr8Children) {
563 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
564 // addresses.
565 typedef uint64_t AddrType;
566 TestChildren<4, AddrType>();
567}
568
569template <uint16_t Version, class AddrType> void TestReferences() {
570 // Test that we can decode DW_FORM_refXXX values correctly in DWARF.
571
572 const uint8_t AddrSize = sizeof(AddrType);
573 initLLVMIfNeeded();
574 Triple Triple = getHostTripleForAddrSize(AddrSize);
575 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
576 if (HandleExpectedError(ExpectedDG))
577 return;
578 dwarfgen::Generator *DG = ExpectedDG.get().get();
579 dwarfgen::CompileUnit &CU1 = DG->addCompileUnit();
580 dwarfgen::CompileUnit &CU2 = DG->addCompileUnit();
581
582 dwarfgen::DIE CU1Die = CU1.getUnitDIE();
583 CU1Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
584 CU1Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
585
586 dwarfgen::DIE CU1TypeDie = CU1Die.addChild(DW_TAG_base_type);
587 CU1TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "int");
588 CU1TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
589 CU1TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
590
591 dwarfgen::DIE CU1Ref1Die = CU1Die.addChild(DW_TAG_variable);
592 CU1Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref1");
593 CU1Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU1TypeDie);
594
595 dwarfgen::DIE CU1Ref2Die = CU1Die.addChild(DW_TAG_variable);
596 CU1Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref2");
597 CU1Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU1TypeDie);
598
599 dwarfgen::DIE CU1Ref4Die = CU1Die.addChild(DW_TAG_variable);
600 CU1Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref4");
601 CU1Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU1TypeDie);
602
603 dwarfgen::DIE CU1Ref8Die = CU1Die.addChild(DW_TAG_variable);
604 CU1Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref8");
605 CU1Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU1TypeDie);
606
607 dwarfgen::DIE CU1RefAddrDie = CU1Die.addChild(DW_TAG_variable);
608 CU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1RefAddr");
609 CU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
610
611 dwarfgen::DIE CU2Die = CU2.getUnitDIE();
612 CU2Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/foo.c");
613 CU2Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
614
615 dwarfgen::DIE CU2TypeDie = CU2Die.addChild(DW_TAG_base_type);
616 CU2TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "float");
617 CU2TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_float);
618 CU2TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
619
620 dwarfgen::DIE CU2Ref1Die = CU2Die.addChild(DW_TAG_variable);
621 CU2Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref1");
622 CU2Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU2TypeDie);
623
624 dwarfgen::DIE CU2Ref2Die = CU2Die.addChild(DW_TAG_variable);
625 CU2Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref2");
626 CU2Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU2TypeDie);
627
628 dwarfgen::DIE CU2Ref4Die = CU2Die.addChild(DW_TAG_variable);
629 CU2Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref4");
630 CU2Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU2TypeDie);
631
632 dwarfgen::DIE CU2Ref8Die = CU2Die.addChild(DW_TAG_variable);
633 CU2Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref8");
634 CU2Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU2TypeDie);
635
636 dwarfgen::DIE CU2RefAddrDie = CU2Die.addChild(DW_TAG_variable);
637 CU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2RefAddr");
638 CU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
639
640 // Refer to a type in CU1 from CU2
641 dwarfgen::DIE CU2ToCU1RefAddrDie = CU2Die.addChild(DW_TAG_variable);
642 CU2ToCU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2ToCU1RefAddr");
643 CU2ToCU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
644
645 // Refer to a type in CU2 from CU1
646 dwarfgen::DIE CU1ToCU2RefAddrDie = CU1Die.addChild(DW_TAG_variable);
647 CU1ToCU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1ToCU2RefAddr");
648 CU1ToCU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
649
650 StringRef FileBytes = DG->generate();
651 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
652 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
653 EXPECT_TRUE((bool)Obj);
654 DWARFContextInMemory DwarfContext(*Obj.get());
655
656 // Verify the number of compile units is correct.
657 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
658 EXPECT_EQ(NumCUs, 2u);
659 DWARFCompileUnit *U1 = DwarfContext.getCompileUnitAtIndex(0);
660 DWARFCompileUnit *U2 = DwarfContext.getCompileUnitAtIndex(1);
661
662 // Get the compile unit DIE is valid.
Greg Claytonc8c10322016-12-13 18:25:19 +0000663 auto Unit1DieDG = U1->getUnitDIE(false);
664 EXPECT_TRUE(Unit1DieDG.isValid());
665 // Unit1DieDG.dump(llvm::outs(), UINT32_MAX);
Greg Clayton3462a422016-12-08 01:03:48 +0000666
Greg Claytonc8c10322016-12-13 18:25:19 +0000667 auto Unit2DieDG = U2->getUnitDIE(false);
668 EXPECT_TRUE(Unit2DieDG.isValid());
669 // Unit2DieDG.dump(llvm::outs(), UINT32_MAX);
Greg Clayton3462a422016-12-08 01:03:48 +0000670
671 // Verify the first child of the compile unit 1 DIE is our int base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000672 auto CU1TypeDieDG = Unit1DieDG.getFirstChild();
673 EXPECT_TRUE(CU1TypeDieDG.isValid());
674 EXPECT_EQ(CU1TypeDieDG.getTag(), DW_TAG_base_type);
Greg Claytond1efea82017-01-11 17:43:37 +0000675 EXPECT_EQ(CU1TypeDieDG.getAttributeValueAsUnsignedConstant(DW_AT_encoding)
676 .getValueOr(0),
677 DW_ATE_signed);
Greg Clayton3462a422016-12-08 01:03:48 +0000678
679 // Verify the first child of the compile unit 2 DIE is our float base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000680 auto CU2TypeDieDG = Unit2DieDG.getFirstChild();
681 EXPECT_TRUE(CU2TypeDieDG.isValid());
682 EXPECT_EQ(CU2TypeDieDG.getTag(), DW_TAG_base_type);
Greg Claytond1efea82017-01-11 17:43:37 +0000683 EXPECT_EQ(CU2TypeDieDG.getAttributeValueAsUnsignedConstant(DW_AT_encoding)
684 .getValueOr(0),
685 DW_ATE_float);
Greg Clayton3462a422016-12-08 01:03:48 +0000686
687 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
688 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000689 auto CU1Ref1DieDG = CU1TypeDieDG.getSibling();
690 EXPECT_TRUE(CU1Ref1DieDG.isValid());
691 EXPECT_EQ(CU1Ref1DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000692 EXPECT_EQ(
693 CU1Ref1DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
694 CU1TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000695 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
696 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000697 auto CU1Ref2DieDG = CU1Ref1DieDG.getSibling();
698 EXPECT_TRUE(CU1Ref2DieDG.isValid());
699 EXPECT_EQ(CU1Ref2DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000700 EXPECT_EQ(
701 CU1Ref2DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
702 CU1TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000703
704 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
705 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000706 auto CU1Ref4DieDG = CU1Ref2DieDG.getSibling();
707 EXPECT_TRUE(CU1Ref4DieDG.isValid());
708 EXPECT_EQ(CU1Ref4DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000709 EXPECT_EQ(
710 CU1Ref4DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
711 CU1TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000712
713 // Verify the sibling is our Ref8 DIE and that its DW_AT_type points to our
714 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000715 auto CU1Ref8DieDG = CU1Ref4DieDG.getSibling();
716 EXPECT_TRUE(CU1Ref8DieDG.isValid());
717 EXPECT_EQ(CU1Ref8DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000718 EXPECT_EQ(
719 CU1Ref8DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
720 CU1TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000721
722 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
723 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000724 auto CU1RefAddrDieDG = CU1Ref8DieDG.getSibling();
725 EXPECT_TRUE(CU1RefAddrDieDG.isValid());
726 EXPECT_EQ(CU1RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000727 EXPECT_EQ(CU1RefAddrDieDG.getAttributeValueAsReference(DW_AT_type)
728 .getValueOr(-1ULL),
729 CU1TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000730
731 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
732 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000733 auto CU1ToCU2RefAddrDieDG = CU1RefAddrDieDG.getSibling();
734 EXPECT_TRUE(CU1ToCU2RefAddrDieDG.isValid());
735 EXPECT_EQ(CU1ToCU2RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000736 EXPECT_EQ(CU1ToCU2RefAddrDieDG.getAttributeValueAsReference(DW_AT_type)
737 .getValueOr(-1ULL),
Greg Claytonc8c10322016-12-13 18:25:19 +0000738 CU2TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000739
740 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
741 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000742 auto CU2Ref1DieDG = CU2TypeDieDG.getSibling();
743 EXPECT_TRUE(CU2Ref1DieDG.isValid());
744 EXPECT_EQ(CU2Ref1DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000745 EXPECT_EQ(
746 CU2Ref1DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
747 CU2TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000748 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
749 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000750 auto CU2Ref2DieDG = CU2Ref1DieDG.getSibling();
751 EXPECT_TRUE(CU2Ref2DieDG.isValid());
752 EXPECT_EQ(CU2Ref2DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000753 EXPECT_EQ(
754 CU2Ref2DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
755 CU2TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000756
757 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
758 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000759 auto CU2Ref4DieDG = CU2Ref2DieDG.getSibling();
760 EXPECT_TRUE(CU2Ref4DieDG.isValid());
761 EXPECT_EQ(CU2Ref4DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000762 EXPECT_EQ(
763 CU2Ref4DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
764 CU2TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000765
766 // Verify the sibling is our Ref8 DIE and that its DW_AT_type points to our
767 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000768 auto CU2Ref8DieDG = CU2Ref4DieDG.getSibling();
769 EXPECT_TRUE(CU2Ref8DieDG.isValid());
770 EXPECT_EQ(CU2Ref8DieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000771 EXPECT_EQ(
772 CU2Ref8DieDG.getAttributeValueAsReference(DW_AT_type).getValueOr(-1ULL),
773 CU2TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000774
775 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
776 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000777 auto CU2RefAddrDieDG = CU2Ref8DieDG.getSibling();
778 EXPECT_TRUE(CU2RefAddrDieDG.isValid());
779 EXPECT_EQ(CU2RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000780 EXPECT_EQ(CU2RefAddrDieDG.getAttributeValueAsReference(DW_AT_type)
781 .getValueOr(-1ULL),
782 CU2TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000783
784 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
785 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000786 auto CU2ToCU1RefAddrDieDG = CU2RefAddrDieDG.getSibling();
787 EXPECT_TRUE(CU2ToCU1RefAddrDieDG.isValid());
788 EXPECT_EQ(CU2ToCU1RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Claytond1efea82017-01-11 17:43:37 +0000789 EXPECT_EQ(CU2ToCU1RefAddrDieDG.getAttributeValueAsReference(DW_AT_type)
790 .getValueOr(-1ULL),
Greg Claytonc8c10322016-12-13 18:25:19 +0000791 CU1TypeDieDG.getOffset());
Greg Clayton3462a422016-12-08 01:03:48 +0000792}
793
794TEST(DWARFDebugInfo, TestDWARF32Version2Addr4References) {
795 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
796 // addresses.
797 typedef uint32_t AddrType;
798 TestReferences<2, AddrType>();
799}
800
801TEST(DWARFDebugInfo, TestDWARF32Version2Addr8References) {
802 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
803 // addresses.
804 typedef uint64_t AddrType;
805 TestReferences<2, AddrType>();
806}
807
808TEST(DWARFDebugInfo, TestDWARF32Version3Addr4References) {
809 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
810 // addresses.
811 typedef uint32_t AddrType;
812 TestReferences<3, AddrType>();
813}
814
815TEST(DWARFDebugInfo, TestDWARF32Version3Addr8References) {
816 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
817 // addresses.
818 typedef uint64_t AddrType;
819 TestReferences<3, AddrType>();
820}
821
822TEST(DWARFDebugInfo, TestDWARF32Version4Addr4References) {
823 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
824 // addresses.
825 typedef uint32_t AddrType;
826 TestReferences<4, AddrType>();
827}
828
829TEST(DWARFDebugInfo, TestDWARF32Version4Addr8References) {
830 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
831 // addresses.
832 typedef uint64_t AddrType;
833 TestReferences<4, AddrType>();
834}
835
Greg Clayton2520c9e2016-12-19 20:36:41 +0000836template <uint16_t Version, class AddrType> void TestAddresses() {
837 // Test the DWARF APIs related to accessing the DW_AT_low_pc and
838 // DW_AT_high_pc.
839 const uint8_t AddrSize = sizeof(AddrType);
840 const bool SupportsHighPCAsOffset = Version >= 4;
841 initLLVMIfNeeded();
842 Triple Triple = getHostTripleForAddrSize(AddrSize);
843 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
844 if (HandleExpectedError(ExpectedDG))
845 return;
846 dwarfgen::Generator *DG = ExpectedDG.get().get();
847 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
848 dwarfgen::DIE CUDie = CU.getUnitDIE();
849
850 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
851 CUDie.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
852
853 // Create a subprogram DIE with no low or high PC.
854 dwarfgen::DIE SubprogramNoPC = CUDie.addChild(DW_TAG_subprogram);
855 SubprogramNoPC.addAttribute(DW_AT_name, DW_FORM_strp, "no_pc");
856
857 // Create a subprogram DIE with a low PC only.
858 dwarfgen::DIE SubprogramLowPC = CUDie.addChild(DW_TAG_subprogram);
859 SubprogramLowPC.addAttribute(DW_AT_name, DW_FORM_strp, "low_pc");
860 const uint64_t ActualLowPC = 0x1000;
861 const uint64_t ActualHighPC = 0x2000;
862 const uint64_t ActualHighPCOffset = ActualHighPC - ActualLowPC;
863 SubprogramLowPC.addAttribute(DW_AT_low_pc, DW_FORM_addr, ActualLowPC);
864
865 // Create a subprogram DIE with a low and high PC.
866 dwarfgen::DIE SubprogramLowHighPC = CUDie.addChild(DW_TAG_subprogram);
867 SubprogramLowHighPC.addAttribute(DW_AT_name, DW_FORM_strp, "low_high_pc");
868 SubprogramLowHighPC.addAttribute(DW_AT_low_pc, DW_FORM_addr, ActualLowPC);
869 // Encode the high PC as an offset from the low PC if supported.
870 if (SupportsHighPCAsOffset)
871 SubprogramLowHighPC.addAttribute(DW_AT_high_pc, DW_FORM_data4,
872 ActualHighPCOffset);
873 else
874 SubprogramLowHighPC.addAttribute(DW_AT_high_pc, DW_FORM_addr, ActualHighPC);
875
876 StringRef FileBytes = DG->generate();
877 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
878 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
879 EXPECT_TRUE((bool)Obj);
880 DWARFContextInMemory DwarfContext(*Obj.get());
881
882 // Verify the number of compile units is correct.
883 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
884 EXPECT_EQ(NumCUs, 1u);
885 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
886
887 // Get the compile unit DIE is valid.
888 auto DieDG = U->getUnitDIE(false);
889 EXPECT_TRUE(DieDG.isValid());
890 // DieDG.dump(llvm::outs(), U, UINT32_MAX);
891
892 uint64_t LowPC, HighPC;
893 Optional<uint64_t> OptU64;
894 // Verify the that our subprogram with no PC value fails appropriately when
895 // asked for any PC values.
896 auto SubprogramDieNoPC = DieDG.getFirstChild();
897 EXPECT_TRUE(SubprogramDieNoPC.isValid());
898 EXPECT_EQ(SubprogramDieNoPC.getTag(), DW_TAG_subprogram);
899 OptU64 = SubprogramDieNoPC.getAttributeValueAsAddress(DW_AT_low_pc);
900 EXPECT_FALSE((bool)OptU64);
901 OptU64 = SubprogramDieNoPC.getAttributeValueAsAddress(DW_AT_high_pc);
902 EXPECT_FALSE((bool)OptU64);
903 EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
904 OptU64 = SubprogramDieNoPC.getAttributeValueAsAddress(DW_AT_high_pc);
905 EXPECT_FALSE((bool)OptU64);
906 OptU64 = SubprogramDieNoPC.getAttributeValueAsUnsignedConstant(DW_AT_high_pc);
907 EXPECT_FALSE((bool)OptU64);
908 OptU64 = SubprogramDieNoPC.getHighPC(ActualLowPC);
909 EXPECT_FALSE((bool)OptU64);
910 EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
911
912
913 // Verify the that our subprogram with only a low PC value succeeds when
914 // we ask for the Low PC, but fails appropriately when asked for the high PC
915 // or both low and high PC values.
916 auto SubprogramDieLowPC = SubprogramDieNoPC.getSibling();
917 EXPECT_TRUE(SubprogramDieLowPC.isValid());
918 EXPECT_EQ(SubprogramDieLowPC.getTag(), DW_TAG_subprogram);
919 OptU64 = SubprogramDieLowPC.getAttributeValueAsAddress(DW_AT_low_pc);
920 EXPECT_TRUE((bool)OptU64);
921 EXPECT_EQ(OptU64.getValue(), ActualLowPC);
922 OptU64 = SubprogramDieLowPC.getAttributeValueAsAddress(DW_AT_high_pc);
923 EXPECT_FALSE((bool)OptU64);
924 OptU64 = SubprogramDieLowPC.getAttributeValueAsUnsignedConstant(DW_AT_high_pc);
925 EXPECT_FALSE((bool)OptU64);
926 OptU64 = SubprogramDieLowPC.getHighPC(ActualLowPC);
927 EXPECT_FALSE((bool)OptU64);
928 EXPECT_FALSE(SubprogramDieLowPC.getLowAndHighPC(LowPC, HighPC));
929
930
931 // Verify the that our subprogram with only a low PC value succeeds when
932 // we ask for the Low PC, but fails appropriately when asked for the high PC
933 // or both low and high PC values.
934 auto SubprogramDieLowHighPC = SubprogramDieLowPC.getSibling();
935 EXPECT_TRUE(SubprogramDieLowHighPC.isValid());
936 EXPECT_EQ(SubprogramDieLowHighPC.getTag(), DW_TAG_subprogram);
937 OptU64 = SubprogramDieLowHighPC.getAttributeValueAsAddress(DW_AT_low_pc);
938 EXPECT_TRUE((bool)OptU64);
939 EXPECT_EQ(OptU64.getValue(), ActualLowPC);
940 // Get the high PC as an address. This should succeed if the high PC was
941 // encoded as an address and fail if the high PC was encoded as an offset.
942 OptU64 = SubprogramDieLowHighPC.getAttributeValueAsAddress(DW_AT_high_pc);
943 if (SupportsHighPCAsOffset) {
944 EXPECT_FALSE((bool)OptU64);
945 } else {
946 EXPECT_TRUE((bool)OptU64);
947 EXPECT_EQ(OptU64.getValue(), ActualHighPC);
948 }
949 // Get the high PC as an unsigned constant. This should succeed if the high PC
950 // was encoded as an offset and fail if the high PC was encoded as an address.
951 OptU64 = SubprogramDieLowHighPC.getAttributeValueAsUnsignedConstant(
952 DW_AT_high_pc);
953 if (SupportsHighPCAsOffset) {
954 EXPECT_TRUE((bool)OptU64);
955 EXPECT_EQ(OptU64.getValue(), ActualHighPCOffset);
956 } else {
957 EXPECT_FALSE((bool)OptU64);
958 }
959
960 OptU64 = SubprogramDieLowHighPC.getHighPC(ActualLowPC);
961 EXPECT_TRUE((bool)OptU64);
962 EXPECT_EQ(OptU64.getValue(), ActualHighPC);
963
964 EXPECT_TRUE(SubprogramDieLowHighPC.getLowAndHighPC(LowPC, HighPC));
965 EXPECT_EQ(LowPC, ActualLowPC);
966 EXPECT_EQ(HighPC, ActualHighPC);
967}
968
969TEST(DWARFDebugInfo, TestDWARF32Version2Addr4Addresses) {
970 // Test that we can decode address values in DWARF32, version 2, with 4 byte
971 // addresses.
972 typedef uint32_t AddrType;
973 TestAddresses<2, AddrType>();
974}
975
976TEST(DWARFDebugInfo, TestDWARF32Version2Addr8Addresses) {
977 // Test that we can decode address values in DWARF32, version 2, with 8 byte
978 // addresses.
979 typedef uint64_t AddrType;
980 TestAddresses<2, AddrType>();
981}
982
983TEST(DWARFDebugInfo, TestDWARF32Version3Addr4Addresses) {
984 // Test that we can decode address values in DWARF32, version 3, with 4 byte
985 // addresses.
986 typedef uint32_t AddrType;
987 TestAddresses<3, AddrType>();
988}
989
990TEST(DWARFDebugInfo, TestDWARF32Version3Addr8Addresses) {
991 // Test that we can decode address values in DWARF32, version 3, with 8 byte
992 // addresses.
993 typedef uint64_t AddrType;
994 TestAddresses<3, AddrType>();
995}
996
997TEST(DWARFDebugInfo, TestDWARF32Version4Addr4Addresses) {
998 // Test that we can decode address values in DWARF32, version 4, with 4 byte
999 // addresses.
1000 typedef uint32_t AddrType;
1001 TestAddresses<4, AddrType>();
1002}
1003
1004TEST(DWARFDebugInfo, TestDWARF32Version4Addr8Addresses) {
1005 // Test that we can decode address values in DWARF32, version 4, with 8 byte
1006 // addresses.
1007 typedef uint64_t AddrType;
1008 TestAddresses<4, AddrType>();
1009}
1010
Greg Clayton78a07bf2016-12-21 21:37:06 +00001011TEST(DWARFDebugInfo, TestRelations) {
1012 // Test the DWARF APIs related to accessing the DW_AT_low_pc and
1013 // DW_AT_high_pc.
1014 uint16_t Version = 4;
1015
1016 const uint8_t AddrSize = sizeof(void *);
1017 initLLVMIfNeeded();
1018 Triple Triple = getHostTripleForAddrSize(AddrSize);
1019 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1020 if (HandleExpectedError(ExpectedDG))
1021 return;
1022 dwarfgen::Generator *DG = ExpectedDG.get().get();
1023 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1024
1025 enum class Tag: uint16_t {
1026 A = dwarf::DW_TAG_lo_user,
1027 B,
Greg Clayton78a07bf2016-12-21 21:37:06 +00001028 C,
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001029 C1,
1030 C2,
1031 D,
1032 D1
Greg Clayton78a07bf2016-12-21 21:37:06 +00001033 };
1034
1035 // Scope to allow us to re-use the same DIE names
1036 {
1037 // Create DWARF tree that looks like:
1038 //
1039 // CU
1040 // A
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001041 // B
1042 // C
1043 // C1
1044 // C2
1045 // D
1046 // D1
Greg Clayton78a07bf2016-12-21 21:37:06 +00001047 dwarfgen::DIE CUDie = CU.getUnitDIE();
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001048 dwarfgen::DIE A = CUDie.addChild((dwarf::Tag)Tag::A);
1049 A.addChild((dwarf::Tag)Tag::B);
1050 dwarfgen::DIE C = A.addChild((dwarf::Tag)Tag::C);
1051 dwarfgen::DIE D = A.addChild((dwarf::Tag)Tag::D);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001052 C.addChild((dwarf::Tag)Tag::C1);
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001053 C.addChild((dwarf::Tag)Tag::C2);
1054 D.addChild((dwarf::Tag)Tag::D1);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001055 }
1056
1057 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1058 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1059 EXPECT_TRUE((bool)Obj);
1060 DWARFContextInMemory DwarfContext(*Obj.get());
1061
1062 // Verify the number of compile units is correct.
1063 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1064 EXPECT_EQ(NumCUs, 1u);
1065 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1066
1067 // Get the compile unit DIE is valid.
1068 auto CUDie = U->getUnitDIE(false);
1069 EXPECT_TRUE(CUDie.isValid());
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001070 // CUDie.dump(llvm::outs(), UINT32_MAX);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001071
1072 // The compile unit doesn't have a parent or a sibling.
1073 auto ParentDie = CUDie.getParent();
1074 EXPECT_FALSE(ParentDie.isValid());
1075 auto SiblingDie = CUDie.getSibling();
1076 EXPECT_FALSE(SiblingDie.isValid());
1077
1078 // Get the children of the compile unit
1079 auto A = CUDie.getFirstChild();
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001080 auto B = A.getFirstChild();
Greg Clayton78a07bf2016-12-21 21:37:06 +00001081 auto C = B.getSibling();
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001082 auto D = C.getSibling();
1083 auto Null = D.getSibling();
Greg Clayton78a07bf2016-12-21 21:37:06 +00001084
1085 // Verify NULL Die is NULL and has no children or siblings
1086 EXPECT_TRUE(Null.isNULL());
1087 EXPECT_FALSE(Null.getSibling().isValid());
1088 EXPECT_FALSE(Null.getFirstChild().isValid());
1089
1090 // Verify all children of the compile unit DIE are correct.
1091 EXPECT_EQ(A.getTag(), (dwarf::Tag)Tag::A);
1092 EXPECT_EQ(B.getTag(), (dwarf::Tag)Tag::B);
1093 EXPECT_EQ(C.getTag(), (dwarf::Tag)Tag::C);
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001094 EXPECT_EQ(D.getTag(), (dwarf::Tag)Tag::D);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001095
1096 // Verify who has children
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001097 EXPECT_TRUE(A.hasChildren());
1098 EXPECT_FALSE(B.hasChildren());
1099 EXPECT_TRUE(C.hasChildren());
1100 EXPECT_TRUE(D.hasChildren());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001101
1102 // Make sure the parent of all the children of the compile unit are the
1103 // compile unit.
1104 EXPECT_EQ(A.getParent(), CUDie);
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001105
1106 // Make sure the parent of all the children of A are the A.
1107 // B is the first child in A, so we need to verify we can get the previous
1108 // DIE as the parent.
1109 EXPECT_EQ(B.getParent(), A);
1110 // C is the second child in A, so we need to make sure we can backup across
1111 // other DIE (B) at the same level to get the correct parent.
1112 EXPECT_EQ(C.getParent(), A);
1113 // D is the third child of A. We need to verify we can backup across other DIE
1114 // (B and C) including DIE that have children (D) to get the correct parent.
1115 EXPECT_EQ(D.getParent(), A);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001116
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001117 // Verify that a DIE with no children returns an invalid DWARFDie.
1118 EXPECT_FALSE(B.getFirstChild().isValid());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001119
1120 // Verify the children of the B DIE
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001121 auto C1 = C.getFirstChild();
1122 auto C2 = C1.getSibling();
1123 EXPECT_TRUE(C2.getSibling().isNULL());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001124
1125 // Verify all children of the B DIE correctly valid or invalid.
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001126 EXPECT_EQ(C1.getTag(), (dwarf::Tag)Tag::C1);
1127 EXPECT_EQ(C2.getTag(), (dwarf::Tag)Tag::C2);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001128
1129 // Make sure the parent of all the children of the B are the B.
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001130 EXPECT_EQ(C1.getParent(), C);
1131 EXPECT_EQ(C2.getParent(), C);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001132}
1133
1134TEST(DWARFDebugInfo, TestDWARFDie) {
1135
1136 // Make sure a default constructed DWARFDie doesn't have any parent, sibling
1137 // or child;
1138 DWARFDie DefaultDie;
1139 EXPECT_FALSE(DefaultDie.getParent().isValid());
1140 EXPECT_FALSE(DefaultDie.getFirstChild().isValid());
1141 EXPECT_FALSE(DefaultDie.getSibling().isValid());
1142}
1143
Greg Clayton93e4fe82017-01-05 23:47:37 +00001144TEST(DWARFDebugInfo, TestChildIterators) {
1145 // Test the DWARF APIs related to iterating across the children of a DIE using
1146 // the DWARFDie::iterator class.
1147 uint16_t Version = 4;
1148
1149 const uint8_t AddrSize = sizeof(void *);
1150 initLLVMIfNeeded();
1151 Triple Triple = getHostTripleForAddrSize(AddrSize);
1152 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1153 if (HandleExpectedError(ExpectedDG))
1154 return;
1155 dwarfgen::Generator *DG = ExpectedDG.get().get();
1156 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1157
1158 enum class Tag: uint16_t {
1159 A = dwarf::DW_TAG_lo_user,
1160 B,
1161 };
1162
1163 // Scope to allow us to re-use the same DIE names
1164 {
1165 // Create DWARF tree that looks like:
1166 //
1167 // CU
1168 // A
1169 // B
1170 auto CUDie = CU.getUnitDIE();
1171 CUDie.addChild((dwarf::Tag)Tag::A);
1172 CUDie.addChild((dwarf::Tag)Tag::B);
1173 }
1174
1175 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1176 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1177 EXPECT_TRUE((bool)Obj);
1178 DWARFContextInMemory DwarfContext(*Obj.get());
1179
1180 // Verify the number of compile units is correct.
1181 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1182 EXPECT_EQ(NumCUs, 1u);
1183 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1184
1185 // Get the compile unit DIE is valid.
1186 auto CUDie = U->getUnitDIE(false);
1187 EXPECT_TRUE(CUDie.isValid());
1188 // CUDie.dump(llvm::outs(), UINT32_MAX);
1189 uint32_t Index;
1190 DWARFDie A;
1191 DWARFDie B;
1192
1193 // Verify the compile unit DIE's children.
1194 Index = 0;
1195 for (auto Die : CUDie.children()) {
1196 switch (Index++) {
1197 case 0: A = Die; break;
1198 case 1: B = Die; break;
1199 }
1200 }
1201
1202 EXPECT_EQ(A.getTag(), (dwarf::Tag)Tag::A);
1203 EXPECT_EQ(B.getTag(), (dwarf::Tag)Tag::B);
1204
1205 // Verify that A has no children by verifying that the begin and end contain
1206 // invalid DIEs and also that the iterators are equal.
1207 EXPECT_EQ(A.begin(), A.end());
1208}
1209
1210TEST(DWARFDebugInfo, TestChildIteratorsOnInvalidDie) {
1211 // Verify that an invalid DIE has no children.
1212 DWARFDie Invalid;
1213 auto begin = Invalid.begin();
1214 auto end = Invalid.end();
1215 EXPECT_FALSE(begin->isValid());
1216 EXPECT_FALSE(end->isValid());
1217 EXPECT_EQ(begin, end);
1218}
1219
1220
1221TEST(DWARFDebugInfo, TestEmptyChildren) {
1222 // Test a DIE that says it has children in the abbreviation, but actually
1223 // doesn't have any attributes, will not return anything during iteration.
1224 // We do this by making sure the begin and end iterators are equal.
1225 uint16_t Version = 4;
1226
1227 const uint8_t AddrSize = sizeof(void *);
1228 initLLVMIfNeeded();
1229 Triple Triple = getHostTripleForAddrSize(AddrSize);
1230 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1231 if (HandleExpectedError(ExpectedDG))
1232 return;
1233 dwarfgen::Generator *DG = ExpectedDG.get().get();
1234 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1235
1236 // Scope to allow us to re-use the same DIE names
1237 {
1238 // Create a compile unit DIE that has an abbreviation that says it has
1239 // children, but doesn't have any actual attributes. This helps us test
1240 // a DIE that has only one child: a NULL DIE.
1241 auto CUDie = CU.getUnitDIE();
1242 CUDie.setForceChildren();
1243 }
1244
1245 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1246 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1247 EXPECT_TRUE((bool)Obj);
1248 DWARFContextInMemory DwarfContext(*Obj.get());
1249
1250 // Verify the number of compile units is correct.
1251 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1252 EXPECT_EQ(NumCUs, 1u);
1253 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1254
1255 // Get the compile unit DIE is valid.
1256 auto CUDie = U->getUnitDIE(false);
1257 EXPECT_TRUE(CUDie.isValid());
1258 CUDie.dump(llvm::outs(), UINT32_MAX);
1259
1260 // Verify that the CU Die that says it has children, but doesn't, actually
1261 // has begin and end iterators that are equal. We want to make sure we don't
1262 // see the Null DIEs during iteration.
1263 EXPECT_EQ(CUDie.begin(), CUDie.end());
1264}
Greg Clayton2520c9e2016-12-19 20:36:41 +00001265
Greg Clayton3462a422016-12-08 01:03:48 +00001266} // end anonymous namespace