blob: b1454bc67a7e4e96d6fb3f92334828ef52c65b52 [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"
Chris Bieneman2e752db2017-01-20 19:03:14 +000016#include "llvm/ObjectYAML/DWARFYAML.h"
17#include "llvm/ObjectYAML/DWARFEmitter.h"
Greg Clayton3462a422016-12-08 01:03:48 +000018#include "llvm/Support/Dwarf.h"
19#include "llvm/Support/Host.h"
20#include "llvm/Support/TargetSelect.h"
21#include "gtest/gtest.h"
22#include <climits>
23
24using namespace llvm;
25using namespace dwarf;
26
27namespace {
28
29void initLLVMIfNeeded() {
30 static bool gInitialized = false;
31 if (!gInitialized) {
32 gInitialized = true;
33 InitializeAllTargets();
34 InitializeAllTargetMCs();
35 InitializeAllAsmPrinters();
36 InitializeAllAsmParsers();
37 }
38}
39
40Triple getHostTripleForAddrSize(uint8_t AddrSize) {
41 Triple PT(Triple::normalize(LLVM_HOST_TRIPLE));
42
43 if (AddrSize == 8 && PT.isArch32Bit())
44 return PT.get64BitArchVariant();
45 if (AddrSize == 4 && PT.isArch64Bit())
46 return PT.get32BitArchVariant();
47 return PT;
48}
49
50/// Take any llvm::Expected and check and handle any errors.
51///
52/// \param Expected a llvm::Excepted instance to check.
53/// \returns true if there were errors, false otherwise.
54template <typename T>
55static bool HandleExpectedError(T &Expected) {
Greg Clayton3462a422016-12-08 01:03:48 +000056 std::string ErrorMsg;
57 handleAllErrors(Expected.takeError(), [&](const llvm::ErrorInfoBase &EI) {
58 ErrorMsg = EI.message();
59 });
Greg Claytonfd461fe2016-12-08 02:11:03 +000060 if (!ErrorMsg.empty()) {
61 ::testing::AssertionFailure() << "error: " << ErrorMsg;
62 return true;
63 }
64 return false;
Greg Clayton3462a422016-12-08 01:03:48 +000065}
66
67template <uint16_t Version, class AddrType, class RefAddrType>
68void TestAllForms() {
69 // Test that we can decode all DW_FORM values correctly.
70
71 const uint8_t AddrSize = sizeof(AddrType);
72 const AddrType AddrValue = (AddrType)0x0123456789abcdefULL;
73 const uint8_t BlockData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
74 const uint32_t BlockSize = sizeof(BlockData);
75 const RefAddrType RefAddr = 0x12345678;
76 const uint8_t Data1 = 0x01U;
77 const uint16_t Data2 = 0x2345U;
78 const uint32_t Data4 = 0x6789abcdU;
79 const uint64_t Data8 = 0x0011223344556677ULL;
80 const uint64_t Data8_2 = 0xAABBCCDDEEFF0011ULL;
81 const int64_t SData = INT64_MIN;
Victor Leschukcbddae72017-01-10 21:18:26 +000082 const int64_t ICSData = INT64_MAX; // DW_FORM_implicit_const SData
Greg Clayton3462a422016-12-08 01:03:48 +000083 const uint64_t UData[] = {UINT64_MAX - 1, UINT64_MAX - 2, UINT64_MAX - 3,
84 UINT64_MAX - 4, UINT64_MAX - 5, UINT64_MAX - 6,
85 UINT64_MAX - 7, UINT64_MAX - 8, UINT64_MAX - 9};
86#define UDATA_1 18446744073709551614ULL
87 const uint32_t Dwarf32Values[] = {1, 2, 3, 4, 5, 6, 7, 8};
88 const char *StringValue = "Hello";
89 const char *StrpValue = "World";
90 initLLVMIfNeeded();
91 Triple Triple = getHostTripleForAddrSize(AddrSize);
92 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
93 if (HandleExpectedError(ExpectedDG))
94 return;
95 dwarfgen::Generator *DG = ExpectedDG.get().get();
96 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
97 dwarfgen::DIE CUDie = CU.getUnitDIE();
98 uint16_t Attr = DW_AT_lo_user;
99
100 //----------------------------------------------------------------------
101 // Test address forms
102 //----------------------------------------------------------------------
103 const auto Attr_DW_FORM_addr = static_cast<dwarf::Attribute>(Attr++);
104 CUDie.addAttribute(Attr_DW_FORM_addr, DW_FORM_addr, AddrValue);
105
106 //----------------------------------------------------------------------
107 // Test block forms
108 //----------------------------------------------------------------------
109 const auto Attr_DW_FORM_block = static_cast<dwarf::Attribute>(Attr++);
110 CUDie.addAttribute(Attr_DW_FORM_block, DW_FORM_block, BlockData, BlockSize);
111
112 const auto Attr_DW_FORM_block1 = static_cast<dwarf::Attribute>(Attr++);
113 CUDie.addAttribute(Attr_DW_FORM_block1, DW_FORM_block1, BlockData, BlockSize);
114
115 const auto Attr_DW_FORM_block2 = static_cast<dwarf::Attribute>(Attr++);
116 CUDie.addAttribute(Attr_DW_FORM_block2, DW_FORM_block2, BlockData, BlockSize);
117
118 const auto Attr_DW_FORM_block4 = static_cast<dwarf::Attribute>(Attr++);
119 CUDie.addAttribute(Attr_DW_FORM_block4, DW_FORM_block4, BlockData, BlockSize);
120
121 //----------------------------------------------------------------------
122 // Test data forms
123 //----------------------------------------------------------------------
124 const auto Attr_DW_FORM_data1 = static_cast<dwarf::Attribute>(Attr++);
125 CUDie.addAttribute(Attr_DW_FORM_data1, DW_FORM_data1, Data1);
126
127 const auto Attr_DW_FORM_data2 = static_cast<dwarf::Attribute>(Attr++);
128 CUDie.addAttribute(Attr_DW_FORM_data2, DW_FORM_data2, Data2);
129
130 const auto Attr_DW_FORM_data4 = static_cast<dwarf::Attribute>(Attr++);
131 CUDie.addAttribute(Attr_DW_FORM_data4, DW_FORM_data4, Data4);
132
133 const auto Attr_DW_FORM_data8 = static_cast<dwarf::Attribute>(Attr++);
134 CUDie.addAttribute(Attr_DW_FORM_data8, DW_FORM_data8, Data8);
135
136 //----------------------------------------------------------------------
137 // Test string forms
138 //----------------------------------------------------------------------
139 const auto Attr_DW_FORM_string = static_cast<dwarf::Attribute>(Attr++);
140 CUDie.addAttribute(Attr_DW_FORM_string, DW_FORM_string, StringValue);
141
142 const auto Attr_DW_FORM_strp = static_cast<dwarf::Attribute>(Attr++);
143 CUDie.addAttribute(Attr_DW_FORM_strp, DW_FORM_strp, StrpValue);
144
145 //----------------------------------------------------------------------
146 // Test reference forms
147 //----------------------------------------------------------------------
148 const auto Attr_DW_FORM_ref_addr = static_cast<dwarf::Attribute>(Attr++);
149 CUDie.addAttribute(Attr_DW_FORM_ref_addr, DW_FORM_ref_addr, RefAddr);
150
151 const auto Attr_DW_FORM_ref1 = static_cast<dwarf::Attribute>(Attr++);
152 CUDie.addAttribute(Attr_DW_FORM_ref1, DW_FORM_ref1, Data1);
153
154 const auto Attr_DW_FORM_ref2 = static_cast<dwarf::Attribute>(Attr++);
155 CUDie.addAttribute(Attr_DW_FORM_ref2, DW_FORM_ref2, Data2);
156
157 const auto Attr_DW_FORM_ref4 = static_cast<dwarf::Attribute>(Attr++);
158 CUDie.addAttribute(Attr_DW_FORM_ref4, DW_FORM_ref4, Data4);
159
160 const auto Attr_DW_FORM_ref8 = static_cast<dwarf::Attribute>(Attr++);
161 CUDie.addAttribute(Attr_DW_FORM_ref8, DW_FORM_ref8, Data8);
162
163 const auto Attr_DW_FORM_ref_sig8 = static_cast<dwarf::Attribute>(Attr++);
164 CUDie.addAttribute(Attr_DW_FORM_ref_sig8, DW_FORM_ref_sig8, Data8_2);
165
166 const auto Attr_DW_FORM_ref_udata = static_cast<dwarf::Attribute>(Attr++);
167 CUDie.addAttribute(Attr_DW_FORM_ref_udata, DW_FORM_ref_udata, UData[0]);
168
169 //----------------------------------------------------------------------
170 // Test flag forms
171 //----------------------------------------------------------------------
172 const auto Attr_DW_FORM_flag_true = static_cast<dwarf::Attribute>(Attr++);
173 CUDie.addAttribute(Attr_DW_FORM_flag_true, DW_FORM_flag, true);
174
175 const auto Attr_DW_FORM_flag_false = static_cast<dwarf::Attribute>(Attr++);
176 CUDie.addAttribute(Attr_DW_FORM_flag_false, DW_FORM_flag, false);
177
178 const auto Attr_DW_FORM_flag_present = static_cast<dwarf::Attribute>(Attr++);
179 CUDie.addAttribute(Attr_DW_FORM_flag_present, DW_FORM_flag_present);
180
181 //----------------------------------------------------------------------
182 // Test SLEB128 based forms
183 //----------------------------------------------------------------------
184 const auto Attr_DW_FORM_sdata = static_cast<dwarf::Attribute>(Attr++);
185 CUDie.addAttribute(Attr_DW_FORM_sdata, DW_FORM_sdata, SData);
186
Victor Leschukcbddae72017-01-10 21:18:26 +0000187 const auto Attr_DW_FORM_implicit_const =
188 static_cast<dwarf::Attribute>(Attr++);
189 if (Version >= 5)
190 CUDie.addAttribute(Attr_DW_FORM_implicit_const, DW_FORM_implicit_const,
191 ICSData);
192
Greg Clayton3462a422016-12-08 01:03:48 +0000193 //----------------------------------------------------------------------
194 // Test ULEB128 based forms
195 //----------------------------------------------------------------------
196 const auto Attr_DW_FORM_udata = static_cast<dwarf::Attribute>(Attr++);
197 CUDie.addAttribute(Attr_DW_FORM_udata, DW_FORM_udata, UData[0]);
198
199 //----------------------------------------------------------------------
200 // Test DWARF32/DWARF64 forms
201 //----------------------------------------------------------------------
202 const auto Attr_DW_FORM_GNU_ref_alt = static_cast<dwarf::Attribute>(Attr++);
203 CUDie.addAttribute(Attr_DW_FORM_GNU_ref_alt, DW_FORM_GNU_ref_alt,
204 Dwarf32Values[0]);
205
206 const auto Attr_DW_FORM_sec_offset = static_cast<dwarf::Attribute>(Attr++);
207 CUDie.addAttribute(Attr_DW_FORM_sec_offset, DW_FORM_sec_offset,
208 Dwarf32Values[1]);
209
210 //----------------------------------------------------------------------
211 // Add an address at the end to make sure we can decode this value
212 //----------------------------------------------------------------------
213 const auto Attr_Last = static_cast<dwarf::Attribute>(Attr++);
214 CUDie.addAttribute(Attr_Last, DW_FORM_addr, AddrValue);
215
216 //----------------------------------------------------------------------
217 // Generate the DWARF
218 //----------------------------------------------------------------------
219 StringRef FileBytes = DG->generate();
220 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
221 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
222 EXPECT_TRUE((bool)Obj);
223 DWARFContextInMemory DwarfContext(*Obj.get());
224 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
225 EXPECT_EQ(NumCUs, 1u);
226 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
Greg Claytonc8c10322016-12-13 18:25:19 +0000227 auto DieDG = U->getUnitDIE(false);
228 EXPECT_TRUE(DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000229
230 //----------------------------------------------------------------------
231 // Test address forms
232 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000233 EXPECT_EQ(AddrValue, toAddress(DieDG.find(Attr_DW_FORM_addr), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000234
235 //----------------------------------------------------------------------
236 // Test block forms
237 //----------------------------------------------------------------------
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000238 Optional<DWARFFormValue> FormValue;
Greg Clayton3462a422016-12-08 01:03:48 +0000239 ArrayRef<uint8_t> ExtractedBlockData;
240 Optional<ArrayRef<uint8_t>> BlockDataOpt;
241
Greg Clayton97d22182017-01-13 21:08:18 +0000242 FormValue = DieDG.find(Attr_DW_FORM_block);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000243 EXPECT_TRUE((bool)FormValue);
244 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000245 EXPECT_TRUE(BlockDataOpt.hasValue());
246 ExtractedBlockData = BlockDataOpt.getValue();
247 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
248 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
249
Greg Clayton97d22182017-01-13 21:08:18 +0000250 FormValue = DieDG.find(Attr_DW_FORM_block1);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000251 EXPECT_TRUE((bool)FormValue);
252 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000253 EXPECT_TRUE(BlockDataOpt.hasValue());
254 ExtractedBlockData = BlockDataOpt.getValue();
255 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
256 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
257
Greg Clayton97d22182017-01-13 21:08:18 +0000258 FormValue = DieDG.find(Attr_DW_FORM_block2);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000259 EXPECT_TRUE((bool)FormValue);
260 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000261 EXPECT_TRUE(BlockDataOpt.hasValue());
262 ExtractedBlockData = BlockDataOpt.getValue();
263 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
264 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
265
Greg Clayton97d22182017-01-13 21:08:18 +0000266 FormValue = DieDG.find(Attr_DW_FORM_block4);
Greg Clayton1cbf3fa2016-12-13 23:20:56 +0000267 EXPECT_TRUE((bool)FormValue);
268 BlockDataOpt = FormValue->getAsBlock();
Greg Clayton3462a422016-12-08 01:03:48 +0000269 EXPECT_TRUE(BlockDataOpt.hasValue());
270 ExtractedBlockData = BlockDataOpt.getValue();
271 EXPECT_EQ(ExtractedBlockData.size(), BlockSize);
272 EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0);
273
274 //----------------------------------------------------------------------
275 // Test data forms
276 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000277 EXPECT_EQ(Data1, toUnsigned(DieDG.find(Attr_DW_FORM_data1), 0));
278 EXPECT_EQ(Data2, toUnsigned(DieDG.find(Attr_DW_FORM_data2), 0));
279 EXPECT_EQ(Data4, toUnsigned(DieDG.find(Attr_DW_FORM_data4), 0));
280 EXPECT_EQ(Data8, toUnsigned(DieDG.find(Attr_DW_FORM_data8), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000281
282 //----------------------------------------------------------------------
283 // Test string forms
284 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000285 auto ExtractedStringValue = toString(DieDG.find(Attr_DW_FORM_string));
286 EXPECT_TRUE((bool)ExtractedStringValue);
287 EXPECT_TRUE(strcmp(StringValue, *ExtractedStringValue) == 0);
Greg Clayton3462a422016-12-08 01:03:48 +0000288
Greg Clayton97d22182017-01-13 21:08:18 +0000289 auto ExtractedStrpValue = toString(DieDG.find(Attr_DW_FORM_strp));
290 EXPECT_TRUE((bool)ExtractedStrpValue);
291 EXPECT_TRUE(strcmp(StrpValue, *ExtractedStrpValue) == 0);
Greg Clayton3462a422016-12-08 01:03:48 +0000292
293 //----------------------------------------------------------------------
294 // Test reference forms
295 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000296 EXPECT_EQ(RefAddr, toReference(DieDG.find(Attr_DW_FORM_ref_addr), 0));
297 EXPECT_EQ(Data1, toReference(DieDG.find(Attr_DW_FORM_ref1), 0));
298 EXPECT_EQ(Data2, toReference(DieDG.find(Attr_DW_FORM_ref2), 0));
299 EXPECT_EQ(Data4, toReference(DieDG.find(Attr_DW_FORM_ref4), 0));
300 EXPECT_EQ(Data8, toReference(DieDG.find(Attr_DW_FORM_ref8), 0));
301 EXPECT_EQ(Data8_2, toReference(DieDG.find(Attr_DW_FORM_ref_sig8), 0));
302 EXPECT_EQ(UData[0], toReference(DieDG.find(Attr_DW_FORM_ref_udata), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000303
304 //----------------------------------------------------------------------
305 // Test flag forms
306 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000307 EXPECT_EQ(1ULL, toUnsigned(DieDG.find(Attr_DW_FORM_flag_true), 0));
308 EXPECT_EQ(0ULL, toUnsigned(DieDG.find(Attr_DW_FORM_flag_false), 1));
309 EXPECT_EQ(1ULL, toUnsigned(DieDG.find(Attr_DW_FORM_flag_present), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000310
Greg Clayton3462a422016-12-08 01:03:48 +0000311 //----------------------------------------------------------------------
312 // Test SLEB128 based forms
313 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000314 EXPECT_EQ(SData, toSigned(DieDG.find(Attr_DW_FORM_sdata), 0));
Victor Leschukcbddae72017-01-10 21:18:26 +0000315 if (Version >= 5)
Greg Clayton97d22182017-01-13 21:08:18 +0000316 EXPECT_EQ(ICSData, toSigned(DieDG.find(Attr_DW_FORM_implicit_const), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000317
318 //----------------------------------------------------------------------
319 // Test ULEB128 based forms
320 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000321 EXPECT_EQ(UData[0], toUnsigned(DieDG.find(Attr_DW_FORM_udata), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000322
323 //----------------------------------------------------------------------
324 // Test DWARF32/DWARF64 forms
325 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000326 EXPECT_EQ(Dwarf32Values[0],
327 toReference(DieDG.find(Attr_DW_FORM_GNU_ref_alt), 0));
328 EXPECT_EQ(Dwarf32Values[1],
329 toSectionOffset(DieDG.find(Attr_DW_FORM_sec_offset), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000330
331 //----------------------------------------------------------------------
332 // Add an address at the end to make sure we can decode this value
333 //----------------------------------------------------------------------
Greg Clayton97d22182017-01-13 21:08:18 +0000334 EXPECT_EQ(AddrValue, toAddress(DieDG.find(Attr_Last), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000335}
336
337TEST(DWARFDebugInfo, TestDWARF32Version2Addr4AllForms) {
338 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
339 // addresses.
340 typedef uint32_t AddrType;
341 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
342 typedef AddrType RefAddrType;
343 TestAllForms<2, AddrType, RefAddrType>();
344}
345
346TEST(DWARFDebugInfo, TestDWARF32Version2Addr8AllForms) {
347 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
348 // addresses.
349 typedef uint64_t AddrType;
350 // DW_FORM_ref_addr are the same as the address type in DWARF32 version 2.
351 typedef AddrType RefAddrType;
352 TestAllForms<2, AddrType, RefAddrType>();
353}
354
355TEST(DWARFDebugInfo, TestDWARF32Version3Addr4AllForms) {
356 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
357 // addresses.
358 typedef uint32_t AddrType;
359 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later.
360 typedef uint32_t RefAddrType;
361 TestAllForms<3, AddrType, RefAddrType>();
362}
363
364TEST(DWARFDebugInfo, TestDWARF32Version3Addr8AllForms) {
365 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
366 // addresses.
367 typedef uint64_t AddrType;
368 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
369 typedef uint32_t RefAddrType;
370 TestAllForms<3, AddrType, RefAddrType>();
371}
372
373TEST(DWARFDebugInfo, TestDWARF32Version4Addr4AllForms) {
374 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
375 // addresses.
376 typedef uint32_t AddrType;
377 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
378 typedef uint32_t RefAddrType;
379 TestAllForms<4, AddrType, RefAddrType>();
380}
381
382TEST(DWARFDebugInfo, TestDWARF32Version4Addr8AllForms) {
383 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
384 // addresses.
385 typedef uint64_t AddrType;
386 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
387 typedef uint32_t RefAddrType;
388 TestAllForms<4, AddrType, RefAddrType>();
389}
390
Victor Leschukcbddae72017-01-10 21:18:26 +0000391TEST(DWARFDebugInfo, TestDWARF32Version5Addr4AllForms) {
392 // Test that we can decode all forms for DWARF32, version 5, with 4 byte
393 // addresses.
394 typedef uint32_t AddrType;
395 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
396 typedef uint32_t RefAddrType;
397 TestAllForms<5, AddrType, RefAddrType>();
398}
399
400TEST(DWARFDebugInfo, TestDWARF32Version5Addr8AllForms) {
401 // Test that we can decode all forms for DWARF32, version 5, with 8 byte
402 // addresses.
403 typedef uint64_t AddrType;
404 // DW_FORM_ref_addr are 4 bytes in DWARF32 for version 3 and later
405 typedef uint32_t RefAddrType;
406 TestAllForms<5, AddrType, RefAddrType>();
407}
408
Greg Clayton3462a422016-12-08 01:03:48 +0000409template <uint16_t Version, class AddrType> void TestChildren() {
410 // Test that we can decode DW_FORM_ref_addr values correctly in DWARF 2 with
411 // 4 byte addresses. DW_FORM_ref_addr values should be 4 bytes when using
412 // 8 byte addresses.
413
414 const uint8_t AddrSize = sizeof(AddrType);
415 initLLVMIfNeeded();
416 Triple Triple = getHostTripleForAddrSize(AddrSize);
417 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
418 if (HandleExpectedError(ExpectedDG))
419 return;
420 dwarfgen::Generator *DG = ExpectedDG.get().get();
421 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
422 dwarfgen::DIE CUDie = CU.getUnitDIE();
423
424 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
425 CUDie.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
426
427 dwarfgen::DIE SubprogramDie = CUDie.addChild(DW_TAG_subprogram);
428 SubprogramDie.addAttribute(DW_AT_name, DW_FORM_strp, "main");
429 SubprogramDie.addAttribute(DW_AT_low_pc, DW_FORM_addr, 0x1000U);
430 SubprogramDie.addAttribute(DW_AT_high_pc, DW_FORM_addr, 0x2000U);
431
432 dwarfgen::DIE IntDie = CUDie.addChild(DW_TAG_base_type);
433 IntDie.addAttribute(DW_AT_name, DW_FORM_strp, "int");
434 IntDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
435 IntDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
436
437 dwarfgen::DIE ArgcDie = SubprogramDie.addChild(DW_TAG_formal_parameter);
438 ArgcDie.addAttribute(DW_AT_name, DW_FORM_strp, "argc");
439 // ArgcDie.addAttribute(DW_AT_type, DW_FORM_ref4, IntDie);
440 ArgcDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, IntDie);
441
442 StringRef FileBytes = DG->generate();
443 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
444 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
445 EXPECT_TRUE((bool)Obj);
446 DWARFContextInMemory DwarfContext(*Obj.get());
447
448 // Verify the number of compile units is correct.
449 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
450 EXPECT_EQ(NumCUs, 1u);
451 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
452
453 // Get the compile unit DIE is valid.
Greg Claytonc8c10322016-12-13 18:25:19 +0000454 auto DieDG = U->getUnitDIE(false);
455 EXPECT_TRUE(DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000456
457 // Verify the first child of the compile unit DIE is our subprogram.
Greg Claytonc8c10322016-12-13 18:25:19 +0000458 auto SubprogramDieDG = DieDG.getFirstChild();
459 EXPECT_TRUE(SubprogramDieDG.isValid());
460 EXPECT_EQ(SubprogramDieDG.getTag(), DW_TAG_subprogram);
Greg Clayton3462a422016-12-08 01:03:48 +0000461
462 // Verify the first child of the subprogram is our formal parameter.
Greg Claytonc8c10322016-12-13 18:25:19 +0000463 auto ArgcDieDG = SubprogramDieDG.getFirstChild();
464 EXPECT_TRUE(ArgcDieDG.isValid());
465 EXPECT_EQ(ArgcDieDG.getTag(), DW_TAG_formal_parameter);
Greg Clayton3462a422016-12-08 01:03:48 +0000466
467 // Verify our formal parameter has a NULL tag sibling.
Greg Claytonc8c10322016-12-13 18:25:19 +0000468 auto NullDieDG = ArgcDieDG.getSibling();
469 EXPECT_TRUE(NullDieDG.isValid());
470 if (NullDieDG) {
471 EXPECT_EQ(NullDieDG.getTag(), DW_TAG_null);
472 EXPECT_TRUE(!NullDieDG.getSibling().isValid());
473 EXPECT_TRUE(!NullDieDG.getFirstChild().isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000474 }
475
476 // Verify the sibling of our subprogram is our integer base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000477 auto IntDieDG = SubprogramDieDG.getSibling();
478 EXPECT_TRUE(IntDieDG.isValid());
479 EXPECT_EQ(IntDieDG.getTag(), DW_TAG_base_type);
Greg Clayton3462a422016-12-08 01:03:48 +0000480
481 // Verify the sibling of our subprogram is our integer base is a NULL tag.
Greg Claytonc8c10322016-12-13 18:25:19 +0000482 NullDieDG = IntDieDG.getSibling();
483 EXPECT_TRUE(NullDieDG.isValid());
484 if (NullDieDG) {
485 EXPECT_EQ(NullDieDG.getTag(), DW_TAG_null);
486 EXPECT_TRUE(!NullDieDG.getSibling().isValid());
487 EXPECT_TRUE(!NullDieDG.getFirstChild().isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000488 }
489}
490
491TEST(DWARFDebugInfo, TestDWARF32Version2Addr4Children) {
492 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
493 // addresses.
494 typedef uint32_t AddrType;
495 TestChildren<2, AddrType>();
496}
497
498TEST(DWARFDebugInfo, TestDWARF32Version2Addr8Children) {
499 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
500 // addresses.
501 typedef uint64_t AddrType;
502 TestChildren<2, AddrType>();
503}
504
505TEST(DWARFDebugInfo, TestDWARF32Version3Addr4Children) {
506 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
507 // addresses.
508 typedef uint32_t AddrType;
509 TestChildren<3, AddrType>();
510}
511
512TEST(DWARFDebugInfo, TestDWARF32Version3Addr8Children) {
513 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
514 // addresses.
515 typedef uint64_t AddrType;
516 TestChildren<3, AddrType>();
517}
518
519TEST(DWARFDebugInfo, TestDWARF32Version4Addr4Children) {
520 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
521 // addresses.
522 typedef uint32_t AddrType;
523 TestChildren<4, AddrType>();
524}
525
526TEST(DWARFDebugInfo, TestDWARF32Version4Addr8Children) {
527 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
528 // addresses.
529 typedef uint64_t AddrType;
530 TestChildren<4, AddrType>();
531}
532
533template <uint16_t Version, class AddrType> void TestReferences() {
534 // Test that we can decode DW_FORM_refXXX values correctly in DWARF.
535
536 const uint8_t AddrSize = sizeof(AddrType);
537 initLLVMIfNeeded();
538 Triple Triple = getHostTripleForAddrSize(AddrSize);
539 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
540 if (HandleExpectedError(ExpectedDG))
541 return;
542 dwarfgen::Generator *DG = ExpectedDG.get().get();
543 dwarfgen::CompileUnit &CU1 = DG->addCompileUnit();
544 dwarfgen::CompileUnit &CU2 = DG->addCompileUnit();
545
546 dwarfgen::DIE CU1Die = CU1.getUnitDIE();
547 CU1Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
548 CU1Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
549
550 dwarfgen::DIE CU1TypeDie = CU1Die.addChild(DW_TAG_base_type);
551 CU1TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "int");
552 CU1TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
553 CU1TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
554
555 dwarfgen::DIE CU1Ref1Die = CU1Die.addChild(DW_TAG_variable);
556 CU1Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref1");
557 CU1Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU1TypeDie);
558
559 dwarfgen::DIE CU1Ref2Die = CU1Die.addChild(DW_TAG_variable);
560 CU1Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref2");
561 CU1Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU1TypeDie);
562
563 dwarfgen::DIE CU1Ref4Die = CU1Die.addChild(DW_TAG_variable);
564 CU1Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref4");
565 CU1Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU1TypeDie);
566
567 dwarfgen::DIE CU1Ref8Die = CU1Die.addChild(DW_TAG_variable);
568 CU1Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU1Ref8");
569 CU1Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU1TypeDie);
570
571 dwarfgen::DIE CU1RefAddrDie = CU1Die.addChild(DW_TAG_variable);
572 CU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1RefAddr");
573 CU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
574
575 dwarfgen::DIE CU2Die = CU2.getUnitDIE();
576 CU2Die.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/foo.c");
577 CU2Die.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
578
579 dwarfgen::DIE CU2TypeDie = CU2Die.addChild(DW_TAG_base_type);
580 CU2TypeDie.addAttribute(DW_AT_name, DW_FORM_strp, "float");
581 CU2TypeDie.addAttribute(DW_AT_encoding, DW_FORM_data1, DW_ATE_float);
582 CU2TypeDie.addAttribute(DW_AT_byte_size, DW_FORM_data1, 4);
583
584 dwarfgen::DIE CU2Ref1Die = CU2Die.addChild(DW_TAG_variable);
585 CU2Ref1Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref1");
586 CU2Ref1Die.addAttribute(DW_AT_type, DW_FORM_ref1, CU2TypeDie);
587
588 dwarfgen::DIE CU2Ref2Die = CU2Die.addChild(DW_TAG_variable);
589 CU2Ref2Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref2");
590 CU2Ref2Die.addAttribute(DW_AT_type, DW_FORM_ref2, CU2TypeDie);
591
592 dwarfgen::DIE CU2Ref4Die = CU2Die.addChild(DW_TAG_variable);
593 CU2Ref4Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref4");
594 CU2Ref4Die.addAttribute(DW_AT_type, DW_FORM_ref4, CU2TypeDie);
595
596 dwarfgen::DIE CU2Ref8Die = CU2Die.addChild(DW_TAG_variable);
597 CU2Ref8Die.addAttribute(DW_AT_name, DW_FORM_strp, "CU2Ref8");
598 CU2Ref8Die.addAttribute(DW_AT_type, DW_FORM_ref8, CU2TypeDie);
599
600 dwarfgen::DIE CU2RefAddrDie = CU2Die.addChild(DW_TAG_variable);
601 CU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2RefAddr");
602 CU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
603
604 // Refer to a type in CU1 from CU2
605 dwarfgen::DIE CU2ToCU1RefAddrDie = CU2Die.addChild(DW_TAG_variable);
606 CU2ToCU1RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU2ToCU1RefAddr");
607 CU2ToCU1RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU1TypeDie);
608
609 // Refer to a type in CU2 from CU1
610 dwarfgen::DIE CU1ToCU2RefAddrDie = CU1Die.addChild(DW_TAG_variable);
611 CU1ToCU2RefAddrDie.addAttribute(DW_AT_name, DW_FORM_strp, "CU1ToCU2RefAddr");
612 CU1ToCU2RefAddrDie.addAttribute(DW_AT_type, DW_FORM_ref_addr, CU2TypeDie);
613
614 StringRef FileBytes = DG->generate();
615 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
616 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
617 EXPECT_TRUE((bool)Obj);
618 DWARFContextInMemory DwarfContext(*Obj.get());
619
620 // Verify the number of compile units is correct.
621 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
622 EXPECT_EQ(NumCUs, 2u);
623 DWARFCompileUnit *U1 = DwarfContext.getCompileUnitAtIndex(0);
624 DWARFCompileUnit *U2 = DwarfContext.getCompileUnitAtIndex(1);
625
626 // Get the compile unit DIE is valid.
Greg Claytonc8c10322016-12-13 18:25:19 +0000627 auto Unit1DieDG = U1->getUnitDIE(false);
628 EXPECT_TRUE(Unit1DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000629
Greg Claytonc8c10322016-12-13 18:25:19 +0000630 auto Unit2DieDG = U2->getUnitDIE(false);
631 EXPECT_TRUE(Unit2DieDG.isValid());
Greg Clayton3462a422016-12-08 01:03:48 +0000632
633 // Verify the first child of the compile unit 1 DIE is our int base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000634 auto CU1TypeDieDG = Unit1DieDG.getFirstChild();
635 EXPECT_TRUE(CU1TypeDieDG.isValid());
636 EXPECT_EQ(CU1TypeDieDG.getTag(), DW_TAG_base_type);
Greg Clayton97d22182017-01-13 21:08:18 +0000637 EXPECT_EQ(DW_ATE_signed, toUnsigned(CU1TypeDieDG.find(DW_AT_encoding), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000638
639 // Verify the first child of the compile unit 2 DIE is our float base type.
Greg Claytonc8c10322016-12-13 18:25:19 +0000640 auto CU2TypeDieDG = Unit2DieDG.getFirstChild();
641 EXPECT_TRUE(CU2TypeDieDG.isValid());
642 EXPECT_EQ(CU2TypeDieDG.getTag(), DW_TAG_base_type);
Greg Clayton97d22182017-01-13 21:08:18 +0000643 EXPECT_EQ(DW_ATE_float, toUnsigned(CU2TypeDieDG.find(DW_AT_encoding), 0));
Greg Clayton3462a422016-12-08 01:03:48 +0000644
645 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
646 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000647 auto CU1Ref1DieDG = CU1TypeDieDG.getSibling();
648 EXPECT_TRUE(CU1Ref1DieDG.isValid());
649 EXPECT_EQ(CU1Ref1DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000650 EXPECT_EQ(CU1TypeDieDG.getOffset(),
651 toReference(CU1Ref1DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000652 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
653 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000654 auto CU1Ref2DieDG = CU1Ref1DieDG.getSibling();
655 EXPECT_TRUE(CU1Ref2DieDG.isValid());
656 EXPECT_EQ(CU1Ref2DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000657 EXPECT_EQ(CU1TypeDieDG.getOffset(),
658 toReference(CU1Ref2DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000659
660 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
661 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000662 auto CU1Ref4DieDG = CU1Ref2DieDG.getSibling();
663 EXPECT_TRUE(CU1Ref4DieDG.isValid());
664 EXPECT_EQ(CU1Ref4DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000665 EXPECT_EQ(CU1TypeDieDG.getOffset(),
666 toReference(CU1Ref4DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000667
668 // Verify the sibling is our Ref8 DIE and that its DW_AT_type points to our
669 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000670 auto CU1Ref8DieDG = CU1Ref4DieDG.getSibling();
671 EXPECT_TRUE(CU1Ref8DieDG.isValid());
672 EXPECT_EQ(CU1Ref8DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000673 EXPECT_EQ(CU1TypeDieDG.getOffset(),
674 toReference(CU1Ref8DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000675
676 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
677 // base type DIE in CU1.
Greg Claytonc8c10322016-12-13 18:25:19 +0000678 auto CU1RefAddrDieDG = CU1Ref8DieDG.getSibling();
679 EXPECT_TRUE(CU1RefAddrDieDG.isValid());
680 EXPECT_EQ(CU1RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000681 EXPECT_EQ(CU1TypeDieDG.getOffset(),
682 toReference(CU1RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000683
684 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
685 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000686 auto CU1ToCU2RefAddrDieDG = CU1RefAddrDieDG.getSibling();
687 EXPECT_TRUE(CU1ToCU2RefAddrDieDG.isValid());
688 EXPECT_EQ(CU1ToCU2RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000689 EXPECT_EQ(CU2TypeDieDG.getOffset(),
690 toReference(CU1ToCU2RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000691
692 // Verify the sibling of the base type DIE is our Ref1 DIE and that its
693 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000694 auto CU2Ref1DieDG = CU2TypeDieDG.getSibling();
695 EXPECT_TRUE(CU2Ref1DieDG.isValid());
696 EXPECT_EQ(CU2Ref1DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000697 EXPECT_EQ(CU2TypeDieDG.getOffset(),
698 toReference(CU2Ref1DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000699 // Verify the sibling is our Ref2 DIE and that its DW_AT_type points to our
700 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000701 auto CU2Ref2DieDG = CU2Ref1DieDG.getSibling();
702 EXPECT_TRUE(CU2Ref2DieDG.isValid());
703 EXPECT_EQ(CU2Ref2DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000704 EXPECT_EQ(CU2TypeDieDG.getOffset(),
705 toReference(CU2Ref2DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000706
707 // Verify the sibling is our Ref4 DIE and that its DW_AT_type points to our
708 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000709 auto CU2Ref4DieDG = CU2Ref2DieDG.getSibling();
710 EXPECT_TRUE(CU2Ref4DieDG.isValid());
711 EXPECT_EQ(CU2Ref4DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000712 EXPECT_EQ(CU2TypeDieDG.getOffset(),
713 toReference(CU2Ref4DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000714
715 // Verify the sibling is our Ref8 DIE and that its DW_AT_type points to our
716 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000717 auto CU2Ref8DieDG = CU2Ref4DieDG.getSibling();
718 EXPECT_TRUE(CU2Ref8DieDG.isValid());
719 EXPECT_EQ(CU2Ref8DieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000720 EXPECT_EQ(CU2TypeDieDG.getOffset(),
721 toReference(CU2Ref8DieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000722
723 // Verify the sibling is our RefAddr DIE and that its DW_AT_type points to our
724 // base type DIE in CU2.
Greg Claytonc8c10322016-12-13 18:25:19 +0000725 auto CU2RefAddrDieDG = CU2Ref8DieDG.getSibling();
726 EXPECT_TRUE(CU2RefAddrDieDG.isValid());
727 EXPECT_EQ(CU2RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000728 EXPECT_EQ(CU2TypeDieDG.getOffset(),
729 toReference(CU2RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000730
731 // Verify the sibling of the Ref4 DIE is our RefAddr DIE and that its
732 // DW_AT_type points to our base type DIE.
Greg Claytonc8c10322016-12-13 18:25:19 +0000733 auto CU2ToCU1RefAddrDieDG = CU2RefAddrDieDG.getSibling();
734 EXPECT_TRUE(CU2ToCU1RefAddrDieDG.isValid());
735 EXPECT_EQ(CU2ToCU1RefAddrDieDG.getTag(), DW_TAG_variable);
Greg Clayton97d22182017-01-13 21:08:18 +0000736 EXPECT_EQ(CU1TypeDieDG.getOffset(),
737 toReference(CU2ToCU1RefAddrDieDG.find(DW_AT_type), -1ULL));
Greg Clayton3462a422016-12-08 01:03:48 +0000738}
739
740TEST(DWARFDebugInfo, TestDWARF32Version2Addr4References) {
741 // Test that we can decode all forms for DWARF32, version 2, with 4 byte
742 // addresses.
743 typedef uint32_t AddrType;
744 TestReferences<2, AddrType>();
745}
746
747TEST(DWARFDebugInfo, TestDWARF32Version2Addr8References) {
748 // Test that we can decode all forms for DWARF32, version 2, with 8 byte
749 // addresses.
750 typedef uint64_t AddrType;
751 TestReferences<2, AddrType>();
752}
753
754TEST(DWARFDebugInfo, TestDWARF32Version3Addr4References) {
755 // Test that we can decode all forms for DWARF32, version 3, with 4 byte
756 // addresses.
757 typedef uint32_t AddrType;
758 TestReferences<3, AddrType>();
759}
760
761TEST(DWARFDebugInfo, TestDWARF32Version3Addr8References) {
762 // Test that we can decode all forms for DWARF32, version 3, with 8 byte
763 // addresses.
764 typedef uint64_t AddrType;
765 TestReferences<3, AddrType>();
766}
767
768TEST(DWARFDebugInfo, TestDWARF32Version4Addr4References) {
769 // Test that we can decode all forms for DWARF32, version 4, with 4 byte
770 // addresses.
771 typedef uint32_t AddrType;
772 TestReferences<4, AddrType>();
773}
774
775TEST(DWARFDebugInfo, TestDWARF32Version4Addr8References) {
776 // Test that we can decode all forms for DWARF32, version 4, with 8 byte
777 // addresses.
778 typedef uint64_t AddrType;
779 TestReferences<4, AddrType>();
780}
781
Greg Clayton2520c9e2016-12-19 20:36:41 +0000782template <uint16_t Version, class AddrType> void TestAddresses() {
783 // Test the DWARF APIs related to accessing the DW_AT_low_pc and
784 // DW_AT_high_pc.
785 const uint8_t AddrSize = sizeof(AddrType);
786 const bool SupportsHighPCAsOffset = Version >= 4;
787 initLLVMIfNeeded();
788 Triple Triple = getHostTripleForAddrSize(AddrSize);
789 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
790 if (HandleExpectedError(ExpectedDG))
791 return;
792 dwarfgen::Generator *DG = ExpectedDG.get().get();
793 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
794 dwarfgen::DIE CUDie = CU.getUnitDIE();
795
796 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, "/tmp/main.c");
797 CUDie.addAttribute(DW_AT_language, DW_FORM_data2, DW_LANG_C);
798
799 // Create a subprogram DIE with no low or high PC.
800 dwarfgen::DIE SubprogramNoPC = CUDie.addChild(DW_TAG_subprogram);
801 SubprogramNoPC.addAttribute(DW_AT_name, DW_FORM_strp, "no_pc");
802
803 // Create a subprogram DIE with a low PC only.
804 dwarfgen::DIE SubprogramLowPC = CUDie.addChild(DW_TAG_subprogram);
805 SubprogramLowPC.addAttribute(DW_AT_name, DW_FORM_strp, "low_pc");
806 const uint64_t ActualLowPC = 0x1000;
807 const uint64_t ActualHighPC = 0x2000;
808 const uint64_t ActualHighPCOffset = ActualHighPC - ActualLowPC;
809 SubprogramLowPC.addAttribute(DW_AT_low_pc, DW_FORM_addr, ActualLowPC);
810
811 // Create a subprogram DIE with a low and high PC.
812 dwarfgen::DIE SubprogramLowHighPC = CUDie.addChild(DW_TAG_subprogram);
813 SubprogramLowHighPC.addAttribute(DW_AT_name, DW_FORM_strp, "low_high_pc");
814 SubprogramLowHighPC.addAttribute(DW_AT_low_pc, DW_FORM_addr, ActualLowPC);
815 // Encode the high PC as an offset from the low PC if supported.
816 if (SupportsHighPCAsOffset)
817 SubprogramLowHighPC.addAttribute(DW_AT_high_pc, DW_FORM_data4,
818 ActualHighPCOffset);
819 else
820 SubprogramLowHighPC.addAttribute(DW_AT_high_pc, DW_FORM_addr, ActualHighPC);
821
822 StringRef FileBytes = DG->generate();
823 MemoryBufferRef FileBuffer(FileBytes, "dwarf");
824 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
825 EXPECT_TRUE((bool)Obj);
826 DWARFContextInMemory DwarfContext(*Obj.get());
827
828 // Verify the number of compile units is correct.
829 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
830 EXPECT_EQ(NumCUs, 1u);
831 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
832
833 // Get the compile unit DIE is valid.
834 auto DieDG = U->getUnitDIE(false);
835 EXPECT_TRUE(DieDG.isValid());
Greg Clayton2520c9e2016-12-19 20:36:41 +0000836
837 uint64_t LowPC, HighPC;
838 Optional<uint64_t> OptU64;
839 // Verify the that our subprogram with no PC value fails appropriately when
840 // asked for any PC values.
841 auto SubprogramDieNoPC = DieDG.getFirstChild();
842 EXPECT_TRUE(SubprogramDieNoPC.isValid());
843 EXPECT_EQ(SubprogramDieNoPC.getTag(), DW_TAG_subprogram);
Greg Clayton97d22182017-01-13 21:08:18 +0000844 OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_low_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000845 EXPECT_FALSE((bool)OptU64);
Greg Clayton97d22182017-01-13 21:08:18 +0000846 OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000847 EXPECT_FALSE((bool)OptU64);
848 EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
Greg Clayton97d22182017-01-13 21:08:18 +0000849 OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000850 EXPECT_FALSE((bool)OptU64);
Greg Clayton97d22182017-01-13 21:08:18 +0000851 OptU64 = toUnsigned(SubprogramDieNoPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000852 EXPECT_FALSE((bool)OptU64);
853 OptU64 = SubprogramDieNoPC.getHighPC(ActualLowPC);
854 EXPECT_FALSE((bool)OptU64);
855 EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
856
857
858 // Verify the that our subprogram with only a low PC value succeeds when
859 // we ask for the Low PC, but fails appropriately when asked for the high PC
860 // or both low and high PC values.
861 auto SubprogramDieLowPC = SubprogramDieNoPC.getSibling();
862 EXPECT_TRUE(SubprogramDieLowPC.isValid());
863 EXPECT_EQ(SubprogramDieLowPC.getTag(), DW_TAG_subprogram);
Greg Clayton97d22182017-01-13 21:08:18 +0000864 OptU64 = toAddress(SubprogramDieLowPC.find(DW_AT_low_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000865 EXPECT_TRUE((bool)OptU64);
866 EXPECT_EQ(OptU64.getValue(), ActualLowPC);
Greg Clayton97d22182017-01-13 21:08:18 +0000867 OptU64 = toAddress(SubprogramDieLowPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000868 EXPECT_FALSE((bool)OptU64);
Greg Clayton97d22182017-01-13 21:08:18 +0000869 OptU64 = toUnsigned(SubprogramDieLowPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000870 EXPECT_FALSE((bool)OptU64);
871 OptU64 = SubprogramDieLowPC.getHighPC(ActualLowPC);
872 EXPECT_FALSE((bool)OptU64);
873 EXPECT_FALSE(SubprogramDieLowPC.getLowAndHighPC(LowPC, HighPC));
874
875
876 // Verify the that our subprogram with only a low PC value succeeds when
877 // we ask for the Low PC, but fails appropriately when asked for the high PC
878 // or both low and high PC values.
879 auto SubprogramDieLowHighPC = SubprogramDieLowPC.getSibling();
880 EXPECT_TRUE(SubprogramDieLowHighPC.isValid());
881 EXPECT_EQ(SubprogramDieLowHighPC.getTag(), DW_TAG_subprogram);
Greg Clayton97d22182017-01-13 21:08:18 +0000882 OptU64 = toAddress(SubprogramDieLowHighPC.find(DW_AT_low_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000883 EXPECT_TRUE((bool)OptU64);
884 EXPECT_EQ(OptU64.getValue(), ActualLowPC);
885 // Get the high PC as an address. This should succeed if the high PC was
886 // encoded as an address and fail if the high PC was encoded as an offset.
Greg Clayton97d22182017-01-13 21:08:18 +0000887 OptU64 = toAddress(SubprogramDieLowHighPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000888 if (SupportsHighPCAsOffset) {
889 EXPECT_FALSE((bool)OptU64);
890 } else {
891 EXPECT_TRUE((bool)OptU64);
892 EXPECT_EQ(OptU64.getValue(), ActualHighPC);
893 }
894 // Get the high PC as an unsigned constant. This should succeed if the high PC
895 // was encoded as an offset and fail if the high PC was encoded as an address.
Greg Clayton97d22182017-01-13 21:08:18 +0000896 OptU64 = toUnsigned(SubprogramDieLowHighPC.find(DW_AT_high_pc));
Greg Clayton2520c9e2016-12-19 20:36:41 +0000897 if (SupportsHighPCAsOffset) {
898 EXPECT_TRUE((bool)OptU64);
899 EXPECT_EQ(OptU64.getValue(), ActualHighPCOffset);
900 } else {
901 EXPECT_FALSE((bool)OptU64);
902 }
903
904 OptU64 = SubprogramDieLowHighPC.getHighPC(ActualLowPC);
905 EXPECT_TRUE((bool)OptU64);
906 EXPECT_EQ(OptU64.getValue(), ActualHighPC);
907
908 EXPECT_TRUE(SubprogramDieLowHighPC.getLowAndHighPC(LowPC, HighPC));
909 EXPECT_EQ(LowPC, ActualLowPC);
910 EXPECT_EQ(HighPC, ActualHighPC);
911}
912
913TEST(DWARFDebugInfo, TestDWARF32Version2Addr4Addresses) {
914 // Test that we can decode address values in DWARF32, version 2, with 4 byte
915 // addresses.
916 typedef uint32_t AddrType;
917 TestAddresses<2, AddrType>();
918}
919
920TEST(DWARFDebugInfo, TestDWARF32Version2Addr8Addresses) {
921 // Test that we can decode address values in DWARF32, version 2, with 8 byte
922 // addresses.
923 typedef uint64_t AddrType;
924 TestAddresses<2, AddrType>();
925}
926
927TEST(DWARFDebugInfo, TestDWARF32Version3Addr4Addresses) {
928 // Test that we can decode address values in DWARF32, version 3, with 4 byte
929 // addresses.
930 typedef uint32_t AddrType;
931 TestAddresses<3, AddrType>();
932}
933
934TEST(DWARFDebugInfo, TestDWARF32Version3Addr8Addresses) {
935 // Test that we can decode address values in DWARF32, version 3, with 8 byte
936 // addresses.
937 typedef uint64_t AddrType;
938 TestAddresses<3, AddrType>();
939}
940
941TEST(DWARFDebugInfo, TestDWARF32Version4Addr4Addresses) {
942 // Test that we can decode address values in DWARF32, version 4, with 4 byte
943 // addresses.
944 typedef uint32_t AddrType;
945 TestAddresses<4, AddrType>();
946}
947
948TEST(DWARFDebugInfo, TestDWARF32Version4Addr8Addresses) {
949 // Test that we can decode address values in DWARF32, version 4, with 8 byte
950 // addresses.
951 typedef uint64_t AddrType;
952 TestAddresses<4, AddrType>();
953}
954
Greg Clayton78a07bf2016-12-21 21:37:06 +0000955TEST(DWARFDebugInfo, TestRelations) {
956 // Test the DWARF APIs related to accessing the DW_AT_low_pc and
957 // DW_AT_high_pc.
958 uint16_t Version = 4;
959
960 const uint8_t AddrSize = sizeof(void *);
961 initLLVMIfNeeded();
962 Triple Triple = getHostTripleForAddrSize(AddrSize);
963 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
964 if (HandleExpectedError(ExpectedDG))
965 return;
966 dwarfgen::Generator *DG = ExpectedDG.get().get();
967 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
968
969 enum class Tag: uint16_t {
970 A = dwarf::DW_TAG_lo_user,
971 B,
Greg Clayton78a07bf2016-12-21 21:37:06 +0000972 C,
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000973 C1,
974 C2,
975 D,
976 D1
Greg Clayton78a07bf2016-12-21 21:37:06 +0000977 };
978
979 // Scope to allow us to re-use the same DIE names
980 {
981 // Create DWARF tree that looks like:
982 //
983 // CU
984 // A
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000985 // B
986 // C
987 // C1
988 // C2
989 // D
990 // D1
Greg Clayton78a07bf2016-12-21 21:37:06 +0000991 dwarfgen::DIE CUDie = CU.getUnitDIE();
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000992 dwarfgen::DIE A = CUDie.addChild((dwarf::Tag)Tag::A);
993 A.addChild((dwarf::Tag)Tag::B);
994 dwarfgen::DIE C = A.addChild((dwarf::Tag)Tag::C);
995 dwarfgen::DIE D = A.addChild((dwarf::Tag)Tag::D);
Greg Clayton78a07bf2016-12-21 21:37:06 +0000996 C.addChild((dwarf::Tag)Tag::C1);
Greg Claytona9ef7ee2017-01-04 00:10:50 +0000997 C.addChild((dwarf::Tag)Tag::C2);
998 D.addChild((dwarf::Tag)Tag::D1);
Greg Clayton78a07bf2016-12-21 21:37:06 +0000999 }
1000
1001 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1002 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1003 EXPECT_TRUE((bool)Obj);
1004 DWARFContextInMemory DwarfContext(*Obj.get());
1005
1006 // Verify the number of compile units is correct.
1007 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1008 EXPECT_EQ(NumCUs, 1u);
1009 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1010
1011 // Get the compile unit DIE is valid.
1012 auto CUDie = U->getUnitDIE(false);
1013 EXPECT_TRUE(CUDie.isValid());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001014
1015 // The compile unit doesn't have a parent or a sibling.
1016 auto ParentDie = CUDie.getParent();
1017 EXPECT_FALSE(ParentDie.isValid());
1018 auto SiblingDie = CUDie.getSibling();
1019 EXPECT_FALSE(SiblingDie.isValid());
1020
1021 // Get the children of the compile unit
1022 auto A = CUDie.getFirstChild();
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001023 auto B = A.getFirstChild();
Greg Clayton78a07bf2016-12-21 21:37:06 +00001024 auto C = B.getSibling();
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001025 auto D = C.getSibling();
1026 auto Null = D.getSibling();
Greg Clayton78a07bf2016-12-21 21:37:06 +00001027
1028 // Verify NULL Die is NULL and has no children or siblings
1029 EXPECT_TRUE(Null.isNULL());
1030 EXPECT_FALSE(Null.getSibling().isValid());
1031 EXPECT_FALSE(Null.getFirstChild().isValid());
1032
1033 // Verify all children of the compile unit DIE are correct.
1034 EXPECT_EQ(A.getTag(), (dwarf::Tag)Tag::A);
1035 EXPECT_EQ(B.getTag(), (dwarf::Tag)Tag::B);
1036 EXPECT_EQ(C.getTag(), (dwarf::Tag)Tag::C);
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001037 EXPECT_EQ(D.getTag(), (dwarf::Tag)Tag::D);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001038
1039 // Verify who has children
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001040 EXPECT_TRUE(A.hasChildren());
1041 EXPECT_FALSE(B.hasChildren());
1042 EXPECT_TRUE(C.hasChildren());
1043 EXPECT_TRUE(D.hasChildren());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001044
1045 // Make sure the parent of all the children of the compile unit are the
1046 // compile unit.
1047 EXPECT_EQ(A.getParent(), CUDie);
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001048
1049 // Make sure the parent of all the children of A are the A.
1050 // B is the first child in A, so we need to verify we can get the previous
1051 // DIE as the parent.
1052 EXPECT_EQ(B.getParent(), A);
1053 // C is the second child in A, so we need to make sure we can backup across
1054 // other DIE (B) at the same level to get the correct parent.
1055 EXPECT_EQ(C.getParent(), A);
1056 // D is the third child of A. We need to verify we can backup across other DIE
1057 // (B and C) including DIE that have children (D) to get the correct parent.
1058 EXPECT_EQ(D.getParent(), A);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001059
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001060 // Verify that a DIE with no children returns an invalid DWARFDie.
1061 EXPECT_FALSE(B.getFirstChild().isValid());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001062
1063 // Verify the children of the B DIE
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001064 auto C1 = C.getFirstChild();
1065 auto C2 = C1.getSibling();
1066 EXPECT_TRUE(C2.getSibling().isNULL());
Greg Clayton78a07bf2016-12-21 21:37:06 +00001067
1068 // Verify all children of the B DIE correctly valid or invalid.
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001069 EXPECT_EQ(C1.getTag(), (dwarf::Tag)Tag::C1);
1070 EXPECT_EQ(C2.getTag(), (dwarf::Tag)Tag::C2);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001071
1072 // Make sure the parent of all the children of the B are the B.
Greg Claytona9ef7ee2017-01-04 00:10:50 +00001073 EXPECT_EQ(C1.getParent(), C);
1074 EXPECT_EQ(C2.getParent(), C);
Greg Clayton78a07bf2016-12-21 21:37:06 +00001075}
1076
1077TEST(DWARFDebugInfo, TestDWARFDie) {
1078
1079 // Make sure a default constructed DWARFDie doesn't have any parent, sibling
1080 // or child;
1081 DWARFDie DefaultDie;
1082 EXPECT_FALSE(DefaultDie.getParent().isValid());
1083 EXPECT_FALSE(DefaultDie.getFirstChild().isValid());
1084 EXPECT_FALSE(DefaultDie.getSibling().isValid());
1085}
1086
Greg Clayton93e4fe82017-01-05 23:47:37 +00001087TEST(DWARFDebugInfo, TestChildIterators) {
1088 // Test the DWARF APIs related to iterating across the children of a DIE using
1089 // the DWARFDie::iterator class.
1090 uint16_t Version = 4;
1091
1092 const uint8_t AddrSize = sizeof(void *);
1093 initLLVMIfNeeded();
1094 Triple Triple = getHostTripleForAddrSize(AddrSize);
1095 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1096 if (HandleExpectedError(ExpectedDG))
1097 return;
1098 dwarfgen::Generator *DG = ExpectedDG.get().get();
1099 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1100
1101 enum class Tag: uint16_t {
1102 A = dwarf::DW_TAG_lo_user,
1103 B,
1104 };
1105
1106 // Scope to allow us to re-use the same DIE names
1107 {
1108 // Create DWARF tree that looks like:
1109 //
1110 // CU
1111 // A
1112 // B
1113 auto CUDie = CU.getUnitDIE();
1114 CUDie.addChild((dwarf::Tag)Tag::A);
1115 CUDie.addChild((dwarf::Tag)Tag::B);
1116 }
1117
1118 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1119 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1120 EXPECT_TRUE((bool)Obj);
1121 DWARFContextInMemory DwarfContext(*Obj.get());
1122
1123 // Verify the number of compile units is correct.
1124 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1125 EXPECT_EQ(NumCUs, 1u);
1126 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1127
1128 // Get the compile unit DIE is valid.
1129 auto CUDie = U->getUnitDIE(false);
1130 EXPECT_TRUE(CUDie.isValid());
Greg Clayton93e4fe82017-01-05 23:47:37 +00001131 uint32_t Index;
1132 DWARFDie A;
1133 DWARFDie B;
1134
1135 // Verify the compile unit DIE's children.
1136 Index = 0;
1137 for (auto Die : CUDie.children()) {
1138 switch (Index++) {
1139 case 0: A = Die; break;
1140 case 1: B = Die; break;
1141 }
1142 }
1143
1144 EXPECT_EQ(A.getTag(), (dwarf::Tag)Tag::A);
1145 EXPECT_EQ(B.getTag(), (dwarf::Tag)Tag::B);
1146
1147 // Verify that A has no children by verifying that the begin and end contain
1148 // invalid DIEs and also that the iterators are equal.
1149 EXPECT_EQ(A.begin(), A.end());
1150}
1151
1152TEST(DWARFDebugInfo, TestChildIteratorsOnInvalidDie) {
1153 // Verify that an invalid DIE has no children.
1154 DWARFDie Invalid;
1155 auto begin = Invalid.begin();
1156 auto end = Invalid.end();
1157 EXPECT_FALSE(begin->isValid());
1158 EXPECT_FALSE(end->isValid());
1159 EXPECT_EQ(begin, end);
1160}
1161
Greg Clayton93e4fe82017-01-05 23:47:37 +00001162TEST(DWARFDebugInfo, TestEmptyChildren) {
Chris Bieneman2e752db2017-01-20 19:03:14 +00001163 const char *yamldata = "debug_abbrev:\n"
1164 " - Code: 0x00000001\n"
1165 " Tag: DW_TAG_compile_unit\n"
1166 " Children: DW_CHILDREN_yes\n"
1167 " Attributes:\n"
1168 "debug_info:\n"
1169 " - Length: 9\n"
1170 " Version: 4\n"
1171 " AbbrOffset: 0\n"
1172 " AddrSize: 8\n"
1173 " Entries:\n"
1174 " - AbbrCode: 0x00000001\n"
1175 " Values:\n"
1176 " - AbbrCode: 0x00000000\n"
1177 " Values:\n";
1178
1179 auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
1180 EXPECT_TRUE((bool)ErrOrSections);
1181
1182 auto &DebugSections = *ErrOrSections;
1183
1184 DWARFContextInMemory DwarfContext(DebugSections, 8);
1185
Greg Clayton93e4fe82017-01-05 23:47:37 +00001186 // Verify the number of compile units is correct.
1187 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1188 EXPECT_EQ(NumCUs, 1u);
1189 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
Chris Bieneman2e752db2017-01-20 19:03:14 +00001190
Greg Clayton93e4fe82017-01-05 23:47:37 +00001191 // Get the compile unit DIE is valid.
1192 auto CUDie = U->getUnitDIE(false);
1193 EXPECT_TRUE(CUDie.isValid());
Greg Clayton93e4fe82017-01-05 23:47:37 +00001194
1195 // Verify that the CU Die that says it has children, but doesn't, actually
1196 // has begin and end iterators that are equal. We want to make sure we don't
1197 // see the Null DIEs during iteration.
1198 EXPECT_EQ(CUDie.begin(), CUDie.end());
1199}
Greg Clayton2520c9e2016-12-19 20:36:41 +00001200
Greg Clayton0e62ee72017-01-13 00:13:42 +00001201TEST(DWARFDebugInfo, TestAttributeIterators) {
1202 // Test the DWARF APIs related to iterating across all attribute values in a
1203 // a DWARFDie.
1204 uint16_t Version = 4;
1205
1206 const uint8_t AddrSize = sizeof(void *);
1207 initLLVMIfNeeded();
1208 Triple Triple = getHostTripleForAddrSize(AddrSize);
1209 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1210 if (HandleExpectedError(ExpectedDG))
1211 return;
1212 dwarfgen::Generator *DG = ExpectedDG.get().get();
1213 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1214 const uint64_t CULowPC = 0x1000;
1215 StringRef CUPath("/tmp/main.c");
1216
1217 // Scope to allow us to re-use the same DIE names
1218 {
1219 auto CUDie = CU.getUnitDIE();
1220 // Encode an attribute value before an attribute with no data.
1221 CUDie.addAttribute(DW_AT_name, DW_FORM_strp, CUPath.data());
1222 // Encode an attribute value with no data in .debug_info/types to ensure
1223 // the iteration works correctly.
1224 CUDie.addAttribute(DW_AT_declaration, DW_FORM_flag_present);
1225 // Encode an attribute value after an attribute with no data.
1226 CUDie.addAttribute(DW_AT_low_pc, DW_FORM_addr, CULowPC);
1227 }
1228
1229 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1230 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1231 EXPECT_TRUE((bool)Obj);
1232 DWARFContextInMemory DwarfContext(*Obj.get());
1233
1234 // Verify the number of compile units is correct.
1235 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1236 EXPECT_EQ(NumCUs, 1u);
1237 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1238
1239 // Get the compile unit DIE is valid.
1240 auto CUDie = U->getUnitDIE(false);
1241 EXPECT_TRUE(CUDie.isValid());
1242
1243 auto R = CUDie.attributes();
1244 auto I = R.begin();
1245 auto E = R.end();
1246
1247 ASSERT_NE(E, I);
1248 EXPECT_EQ(I->Attr, DW_AT_name);
1249 auto ActualCUPath = I->Value.getAsCString();
1250 EXPECT_EQ(CUPath, *ActualCUPath);
1251
1252 ASSERT_NE(E, ++I);
1253 EXPECT_EQ(I->Attr, DW_AT_declaration);
Greg Clayton71503432017-01-13 00:23:59 +00001254 EXPECT_EQ(1ull, *I->Value.getAsUnsignedConstant());
Greg Clayton0e62ee72017-01-13 00:13:42 +00001255
1256 ASSERT_NE(E, ++I);
1257 EXPECT_EQ(I->Attr, DW_AT_low_pc);
Greg Clayton71503432017-01-13 00:23:59 +00001258 EXPECT_EQ(CULowPC, *I->Value.getAsAddress());
Greg Clayton0e62ee72017-01-13 00:13:42 +00001259
1260 EXPECT_EQ(E, ++I);
1261}
1262
Greg Clayton97d22182017-01-13 21:08:18 +00001263TEST(DWARFDebugInfo, TestFindRecurse) {
1264 uint16_t Version = 4;
1265
1266 const uint8_t AddrSize = sizeof(void *);
1267 initLLVMIfNeeded();
1268 Triple Triple = getHostTripleForAddrSize(AddrSize);
1269 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1270 if (HandleExpectedError(ExpectedDG))
1271 return;
1272 dwarfgen::Generator *DG = ExpectedDG.get().get();
1273 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1274
1275 StringRef SpecDieName("spec");
1276 StringRef AbsDieName("abs");
1277 // Scope to allow us to re-use the same DIE names
1278 {
1279 // Create a compile unit DIE that has an abbreviation that says it has
1280 // children, but doesn't have any actual attributes. This helps us test
1281 // a DIE that has only one child: a NULL DIE.
1282 auto CUDie = CU.getUnitDIE();
1283 auto FuncSpecDie = CUDie.addChild(DW_TAG_subprogram);
1284 auto FuncDie = CUDie.addChild(DW_TAG_subprogram);
1285 auto VarAbsDie = CUDie.addChild(DW_TAG_variable);
1286 auto VarDie = CUDie.addChild(DW_TAG_variable);
1287 FuncSpecDie.addAttribute(DW_AT_name, DW_FORM_strp, SpecDieName);
1288 FuncDie.addAttribute(DW_AT_specification, DW_FORM_ref4, FuncSpecDie);
1289 VarAbsDie.addAttribute(DW_AT_name, DW_FORM_strp, AbsDieName);
1290 VarDie.addAttribute(DW_AT_abstract_origin, DW_FORM_ref4, VarAbsDie);
1291 }
1292
1293 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1294 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1295 EXPECT_TRUE((bool)Obj);
1296 DWARFContextInMemory DwarfContext(*Obj.get());
1297
1298 // Verify the number of compile units is correct.
1299 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1300 EXPECT_EQ(NumCUs, 1u);
1301 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1302
1303 // Get the compile unit DIE is valid.
1304 auto CUDie = U->getUnitDIE(false);
1305 EXPECT_TRUE(CUDie.isValid());
1306
1307 auto FuncSpecDie = CUDie.getFirstChild();
1308 auto FuncDie = FuncSpecDie.getSibling();
1309 auto VarAbsDie = FuncDie.getSibling();
1310 auto VarDie = VarAbsDie.getSibling();
1311
1312 // Make sure we can't extract the name from the specification die when using
1313 // DWARFDie::find() since it won't check the DW_AT_specification DIE.
1314 EXPECT_FALSE(FuncDie.find(DW_AT_name).hasValue());
1315
1316 // Make sure we can extract the name from the specification die when using
1317 // DWARFDie::findRecursively() since it should recurse through the
1318 // DW_AT_specification DIE.
1319 auto NameOpt = FuncDie.findRecursively(DW_AT_name);
1320 EXPECT_TRUE(NameOpt.hasValue());
1321 // Test the dwarf::toString() helper function.
1322 auto StringOpt = toString(NameOpt);
1323 EXPECT_TRUE(StringOpt.hasValue());
1324 EXPECT_EQ(SpecDieName, StringOpt.getValueOr(nullptr));
1325 // Test the dwarf::toString() helper function with a default value specified.
1326 EXPECT_EQ(SpecDieName, toString(NameOpt, nullptr));
1327
1328 // Make sure we can't extract the name from the abstract origin die when using
1329 // DWARFDie::find() since it won't check the DW_AT_abstract_origin DIE.
1330 EXPECT_FALSE(VarDie.find(DW_AT_name).hasValue());
1331
1332 // Make sure we can extract the name from the abstract origin die when using
1333 // DWARFDie::findRecursively() since it should recurse through the
1334 // DW_AT_abstract_origin DIE.
1335 NameOpt = VarDie.findRecursively(DW_AT_name);
1336 EXPECT_TRUE(NameOpt.hasValue());
1337 // Test the dwarf::toString() helper function.
1338 StringOpt = toString(NameOpt);
1339 EXPECT_TRUE(StringOpt.hasValue());
1340 EXPECT_EQ(AbsDieName, StringOpt.getValueOr(nullptr));
1341 // Test the dwarf::toString() helper function with a default value specified.
1342 EXPECT_EQ(AbsDieName, toString(NameOpt, nullptr));
1343}
1344
1345TEST(DWARFDebugInfo, TestDwarfToFunctions) {
1346 // Test all of the dwarf::toXXX functions that take a
1347 // Optional<DWARFFormValue> and extract the values from it.
1348 DWARFFormValue FormVal;
1349 uint64_t InvalidU64 = 0xBADBADBADBADBADB;
1350 int64_t InvalidS64 = 0xBADBADBADBADBADB;
1351 // First test that we don't get valid values back when using an optional with
1352 // no value.
1353 Optional<DWARFFormValue> FormValOpt;
1354 EXPECT_FALSE(toString(FormValOpt).hasValue());
1355 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1356 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1357 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1358 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1359 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1360 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1361 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1362 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1363 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1364 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1365 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1366 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidS64));
1367
1368
1369 // Test successful and unsuccessful address decoding.
1370 uint64_t Address = 0x100000000ULL;
1371 FormVal.setForm(DW_FORM_addr);
1372 FormVal.setUValue(Address);
1373 FormValOpt = FormVal;
1374
1375 EXPECT_FALSE(toString(FormValOpt).hasValue());
1376 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1377 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1378 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1379 EXPECT_TRUE(toAddress(FormValOpt).hasValue());
1380 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1381 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1382 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1383 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1384 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1385 EXPECT_EQ(Address, toAddress(FormValOpt, InvalidU64));
1386 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1387 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidU64));
1388
1389 // Test successful and unsuccessful unsigned constant decoding.
1390 uint64_t UData8 = 0x1020304050607080ULL;
1391 FormVal.setForm(DW_FORM_udata);
1392 FormVal.setUValue(UData8);
1393 FormValOpt = FormVal;
1394
1395 EXPECT_FALSE(toString(FormValOpt).hasValue());
1396 EXPECT_TRUE(toUnsigned(FormValOpt).hasValue());
1397 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1398 EXPECT_TRUE(toSigned(FormValOpt).hasValue());
1399 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1400 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1401 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1402 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1403 EXPECT_EQ(UData8, toUnsigned(FormValOpt, InvalidU64));
1404 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1405 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1406 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1407 EXPECT_EQ((int64_t)UData8, toSigned(FormValOpt, InvalidU64));
1408
1409 // Test successful and unsuccessful reference decoding.
1410 uint32_t RefData = 0x11223344U;
1411 FormVal.setForm(DW_FORM_ref_addr);
1412 FormVal.setUValue(RefData);
1413 FormValOpt = FormVal;
1414
1415 EXPECT_FALSE(toString(FormValOpt).hasValue());
1416 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1417 EXPECT_TRUE(toReference(FormValOpt).hasValue());
1418 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1419 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1420 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1421 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1422 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1423 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1424 EXPECT_EQ(RefData, toReference(FormValOpt, InvalidU64));
1425 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1426 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1427 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidU64));
1428
1429 // Test successful and unsuccessful signed constant decoding.
1430 int64_t SData8 = 0x1020304050607080ULL;
1431 FormVal.setForm(DW_FORM_udata);
1432 FormVal.setSValue(SData8);
1433 FormValOpt = FormVal;
1434
1435 EXPECT_FALSE(toString(FormValOpt).hasValue());
1436 EXPECT_TRUE(toUnsigned(FormValOpt).hasValue());
1437 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1438 EXPECT_TRUE(toSigned(FormValOpt).hasValue());
1439 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1440 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1441 EXPECT_FALSE(toBlock(FormValOpt).hasValue());
1442 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1443 EXPECT_EQ((uint64_t)SData8, toUnsigned(FormValOpt, InvalidU64));
1444 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1445 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1446 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1447 EXPECT_EQ(SData8, toSigned(FormValOpt, InvalidU64));
1448
1449 // Test successful and unsuccessful block decoding.
1450 uint8_t Data[] = { 2, 3, 4 };
1451 ArrayRef<uint8_t> Array(Data);
1452 FormVal.setForm(DW_FORM_block1);
1453 FormVal.setBlockValue(Array);
1454 FormValOpt = FormVal;
1455
1456 EXPECT_FALSE(toString(FormValOpt).hasValue());
1457 EXPECT_FALSE(toUnsigned(FormValOpt).hasValue());
1458 EXPECT_FALSE(toReference(FormValOpt).hasValue());
1459 EXPECT_FALSE(toSigned(FormValOpt).hasValue());
1460 EXPECT_FALSE(toAddress(FormValOpt).hasValue());
1461 EXPECT_FALSE(toSectionOffset(FormValOpt).hasValue());
1462 auto BlockOpt = toBlock(FormValOpt);
1463 EXPECT_TRUE(BlockOpt.hasValue());
1464 EXPECT_EQ(*BlockOpt, Array);
1465 EXPECT_EQ(nullptr, toString(FormValOpt, nullptr));
1466 EXPECT_EQ(InvalidU64, toUnsigned(FormValOpt, InvalidU64));
1467 EXPECT_EQ(InvalidU64, toReference(FormValOpt, InvalidU64));
1468 EXPECT_EQ(InvalidU64, toAddress(FormValOpt, InvalidU64));
1469 EXPECT_EQ(InvalidU64, toSectionOffset(FormValOpt, InvalidU64));
1470 EXPECT_EQ(InvalidS64, toSigned(FormValOpt, InvalidU64));
1471
1472 // Test
1473}
1474
Greg Claytonc109bbe2017-01-13 22:32:12 +00001475TEST(DWARFDebugInfo, TestFindAttrs) {
1476 // Test the DWARFDie::find() and DWARFDie::findRecursively() that take an
1477 // ArrayRef<dwarf::Attribute> value to make sure they work correctly.
1478 uint16_t Version = 4;
1479
1480 const uint8_t AddrSize = sizeof(void *);
1481 initLLVMIfNeeded();
1482 Triple Triple = getHostTripleForAddrSize(AddrSize);
1483 auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
1484 if (HandleExpectedError(ExpectedDG))
1485 return;
1486 dwarfgen::Generator *DG = ExpectedDG.get().get();
1487 dwarfgen::CompileUnit &CU = DG->addCompileUnit();
1488
1489 StringRef DieMangled("_Z3fooi");
1490 // Scope to allow us to re-use the same DIE names
1491 {
1492 // Create a compile unit DIE that has an abbreviation that says it has
1493 // children, but doesn't have any actual attributes. This helps us test
1494 // a DIE that has only one child: a NULL DIE.
1495 auto CUDie = CU.getUnitDIE();
1496 auto FuncSpecDie = CUDie.addChild(DW_TAG_subprogram);
1497 auto FuncDie = CUDie.addChild(DW_TAG_subprogram);
1498 FuncSpecDie.addAttribute(DW_AT_MIPS_linkage_name, DW_FORM_strp, DieMangled);
1499 FuncDie.addAttribute(DW_AT_specification, DW_FORM_ref4, FuncSpecDie);
1500 }
1501
1502 MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
1503 auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
1504 EXPECT_TRUE((bool)Obj);
1505 DWARFContextInMemory DwarfContext(*Obj.get());
1506
1507 // Verify the number of compile units is correct.
1508 uint32_t NumCUs = DwarfContext.getNumCompileUnits();
1509 EXPECT_EQ(NumCUs, 1u);
1510 DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
1511
1512 // Get the compile unit DIE is valid.
1513 auto CUDie = U->getUnitDIE(false);
1514 EXPECT_TRUE(CUDie.isValid());
1515
1516 auto FuncSpecDie = CUDie.getFirstChild();
1517 auto FuncDie = FuncSpecDie.getSibling();
1518
1519 // Make sure that passing in an empty attribute list behave correctly.
1520 EXPECT_FALSE(FuncDie.find(ArrayRef<dwarf::Attribute>()).hasValue());
1521
1522 // Make sure that passing in a list of attribute that are not contained
1523 // in the DIE returns nothing.
1524 EXPECT_FALSE(FuncDie.find({DW_AT_low_pc, DW_AT_entry_pc}).hasValue());
1525
NAKAMURA Takumif2b135a2017-01-16 14:33:37 +00001526 const dwarf::Attribute Attrs[] = {DW_AT_linkage_name,
1527 DW_AT_MIPS_linkage_name};
1528
Greg Claytonc109bbe2017-01-13 22:32:12 +00001529 // Make sure we can't extract the linkage name attributes when using
1530 // DWARFDie::find() since it won't check the DW_AT_specification DIE.
1531 EXPECT_FALSE(FuncDie.find(Attrs).hasValue());
1532
1533 // Make sure we can extract the name from the specification die when using
1534 // DWARFDie::findRecursively() since it should recurse through the
1535 // DW_AT_specification DIE.
1536 auto NameOpt = FuncDie.findRecursively(Attrs);
1537 EXPECT_TRUE(NameOpt.hasValue());
1538 EXPECT_EQ(DieMangled, toString(NameOpt, ""));
1539
1540}
1541
Greg Clayton3462a422016-12-08 01:03:48 +00001542} // end anonymous namespace