blob: 72d8856450265b38894c387bf8818d6a99d183d9 [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 Clayton97d22182017-01-13 21:08:18 +0000231 EXPECT_EQ(AddrValue, toAddress(DieDG.find(Attr_DW_FORM_addr), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000232
233 //----------------------------------------------------------------------
234 // Test block forms
235 //----------------------------------------------------------------------
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000236 Optional<DWARFFormValue> FormValue;
Greg Clayton3462a422016-12-08 01:03:48 +0000237 ArrayRef<uint8_t> ExtractedBlockData;
238 Optional<ArrayRef<uint8_t>> BlockDataOpt;
239
Greg Clayton97d22182017-01-13 21:08:18 +0000240 FormValue = DieDG.find(Attr_DW_FORM_block);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000241 EXPECT_TRUE((bool)FormValue);
242 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000243 EXPECT_TRUE(BlockDataOpt.hasValue());
244 ExtractedBlockData = BlockDataOpt.getValue();
245 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
246 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
247
Greg Clayton97d22182017-01-13 21:08:18 +0000248 FormValue = DieDG.find(Attr_DW_FORM_block1);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000249 EXPECT_TRUE((bool)FormValue);
250 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000251 EXPECT_TRUE(BlockDataOpt.hasValue());
252 ExtractedBlockData = BlockDataOpt.getValue();
253 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
254 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
255
Greg Clayton97d22182017-01-13 21:08:18 +0000256 FormValue = DieDG.find(Attr_DW_FORM_block2);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000257 EXPECT_TRUE((bool)FormValue);
258 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000259 EXPECT_TRUE(BlockDataOpt.hasValue());
260 ExtractedBlockData = BlockDataOpt.getValue();
261 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
262 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
263
Greg Clayton97d22182017-01-13 21:08:18 +0000264 FormValue = DieDG.find(Attr_DW_FORM_block4);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000265 EXPECT_TRUE((bool)FormValue);
266 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000267 EXPECT_TRUE(BlockDataOpt.hasValue());
268 ExtractedBlockData = BlockDataOpt.getValue();
269 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
270 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
271
272 //----------------------------------------------------------------------
273 // Test data forms
274 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000275 EXPECT_EQ(Data1, toUnsigned(DieDG.find(Attr_DW_FORM_data1), 0));
276 EXPECT_EQ(Data2, toUnsigned(DieDG.find(Attr_DW_FORM_data2), 0));
277 EXPECT_EQ(Data4, toUnsigned(DieDG.find(Attr_DW_FORM_data4), 0));
278 EXPECT_EQ(Data8, toUnsigned(DieDG.find(Attr_DW_FORM_data8), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000279
280 //----------------------------------------------------------------------
281 // Test string forms
282 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000283 auto ExtractedStringValue = toString(DieDG.find(Attr_DW_FORM_string));
284 EXPECT_TRUE((bool)ExtractedStringValue);
285 EXPECT_TRUE(strcmp(StringValue, *ExtractedStringValue) == 0);
Greg Clayton3462a422016-12-08 01:03:48 +0000286
Greg Clayton97d22182017-01-13 21:08:18 +0000287 auto ExtractedStrpValue = toString(DieDG.find(Attr_DW_FORM_strp));
288 EXPECT_TRUE((bool)ExtractedStrpValue);
289 EXPECT_TRUE(strcmp(StrpValue, *ExtractedStrpValue) == 0);
Greg Clayton3462a422016-12-08 01:03:48 +0000290
291 //----------------------------------------------------------------------
292 // Test reference forms
293 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000294 EXPECT_EQ(RefAddr, toReference(DieDG.find(Attr_DW_FORM_ref_addr), 0));
295 EXPECT_EQ(Data1, toReference(DieDG.find(Attr_DW_FORM_ref1), 0));
296 EXPECT_EQ(Data2, toReference(DieDG.find(Attr_DW_FORM_ref2), 0));
297 EXPECT_EQ(Data4, toReference(DieDG.find(Attr_DW_FORM_ref4), 0));
298 EXPECT_EQ(Data8, toReference(DieDG.find(Attr_DW_FORM_ref8), 0));
299 EXPECT_EQ(Data8_2, toReference(DieDG.find(Attr_DW_FORM_ref_sig8), 0));
300 EXPECT_EQ(UData[0], toReference(DieDG.find(Attr_DW_FORM_ref_udata), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000301
302 //----------------------------------------------------------------------
303 // Test flag forms
304 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000305 EXPECT_EQ(1ULL, toUnsigned(DieDG.find(Attr_DW_FORM_flag_true), 0));
306 EXPECT_EQ(0ULL, toUnsigned(DieDG.find(Attr_DW_FORM_flag_false), 1));
307 EXPECT_EQ(1ULL, toUnsigned(DieDG.find(Attr_DW_FORM_flag_present), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000308
Greg Clayton3462a422016-12-08 01:03:48 +0000309 //----------------------------------------------------------------------
310 // Test SLEB128 based forms
311 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000312 EXPECT_EQ(SData, toSigned(DieDG.find(Attr_DW_FORM_sdata), 0));
Victor Leschukcbddae72017-01-10 21:18:26 +0000313 if (Version >= 5)
Greg Clayton97d22182017-01-13 21:08:18 +0000314 EXPECT_EQ(ICSData, toSigned(DieDG.find(Attr_DW_FORM_implicit_const), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000315
316 //----------------------------------------------------------------------
317 // Test ULEB128 based forms
318 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000319 EXPECT_EQ(UData[0], toUnsigned(DieDG.find(Attr_DW_FORM_udata), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000320
321 //----------------------------------------------------------------------
322 // Test DWARF32/DWARF64 forms
323 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000324 EXPECT_EQ(Dwarf32Values[0],
325 toReference(DieDG.find(Attr_DW_FORM_GNU_ref_alt), 0));
326 EXPECT_EQ(Dwarf32Values[1],
327 toSectionOffset(DieDG.find(Attr_DW_FORM_sec_offset), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000328
329 //----------------------------------------------------------------------
330 // Add an address at the end to make sure we can decode this value
331 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000332 EXPECT_EQ(AddrValue, toAddress(DieDG.find(Attr_Last), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000333}
334
335TEST(DWARFDebugInfo, TestDWARF32Version2Addr4AllForms) {
336 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
337 // addresses.
338 typedef uint32_t AddrType;
339 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
340 typedef AddrType RefAddrType;
341 TestAllForms<2, AddrType, RefAddrType>();
342}
343
344TEST(DWARFDebugInfo, TestDWARF32Version2Addr8AllForms) {
345 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
346 // addresses.
347 typedef uint64_t AddrType;
348 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
349 typedef AddrType RefAddrType;
350 TestAllForms<2, AddrType, RefAddrType>();
351}
352
353TEST(DWARFDebugInfo, TestDWARF32Version3Addr4AllForms) {
354 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
355 // addresses.
356 typedef uint32_t AddrType;
357 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later.
358 typedef uint32_t RefAddrType;
359 TestAllForms<3, AddrType, RefAddrType>();
360}
361
362TEST(DWARFDebugInfo, TestDWARF32Version3Addr8AllForms) {
363 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
364 // addresses.
365 typedef uint64_t AddrType;
366 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
367 typedef uint32_t RefAddrType;
368 TestAllForms<3, AddrType, RefAddrType>();
369}
370
371TEST(DWARFDebugInfo, TestDWARF32Version4Addr4AllForms) {
372 // Test that we can decode all forms for DWARF32, version 4, 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<4, AddrType, RefAddrType>();
378}
379
380TEST(DWARFDebugInfo, TestDWARF32Version4Addr8AllForms) {
381 // Test that we can decode all forms for DWARF32, version 4, 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<4, AddrType, RefAddrType>();
387}
388
Victor Leschukcbddae72017-01-10 21:18:26 +0000389TEST(DWARFDebugInfo, TestDWARF32Version5Addr4AllForms) {
390 // Test that we can decode all forms for DWARF32, version 5, 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<5, AddrType, RefAddrType>();
396}
397
398TEST(DWARFDebugInfo, TestDWARF32Version5Addr8AllForms) {
399 // Test that we can decode all forms for DWARF32, version 5, 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<5, AddrType, RefAddrType>();
405}
406
Greg Clayton3462a422016-12-08 01:03:48 +0000407template <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.
Greg Claytonc8c10322016-12-13 18:25:19 +0000452 auto DieDG = U->getUnitDIE(false);
453 EXPECT_TRUE(DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000454
455 // Verify the first child of the compile unit DIE is our subprogram.
Greg Claytonc8c10322016-12-13 18:25:19 +0000456 auto SubprogramDieDG = DieDG.getFirstChild();
457 EXPECT_TRUE(SubprogramDieDG.isValid());
458 EXPECT_EQ(SubprogramDieDG.getTag(), DW_TAG_subprogram);
Greg Clayton3462a422016-12-08 01:03:48 +0000459
460 // Verify the first child of the subprogram is our formal parameter.
Greg Claytonc8c10322016-12-13 18:25:19 +0000461 auto ArgcDieDG = SubprogramDieDG.getFirstChild();
462 EXPECT_TRUE(ArgcDieDG.isValid());
463 EXPECT_EQ(ArgcDieDG.getTag(), DW_TAG_formal_parameter);
Greg Clayton3462a422016-12-08 01:03:48 +0000464
465 // Verify our formal parameter has a NULL tag sibling.
Greg Claytonc8c10322016-12-13 18:25:19 +0000466 auto NullDieDG = ArgcDieDG.getSibling();
467 EXPECT_TRUE(NullDieDG.isValid());
468 if (NullDieDG) {
469 EXPECT_EQ(NullDieDG.getTag(), DW_TAG_null);
470 EXPECT_TRUE(!NullDieDG.getSibling().isValid());
471 EXPECT_TRUE(!NullDieDG.getFirstChild().isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000472 }
473
474 // Verify the sibling of our subprogram is our integer base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000475 auto IntDieDG = SubprogramDieDG.getSibling();
476 EXPECT_TRUE(IntDieDG.isValid());
477 EXPECT_EQ(IntDieDG.getTag(), DW_TAG_base_type);
Greg Clayton3462a422016-12-08 01:03:48 +0000478
479 // Verify the sibling of our subprogram is our integer base is a NULL tag.
Greg Claytonc8c10322016-12-13 18:25:19 +0000480 NullDieDG = IntDieDG.getSibling();
481 EXPECT_TRUE(NullDieDG.isValid());
482 if (NullDieDG) {
483 EXPECT_EQ(NullDieDG.getTag(), DW_TAG_null);
484 EXPECT_TRUE(!NullDieDG.getSibling().isValid());
485 EXPECT_TRUE(!NullDieDG.getFirstChild().isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000486 }
487}
488
489TEST(DWARFDebugInfo, TestDWARF32Version2Addr4Children) {
490 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
491 // addresses.
492 typedef uint32_t AddrType;
493 TestChildren<2, AddrType>();
494}
495
496TEST(DWARFDebugInfo, TestDWARF32Version2Addr8Children) {
497 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
498 // addresses.
499 typedef uint64_t AddrType;
500 TestChildren<2, AddrType>();
501}
502
503TEST(DWARFDebugInfo, TestDWARF32Version3Addr4Children) {
504 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
505 // addresses.
506 typedef uint32_t AddrType;
507 TestChildren<3, AddrType>();
508}
509
510TEST(DWARFDebugInfo, TestDWARF32Version3Addr8Children) {
511 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
512 // addresses.
513 typedef uint64_t AddrType;
514 TestChildren<3, AddrType>();
515}
516
517TEST(DWARFDebugInfo, TestDWARF32Version4Addr4Children) {
518 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
519 // addresses.
520 typedef uint32_t AddrType;
521 TestChildren<4, AddrType>();
522}
523
524TEST(DWARFDebugInfo, TestDWARF32Version4Addr8Children) {
525 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
526 // addresses.
527 typedef uint64_t AddrType;
528 TestChildren<4, AddrType>();
529}
530
531template <uint16_t Version, class AddrType> void TestReferences() {
532 // Test that we can decode DW_FORM_refXXX values correctly in DWARF.
533
534 const uint8_t AddrSize = sizeof(AddrType);
535 initLLVMIfNeeded();
536 Triple Triple = getHostTripleForAddrSize(AddrSize);
537 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
538 if (HandleExpectedError(ExpectedDG))
539 return;
540 dwarfgen::Generator *DG = ExpectedDG.get().get();
541 dwarfgen::CompileUnit &CU1 = DG->addCompileUnit();
542 dwarfgen::CompileUnit &CU2 = DG->addCompileUnit();
543
544 dwarfgen::DIE CU1Die = CU1.getUnitDIE();
545 CU1Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
546 CU1Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
547
548 dwarfgen::DIE CU1TypeDie = CU1Die.addChild(DW_TAG_base_type);
549 CU1TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "int");
550 CU1TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
551 CU1TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
552
553 dwarfgen::DIE CU1Ref1Die = CU1Die.addChild(DW_TAG_variable);
554 CU1Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref1");
555 CU1Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU1TypeDie);
556
557 dwarfgen::DIE CU1Ref2Die = CU1Die.addChild(DW_TAG_variable);
558 CU1Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref2");
559 CU1Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU1TypeDie);
560
561 dwarfgen::DIE CU1Ref4Die = CU1Die.addChild(DW_TAG_variable);
562 CU1Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref4");
563 CU1Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU1TypeDie);
564
565 dwarfgen::DIE CU1Ref8Die = CU1Die.addChild(DW_TAG_variable);
566 CU1Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref8");
567 CU1Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU1TypeDie);
568
569 dwarfgen::DIE CU1RefAddrDie = CU1Die.addChild(DW_TAG_variable);
570 CU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1RefAddr");
571 CU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
572
573 dwarfgen::DIE CU2Die = CU2.getUnitDIE();
574 CU2Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/foo.c");
575 CU2Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
576
577 dwarfgen::DIE CU2TypeDie = CU2Die.addChild(DW_TAG_base_type);
578 CU2TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "float");
579 CU2TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_float);
580 CU2TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
581
582 dwarfgen::DIE CU2Ref1Die = CU2Die.addChild(DW_TAG_variable);
583 CU2Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref1");
584 CU2Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU2TypeDie);
585
586 dwarfgen::DIE CU2Ref2Die = CU2Die.addChild(DW_TAG_variable);
587 CU2Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref2");
588 CU2Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU2TypeDie);
589
590 dwarfgen::DIE CU2Ref4Die = CU2Die.addChild(DW_TAG_variable);
591 CU2Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref4");
592 CU2Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU2TypeDie);
593
594 dwarfgen::DIE CU2Ref8Die = CU2Die.addChild(DW_TAG_variable);
595 CU2Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref8");
596 CU2Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU2TypeDie);
597
598 dwarfgen::DIE CU2RefAddrDie = CU2Die.addChild(DW_TAG_variable);
599 CU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2RefAddr");
600 CU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
601
602 // Refer to a type in CU1 from CU2
603 dwarfgen::DIE CU2ToCU1RefAddrDie = CU2Die.addChild(DW_TAG_variable);
604 CU2ToCU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2ToCU1RefAddr");
605 CU2ToCU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
606
607 // Refer to a type in CU2 from CU1
608 dwarfgen::DIE CU1ToCU2RefAddrDie = CU1Die.addChild(DW_TAG_variable);
609 CU1ToCU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1ToCU2RefAddr");
610 CU1ToCU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
611
612 StringRef FileBytes = DG->generate();
613 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
614 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
615 EXPECT_TRUE((bool)Obj);
616 DWARFContextInMemory DwarfContext(*Obj.get());
617
618 // Verify the number of compile units is correct.
619 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
620 EXPECT_EQ(NumCUs, 2u);
621 DWARFCompileUnit *U1 = DwarfContext.getCompileUnitAtIndex(0);
622 DWARFCompileUnit *U2 = DwarfContext.getCompileUnitAtIndex(1);
623
624 // Get the compile unit DIE is valid.
Greg Claytonc8c10322016-12-13 18:25:19 +0000625 auto Unit1DieDG = U1->getUnitDIE(false);
626 EXPECT_TRUE(Unit1DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000627
Greg Claytonc8c10322016-12-13 18:25:19 +0000628 auto Unit2DieDG = U2->getUnitDIE(false);
629 EXPECT_TRUE(Unit2DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000630
631 // Verify the first child of the compile unit 1 DIE is our int base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000632 auto CU1TypeDieDG = Unit1DieDG.getFirstChild();
633 EXPECT_TRUE(CU1TypeDieDG.isValid());
634 EXPECT_EQ(CU1TypeDieDG.getTag(), DW_TAG_base_type);
Greg Clayton97d22182017-01-13 21:08:18 +0000635 EXPECT_EQ(DW_ATE_signed, toUnsigned(CU1TypeDieDG.find(DW_AT_encoding), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000636
637 // Verify the first child of the compile unit 2 DIE is our float base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000638 auto CU2TypeDieDG = Unit2DieDG.getFirstChild();
639 EXPECT_TRUE(CU2TypeDieDG.isValid());
640 EXPECT_EQ(CU2TypeDieDG.getTag(), DW_TAG_base_type);
Greg Clayton97d22182017-01-13 21:08:18 +0000641 EXPECT_EQ(DW_ATE_float, toUnsigned(CU2TypeDieDG.find(DW_AT_encoding), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000642
643 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
644 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000645 auto CU1Ref1DieDG = CU1TypeDieDG.getSibling();
646 EXPECT_TRUE(CU1Ref1DieDG.isValid());
647 EXPECT_EQ(CU1Ref1DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000648 EXPECT_EQ(CU1TypeDieDG.getOffset(),
649 toReference(CU1Ref1DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000650 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
651 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000652 auto CU1Ref2DieDG = CU1Ref1DieDG.getSibling();
653 EXPECT_TRUE(CU1Ref2DieDG.isValid());
654 EXPECT_EQ(CU1Ref2DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000655 EXPECT_EQ(CU1TypeDieDG.getOffset(),
656 toReference(CU1Ref2DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000657
658 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
659 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000660 auto CU1Ref4DieDG = CU1Ref2DieDG.getSibling();
661 EXPECT_TRUE(CU1Ref4DieDG.isValid());
662 EXPECT_EQ(CU1Ref4DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000663 EXPECT_EQ(CU1TypeDieDG.getOffset(),
664 toReference(CU1Ref4DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000665
666 // Verify the sibling is our Ref8 DIE and that its DW_AT_type points to our
667 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000668 auto CU1Ref8DieDG = CU1Ref4DieDG.getSibling();
669 EXPECT_TRUE(CU1Ref8DieDG.isValid());
670 EXPECT_EQ(CU1Ref8DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000671 EXPECT_EQ(CU1TypeDieDG.getOffset(),
672 toReference(CU1Ref8DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000673
674 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
675 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000676 auto CU1RefAddrDieDG = CU1Ref8DieDG.getSibling();
677 EXPECT_TRUE(CU1RefAddrDieDG.isValid());
678 EXPECT_EQ(CU1RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000679 EXPECT_EQ(CU1TypeDieDG.getOffset(),
680 toReference(CU1RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000681
682 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
683 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000684 auto CU1ToCU2RefAddrDieDG = CU1RefAddrDieDG.getSibling();
685 EXPECT_TRUE(CU1ToCU2RefAddrDieDG.isValid());
686 EXPECT_EQ(CU1ToCU2RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000687 EXPECT_EQ(CU2TypeDieDG.getOffset(),
688 toReference(CU1ToCU2RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000689
690 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
691 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000692 auto CU2Ref1DieDG = CU2TypeDieDG.getSibling();
693 EXPECT_TRUE(CU2Ref1DieDG.isValid());
694 EXPECT_EQ(CU2Ref1DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000695 EXPECT_EQ(CU2TypeDieDG.getOffset(),
696 toReference(CU2Ref1DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000697 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
698 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000699 auto CU2Ref2DieDG = CU2Ref1DieDG.getSibling();
700 EXPECT_TRUE(CU2Ref2DieDG.isValid());
701 EXPECT_EQ(CU2Ref2DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000702 EXPECT_EQ(CU2TypeDieDG.getOffset(),
703 toReference(CU2Ref2DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000704
705 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
706 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000707 auto CU2Ref4DieDG = CU2Ref2DieDG.getSibling();
708 EXPECT_TRUE(CU2Ref4DieDG.isValid());
709 EXPECT_EQ(CU2Ref4DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000710 EXPECT_EQ(CU2TypeDieDG.getOffset(),
711 toReference(CU2Ref4DieDG.find(DW_AT_type), -1ULL));
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 CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000715 auto CU2Ref8DieDG = CU2Ref4DieDG.getSibling();
716 EXPECT_TRUE(CU2Ref8DieDG.isValid());
717 EXPECT_EQ(CU2Ref8DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000718 EXPECT_EQ(CU2TypeDieDG.getOffset(),
719 toReference(CU2Ref8DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000720
721 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
722 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000723 auto CU2RefAddrDieDG = CU2Ref8DieDG.getSibling();
724 EXPECT_TRUE(CU2RefAddrDieDG.isValid());
725 EXPECT_EQ(CU2RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000726 EXPECT_EQ(CU2TypeDieDG.getOffset(),
727 toReference(CU2RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000728
729 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
730 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000731 auto CU2ToCU1RefAddrDieDG = CU2RefAddrDieDG.getSibling();
732 EXPECT_TRUE(CU2ToCU1RefAddrDieDG.isValid());
733 EXPECT_EQ(CU2ToCU1RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000734 EXPECT_EQ(CU1TypeDieDG.getOffset(),
735 toReference(CU2ToCU1RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000736}
737
738TEST(DWARFDebugInfo, TestDWARF32Version2Addr4References) {
739 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
740 // addresses.
741 typedef uint32_t AddrType;
742 TestReferences<2, AddrType>();
743}
744
745TEST(DWARFDebugInfo, TestDWARF32Version2Addr8References) {
746 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
747 // addresses.
748 typedef uint64_t AddrType;
749 TestReferences<2, AddrType>();
750}
751
752TEST(DWARFDebugInfo, TestDWARF32Version3Addr4References) {
753 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
754 // addresses.
755 typedef uint32_t AddrType;
756 TestReferences<3, AddrType>();
757}
758
759TEST(DWARFDebugInfo, TestDWARF32Version3Addr8References) {
760 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
761 // addresses.
762 typedef uint64_t AddrType;
763 TestReferences<3, AddrType>();
764}
765
766TEST(DWARFDebugInfo, TestDWARF32Version4Addr4References) {
767 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
768 // addresses.
769 typedef uint32_t AddrType;
770 TestReferences<4, AddrType>();
771}
772
773TEST(DWARFDebugInfo, TestDWARF32Version4Addr8References) {
774 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
775 // addresses.
776 typedef uint64_t AddrType;
777 TestReferences<4, AddrType>();
778}
779
Greg Clayton2520c9e2016-12-19 20:36:41 +0000780template <uint16_t Version, class AddrType> void TestAddresses() {
781 // Test the DWARF APIs related to accessing the DW_AT_low_pc and
782 // DW_AT_high_pc.
783 const uint8_t AddrSize = sizeof(AddrType);
784 const bool SupportsHighPCAsOffset = Version >= 4;
785 initLLVMIfNeeded();
786 Triple Triple = getHostTripleForAddrSize(AddrSize);
787 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
788 if (HandleExpectedError(ExpectedDG))
789 return;
790 dwarfgen::Generator *DG = ExpectedDG.get().get();
791 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
792 dwarfgen::DIE CUDie = CU.getUnitDIE();
793
794 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
795 CUDie.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
796
797 // Create a subprogram DIE with no low or high PC.
798 dwarfgen::DIE SubprogramNoPC = CUDie.addChild(DW_TAG_subprogram);
799 SubprogramNoPC.addAttribute(DW_AT_name, DW_FORM_strp, "no_pc");
800
801 // Create a subprogram DIE with a low PC only.
802 dwarfgen::DIE SubprogramLowPC = CUDie.addChild(DW_TAG_subprogram);
803 SubprogramLowPC.addAttribute(DW_AT_name, DW_FORM_strp, "low_pc");
804 const uint64_t ActualLowPC = 0x1000;
805 const uint64_t ActualHighPC = 0x2000;
806 const uint64_t ActualHighPCOffset = ActualHighPC - ActualLowPC;
807 SubprogramLowPC.addAttribute(DW_AT_low_pc, DW_FORM_addr, ActualLowPC);
808
809 // Create a subprogram DIE with a low and high PC.
810 dwarfgen::DIE SubprogramLowHighPC = CUDie.addChild(DW_TAG_subprogram);
811 SubprogramLowHighPC.addAttribute(DW_AT_name, DW_FORM_strp, "low_high_pc");
812 SubprogramLowHighPC.addAttribute(DW_AT_low_pc, DW_FORM_addr, ActualLowPC);
813 // Encode the high PC as an offset from the low PC if supported.
814 if (SupportsHighPCAsOffset)
815 SubprogramLowHighPC.addAttribute(DW_AT_high_pc, DW_FORM_data4,
816 ActualHighPCOffset);
817 else
818 SubprogramLowHighPC.addAttribute(DW_AT_high_pc, DW_FORM_addr, ActualHighPC);
819
820 StringRef FileBytes = DG->generate();
821 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
822 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
823 EXPECT_TRUE((bool)Obj);
824 DWARFContextInMemory DwarfContext(*Obj.get());
825
826 // Verify the number of compile units is correct.
827 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
828 EXPECT_EQ(NumCUs, 1u);
829 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
830
831 // Get the compile unit DIE is valid.
832 auto DieDG = U->getUnitDIE(false);
833 EXPECT_TRUE(DieDG.isValid());
Greg Clayton2520c9e2016-12-19 20:36:41 +0000834
835 uint64_t LowPC, HighPC;
836 Optional<uint64_t> OptU64;
837 // Verify the that our subprogram with no PC value fails appropriately when
838 // asked for any PC values.
839 auto SubprogramDieNoPC = DieDG.getFirstChild();
840 EXPECT_TRUE(SubprogramDieNoPC.isValid());
841 EXPECT_EQ(SubprogramDieNoPC.getTag(), DW_TAG_subprogram);
Greg Clayton97d22182017-01-13 21:08:18 +0000842 OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_low_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000843 EXPECT_FALSE((bool)OptU64);
Greg Clayton97d22182017-01-13 21:08:18 +0000844 OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000845 EXPECT_FALSE((bool)OptU64);
846 EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
Greg Clayton97d22182017-01-13 21:08:18 +0000847 OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000848 EXPECT_FALSE((bool)OptU64);
Greg Clayton97d22182017-01-13 21:08:18 +0000849 OptU64 = toUnsigned(SubprogramDieNoPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000850 EXPECT_FALSE((bool)OptU64);
851 OptU64 = SubprogramDieNoPC.getHighPC(ActualLowPC);
852 EXPECT_FALSE((bool)OptU64);
853 EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
854
855
856 // Verify the that our subprogram with only a low PC value succeeds when
857 // we ask for the Low PC, but fails appropriately when asked for the high PC
858 // or both low and high PC values.
859 auto SubprogramDieLowPC = SubprogramDieNoPC.getSibling();
860 EXPECT_TRUE(SubprogramDieLowPC.isValid());
861 EXPECT_EQ(SubprogramDieLowPC.getTag(), DW_TAG_subprogram);
Greg Clayton97d22182017-01-13 21:08:18 +0000862 OptU64 = toAddress(SubprogramDieLowPC.find(DW_AT_low_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000863 EXPECT_TRUE((bool)OptU64);
864 EXPECT_EQ(OptU64.getValue(), ActualLowPC);
Greg Clayton97d22182017-01-13 21:08:18 +0000865 OptU64 = toAddress(SubprogramDieLowPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000866 EXPECT_FALSE((bool)OptU64);
Greg Clayton97d22182017-01-13 21:08:18 +0000867 OptU64 = toUnsigned(SubprogramDieLowPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000868 EXPECT_FALSE((bool)OptU64);
869 OptU64 = SubprogramDieLowPC.getHighPC(ActualLowPC);
870 EXPECT_FALSE((bool)OptU64);
871 EXPECT_FALSE(SubprogramDieLowPC.getLowAndHighPC(LowPC, HighPC));
872
873
874 // Verify the that our subprogram with only a low PC value succeeds when
875 // we ask for the Low PC, but fails appropriately when asked for the high PC
876 // or both low and high PC values.
877 auto SubprogramDieLowHighPC = SubprogramDieLowPC.getSibling();
878 EXPECT_TRUE(SubprogramDieLowHighPC.isValid());
879 EXPECT_EQ(SubprogramDieLowHighPC.getTag(), DW_TAG_subprogram);
Greg Clayton97d22182017-01-13 21:08:18 +0000880 OptU64 = toAddress(SubprogramDieLowHighPC.find(DW_AT_low_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000881 EXPECT_TRUE((bool)OptU64);
882 EXPECT_EQ(OptU64.getValue(), ActualLowPC);
883 // Get the high PC as an address. This should succeed if the high PC was
884 // encoded as an address and fail if the high PC was encoded as an offset.
Greg Clayton97d22182017-01-13 21:08:18 +0000885 OptU64 = toAddress(SubprogramDieLowHighPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000886 if (SupportsHighPCAsOffset) {
887 EXPECT_FALSE((bool)OptU64);
888 } else {
889 EXPECT_TRUE((bool)OptU64);
890 EXPECT_EQ(OptU64.getValue(), ActualHighPC);
891 }
892 // Get the high PC as an unsigned constant. This should succeed if the high PC
893 // was encoded as an offset and fail if the high PC was encoded as an address.
Greg Clayton97d22182017-01-13 21:08:18 +0000894 OptU64 = toUnsigned(SubprogramDieLowHighPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000895 if (SupportsHighPCAsOffset) {
896 EXPECT_TRUE((bool)OptU64);
897 EXPECT_EQ(OptU64.getValue(), ActualHighPCOffset);
898 } else {
899 EXPECT_FALSE((bool)OptU64);
900 }
901
902 OptU64 = SubprogramDieLowHighPC.getHighPC(ActualLowPC);
903 EXPECT_TRUE((bool)OptU64);
904 EXPECT_EQ(OptU64.getValue(), ActualHighPC);
905
906 EXPECT_TRUE(SubprogramDieLowHighPC.getLowAndHighPC(LowPC, HighPC));
907 EXPECT_EQ(LowPC, ActualLowPC);
908 EXPECT_EQ(HighPC, ActualHighPC);
909}
910
911TEST(DWARFDebugInfo, TestDWARF32Version2Addr4Addresses) {
912 // Test that we can decode address values in DWARF32, version 2, with 4 byte
913 // addresses.
914 typedef uint32_t AddrType;
915 TestAddresses<2, AddrType>();
916}
917
918TEST(DWARFDebugInfo, TestDWARF32Version2Addr8Addresses) {
919 // Test that we can decode address values in DWARF32, version 2, with 8 byte
920 // addresses.
921 typedef uint64_t AddrType;
922 TestAddresses<2, AddrType>();
923}
924
925TEST(DWARFDebugInfo, TestDWARF32Version3Addr4Addresses) {
926 // Test that we can decode address values in DWARF32, version 3, with 4 byte
927 // addresses.
928 typedef uint32_t AddrType;
929 TestAddresses<3, AddrType>();
930}
931
932TEST(DWARFDebugInfo, TestDWARF32Version3Addr8Addresses) {
933 // Test that we can decode address values in DWARF32, version 3, with 8 byte
934 // addresses.
935 typedef uint64_t AddrType;
936 TestAddresses<3, AddrType>();
937}
938
939TEST(DWARFDebugInfo, TestDWARF32Version4Addr4Addresses) {
940 // Test that we can decode address values in DWARF32, version 4, with 4 byte
941 // addresses.
942 typedef uint32_t AddrType;
943 TestAddresses<4, AddrType>();
944}
945
946TEST(DWARFDebugInfo, TestDWARF32Version4Addr8Addresses) {
947 // Test that we can decode address values in DWARF32, version 4, with 8 byte
948 // addresses.
949 typedef uint64_t AddrType;
950 TestAddresses<4, AddrType>();
951}
952
Greg Clayton78a07bf2016-12-21 21:37:06 +0000953TEST(DWARFDebugInfo, TestRelations) {
954 // Test the DWARF APIs related to accessing the DW_AT_low_pc and
955 // DW_AT_high_pc.
956 uint16_t Version = 4;
957
958 const uint8_t AddrSize = sizeof(void *);
959 initLLVMIfNeeded();
960 Triple Triple = getHostTripleForAddrSize(AddrSize);
961 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
962 if (HandleExpectedError(ExpectedDG))
963 return;
964 dwarfgen::Generator *DG = ExpectedDG.get().get();
965 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
966
967 enum class Tag: uint16_t {
968 A = dwarf::DW_TAG_lo_user,
969 B,
Greg Clayton78a07bf2016-12-21 21:37:06 +0000970 C,
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000971 C1,
972 C2,
973 D,
974 D1
Greg Clayton78a07bf2016-12-21 21:37:06 +0000975 };
976
977 // Scope to allow us to re-use the same DIE names
978 {
979 // Create DWARF tree that looks like:
980 //
981 // CU
982 // A
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000983 // B
984 // C
985 // C1
986 // C2
987 // D
988 // D1
Greg Clayton78a07bf2016-12-21 21:37:06 +0000989 dwarfgen::DIE CUDie = CU.getUnitDIE();
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000990 dwarfgen::DIE A = CUDie.addChild((dwarf::Tag)Tag::A);
991 A.addChild((dwarf::Tag)Tag::B);
992 dwarfgen::DIE C = A.addChild((dwarf::Tag)Tag::C);
993 dwarfgen::DIE D = A.addChild((dwarf::Tag)Tag::D);
Greg Clayton78a07bf2016-12-21 21:37:06 +0000994 C.addChild((dwarf::Tag)Tag::C1);
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000995 C.addChild((dwarf::Tag)Tag::C2);
996 D.addChild((dwarf::Tag)Tag::D1);
Greg Clayton78a07bf2016-12-21 21:37:06 +0000997 }
998
999 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1000 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1001 EXPECT_TRUE((bool)Obj);
1002 DWARFContextInMemory DwarfContext(*Obj.get());
1003
1004 // Verify the number of compile units is correct.
1005 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1006 EXPECT_EQ(NumCUs, 1u);
1007 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1008
1009 // Get the compile unit DIE is valid.
1010 auto CUDie = U->getUnitDIE(false);
1011 EXPECT_TRUE(CUDie.isValid());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001012
1013 // The compile unit doesn't have a parent or a sibling.
1014 auto ParentDie = CUDie.getParent();
1015 EXPECT_FALSE(ParentDie.isValid());
1016 auto SiblingDie = CUDie.getSibling();
1017 EXPECT_FALSE(SiblingDie.isValid());
1018
1019 // Get the children of the compile unit
1020 auto A = CUDie.getFirstChild();
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001021 auto B = A.getFirstChild();
Greg Clayton78a07bf2016-12-21 21:37:06 +00001022 auto C = B.getSibling();
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001023 auto D = C.getSibling();
1024 auto Null = D.getSibling();
Greg Clayton78a07bf2016-12-21 21:37:06 +00001025
1026 // Verify NULL Die is NULL and has no children or siblings
1027 EXPECT_TRUE(Null.isNULL());
1028 EXPECT_FALSE(Null.getSibling().isValid());
1029 EXPECT_FALSE(Null.getFirstChild().isValid());
1030
1031 // Verify all children of the compile unit DIE are correct.
1032 EXPECT_EQ(A.getTag(), (dwarf::Tag)Tag::A);
1033 EXPECT_EQ(B.getTag(), (dwarf::Tag)Tag::B);
1034 EXPECT_EQ(C.getTag(), (dwarf::Tag)Tag::C);
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001035 EXPECT_EQ(D.getTag(), (dwarf::Tag)Tag::D);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001036
1037 // Verify who has children
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001038 EXPECT_TRUE(A.hasChildren());
1039 EXPECT_FALSE(B.hasChildren());
1040 EXPECT_TRUE(C.hasChildren());
1041 EXPECT_TRUE(D.hasChildren());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001042
1043 // Make sure the parent of all the children of the compile unit are the
1044 // compile unit.
1045 EXPECT_EQ(A.getParent(), CUDie);
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001046
1047 // Make sure the parent of all the children of A are the A.
1048 // B is the first child in A, so we need to verify we can get the previous
1049 // DIE as the parent.
1050 EXPECT_EQ(B.getParent(), A);
1051 // C is the second child in A, so we need to make sure we can backup across
1052 // other DIE (B) at the same level to get the correct parent.
1053 EXPECT_EQ(C.getParent(), A);
1054 // D is the third child of A. We need to verify we can backup across other DIE
1055 // (B and C) including DIE that have children (D) to get the correct parent.
1056 EXPECT_EQ(D.getParent(), A);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001057
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001058 // Verify that a DIE with no children returns an invalid DWARFDie.
1059 EXPECT_FALSE(B.getFirstChild().isValid());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001060
1061 // Verify the children of the B DIE
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001062 auto C1 = C.getFirstChild();
1063 auto C2 = C1.getSibling();
1064 EXPECT_TRUE(C2.getSibling().isNULL());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001065
1066 // Verify all children of the B DIE correctly valid or invalid.
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001067 EXPECT_EQ(C1.getTag(), (dwarf::Tag)Tag::C1);
1068 EXPECT_EQ(C2.getTag(), (dwarf::Tag)Tag::C2);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001069
1070 // Make sure the parent of all the children of the B are the B.
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001071 EXPECT_EQ(C1.getParent(), C);
1072 EXPECT_EQ(C2.getParent(), C);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001073}
1074
1075TEST(DWARFDebugInfo, TestDWARFDie) {
1076
1077 // Make sure a default constructed DWARFDie doesn't have any parent, sibling
1078 // or child;
1079 DWARFDie DefaultDie;
1080 EXPECT_FALSE(DefaultDie.getParent().isValid());
1081 EXPECT_FALSE(DefaultDie.getFirstChild().isValid());
1082 EXPECT_FALSE(DefaultDie.getSibling().isValid());
1083}
1084
Greg Clayton93e4fe82017-01-05 23:47:37 +00001085TEST(DWARFDebugInfo, TestChildIterators) {
1086 // Test the DWARF APIs related to iterating across the children of a DIE using
1087 // the DWARFDie::iterator class.
1088 uint16_t Version = 4;
1089
1090 const uint8_t AddrSize = sizeof(void *);
1091 initLLVMIfNeeded();
1092 Triple Triple = getHostTripleForAddrSize(AddrSize);
1093 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1094 if (HandleExpectedError(ExpectedDG))
1095 return;
1096 dwarfgen::Generator *DG = ExpectedDG.get().get();
1097 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1098
1099 enum class Tag: uint16_t {
1100 A = dwarf::DW_TAG_lo_user,
1101 B,
1102 };
1103
1104 // Scope to allow us to re-use the same DIE names
1105 {
1106 // Create DWARF tree that looks like:
1107 //
1108 // CU
1109 // A
1110 // B
1111 auto CUDie = CU.getUnitDIE();
1112 CUDie.addChild((dwarf::Tag)Tag::A);
1113 CUDie.addChild((dwarf::Tag)Tag::B);
1114 }
1115
1116 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1117 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1118 EXPECT_TRUE((bool)Obj);
1119 DWARFContextInMemory DwarfContext(*Obj.get());
1120
1121 // Verify the number of compile units is correct.
1122 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1123 EXPECT_EQ(NumCUs, 1u);
1124 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1125
1126 // Get the compile unit DIE is valid.
1127 auto CUDie = U->getUnitDIE(false);
1128 EXPECT_TRUE(CUDie.isValid());
Greg Clayton93e4fe82017-01-05 23:47:37 +00001129 uint32_t Index;
1130 DWARFDie A;
1131 DWARFDie B;
1132
1133 // Verify the compile unit DIE's children.
1134 Index = 0;
1135 for (auto Die : CUDie.children()) {
1136 switch (Index++) {
1137 case 0: A = Die; break;
1138 case 1: B = Die; break;
1139 }
1140 }
1141
1142 EXPECT_EQ(A.getTag(), (dwarf::Tag)Tag::A);
1143 EXPECT_EQ(B.getTag(), (dwarf::Tag)Tag::B);
1144
1145 // Verify that A has no children by verifying that the begin and end contain
1146 // invalid DIEs and also that the iterators are equal.
1147 EXPECT_EQ(A.begin(), A.end());
1148}
1149
1150TEST(DWARFDebugInfo, TestChildIteratorsOnInvalidDie) {
1151 // Verify that an invalid DIE has no children.
1152 DWARFDie Invalid;
1153 auto begin = Invalid.begin();
1154 auto end = Invalid.end();
1155 EXPECT_FALSE(begin->isValid());
1156 EXPECT_FALSE(end->isValid());
1157 EXPECT_EQ(begin, end);
1158}
1159
1160
1161TEST(DWARFDebugInfo, TestEmptyChildren) {
1162 // Test a DIE that says it has children in the abbreviation, but actually
1163 // doesn't have any attributes, will not return anything during iteration.
1164 // We do this by making sure the begin and end iterators are equal.
1165 uint16_t Version = 4;
1166
1167 const uint8_t AddrSize = sizeof(void *);
1168 initLLVMIfNeeded();
1169 Triple Triple = getHostTripleForAddrSize(AddrSize);
1170 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1171 if (HandleExpectedError(ExpectedDG))
1172 return;
1173 dwarfgen::Generator *DG = ExpectedDG.get().get();
1174 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1175
1176 // Scope to allow us to re-use the same DIE names
1177 {
1178 // Create a compile unit DIE that has an abbreviation that says it has
1179 // children, but doesn't have any actual attributes. This helps us test
1180 // a DIE that has only one child: a NULL DIE.
1181 auto CUDie = CU.getUnitDIE();
1182 CUDie.setForceChildren();
1183 }
1184
1185 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1186 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1187 EXPECT_TRUE((bool)Obj);
1188 DWARFContextInMemory DwarfContext(*Obj.get());
1189
1190 // Verify the number of compile units is correct.
1191 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1192 EXPECT_EQ(NumCUs, 1u);
1193 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1194
1195 // Get the compile unit DIE is valid.
1196 auto CUDie = U->getUnitDIE(false);
1197 EXPECT_TRUE(CUDie.isValid());
Greg Clayton93e4fe82017-01-05 23:47:37 +00001198
1199 // Verify that the CU Die that says it has children, but doesn't, actually
1200 // has begin and end iterators that are equal. We want to make sure we don't
1201 // see the Null DIEs during iteration.
1202 EXPECT_EQ(CUDie.begin(), CUDie.end());
1203}
Greg Clayton2520c9e2016-12-19 20:36:41 +00001204
Greg Clayton0e62ee72017-01-13 00:13:42 +00001205TEST(DWARFDebugInfo, TestAttributeIterators) {
1206 // Test the DWARF APIs related to iterating across all attribute values in a
1207 // a DWARFDie.
1208 uint16_t Version = 4;
1209
1210 const uint8_t AddrSize = sizeof(void *);
1211 initLLVMIfNeeded();
1212 Triple Triple = getHostTripleForAddrSize(AddrSize);
1213 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1214 if (HandleExpectedError(ExpectedDG))
1215 return;
1216 dwarfgen::Generator *DG = ExpectedDG.get().get();
1217 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1218 const uint64_t CULowPC = 0x1000;
1219 StringRef CUPath("/tmp/main.c");
1220
1221 // Scope to allow us to re-use the same DIE names
1222 {
1223 auto CUDie = CU.getUnitDIE();
1224 // Encode an attribute value before an attribute with no data.
1225 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, CUPath.data());
1226 // Encode an attribute value with no data in .debug_info/types to ensure
1227 // the iteration works correctly.
1228 CUDie.addAttribute(DW_AT_declaration, DW_FORM_flag_present);
1229 // Encode an attribute value after an attribute with no data.
1230 CUDie.addAttribute(DW_AT_low_pc, DW_FORM_addr, CULowPC);
1231 }
1232
1233 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1234 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1235 EXPECT_TRUE((bool)Obj);
1236 DWARFContextInMemory DwarfContext(*Obj.get());
1237
1238 // Verify the number of compile units is correct.
1239 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1240 EXPECT_EQ(NumCUs, 1u);
1241 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1242
1243 // Get the compile unit DIE is valid.
1244 auto CUDie = U->getUnitDIE(false);
1245 EXPECT_TRUE(CUDie.isValid());
1246
1247 auto R = CUDie.attributes();
1248 auto I = R.begin();
1249 auto E = R.end();
1250
1251 ASSERT_NE(E, I);
1252 EXPECT_EQ(I->Attr, DW_AT_name);
1253 auto ActualCUPath = I->Value.getAsCString();
1254 EXPECT_EQ(CUPath, *ActualCUPath);
1255
1256 ASSERT_NE(E, ++I);
1257 EXPECT_EQ(I->Attr, DW_AT_declaration);
Greg Clayton71503432017-01-13 00:23:59 +00001258 EXPECT_EQ(1ull, *I->Value.getAsUnsignedConstant());
Greg Clayton0e62ee72017-01-13 00:13:42 +00001259
1260 ASSERT_NE(E, ++I);
1261 EXPECT_EQ(I->Attr, DW_AT_low_pc);
Greg Clayton71503432017-01-13 00:23:59 +00001262 EXPECT_EQ(CULowPC, *I->Value.getAsAddress());
Greg Clayton0e62ee72017-01-13 00:13:42 +00001263
1264 EXPECT_EQ(E, ++I);
1265}
1266
Greg Clayton97d22182017-01-13 21:08:18 +00001267TEST(DWARFDebugInfo, TestFindRecurse) {
1268 uint16_t Version = 4;
1269
1270 const uint8_t AddrSize = sizeof(void *);
1271 initLLVMIfNeeded();
1272 Triple Triple = getHostTripleForAddrSize(AddrSize);
1273 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1274 if (HandleExpectedError(ExpectedDG))
1275 return;
1276 dwarfgen::Generator *DG = ExpectedDG.get().get();
1277 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1278
1279 StringRef SpecDieName("spec");
1280 StringRef AbsDieName("abs");
1281 // Scope to allow us to re-use the same DIE names
1282 {
1283 // Create a compile unit DIE that has an abbreviation that says it has
1284 // children, but doesn't have any actual attributes. This helps us test
1285 // a DIE that has only one child: a NULL DIE.
1286 auto CUDie = CU.getUnitDIE();
1287 auto FuncSpecDie = CUDie.addChild(DW_TAG_subprogram);
1288 auto FuncDie = CUDie.addChild(DW_TAG_subprogram);
1289 auto VarAbsDie = CUDie.addChild(DW_TAG_variable);
1290 auto VarDie = CUDie.addChild(DW_TAG_variable);
1291 FuncSpecDie.addAttribute(DW_AT_name, DW_FORM_strp, SpecDieName);
1292 FuncDie.addAttribute(DW_AT_specification, DW_FORM_ref4, FuncSpecDie);
1293 VarAbsDie.addAttribute(DW_AT_name, DW_FORM_strp, AbsDieName);
1294 VarDie.addAttribute(DW_AT_abstract_origin, DW_FORM_ref4, VarAbsDie);
1295 }
1296
1297 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1298 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1299 EXPECT_TRUE((bool)Obj);
1300 DWARFContextInMemory DwarfContext(*Obj.get());
1301
1302 // Verify the number of compile units is correct.
1303 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1304 EXPECT_EQ(NumCUs, 1u);
1305 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1306
1307 // Get the compile unit DIE is valid.
1308 auto CUDie = U->getUnitDIE(false);
1309 EXPECT_TRUE(CUDie.isValid());
1310
1311 auto FuncSpecDie = CUDie.getFirstChild();
1312 auto FuncDie = FuncSpecDie.getSibling();
1313 auto VarAbsDie = FuncDie.getSibling();
1314 auto VarDie = VarAbsDie.getSibling();
1315
1316 // Make sure we can't extract the name from the specification die when using
1317 // DWARFDie::find() since it won't check the DW_AT_specification DIE.
1318 EXPECT_FALSE(FuncDie.find(DW_AT_name).hasValue());
1319
1320 // Make sure we can extract the name from the specification die when using
1321 // DWARFDie::findRecursively() since it should recurse through the
1322 // DW_AT_specification DIE.
1323 auto NameOpt = FuncDie.findRecursively(DW_AT_name);
1324 EXPECT_TRUE(NameOpt.hasValue());
1325 // Test the dwarf::toString() helper function.
1326 auto StringOpt = toString(NameOpt);
1327 EXPECT_TRUE(StringOpt.hasValue());
1328 EXPECT_EQ(SpecDieName, StringOpt.getValueOr(nullptr));
1329 // Test the dwarf::toString() helper function with a default value specified.
1330 EXPECT_EQ(SpecDieName, toString(NameOpt, nullptr));
1331
1332 // Make sure we can't extract the name from the abstract origin die when using
1333 // DWARFDie::find() since it won't check the DW_AT_abstract_origin DIE.
1334 EXPECT_FALSE(VarDie.find(DW_AT_name).hasValue());
1335
1336 // Make sure we can extract the name from the abstract origin die when using
1337 // DWARFDie::findRecursively() since it should recurse through the
1338 // DW_AT_abstract_origin DIE.
1339 NameOpt = VarDie.findRecursively(DW_AT_name);
1340 EXPECT_TRUE(NameOpt.hasValue());
1341 // Test the dwarf::toString() helper function.
1342 StringOpt = toString(NameOpt);
1343 EXPECT_TRUE(StringOpt.hasValue());
1344 EXPECT_EQ(AbsDieName, StringOpt.getValueOr(nullptr));
1345 // Test the dwarf::toString() helper function with a default value specified.
1346 EXPECT_EQ(AbsDieName, toString(NameOpt, nullptr));
1347}
1348
1349TEST(DWARFDebugInfo, TestDwarfToFunctions) {
1350 // Test all of the dwarf::toXXX functions that take a
1351 // Optional<DWARFFormValue> and extract the values from it.
1352 DWARFFormValue FormVal;
1353 uint64_t InvalidU64 = 0xBADBADBADBADBADB;
1354 int64_t InvalidS64 = 0xBADBADBADBADBADB;
1355 // First test that we don't get valid values back when using an optional with
1356 // no value.
1357 Optional<DWARFFormValue> FormValOpt;
1358 EXPECT_FALSE(toString(FormValOpt).hasValue());
1359 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1360 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1361 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1362 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1363 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1364 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1365 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1366 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1367 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1368 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1369 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1370 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidS64));
1371
1372
1373 // Test successful and unsuccessful address decoding.
1374 uint64_t Address = 0x100000000ULL;
1375 FormVal.setForm(DW_FORM_addr);
1376 FormVal.setUValue(Address);
1377 FormValOpt = FormVal;
1378
1379 EXPECT_FALSE(toString(FormValOpt).hasValue());
1380 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1381 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1382 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1383 EXPECT_TRUE(toAddress(FormValOpt).hasValue());
1384 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1385 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1386 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1387 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1388 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1389 EXPECT_EQ(Address, toAddress(FormValOpt, InvalidU64));
1390 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1391 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidU64));
1392
1393 // Test successful and unsuccessful unsigned constant decoding.
1394 uint64_t UData8 = 0x1020304050607080ULL;
1395 FormVal.setForm(DW_FORM_udata);
1396 FormVal.setUValue(UData8);
1397 FormValOpt = FormVal;
1398
1399 EXPECT_FALSE(toString(FormValOpt).hasValue());
1400 EXPECT_TRUE(toUnsigned(FormValOpt).hasValue());
1401 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1402 EXPECT_TRUE(toSigned(FormValOpt).hasValue());
1403 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1404 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1405 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1406 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1407 EXPECT_EQ(UData8, toUnsigned(FormValOpt, InvalidU64));
1408 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1409 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1410 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1411 EXPECT_EQ((int64_t)UData8, toSigned(FormValOpt, InvalidU64));
1412
1413 // Test successful and unsuccessful reference decoding.
1414 uint32_t RefData = 0x11223344U;
1415 FormVal.setForm(DW_FORM_ref_addr);
1416 FormVal.setUValue(RefData);
1417 FormValOpt = FormVal;
1418
1419 EXPECT_FALSE(toString(FormValOpt).hasValue());
1420 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1421 EXPECT_TRUE(toReference(FormValOpt).hasValue());
1422 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1423 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1424 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1425 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1426 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1427 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1428 EXPECT_EQ(RefData, toReference(FormValOpt, InvalidU64));
1429 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1430 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1431 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidU64));
1432
1433 // Test successful and unsuccessful signed constant decoding.
1434 int64_t SData8 = 0x1020304050607080ULL;
1435 FormVal.setForm(DW_FORM_udata);
1436 FormVal.setSValue(SData8);
1437 FormValOpt = FormVal;
1438
1439 EXPECT_FALSE(toString(FormValOpt).hasValue());
1440 EXPECT_TRUE(toUnsigned(FormValOpt).hasValue());
1441 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1442 EXPECT_TRUE(toSigned(FormValOpt).hasValue());
1443 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1444 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1445 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1446 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1447 EXPECT_EQ((uint64_t)SData8, toUnsigned(FormValOpt, InvalidU64));
1448 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1449 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1450 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1451 EXPECT_EQ(SData8, toSigned(FormValOpt, InvalidU64));
1452
1453 // Test successful and unsuccessful block decoding.
1454 uint8_t Data[] = { 2, 3, 4 };
1455 ArrayRef<uint8_t> Array(Data);
1456 FormVal.setForm(DW_FORM_block1);
1457 FormVal.setBlockValue(Array);
1458 FormValOpt = FormVal;
1459
1460 EXPECT_FALSE(toString(FormValOpt).hasValue());
1461 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1462 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1463 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1464 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1465 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1466 auto BlockOpt = toBlock(FormValOpt);
1467 EXPECT_TRUE(BlockOpt.hasValue());
1468 EXPECT_EQ(*BlockOpt, Array);
1469 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1470 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1471 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1472 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1473 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1474 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidU64));
1475
1476 // Test
1477}
1478
Greg Clayton3462a422016-12-08 01:03:48 +00001479} // end anonymous namespace