blob: 47709ff89ef6b8127da81dac059d3a049f062f00 [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
10#include "../lib/CodeGen/DwarfGenerator.h"
11#include "llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h"
12#include "llvm/DebugInfo/DWARF/DWARFContext.h"
13#include "llvm/DebugInfo/DWARF/DWARFDebugInfoEntry.h"
14#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;
80 const uint64_t UData[] = {UINT64_MAX - 1, UINT64_MAX - 2, UINT64_MAX - 3,
81 UINT64_MAX - 4, UINT64_MAX - 5, UINT64_MAX - 6,
82 UINT64_MAX - 7, UINT64_MAX - 8, UINT64_MAX - 9};
83#define UDATA_1 18446744073709551614ULL
84 const uint32_t Dwarf32Values[] = {1, 2, 3, 4, 5, 6, 7, 8};
85 const char *StringValue = "Hello";
86 const char *StrpValue = "World";
87 initLLVMIfNeeded();
88 Triple Triple = getHostTripleForAddrSize(AddrSize);
89 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
90 if (HandleExpectedError(ExpectedDG))
91 return;
92 dwarfgen::Generator *DG = ExpectedDG.get().get();
93 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
94 dwarfgen::DIE CUDie = CU.getUnitDIE();
95 uint16_t Attr = DW_AT_lo_user;
96
97 //----------------------------------------------------------------------
98 // Test address forms
99 //----------------------------------------------------------------------
100 const auto Attr_DW_FORM_addr = static_cast<dwarf::Attribute>(Attr++);
101 CUDie.addAttribute(Attr_DW_FORM_addr, DW_FORM_addr, AddrValue);
102
103 //----------------------------------------------------------------------
104 // Test block forms
105 //----------------------------------------------------------------------
106 const auto Attr_DW_FORM_block = static_cast<dwarf::Attribute>(Attr++);
107 CUDie.addAttribute(Attr_DW_FORM_block, DW_FORM_block, BlockData, BlockSize);
108
109 const auto Attr_DW_FORM_block1 = static_cast<dwarf::Attribute>(Attr++);
110 CUDie.addAttribute(Attr_DW_FORM_block1, DW_FORM_block1, BlockData, BlockSize);
111
112 const auto Attr_DW_FORM_block2 = static_cast<dwarf::Attribute>(Attr++);
113 CUDie.addAttribute(Attr_DW_FORM_block2, DW_FORM_block2, BlockData, BlockSize);
114
115 const auto Attr_DW_FORM_block4 = static_cast<dwarf::Attribute>(Attr++);
116 CUDie.addAttribute(Attr_DW_FORM_block4, DW_FORM_block4, BlockData, BlockSize);
117
118 //----------------------------------------------------------------------
119 // Test data forms
120 //----------------------------------------------------------------------
121 const auto Attr_DW_FORM_data1 = static_cast<dwarf::Attribute>(Attr++);
122 CUDie.addAttribute(Attr_DW_FORM_data1, DW_FORM_data1, Data1);
123
124 const auto Attr_DW_FORM_data2 = static_cast<dwarf::Attribute>(Attr++);
125 CUDie.addAttribute(Attr_DW_FORM_data2, DW_FORM_data2, Data2);
126
127 const auto Attr_DW_FORM_data4 = static_cast<dwarf::Attribute>(Attr++);
128 CUDie.addAttribute(Attr_DW_FORM_data4, DW_FORM_data4, Data4);
129
130 const auto Attr_DW_FORM_data8 = static_cast<dwarf::Attribute>(Attr++);
131 CUDie.addAttribute(Attr_DW_FORM_data8, DW_FORM_data8, Data8);
132
133 //----------------------------------------------------------------------
134 // Test string forms
135 //----------------------------------------------------------------------
136 const auto Attr_DW_FORM_string = static_cast<dwarf::Attribute>(Attr++);
137 CUDie.addAttribute(Attr_DW_FORM_string, DW_FORM_string, StringValue);
138
139 const auto Attr_DW_FORM_strp = static_cast<dwarf::Attribute>(Attr++);
140 CUDie.addAttribute(Attr_DW_FORM_strp, DW_FORM_strp, StrpValue);
141
142 //----------------------------------------------------------------------
143 // Test reference forms
144 //----------------------------------------------------------------------
145 const auto Attr_DW_FORM_ref_addr = static_cast<dwarf::Attribute>(Attr++);
146 CUDie.addAttribute(Attr_DW_FORM_ref_addr, DW_FORM_ref_addr, RefAddr);
147
148 const auto Attr_DW_FORM_ref1 = static_cast<dwarf::Attribute>(Attr++);
149 CUDie.addAttribute(Attr_DW_FORM_ref1, DW_FORM_ref1, Data1);
150
151 const auto Attr_DW_FORM_ref2 = static_cast<dwarf::Attribute>(Attr++);
152 CUDie.addAttribute(Attr_DW_FORM_ref2, DW_FORM_ref2, Data2);
153
154 const auto Attr_DW_FORM_ref4 = static_cast<dwarf::Attribute>(Attr++);
155 CUDie.addAttribute(Attr_DW_FORM_ref4, DW_FORM_ref4, Data4);
156
157 const auto Attr_DW_FORM_ref8 = static_cast<dwarf::Attribute>(Attr++);
158 CUDie.addAttribute(Attr_DW_FORM_ref8, DW_FORM_ref8, Data8);
159
160 const auto Attr_DW_FORM_ref_sig8 = static_cast<dwarf::Attribute>(Attr++);
161 CUDie.addAttribute(Attr_DW_FORM_ref_sig8, DW_FORM_ref_sig8, Data8_2);
162
163 const auto Attr_DW_FORM_ref_udata = static_cast<dwarf::Attribute>(Attr++);
164 CUDie.addAttribute(Attr_DW_FORM_ref_udata, DW_FORM_ref_udata, UData[0]);
165
166 //----------------------------------------------------------------------
167 // Test flag forms
168 //----------------------------------------------------------------------
169 const auto Attr_DW_FORM_flag_true = static_cast<dwarf::Attribute>(Attr++);
170 CUDie.addAttribute(Attr_DW_FORM_flag_true, DW_FORM_flag, true);
171
172 const auto Attr_DW_FORM_flag_false = static_cast<dwarf::Attribute>(Attr++);
173 CUDie.addAttribute(Attr_DW_FORM_flag_false, DW_FORM_flag, false);
174
175 const auto Attr_DW_FORM_flag_present = static_cast<dwarf::Attribute>(Attr++);
176 CUDie.addAttribute(Attr_DW_FORM_flag_present, DW_FORM_flag_present);
177
178 //----------------------------------------------------------------------
179 // Test SLEB128 based forms
180 //----------------------------------------------------------------------
181 const auto Attr_DW_FORM_sdata = static_cast<dwarf::Attribute>(Attr++);
182 CUDie.addAttribute(Attr_DW_FORM_sdata, DW_FORM_sdata, SData);
183
184 //----------------------------------------------------------------------
185 // Test ULEB128 based forms
186 //----------------------------------------------------------------------
187 const auto Attr_DW_FORM_udata = static_cast<dwarf::Attribute>(Attr++);
188 CUDie.addAttribute(Attr_DW_FORM_udata, DW_FORM_udata, UData[0]);
189
190 //----------------------------------------------------------------------
191 // Test DWARF32/DWARF64 forms
192 //----------------------------------------------------------------------
193 const auto Attr_DW_FORM_GNU_ref_alt = static_cast<dwarf::Attribute>(Attr++);
194 CUDie.addAttribute(Attr_DW_FORM_GNU_ref_alt, DW_FORM_GNU_ref_alt,
195 Dwarf32Values[0]);
196
197 const auto Attr_DW_FORM_sec_offset = static_cast<dwarf::Attribute>(Attr++);
198 CUDie.addAttribute(Attr_DW_FORM_sec_offset, DW_FORM_sec_offset,
199 Dwarf32Values[1]);
200
201 //----------------------------------------------------------------------
202 // Add an address at the end to make sure we can decode this value
203 //----------------------------------------------------------------------
204 const auto Attr_Last = static_cast<dwarf::Attribute>(Attr++);
205 CUDie.addAttribute(Attr_Last, DW_FORM_addr, AddrValue);
206
207 //----------------------------------------------------------------------
208 // Generate the DWARF
209 //----------------------------------------------------------------------
210 StringRef FileBytes = DG->generate();
211 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
212 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
213 EXPECT_TRUE((bool)Obj);
214 DWARFContextInMemory DwarfContext(*Obj.get());
215 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
216 EXPECT_EQ(NumCUs, 1u);
217 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
218 auto DiePtr = U->getUnitDIE(false);
219 EXPECT_TRUE(DiePtr != nullptr);
220
221 //----------------------------------------------------------------------
222 // Test address forms
223 //----------------------------------------------------------------------
224 EXPECT_EQ(DiePtr->getAttributeValueAsAddress(U, Attr_DW_FORM_addr, 0),
225 AddrValue);
226
227 //----------------------------------------------------------------------
228 // Test block forms
229 //----------------------------------------------------------------------
230 DWARFFormValue FormValue;
231 ArrayRef<uint8_t> ExtractedBlockData;
232 Optional<ArrayRef<uint8_t>> BlockDataOpt;
233
234 EXPECT_TRUE(DiePtr->getAttributeValue(U, Attr_DW_FORM_block, FormValue));
235 BlockDataOpt = FormValue.getAsBlock();
236 EXPECT_TRUE(BlockDataOpt.hasValue());
237 ExtractedBlockData = BlockDataOpt.getValue();
238 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
239 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
240
241 EXPECT_TRUE(DiePtr->getAttributeValue(U, Attr_DW_FORM_block1, FormValue));
242 BlockDataOpt = FormValue.getAsBlock();
243 EXPECT_TRUE(BlockDataOpt.hasValue());
244 ExtractedBlockData = BlockDataOpt.getValue();
245 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
246 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
247
248 EXPECT_TRUE(DiePtr->getAttributeValue(U, Attr_DW_FORM_block2, FormValue));
249 BlockDataOpt = FormValue.getAsBlock();
250 EXPECT_TRUE(BlockDataOpt.hasValue());
251 ExtractedBlockData = BlockDataOpt.getValue();
252 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
253 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
254
255 EXPECT_TRUE(DiePtr->getAttributeValue(U, Attr_DW_FORM_block4, FormValue));
256 BlockDataOpt = FormValue.getAsBlock();
257 EXPECT_TRUE(BlockDataOpt.hasValue());
258 ExtractedBlockData = BlockDataOpt.getValue();
259 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
260 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
261
262 //----------------------------------------------------------------------
263 // Test data forms
264 //----------------------------------------------------------------------
265 EXPECT_EQ(
266 DiePtr->getAttributeValueAsUnsignedConstant(U, Attr_DW_FORM_data1, 0),
267 Data1);
268 EXPECT_EQ(
269 DiePtr->getAttributeValueAsUnsignedConstant(U, Attr_DW_FORM_data2, 0),
270 Data2);
271 EXPECT_EQ(
272 DiePtr->getAttributeValueAsUnsignedConstant(U, Attr_DW_FORM_data4, 0),
273 Data4);
274 EXPECT_EQ(
275 DiePtr->getAttributeValueAsUnsignedConstant(U, Attr_DW_FORM_data8, 0),
276 Data8);
277
278 //----------------------------------------------------------------------
279 // Test string forms
280 //----------------------------------------------------------------------
281 const char *ExtractedStringValue =
282 DiePtr->getAttributeValueAsString(U, Attr_DW_FORM_string, nullptr);
283 EXPECT_TRUE(ExtractedStringValue != nullptr);
284 EXPECT_TRUE(strcmp(StringValue, ExtractedStringValue) == 0);
285
286 const char *ExtractedStrpValue =
287 DiePtr->getAttributeValueAsString(U, Attr_DW_FORM_strp, nullptr);
288 EXPECT_TRUE(ExtractedStrpValue != nullptr);
289 EXPECT_TRUE(strcmp(StrpValue, ExtractedStrpValue) == 0);
290
291 //----------------------------------------------------------------------
292 // Test reference forms
293 //----------------------------------------------------------------------
294 EXPECT_EQ(DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_ref_addr, 0),
295 RefAddr);
296 EXPECT_EQ(DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_ref1, 0),
297 Data1);
298 EXPECT_EQ(DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_ref2, 0),
299 Data2);
300 EXPECT_EQ(DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_ref4, 0),
301 Data4);
302 EXPECT_EQ(DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_ref8, 0),
303 Data8);
304 EXPECT_EQ(DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_ref_sig8, 0),
305 Data8_2);
306 EXPECT_EQ(DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_ref_udata, 0),
307 UData[0]);
308
309 //----------------------------------------------------------------------
310 // Test flag forms
311 //----------------------------------------------------------------------
312 EXPECT_EQ(DiePtr->getAttributeValueAsUnsignedConstant(
313 U, Attr_DW_FORM_flag_true, 0ULL),
314 1ULL);
315 EXPECT_EQ(DiePtr->getAttributeValueAsUnsignedConstant(
316 U, Attr_DW_FORM_flag_false, 1ULL),
317 0ULL);
318 EXPECT_EQ(DiePtr->getAttributeValueAsUnsignedConstant(
319 U, Attr_DW_FORM_flag_present, 0ULL),
320 1ULL);
321
322 // TODO: test Attr_DW_FORM_implicit_const extraction
323
324 //----------------------------------------------------------------------
325 // Test SLEB128 based forms
326 //----------------------------------------------------------------------
327 EXPECT_EQ(DiePtr->getAttributeValueAsSignedConstant(U, Attr_DW_FORM_sdata, 0),
328 SData);
329
330 //----------------------------------------------------------------------
331 // Test ULEB128 based forms
332 //----------------------------------------------------------------------
333 EXPECT_EQ(
334 DiePtr->getAttributeValueAsUnsignedConstant(U, Attr_DW_FORM_udata, 0),
335 UData[0]);
336
337 //----------------------------------------------------------------------
338 // Test DWARF32/DWARF64 forms
339 //----------------------------------------------------------------------
340 EXPECT_EQ(
341 DiePtr->getAttributeValueAsReference(U, Attr_DW_FORM_GNU_ref_alt, 0),
342 Dwarf32Values[0]);
343 EXPECT_EQ(
344 DiePtr->getAttributeValueAsSectionOffset(U, Attr_DW_FORM_sec_offset, 0),
345 Dwarf32Values[1]);
346
347 //----------------------------------------------------------------------
348 // Add an address at the end to make sure we can decode this value
349 //----------------------------------------------------------------------
350 EXPECT_EQ(DiePtr->getAttributeValueAsAddress(U, Attr_Last, 0), AddrValue);
351}
352
353TEST(DWARFDebugInfo, TestDWARF32Version2Addr4AllForms) {
354 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
355 // addresses.
356 typedef uint32_t AddrType;
357 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
358 typedef AddrType RefAddrType;
359 TestAllForms<2, AddrType, RefAddrType>();
360}
361
362TEST(DWARFDebugInfo, TestDWARF32Version2Addr8AllForms) {
363 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
364 // addresses.
365 typedef uint64_t AddrType;
366 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
367 typedef AddrType RefAddrType;
368 TestAllForms<2, AddrType, RefAddrType>();
369}
370
371TEST(DWARFDebugInfo, TestDWARF32Version3Addr4AllForms) {
372 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
373 // addresses.
374 typedef uint32_t AddrType;
375 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later.
376 typedef uint32_t RefAddrType;
377 TestAllForms<3, AddrType, RefAddrType>();
378}
379
380TEST(DWARFDebugInfo, TestDWARF32Version3Addr8AllForms) {
381 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
382 // addresses.
383 typedef uint64_t AddrType;
384 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
385 typedef uint32_t RefAddrType;
386 TestAllForms<3, AddrType, RefAddrType>();
387}
388
389TEST(DWARFDebugInfo, TestDWARF32Version4Addr4AllForms) {
390 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
391 // addresses.
392 typedef uint32_t AddrType;
393 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
394 typedef uint32_t RefAddrType;
395 TestAllForms<4, AddrType, RefAddrType>();
396}
397
398TEST(DWARFDebugInfo, TestDWARF32Version4Addr8AllForms) {
399 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
400 // addresses.
401 typedef uint64_t AddrType;
402 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
403 typedef uint32_t RefAddrType;
404 TestAllForms<4, AddrType, RefAddrType>();
405}
406
407template <uint16_t Version, class AddrType> void TestChildren() {
408 // Test that we can decode DW_FORM_ref_addr values correctly in DWARF 2 with
409 // 4 byte addresses. DW_FORM_ref_addr values should be 4 bytes when using
410 // 8 byte addresses.
411
412 const uint8_t AddrSize = sizeof(AddrType);
413 initLLVMIfNeeded();
414 Triple Triple = getHostTripleForAddrSize(AddrSize);
415 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
416 if (HandleExpectedError(ExpectedDG))
417 return;
418 dwarfgen::Generator *DG = ExpectedDG.get().get();
419 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
420 dwarfgen::DIE CUDie = CU.getUnitDIE();
421
422 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
423 CUDie.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
424
425 dwarfgen::DIE SubprogramDie = CUDie.addChild(DW_TAG_subprogram);
426 SubprogramDie.addAttribute(DW_AT_name, DW_FORM_strp, "main");
427 SubprogramDie.addAttribute(DW_AT_low_pc, DW_FORM_addr, 0x1000U);
428 SubprogramDie.addAttribute(DW_AT_high_pc, DW_FORM_addr, 0x2000U);
429
430 dwarfgen::DIE IntDie = CUDie.addChild(DW_TAG_base_type);
431 IntDie.addAttribute(DW_AT_name, DW_FORM_strp, "int");
432 IntDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
433 IntDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
434
435 dwarfgen::DIE ArgcDie = SubprogramDie.addChild(DW_TAG_formal_parameter);
436 ArgcDie.addAttribute(DW_AT_name, DW_FORM_strp, "argc");
437 // ArgcDie.addAttribute(DW_AT_type, DW_FORM_ref4, IntDie);
438 ArgcDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, IntDie);
439
440 StringRef FileBytes = DG->generate();
441 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
442 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
443 EXPECT_TRUE((bool)Obj);
444 DWARFContextInMemory DwarfContext(*Obj.get());
445
446 // Verify the number of compile units is correct.
447 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
448 EXPECT_EQ(NumCUs, 1u);
449 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
450
451 // Get the compile unit DIE is valid.
452 auto DiePtr = U->getUnitDIE(false);
453 EXPECT_TRUE(DiePtr != nullptr);
454 // DiePtr->dump(llvm::outs(), U, UINT32_MAX);
455
456 // Verify the first child of the compile unit DIE is our subprogram.
457 auto SubprogramDiePtr = DiePtr->getFirstChild();
458 EXPECT_TRUE(SubprogramDiePtr != nullptr);
459 EXPECT_EQ(SubprogramDiePtr->getTag(), DW_TAG_subprogram);
460
461 // Verify the first child of the subprogram is our formal parameter.
462 auto ArgcDiePtr = SubprogramDiePtr->getFirstChild();
463 EXPECT_TRUE(ArgcDiePtr != nullptr);
464 EXPECT_EQ(ArgcDiePtr->getTag(), DW_TAG_formal_parameter);
465
466 // Verify our formal parameter has a NULL tag sibling.
467 auto NullDiePtr = ArgcDiePtr->getSibling();
468 EXPECT_TRUE(NullDiePtr != nullptr);
469 if (NullDiePtr) {
470 EXPECT_EQ(NullDiePtr->getTag(), DW_TAG_null);
471 EXPECT_TRUE(NullDiePtr->getSibling() == nullptr);
472 EXPECT_TRUE(NullDiePtr->getFirstChild() == nullptr);
473 }
474
475 // Verify the sibling of our subprogram is our integer base type.
476 auto IntDiePtr = SubprogramDiePtr->getSibling();
477 EXPECT_TRUE(IntDiePtr != nullptr);
478 EXPECT_EQ(IntDiePtr->getTag(), DW_TAG_base_type);
479
480 // Verify the sibling of our subprogram is our integer base is a NULL tag.
481 NullDiePtr = IntDiePtr->getSibling();
482 EXPECT_TRUE(NullDiePtr != nullptr);
483 if (NullDiePtr) {
484 EXPECT_EQ(NullDiePtr->getTag(), DW_TAG_null);
485 EXPECT_TRUE(NullDiePtr->getSibling() == nullptr);
486 EXPECT_TRUE(NullDiePtr->getFirstChild() == nullptr);
487 }
488}
489
490TEST(DWARFDebugInfo, TestDWARF32Version2Addr4Children) {
491 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
492 // addresses.
493 typedef uint32_t AddrType;
494 TestChildren<2, AddrType>();
495}
496
497TEST(DWARFDebugInfo, TestDWARF32Version2Addr8Children) {
498 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
499 // addresses.
500 typedef uint64_t AddrType;
501 TestChildren<2, AddrType>();
502}
503
504TEST(DWARFDebugInfo, TestDWARF32Version3Addr4Children) {
505 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
506 // addresses.
507 typedef uint32_t AddrType;
508 TestChildren<3, AddrType>();
509}
510
511TEST(DWARFDebugInfo, TestDWARF32Version3Addr8Children) {
512 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
513 // addresses.
514 typedef uint64_t AddrType;
515 TestChildren<3, AddrType>();
516}
517
518TEST(DWARFDebugInfo, TestDWARF32Version4Addr4Children) {
519 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
520 // addresses.
521 typedef uint32_t AddrType;
522 TestChildren<4, AddrType>();
523}
524
525TEST(DWARFDebugInfo, TestDWARF32Version4Addr8Children) {
526 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
527 // addresses.
528 typedef uint64_t AddrType;
529 TestChildren<4, AddrType>();
530}
531
532template <uint16_t Version, class AddrType> void TestReferences() {
533 // Test that we can decode DW_FORM_refXXX values correctly in DWARF.
534
535 const uint8_t AddrSize = sizeof(AddrType);
536 initLLVMIfNeeded();
537 Triple Triple = getHostTripleForAddrSize(AddrSize);
538 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
539 if (HandleExpectedError(ExpectedDG))
540 return;
541 dwarfgen::Generator *DG = ExpectedDG.get().get();
542 dwarfgen::CompileUnit &CU1 = DG->addCompileUnit();
543 dwarfgen::CompileUnit &CU2 = DG->addCompileUnit();
544
545 dwarfgen::DIE CU1Die = CU1.getUnitDIE();
546 CU1Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
547 CU1Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
548
549 dwarfgen::DIE CU1TypeDie = CU1Die.addChild(DW_TAG_base_type);
550 CU1TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "int");
551 CU1TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
552 CU1TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
553
554 dwarfgen::DIE CU1Ref1Die = CU1Die.addChild(DW_TAG_variable);
555 CU1Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref1");
556 CU1Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU1TypeDie);
557
558 dwarfgen::DIE CU1Ref2Die = CU1Die.addChild(DW_TAG_variable);
559 CU1Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref2");
560 CU1Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU1TypeDie);
561
562 dwarfgen::DIE CU1Ref4Die = CU1Die.addChild(DW_TAG_variable);
563 CU1Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref4");
564 CU1Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU1TypeDie);
565
566 dwarfgen::DIE CU1Ref8Die = CU1Die.addChild(DW_TAG_variable);
567 CU1Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref8");
568 CU1Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU1TypeDie);
569
570 dwarfgen::DIE CU1RefAddrDie = CU1Die.addChild(DW_TAG_variable);
571 CU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1RefAddr");
572 CU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
573
574 dwarfgen::DIE CU2Die = CU2.getUnitDIE();
575 CU2Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/foo.c");
576 CU2Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
577
578 dwarfgen::DIE CU2TypeDie = CU2Die.addChild(DW_TAG_base_type);
579 CU2TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "float");
580 CU2TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_float);
581 CU2TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
582
583 dwarfgen::DIE CU2Ref1Die = CU2Die.addChild(DW_TAG_variable);
584 CU2Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref1");
585 CU2Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU2TypeDie);
586
587 dwarfgen::DIE CU2Ref2Die = CU2Die.addChild(DW_TAG_variable);
588 CU2Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref2");
589 CU2Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU2TypeDie);
590
591 dwarfgen::DIE CU2Ref4Die = CU2Die.addChild(DW_TAG_variable);
592 CU2Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref4");
593 CU2Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU2TypeDie);
594
595 dwarfgen::DIE CU2Ref8Die = CU2Die.addChild(DW_TAG_variable);
596 CU2Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref8");
597 CU2Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU2TypeDie);
598
599 dwarfgen::DIE CU2RefAddrDie = CU2Die.addChild(DW_TAG_variable);
600 CU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2RefAddr");
601 CU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
602
603 // Refer to a type in CU1 from CU2
604 dwarfgen::DIE CU2ToCU1RefAddrDie = CU2Die.addChild(DW_TAG_variable);
605 CU2ToCU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2ToCU1RefAddr");
606 CU2ToCU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
607
608 // Refer to a type in CU2 from CU1
609 dwarfgen::DIE CU1ToCU2RefAddrDie = CU1Die.addChild(DW_TAG_variable);
610 CU1ToCU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1ToCU2RefAddr");
611 CU1ToCU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
612
613 StringRef FileBytes = DG->generate();
614 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
615 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
616 EXPECT_TRUE((bool)Obj);
617 DWARFContextInMemory DwarfContext(*Obj.get());
618
619 // Verify the number of compile units is correct.
620 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
621 EXPECT_EQ(NumCUs, 2u);
622 DWARFCompileUnit *U1 = DwarfContext.getCompileUnitAtIndex(0);
623 DWARFCompileUnit *U2 = DwarfContext.getCompileUnitAtIndex(1);
624
625 // Get the compile unit DIE is valid.
626 auto Unit1DiePtr = U1->getUnitDIE(false);
627 EXPECT_TRUE(Unit1DiePtr != nullptr);
628 // Unit1DiePtr->dump(llvm::outs(), U1, UINT32_MAX);
629
630 auto Unit2DiePtr = U2->getUnitDIE(false);
631 EXPECT_TRUE(Unit2DiePtr != nullptr);
632 // Unit2DiePtr->dump(llvm::outs(), U2, UINT32_MAX);
633
634 // Verify the first child of the compile unit 1 DIE is our int base type.
635 auto CU1TypeDiePtr = Unit1DiePtr->getFirstChild();
636 EXPECT_TRUE(CU1TypeDiePtr != nullptr);
637 EXPECT_EQ(CU1TypeDiePtr->getTag(), DW_TAG_base_type);
638 EXPECT_EQ(
639 CU1TypeDiePtr->getAttributeValueAsUnsignedConstant(U1, DW_AT_encoding, 0),
640 DW_ATE_signed);
641
642 // Verify the first child of the compile unit 2 DIE is our float base type.
643 auto CU2TypeDiePtr = Unit2DiePtr->getFirstChild();
644 EXPECT_TRUE(CU2TypeDiePtr != nullptr);
645 EXPECT_EQ(CU2TypeDiePtr->getTag(), DW_TAG_base_type);
646 EXPECT_EQ(
647 CU2TypeDiePtr->getAttributeValueAsUnsignedConstant(U2, DW_AT_encoding, 0),
648 DW_ATE_float);
649
650 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
651 // DW_AT_type points to our base type DIE.
652 auto CU1Ref1DiePtr = CU1TypeDiePtr->getSibling();
653 EXPECT_TRUE(CU1Ref1DiePtr != nullptr);
654 EXPECT_EQ(CU1Ref1DiePtr->getTag(), DW_TAG_variable);
655 EXPECT_EQ(CU1Ref1DiePtr->getAttributeValueAsReference(U1, DW_AT_type, -1ULL),
656 CU1TypeDiePtr->getOffset());
657 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
658 // base type DIE in CU1.
659 auto CU1Ref2DiePtr = CU1Ref1DiePtr->getSibling();
660 EXPECT_TRUE(CU1Ref2DiePtr != nullptr);
661 EXPECT_EQ(CU1Ref2DiePtr->getTag(), DW_TAG_variable);
662 EXPECT_EQ(CU1Ref2DiePtr->getAttributeValueAsReference(U1, DW_AT_type, -1ULL),
663 CU1TypeDiePtr->getOffset());
664
665 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
666 // base type DIE in CU1.
667 auto CU1Ref4DiePtr = CU1Ref2DiePtr->getSibling();
668 EXPECT_TRUE(CU1Ref4DiePtr != nullptr);
669 EXPECT_EQ(CU1Ref4DiePtr->getTag(), DW_TAG_variable);
670 EXPECT_EQ(CU1Ref4DiePtr->getAttributeValueAsReference(U1, DW_AT_type, -1ULL),
671 CU1TypeDiePtr->getOffset());
672
673 // Verify the sibling is our Ref8 DIE and that its DW_AT_type points to our
674 // base type DIE in CU1.
675 auto CU1Ref8DiePtr = CU1Ref4DiePtr->getSibling();
676 EXPECT_TRUE(CU1Ref8DiePtr != nullptr);
677 EXPECT_EQ(CU1Ref8DiePtr->getTag(), DW_TAG_variable);
678 EXPECT_EQ(CU1Ref8DiePtr->getAttributeValueAsReference(U1, DW_AT_type, -1ULL),
679 CU1TypeDiePtr->getOffset());
680
681 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
682 // base type DIE in CU1.
683 auto CU1RefAddrDiePtr = CU1Ref8DiePtr->getSibling();
684 EXPECT_TRUE(CU1RefAddrDiePtr != nullptr);
685 EXPECT_EQ(CU1RefAddrDiePtr->getTag(), DW_TAG_variable);
686 EXPECT_EQ(
687 CU1RefAddrDiePtr->getAttributeValueAsReference(U1, DW_AT_type, -1ULL),
688 CU1TypeDiePtr->getOffset());
689
690 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
691 // DW_AT_type points to our base type DIE.
692 auto CU1ToCU2RefAddrDiePtr = CU1RefAddrDiePtr->getSibling();
693 EXPECT_TRUE(CU1ToCU2RefAddrDiePtr != nullptr);
694 EXPECT_EQ(CU1ToCU2RefAddrDiePtr->getTag(), DW_TAG_variable);
695 EXPECT_EQ(CU1ToCU2RefAddrDiePtr->getAttributeValueAsReference(U1, DW_AT_type,
696 -1ULL),
697 CU2TypeDiePtr->getOffset());
698
699 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
700 // DW_AT_type points to our base type DIE.
701 auto CU2Ref1DiePtr = CU2TypeDiePtr->getSibling();
702 EXPECT_TRUE(CU2Ref1DiePtr != nullptr);
703 EXPECT_EQ(CU2Ref1DiePtr->getTag(), DW_TAG_variable);
704 EXPECT_EQ(CU2Ref1DiePtr->getAttributeValueAsReference(U2, DW_AT_type, -1ULL),
705 CU2TypeDiePtr->getOffset());
706 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
707 // base type DIE in CU2.
708 auto CU2Ref2DiePtr = CU2Ref1DiePtr->getSibling();
709 EXPECT_TRUE(CU2Ref2DiePtr != nullptr);
710 EXPECT_EQ(CU2Ref2DiePtr->getTag(), DW_TAG_variable);
711 EXPECT_EQ(CU2Ref2DiePtr->getAttributeValueAsReference(U2, DW_AT_type, -1ULL),
712 CU2TypeDiePtr->getOffset());
713
714 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
715 // base type DIE in CU2.
716 auto CU2Ref4DiePtr = CU2Ref2DiePtr->getSibling();
717 EXPECT_TRUE(CU2Ref4DiePtr != nullptr);
718 EXPECT_EQ(CU2Ref4DiePtr->getTag(), DW_TAG_variable);
719 EXPECT_EQ(CU2Ref4DiePtr->getAttributeValueAsReference(U2, DW_AT_type, -1ULL),
720 CU2TypeDiePtr->getOffset());
721
722 // Verify the sibling is our Ref8 DIE and that its DW_AT_type points to our
723 // base type DIE in CU2.
724 auto CU2Ref8DiePtr = CU2Ref4DiePtr->getSibling();
725 EXPECT_TRUE(CU2Ref8DiePtr != nullptr);
726 EXPECT_EQ(CU2Ref8DiePtr->getTag(), DW_TAG_variable);
727 EXPECT_EQ(CU2Ref8DiePtr->getAttributeValueAsReference(U2, DW_AT_type, -1ULL),
728 CU2TypeDiePtr->getOffset());
729
730 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
731 // base type DIE in CU2.
732 auto CU2RefAddrDiePtr = CU2Ref8DiePtr->getSibling();
733 EXPECT_TRUE(CU2RefAddrDiePtr != nullptr);
734 EXPECT_EQ(CU2RefAddrDiePtr->getTag(), DW_TAG_variable);
735 EXPECT_EQ(
736 CU2RefAddrDiePtr->getAttributeValueAsReference(U2, DW_AT_type, -1ULL),
737 CU2TypeDiePtr->getOffset());
738
739 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
740 // DW_AT_type points to our base type DIE.
741 auto CU2ToCU1RefAddrDiePtr = CU2RefAddrDiePtr->getSibling();
742 EXPECT_TRUE(CU2ToCU1RefAddrDiePtr != nullptr);
743 EXPECT_EQ(CU2ToCU1RefAddrDiePtr->getTag(), DW_TAG_variable);
744 EXPECT_EQ(CU2ToCU1RefAddrDiePtr->getAttributeValueAsReference(U2, DW_AT_type,
745 -1ULL),
746 CU1TypeDiePtr->getOffset());
747}
748
749TEST(DWARFDebugInfo, TestDWARF32Version2Addr4References) {
750 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
751 // addresses.
752 typedef uint32_t AddrType;
753 TestReferences<2, AddrType>();
754}
755
756TEST(DWARFDebugInfo, TestDWARF32Version2Addr8References) {
757 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
758 // addresses.
759 typedef uint64_t AddrType;
760 TestReferences<2, AddrType>();
761}
762
763TEST(DWARFDebugInfo, TestDWARF32Version3Addr4References) {
764 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
765 // addresses.
766 typedef uint32_t AddrType;
767 TestReferences<3, AddrType>();
768}
769
770TEST(DWARFDebugInfo, TestDWARF32Version3Addr8References) {
771 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
772 // addresses.
773 typedef uint64_t AddrType;
774 TestReferences<3, AddrType>();
775}
776
777TEST(DWARFDebugInfo, TestDWARF32Version4Addr4References) {
778 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
779 // addresses.
780 typedef uint32_t AddrType;
781 TestReferences<4, AddrType>();
782}
783
784TEST(DWARFDebugInfo, TestDWARF32Version4Addr8References) {
785 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
786 // addresses.
787 typedef uint64_t AddrType;
788 TestReferences<4, AddrType>();
789}
790
791} // end anonymous namespace