1 //===- DWARFContext.cpp ---------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/SmallVector.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/ADT/StringSwitch.h"
16 #include "llvm/BinaryFormat/Dwarf.h"
17 #include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
18 #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
19 #include "llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h"
20 #include "llvm/DebugInfo/DWARF/DWARFDebugAddr.h"
21 #include "llvm/DebugInfo/DWARF/DWARFDebugArangeSet.h"
22 #include "llvm/DebugInfo/DWARF/DWARFDebugAranges.h"
23 #include "llvm/DebugInfo/DWARF/DWARFDebugFrame.h"
24 #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
25 #include "llvm/DebugInfo/DWARF/DWARFDebugLoc.h"
26 #include "llvm/DebugInfo/DWARF/DWARFDebugMacro.h"
27 #include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
28 #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
29 #include "llvm/DebugInfo/DWARF/DWARFDebugRnglists.h"
30 #include "llvm/DebugInfo/DWARF/DWARFDie.h"
31 #include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
32 #include "llvm/DebugInfo/DWARF/DWARFGdbIndex.h"
33 #include "llvm/DebugInfo/DWARF/DWARFSection.h"
34 #include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
35 #include "llvm/DebugInfo/DWARF/DWARFVerifier.h"
36 #include "llvm/MC/MCRegisterInfo.h"
37 #include "llvm/Object/Decompressor.h"
38 #include "llvm/Object/MachO.h"
39 #include "llvm/Object/ObjectFile.h"
40 #include "llvm/Object/RelocVisitor.h"
41 #include "llvm/Support/Casting.h"
42 #include "llvm/Support/DataExtractor.h"
43 #include "llvm/Support/Error.h"
44 #include "llvm/Support/Format.h"
45 #include "llvm/Support/MemoryBuffer.h"
46 #include "llvm/Support/Path.h"
47 #include "llvm/Support/TargetRegistry.h"
48 #include "llvm/Support/WithColor.h"
49 #include "llvm/Support/raw_ostream.h"
59 using namespace dwarf
;
60 using namespace object
;
62 #define DEBUG_TYPE "dwarf"
64 using DWARFLineTable
= DWARFDebugLine::LineTable
;
65 using FileLineInfoKind
= DILineInfoSpecifier::FileLineInfoKind
;
66 using FunctionNameKind
= DILineInfoSpecifier::FunctionNameKind
;
68 DWARFContext::DWARFContext(std::unique_ptr
<const DWARFObject
> DObj
,
70 : DIContext(CK_DWARF
), DWPName(std::move(DWPName
)), DObj(std::move(DObj
)) {}
72 DWARFContext::~DWARFContext() = default;
74 /// Dump the UUID load command.
75 static void dumpUUID(raw_ostream
&OS
, const ObjectFile
&Obj
) {
76 auto *MachO
= dyn_cast
<MachOObjectFile
>(&Obj
);
79 for (auto LC
: MachO
->load_commands()) {
80 raw_ostream::uuid_t UUID
;
81 if (LC
.C
.cmd
== MachO::LC_UUID
) {
82 if (LC
.C
.cmdsize
< sizeof(UUID
) + sizeof(LC
.C
)) {
83 OS
<< "error: UUID load command is too short.\n";
87 memcpy(&UUID
, LC
.Ptr
+sizeof(LC
.C
), sizeof(UUID
));
89 Triple T
= MachO
->getArchTriple();
90 OS
<< " (" << T
.getArchName() << ')';
91 OS
<< ' ' << MachO
->getFileName() << '\n';
96 using ContributionCollection
=
97 std::vector
<Optional
<StrOffsetsContributionDescriptor
>>;
99 // Collect all the contributions to the string offsets table from all units,
100 // sort them by their starting offsets and remove duplicates.
101 static ContributionCollection
102 collectContributionData(DWARFContext::unit_iterator_range Units
) {
103 ContributionCollection Contributions
;
104 for (const auto &U
: Units
)
105 Contributions
.push_back(U
->getStringOffsetsTableContribution());
106 // Sort the contributions so that any invalid ones are placed at
107 // the start of the contributions vector. This way they are reported
109 llvm::sort(Contributions
.begin(), Contributions
.end(),
110 [](const Optional
<StrOffsetsContributionDescriptor
> &L
,
111 const Optional
<StrOffsetsContributionDescriptor
> &R
) {
112 if (L
&& R
) return L
->Base
< R
->Base
;
116 // Uniquify contributions, as it is possible that units (specifically
117 // type units in dwo or dwp files) share contributions. We don't want
118 // to report them more than once.
120 std::unique(Contributions
.begin(), Contributions
.end(),
121 [](const Optional
<StrOffsetsContributionDescriptor
> &L
,
122 const Optional
<StrOffsetsContributionDescriptor
> &R
) {
124 return L
->Base
== R
->Base
&& L
->Size
== R
->Size
;
127 Contributions
.end());
128 return Contributions
;
131 static void dumpDWARFv5StringOffsetsSection(
132 raw_ostream
&OS
, StringRef SectionName
, const DWARFObject
&Obj
,
133 const DWARFSection
&StringOffsetsSection
, StringRef StringSection
,
134 DWARFContext::unit_iterator_range Units
, bool LittleEndian
) {
135 auto Contributions
= collectContributionData(Units
);
136 DWARFDataExtractor
StrOffsetExt(Obj
, StringOffsetsSection
, LittleEndian
, 0);
137 DataExtractor
StrData(StringSection
, LittleEndian
, 0);
138 uint64_t SectionSize
= StringOffsetsSection
.Data
.size();
140 for (auto &Contribution
: Contributions
) {
141 // Report an ill-formed contribution.
143 OS
<< "error: invalid contribution to string offsets table in section ."
144 << SectionName
<< ".\n";
148 dwarf::DwarfFormat Format
= Contribution
->getFormat();
149 uint16_t Version
= Contribution
->getVersion();
150 uint64_t ContributionHeader
= Contribution
->Base
;
151 // In DWARF v5 there is a contribution header that immediately precedes
152 // the string offsets base (the location we have previously retrieved from
153 // the CU DIE's DW_AT_str_offsets attribute). The header is located either
154 // 8 or 16 bytes before the base, depending on the contribution's format.
156 ContributionHeader
-= Format
== DWARF32
? 8 : 16;
158 // Detect overlapping contributions.
159 if (Offset
> ContributionHeader
) {
160 OS
<< "error: overlapping contributions to string offsets table in "
162 << SectionName
<< ".\n";
165 // Report a gap in the table.
166 if (Offset
< ContributionHeader
) {
167 OS
<< format("0x%8.8x: Gap, length = ", Offset
);
168 OS
<< (ContributionHeader
- Offset
) << "\n";
170 OS
<< format("0x%8.8x: ", (uint32_t)ContributionHeader
);
171 // In DWARF v5 the contribution size in the descriptor does not equal
172 // the originally encoded length (it does not contain the length of the
173 // version field and the padding, a total of 4 bytes). Add them back in
175 OS
<< "Contribution size = " << (Contribution
->Size
+ (Version
< 5 ? 0 : 4))
176 << ", Format = " << (Format
== DWARF32
? "DWARF32" : "DWARF64")
177 << ", Version = " << Version
<< "\n";
179 Offset
= Contribution
->Base
;
180 unsigned EntrySize
= Contribution
->getDwarfOffsetByteSize();
181 while (Offset
- Contribution
->Base
< Contribution
->Size
) {
182 OS
<< format("0x%8.8x: ", Offset
);
183 // FIXME: We can only extract strings if the offset fits in 32 bits.
184 uint64_t StringOffset
=
185 StrOffsetExt
.getRelocatedValue(EntrySize
, &Offset
);
186 // Extract the string if we can and display it. Otherwise just report
188 if (StringOffset
<= std::numeric_limits
<uint32_t>::max()) {
189 uint32_t StringOffset32
= (uint32_t)StringOffset
;
190 OS
<< format("%8.8x ", StringOffset32
);
191 const char *S
= StrData
.getCStr(&StringOffset32
);
193 OS
<< format("\"%s\"", S
);
195 OS
<< format("%16.16" PRIx64
" ", StringOffset
);
199 // Report a gap at the end of the table.
200 if (Offset
< SectionSize
) {
201 OS
<< format("0x%8.8x: Gap, length = ", Offset
);
202 OS
<< (SectionSize
- Offset
) << "\n";
206 // Dump a DWARF string offsets section. This may be a DWARF v5 formatted
207 // string offsets section, where each compile or type unit contributes a
208 // number of entries (string offsets), with each contribution preceded by
209 // a header containing size and version number. Alternatively, it may be a
210 // monolithic series of string offsets, as generated by the pre-DWARF v5
211 // implementation of split DWARF.
212 static void dumpStringOffsetsSection(raw_ostream
&OS
, StringRef SectionName
,
213 const DWARFObject
&Obj
,
214 const DWARFSection
&StringOffsetsSection
,
215 StringRef StringSection
,
216 DWARFContext::unit_iterator_range Units
,
217 bool LittleEndian
, unsigned MaxVersion
) {
218 // If we have at least one (compile or type) unit with DWARF v5 or greater,
219 // we assume that the section is formatted like a DWARF v5 string offsets
222 dumpDWARFv5StringOffsetsSection(OS
, SectionName
, Obj
, StringOffsetsSection
,
223 StringSection
, Units
, LittleEndian
);
225 DataExtractor
strOffsetExt(StringOffsetsSection
.Data
, LittleEndian
, 0);
227 uint64_t size
= StringOffsetsSection
.Data
.size();
228 // Ensure that size is a multiple of the size of an entry.
229 if (size
& ((uint64_t)(sizeof(uint32_t) - 1))) {
230 OS
<< "error: size of ." << SectionName
<< " is not a multiple of "
231 << sizeof(uint32_t) << ".\n";
232 size
&= -(uint64_t)sizeof(uint32_t);
234 DataExtractor
StrData(StringSection
, LittleEndian
, 0);
235 while (offset
< size
) {
236 OS
<< format("0x%8.8x: ", offset
);
237 uint32_t StringOffset
= strOffsetExt
.getU32(&offset
);
238 OS
<< format("%8.8x ", StringOffset
);
239 const char *S
= StrData
.getCStr(&StringOffset
);
241 OS
<< format("\"%s\"", S
);
247 // Dump the .debug_addr section.
248 static void dumpAddrSection(raw_ostream
&OS
, DWARFDataExtractor
&AddrData
,
249 DIDumpOptions DumpOpts
, uint16_t Version
,
252 while (AddrData
.isValidOffset(Offset
)) {
253 DWARFDebugAddrTable AddrTable
;
254 uint32_t TableOffset
= Offset
;
255 if (Error Err
= AddrTable
.extract(AddrData
, &Offset
, Version
, AddrSize
,
256 DWARFContext::dumpWarning
)) {
257 WithColor::error() << toString(std::move(Err
)) << '\n';
258 // Keep going after an error, if we can, assuming that the length field
259 // could be read. If it couldn't, stop reading the section.
260 if (!AddrTable
.hasValidLength())
262 uint64_t Length
= AddrTable
.getLength();
263 Offset
= TableOffset
+ Length
;
265 AddrTable
.dump(OS
, DumpOpts
);
270 // Dump the .debug_rnglists or .debug_rnglists.dwo section (DWARF v5).
271 static void dumpRnglistsSection(raw_ostream
&OS
,
272 DWARFDataExtractor
&rnglistData
,
273 DIDumpOptions DumpOpts
) {
275 while (rnglistData
.isValidOffset(Offset
)) {
276 llvm::DWARFDebugRnglistTable Rnglists
;
277 uint32_t TableOffset
= Offset
;
278 if (Error Err
= Rnglists
.extract(rnglistData
, &Offset
)) {
279 WithColor::error() << toString(std::move(Err
)) << '\n';
280 uint64_t Length
= Rnglists
.length();
281 // Keep going after an error, if we can, assuming that the length field
282 // could be read. If it couldn't, stop reading the section.
285 Offset
= TableOffset
+ Length
;
287 Rnglists
.dump(OS
, DumpOpts
);
292 void DWARFContext::dump(
293 raw_ostream
&OS
, DIDumpOptions DumpOpts
,
294 std::array
<Optional
<uint64_t>, DIDT_ID_Count
> DumpOffsets
) {
296 Optional
<uint64_t> DumpOffset
;
297 uint64_t DumpType
= DumpOpts
.DumpType
;
299 StringRef Extension
= sys::path::extension(DObj
->getFileName());
300 bool IsDWO
= (Extension
== ".dwo") || (Extension
== ".dwp");
302 // Print UUID header.
303 const auto *ObjFile
= DObj
->getFile();
304 if (DumpType
& DIDT_UUID
)
305 dumpUUID(OS
, *ObjFile
);
307 // Print a header for each explicitly-requested section.
308 // Otherwise just print one for non-empty sections.
309 // Only print empty .dwo section headers when dumping a .dwo file.
310 bool Explicit
= DumpType
!= DIDT_All
&& !IsDWO
;
311 bool ExplicitDWO
= Explicit
&& IsDWO
;
312 auto shouldDump
= [&](bool Explicit
, const char *Name
, unsigned ID
,
314 DumpOffset
= DumpOffsets
[ID
];
315 unsigned Mask
= 1U << ID
;
316 bool Should
= (DumpType
& Mask
) && (Explicit
|| !Section
.empty());
318 OS
<< "\n" << Name
<< " contents:\n";
322 // Dump individual sections.
323 if (shouldDump(Explicit
, ".debug_abbrev", DIDT_ID_DebugAbbrev
,
324 DObj
->getAbbrevSection()))
325 getDebugAbbrev()->dump(OS
);
326 if (shouldDump(ExplicitDWO
, ".debug_abbrev.dwo", DIDT_ID_DebugAbbrev
,
327 DObj
->getAbbrevDWOSection()))
328 getDebugAbbrevDWO()->dump(OS
);
330 auto dumpDebugInfo
= [&](bool IsExplicit
, const char *Name
,
331 DWARFSection Section
, unit_iterator_range Units
) {
332 if (shouldDump(IsExplicit
, Name
, DIDT_ID_DebugInfo
, Section
.Data
)) {
334 getDIEForOffset(DumpOffset
.getValue())
335 .dump(OS
, 0, DumpOpts
.noImplicitRecursion());
337 for (const auto &U
: Units
)
338 U
->dump(OS
, DumpOpts
);
341 dumpDebugInfo(Explicit
, ".debug_info", DObj
->getInfoSection(),
342 info_section_units());
343 dumpDebugInfo(ExplicitDWO
, ".debug_info.dwo", DObj
->getInfoDWOSection(),
344 dwo_info_section_units());
346 auto dumpDebugType
= [&](const char *Name
, unit_iterator_range Units
) {
347 OS
<< '\n' << Name
<< " contents:\n";
348 DumpOffset
= DumpOffsets
[DIDT_ID_DebugTypes
];
349 for (const auto &U
: Units
)
351 U
->getDIEForOffset(*DumpOffset
)
352 .dump(OS
, 0, DumpOpts
.noImplicitRecursion());
354 U
->dump(OS
, DumpOpts
);
356 if ((DumpType
& DIDT_DebugTypes
)) {
357 if (Explicit
|| getNumTypeUnits())
358 dumpDebugType(".debug_types", types_section_units());
359 if (ExplicitDWO
|| getNumDWOTypeUnits())
360 dumpDebugType(".debug_types.dwo", dwo_types_section_units());
363 if (shouldDump(Explicit
, ".debug_loc", DIDT_ID_DebugLoc
,
364 DObj
->getLocSection().Data
)) {
365 getDebugLoc()->dump(OS
, getRegisterInfo(), DumpOffset
);
367 if (shouldDump(ExplicitDWO
, ".debug_loc.dwo", DIDT_ID_DebugLoc
,
368 DObj
->getLocDWOSection().Data
)) {
369 getDebugLocDWO()->dump(OS
, getRegisterInfo(), DumpOffset
);
372 if (shouldDump(Explicit
, ".debug_frame", DIDT_ID_DebugFrame
,
373 DObj
->getDebugFrameSection()))
374 getDebugFrame()->dump(OS
, getRegisterInfo(), DumpOffset
);
376 if (shouldDump(Explicit
, ".eh_frame", DIDT_ID_DebugFrame
,
377 DObj
->getEHFrameSection()))
378 getEHFrame()->dump(OS
, getRegisterInfo(), DumpOffset
);
380 if (DumpType
& DIDT_DebugMacro
) {
381 if (Explicit
|| !getDebugMacro()->empty()) {
382 OS
<< "\n.debug_macinfo contents:\n";
383 getDebugMacro()->dump(OS
);
387 if (shouldDump(Explicit
, ".debug_aranges", DIDT_ID_DebugAranges
,
388 DObj
->getARangeSection())) {
390 DataExtractor
arangesData(DObj
->getARangeSection(), isLittleEndian(), 0);
391 DWARFDebugArangeSet set
;
392 while (set
.extract(arangesData
, &offset
))
396 auto DumpLineSection
= [&](DWARFDebugLine::SectionParser Parser
,
397 DIDumpOptions DumpOpts
) {
398 while (!Parser
.done()) {
399 if (DumpOffset
&& Parser
.getOffset() != *DumpOffset
) {
400 Parser
.skip(dumpWarning
);
403 OS
<< "debug_line[" << format("0x%8.8x", Parser
.getOffset()) << "]\n";
404 if (DumpOpts
.Verbose
) {
405 Parser
.parseNext(dumpWarning
, dumpWarning
, &OS
);
407 DWARFDebugLine::LineTable LineTable
=
408 Parser
.parseNext(dumpWarning
, dumpWarning
);
409 LineTable
.dump(OS
, DumpOpts
);
414 if (shouldDump(Explicit
, ".debug_line", DIDT_ID_DebugLine
,
415 DObj
->getLineSection().Data
)) {
416 DWARFDataExtractor
LineData(*DObj
, DObj
->getLineSection(), isLittleEndian(),
418 DWARFDebugLine::SectionParser
Parser(LineData
, *this, compile_units(),
420 DumpLineSection(Parser
, DumpOpts
);
423 if (shouldDump(ExplicitDWO
, ".debug_line.dwo", DIDT_ID_DebugLine
,
424 DObj
->getLineDWOSection().Data
)) {
425 DWARFDataExtractor
LineData(*DObj
, DObj
->getLineDWOSection(),
426 isLittleEndian(), 0);
427 DWARFDebugLine::SectionParser
Parser(LineData
, *this, dwo_compile_units(),
429 DumpLineSection(Parser
, DumpOpts
);
432 if (shouldDump(Explicit
, ".debug_cu_index", DIDT_ID_DebugCUIndex
,
433 DObj
->getCUIndexSection())) {
434 getCUIndex().dump(OS
);
437 if (shouldDump(Explicit
, ".debug_tu_index", DIDT_ID_DebugTUIndex
,
438 DObj
->getTUIndexSection())) {
439 getTUIndex().dump(OS
);
442 if (shouldDump(Explicit
, ".debug_str", DIDT_ID_DebugStr
,
443 DObj
->getStringSection())) {
444 DataExtractor
strData(DObj
->getStringSection(), isLittleEndian(), 0);
446 uint32_t strOffset
= 0;
447 while (const char *s
= strData
.getCStr(&offset
)) {
448 OS
<< format("0x%8.8x: \"%s\"\n", strOffset
, s
);
452 if (shouldDump(ExplicitDWO
, ".debug_str.dwo", DIDT_ID_DebugStr
,
453 DObj
->getStringDWOSection())) {
454 DataExtractor
strDWOData(DObj
->getStringDWOSection(), isLittleEndian(), 0);
456 uint32_t strDWOOffset
= 0;
457 while (const char *s
= strDWOData
.getCStr(&offset
)) {
458 OS
<< format("0x%8.8x: \"%s\"\n", strDWOOffset
, s
);
459 strDWOOffset
= offset
;
462 if (shouldDump(Explicit
, ".debug_line_str", DIDT_ID_DebugLineStr
,
463 DObj
->getLineStringSection())) {
464 DataExtractor
strData(DObj
->getLineStringSection(), isLittleEndian(), 0);
466 uint32_t strOffset
= 0;
467 while (const char *s
= strData
.getCStr(&offset
)) {
468 OS
<< format("0x%8.8x: \"", strOffset
);
475 if (shouldDump(Explicit
, ".debug_addr", DIDT_ID_DebugAddr
,
476 DObj
->getAddrSection().Data
)) {
477 DWARFDataExtractor
AddrData(*DObj
, DObj
->getAddrSection(),
478 isLittleEndian(), 0);
479 dumpAddrSection(OS
, AddrData
, DumpOpts
, getMaxVersion(), getCUAddrSize());
482 if (shouldDump(Explicit
, ".debug_ranges", DIDT_ID_DebugRanges
,
483 DObj
->getRangeSection().Data
)) {
484 uint8_t savedAddressByteSize
= getCUAddrSize();
485 DWARFDataExtractor
rangesData(*DObj
, DObj
->getRangeSection(),
486 isLittleEndian(), savedAddressByteSize
);
488 DWARFDebugRangeList rangeList
;
489 while (rangesData
.isValidOffset(offset
)) {
490 if (Error E
= rangeList
.extract(rangesData
, &offset
)) {
491 WithColor::error() << toString(std::move(E
)) << '\n';
498 if (shouldDump(Explicit
, ".debug_rnglists", DIDT_ID_DebugRnglists
,
499 DObj
->getRnglistsSection().Data
)) {
500 DWARFDataExtractor
RnglistData(*DObj
, DObj
->getRnglistsSection(),
501 isLittleEndian(), 0);
502 dumpRnglistsSection(OS
, RnglistData
, DumpOpts
);
505 if (shouldDump(ExplicitDWO
, ".debug_rnglists.dwo", DIDT_ID_DebugRnglists
,
506 DObj
->getRnglistsDWOSection().Data
)) {
507 DWARFDataExtractor
RnglistData(*DObj
, DObj
->getRnglistsDWOSection(),
508 isLittleEndian(), 0);
509 dumpRnglistsSection(OS
, RnglistData
, DumpOpts
);
512 if (shouldDump(Explicit
, ".debug_pubnames", DIDT_ID_DebugPubnames
,
513 DObj
->getPubNamesSection()))
514 DWARFDebugPubTable(DObj
->getPubNamesSection(), isLittleEndian(), false)
517 if (shouldDump(Explicit
, ".debug_pubtypes", DIDT_ID_DebugPubtypes
,
518 DObj
->getPubTypesSection()))
519 DWARFDebugPubTable(DObj
->getPubTypesSection(), isLittleEndian(), false)
522 if (shouldDump(Explicit
, ".debug_gnu_pubnames", DIDT_ID_DebugGnuPubnames
,
523 DObj
->getGnuPubNamesSection()))
524 DWARFDebugPubTable(DObj
->getGnuPubNamesSection(), isLittleEndian(),
528 if (shouldDump(Explicit
, ".debug_gnu_pubtypes", DIDT_ID_DebugGnuPubtypes
,
529 DObj
->getGnuPubTypesSection()))
530 DWARFDebugPubTable(DObj
->getGnuPubTypesSection(), isLittleEndian(),
534 if (shouldDump(Explicit
, ".debug_str_offsets", DIDT_ID_DebugStrOffsets
,
535 DObj
->getStringOffsetSection().Data
))
536 dumpStringOffsetsSection(OS
, "debug_str_offsets", *DObj
,
537 DObj
->getStringOffsetSection(),
538 DObj
->getStringSection(), normal_units(),
539 isLittleEndian(), getMaxVersion());
540 if (shouldDump(ExplicitDWO
, ".debug_str_offsets.dwo", DIDT_ID_DebugStrOffsets
,
541 DObj
->getStringOffsetDWOSection().Data
))
542 dumpStringOffsetsSection(OS
, "debug_str_offsets.dwo", *DObj
,
543 DObj
->getStringOffsetDWOSection(),
544 DObj
->getStringDWOSection(), dwo_units(),
545 isLittleEndian(), getMaxVersion());
547 if (shouldDump(Explicit
, ".gnu_index", DIDT_ID_GdbIndex
,
548 DObj
->getGdbIndexSection())) {
549 getGdbIndex().dump(OS
);
552 if (shouldDump(Explicit
, ".apple_names", DIDT_ID_AppleNames
,
553 DObj
->getAppleNamesSection().Data
))
554 getAppleNames().dump(OS
);
556 if (shouldDump(Explicit
, ".apple_types", DIDT_ID_AppleTypes
,
557 DObj
->getAppleTypesSection().Data
))
558 getAppleTypes().dump(OS
);
560 if (shouldDump(Explicit
, ".apple_namespaces", DIDT_ID_AppleNamespaces
,
561 DObj
->getAppleNamespacesSection().Data
))
562 getAppleNamespaces().dump(OS
);
564 if (shouldDump(Explicit
, ".apple_objc", DIDT_ID_AppleObjC
,
565 DObj
->getAppleObjCSection().Data
))
566 getAppleObjC().dump(OS
);
567 if (shouldDump(Explicit
, ".debug_names", DIDT_ID_DebugNames
,
568 DObj
->getDebugNamesSection().Data
))
569 getDebugNames().dump(OS
);
572 DWARFCompileUnit
*DWARFContext::getDWOCompileUnitForHash(uint64_t Hash
) {
573 parseDWOUnits(LazyParse
);
575 if (const auto &CUI
= getCUIndex()) {
576 if (const auto *R
= CUI
.getFromHash(Hash
))
577 return dyn_cast_or_null
<DWARFCompileUnit
>(
578 DWOUnits
.getUnitForIndexEntry(*R
));
582 // If there's no index, just search through the CUs in the DWO - there's
583 // probably only one unless this is something like LTO - though an in-process
584 // built/cached lookup table could be used in that case to improve repeated
585 // lookups of different CUs in the DWO.
586 for (const auto &DWOCU
: dwo_compile_units()) {
587 // Might not have parsed DWO ID yet.
588 if (!DWOCU
->getDWOId()) {
589 if (Optional
<uint64_t> DWOId
=
590 toUnsigned(DWOCU
->getUnitDIE().find(DW_AT_GNU_dwo_id
)))
591 DWOCU
->setDWOId(*DWOId
);
596 if (DWOCU
->getDWOId() == Hash
)
597 return dyn_cast
<DWARFCompileUnit
>(DWOCU
.get());
602 DWARFDie
DWARFContext::getDIEForOffset(uint32_t Offset
) {
604 if (auto *CU
= NormalUnits
.getUnitForOffset(Offset
))
605 return CU
->getDIEForOffset(Offset
);
609 bool DWARFContext::verify(raw_ostream
&OS
, DIDumpOptions DumpOpts
) {
611 DWARFVerifier
verifier(OS
, *this, DumpOpts
);
613 Success
&= verifier
.handleDebugAbbrev();
614 if (DumpOpts
.DumpType
& DIDT_DebugInfo
)
615 Success
&= verifier
.handleDebugInfo();
616 if (DumpOpts
.DumpType
& DIDT_DebugLine
)
617 Success
&= verifier
.handleDebugLine();
618 Success
&= verifier
.handleAccelTables();
622 const DWARFUnitIndex
&DWARFContext::getCUIndex() {
626 DataExtractor
CUIndexData(DObj
->getCUIndexSection(), isLittleEndian(), 0);
628 CUIndex
= llvm::make_unique
<DWARFUnitIndex
>(DW_SECT_INFO
);
629 CUIndex
->parse(CUIndexData
);
633 const DWARFUnitIndex
&DWARFContext::getTUIndex() {
637 DataExtractor
TUIndexData(DObj
->getTUIndexSection(), isLittleEndian(), 0);
639 TUIndex
= llvm::make_unique
<DWARFUnitIndex
>(DW_SECT_TYPES
);
640 TUIndex
->parse(TUIndexData
);
644 DWARFGdbIndex
&DWARFContext::getGdbIndex() {
648 DataExtractor
GdbIndexData(DObj
->getGdbIndexSection(), true /*LE*/, 0);
649 GdbIndex
= llvm::make_unique
<DWARFGdbIndex
>();
650 GdbIndex
->parse(GdbIndexData
);
654 const DWARFDebugAbbrev
*DWARFContext::getDebugAbbrev() {
658 DataExtractor
abbrData(DObj
->getAbbrevSection(), isLittleEndian(), 0);
660 Abbrev
.reset(new DWARFDebugAbbrev());
661 Abbrev
->extract(abbrData
);
665 const DWARFDebugAbbrev
*DWARFContext::getDebugAbbrevDWO() {
667 return AbbrevDWO
.get();
669 DataExtractor
abbrData(DObj
->getAbbrevDWOSection(), isLittleEndian(), 0);
670 AbbrevDWO
.reset(new DWARFDebugAbbrev());
671 AbbrevDWO
->extract(abbrData
);
672 return AbbrevDWO
.get();
675 const DWARFDebugLoc
*DWARFContext::getDebugLoc() {
679 Loc
.reset(new DWARFDebugLoc
);
680 // Assume all units have the same address byte size.
681 if (getNumCompileUnits()) {
682 DWARFDataExtractor
LocData(*DObj
, DObj
->getLocSection(), isLittleEndian(),
683 getUnitAtIndex(0)->getAddressByteSize());
689 const DWARFDebugLocDWO
*DWARFContext::getDebugLocDWO() {
693 LocDWO
.reset(new DWARFDebugLocDWO());
694 // Assume all compile units have the same address byte size.
695 if (getNumCompileUnits()) {
696 DataExtractor
LocData(DObj
->getLocDWOSection().Data
, isLittleEndian(),
697 getUnitAtIndex(0)->getAddressByteSize());
698 LocDWO
->parse(LocData
);
703 const DWARFDebugAranges
*DWARFContext::getDebugAranges() {
705 return Aranges
.get();
707 Aranges
.reset(new DWARFDebugAranges());
708 Aranges
->generate(this);
709 return Aranges
.get();
712 const DWARFDebugFrame
*DWARFContext::getDebugFrame() {
714 return DebugFrame
.get();
716 // There's a "bug" in the DWARFv3 standard with respect to the target address
717 // size within debug frame sections. While DWARF is supposed to be independent
718 // of its container, FDEs have fields with size being "target address size",
719 // which isn't specified in DWARF in general. It's only specified for CUs, but
720 // .eh_frame can appear without a .debug_info section. Follow the example of
721 // other tools (libdwarf) and extract this from the container (ObjectFile
722 // provides this information). This problem is fixed in DWARFv4
723 // See this dwarf-discuss discussion for more details:
724 // http://lists.dwarfstd.org/htdig.cgi/dwarf-discuss-dwarfstd.org/2011-December/001173.html
725 DWARFDataExtractor
debugFrameData(DObj
->getDebugFrameSection(),
726 isLittleEndian(), DObj
->getAddressSize());
727 DebugFrame
.reset(new DWARFDebugFrame(false /* IsEH */));
728 DebugFrame
->parse(debugFrameData
);
729 return DebugFrame
.get();
732 const DWARFDebugFrame
*DWARFContext::getEHFrame() {
734 return EHFrame
.get();
736 DWARFDataExtractor
debugFrameData(DObj
->getEHFrameSection(), isLittleEndian(),
737 DObj
->getAddressSize());
738 DebugFrame
.reset(new DWARFDebugFrame(true /* IsEH */));
739 DebugFrame
->parse(debugFrameData
);
740 return DebugFrame
.get();
743 const DWARFDebugMacro
*DWARFContext::getDebugMacro() {
747 DataExtractor
MacinfoData(DObj
->getMacinfoSection(), isLittleEndian(), 0);
748 Macro
.reset(new DWARFDebugMacro());
749 Macro
->parse(MacinfoData
);
753 template <typename T
>
754 static T
&getAccelTable(std::unique_ptr
<T
> &Cache
, const DWARFObject
&Obj
,
755 const DWARFSection
&Section
, StringRef StringSection
,
756 bool IsLittleEndian
) {
759 DWARFDataExtractor
AccelSection(Obj
, Section
, IsLittleEndian
, 0);
760 DataExtractor
StrData(StringSection
, IsLittleEndian
, 0);
761 Cache
.reset(new T(AccelSection
, StrData
));
762 if (Error E
= Cache
->extract())
763 llvm::consumeError(std::move(E
));
767 const DWARFDebugNames
&DWARFContext::getDebugNames() {
768 return getAccelTable(Names
, *DObj
, DObj
->getDebugNamesSection(),
769 DObj
->getStringSection(), isLittleEndian());
772 const AppleAcceleratorTable
&DWARFContext::getAppleNames() {
773 return getAccelTable(AppleNames
, *DObj
, DObj
->getAppleNamesSection(),
774 DObj
->getStringSection(), isLittleEndian());
777 const AppleAcceleratorTable
&DWARFContext::getAppleTypes() {
778 return getAccelTable(AppleTypes
, *DObj
, DObj
->getAppleTypesSection(),
779 DObj
->getStringSection(), isLittleEndian());
782 const AppleAcceleratorTable
&DWARFContext::getAppleNamespaces() {
783 return getAccelTable(AppleNamespaces
, *DObj
,
784 DObj
->getAppleNamespacesSection(),
785 DObj
->getStringSection(), isLittleEndian());
788 const AppleAcceleratorTable
&DWARFContext::getAppleObjC() {
789 return getAccelTable(AppleObjC
, *DObj
, DObj
->getAppleObjCSection(),
790 DObj
->getStringSection(), isLittleEndian());
793 const DWARFDebugLine::LineTable
*
794 DWARFContext::getLineTableForUnit(DWARFUnit
*U
) {
795 Expected
<const DWARFDebugLine::LineTable
*> ExpectedLineTable
=
796 getLineTableForUnit(U
, dumpWarning
);
797 if (!ExpectedLineTable
) {
798 dumpWarning(ExpectedLineTable
.takeError());
801 return *ExpectedLineTable
;
804 Expected
<const DWARFDebugLine::LineTable
*> DWARFContext::getLineTableForUnit(
805 DWARFUnit
*U
, std::function
<void(Error
)> RecoverableErrorCallback
) {
807 Line
.reset(new DWARFDebugLine
);
809 auto UnitDIE
= U
->getUnitDIE();
813 auto Offset
= toSectionOffset(UnitDIE
.find(DW_AT_stmt_list
));
815 return nullptr; // No line table for this compile unit.
817 uint32_t stmtOffset
= *Offset
+ U
->getLineTableOffset();
818 // See if the line table is cached.
819 if (const DWARFLineTable
*lt
= Line
->getLineTable(stmtOffset
))
822 // Make sure the offset is good before we try to parse.
823 if (stmtOffset
>= U
->getLineSection().Data
.size())
826 // We have to parse it first.
827 DWARFDataExtractor
lineData(*DObj
, U
->getLineSection(), isLittleEndian(),
828 U
->getAddressByteSize());
829 return Line
->getOrParseLineTable(lineData
, stmtOffset
, *this, U
,
830 RecoverableErrorCallback
);
833 void DWARFContext::parseNormalUnits() {
834 if (!NormalUnits
.empty())
836 NormalUnits
.addUnitsForSection(*this, DObj
->getInfoSection(), DW_SECT_INFO
);
837 NormalUnits
.finishedInfoUnits();
838 DObj
->forEachTypesSections([&](const DWARFSection
&S
) {
839 NormalUnits
.addUnitsForSection(*this, S
, DW_SECT_TYPES
);
843 void DWARFContext::parseDWOUnits(bool Lazy
) {
844 if (!DWOUnits
.empty())
846 DWOUnits
.addUnitsForDWOSection(*this, DObj
->getInfoDWOSection(), DW_SECT_INFO
,
848 DWOUnits
.finishedInfoUnits();
849 DObj
->forEachTypesDWOSections([&](const DWARFSection
&S
) {
850 DWOUnits
.addUnitsForDWOSection(*this, S
, DW_SECT_TYPES
, Lazy
);
854 DWARFCompileUnit
*DWARFContext::getCompileUnitForOffset(uint32_t Offset
) {
856 return dyn_cast_or_null
<DWARFCompileUnit
>(
857 NormalUnits
.getUnitForOffset(Offset
));
860 DWARFCompileUnit
*DWARFContext::getCompileUnitForAddress(uint64_t Address
) {
861 // First, get the offset of the compile unit.
862 uint32_t CUOffset
= getDebugAranges()->findAddress(Address
);
863 // Retrieve the compile unit.
864 return getCompileUnitForOffset(CUOffset
);
867 DWARFContext::DIEsForAddress
DWARFContext::getDIEsForAddress(uint64_t Address
) {
868 DIEsForAddress Result
;
870 DWARFCompileUnit
*CU
= getCompileUnitForAddress(Address
);
874 Result
.CompileUnit
= CU
;
875 Result
.FunctionDIE
= CU
->getSubroutineForAddress(Address
);
877 std::vector
<DWARFDie
> Worklist
;
878 Worklist
.push_back(Result
.FunctionDIE
);
879 while (!Worklist
.empty()) {
880 DWARFDie DIE
= Worklist
.back();
883 if (DIE
.getTag() == DW_TAG_lexical_block
&&
884 DIE
.addressRangeContainsAddress(Address
)) {
885 Result
.BlockDIE
= DIE
;
889 for (auto Child
: DIE
)
890 Worklist
.push_back(Child
);
896 static bool getFunctionNameAndStartLineForAddress(DWARFCompileUnit
*CU
,
898 FunctionNameKind Kind
,
899 std::string
&FunctionName
,
900 uint32_t &StartLine
) {
901 // The address may correspond to instruction in some inlined function,
902 // so we have to build the chain of inlined functions and take the
903 // name of the topmost function in it.
904 SmallVector
<DWARFDie
, 4> InlinedChain
;
905 CU
->getInlinedChainForAddress(Address
, InlinedChain
);
906 if (InlinedChain
.empty())
909 const DWARFDie
&DIE
= InlinedChain
[0];
910 bool FoundResult
= false;
911 const char *Name
= nullptr;
912 if (Kind
!= FunctionNameKind::None
&& (Name
= DIE
.getSubroutineName(Kind
))) {
916 if (auto DeclLineResult
= DIE
.getDeclLine()) {
917 StartLine
= DeclLineResult
;
924 DILineInfo
DWARFContext::getLineInfoForAddress(uint64_t Address
,
925 DILineInfoSpecifier Spec
) {
928 DWARFCompileUnit
*CU
= getCompileUnitForAddress(Address
);
931 getFunctionNameAndStartLineForAddress(CU
, Address
, Spec
.FNKind
,
934 if (Spec
.FLIKind
!= FileLineInfoKind::None
) {
935 if (const DWARFLineTable
*LineTable
= getLineTableForUnit(CU
))
936 LineTable
->getFileLineInfoForAddress(Address
, CU
->getCompilationDir(),
937 Spec
.FLIKind
, Result
);
943 DWARFContext::getLineInfoForAddressRange(uint64_t Address
, uint64_t Size
,
944 DILineInfoSpecifier Spec
) {
945 DILineInfoTable Lines
;
946 DWARFCompileUnit
*CU
= getCompileUnitForAddress(Address
);
950 std::string FunctionName
= "<invalid>";
951 uint32_t StartLine
= 0;
952 getFunctionNameAndStartLineForAddress(CU
, Address
, Spec
.FNKind
, FunctionName
,
955 // If the Specifier says we don't need FileLineInfo, just
956 // return the top-most function at the starting address.
957 if (Spec
.FLIKind
== FileLineInfoKind::None
) {
959 Result
.FunctionName
= FunctionName
;
960 Result
.StartLine
= StartLine
;
961 Lines
.push_back(std::make_pair(Address
, Result
));
965 const DWARFLineTable
*LineTable
= getLineTableForUnit(CU
);
967 // Get the index of row we're looking for in the line table.
968 std::vector
<uint32_t> RowVector
;
969 if (!LineTable
->lookupAddressRange(Address
, Size
, RowVector
))
972 for (uint32_t RowIndex
: RowVector
) {
973 // Take file number and line/column from the row.
974 const DWARFDebugLine::Row
&Row
= LineTable
->Rows
[RowIndex
];
976 LineTable
->getFileNameByIndex(Row
.File
, CU
->getCompilationDir(),
977 Spec
.FLIKind
, Result
.FileName
);
978 Result
.FunctionName
= FunctionName
;
979 Result
.Line
= Row
.Line
;
980 Result
.Column
= Row
.Column
;
981 Result
.StartLine
= StartLine
;
982 Lines
.push_back(std::make_pair(Row
.Address
, Result
));
989 DWARFContext::getInliningInfoForAddress(uint64_t Address
,
990 DILineInfoSpecifier Spec
) {
991 DIInliningInfo InliningInfo
;
993 DWARFCompileUnit
*CU
= getCompileUnitForAddress(Address
);
997 const DWARFLineTable
*LineTable
= nullptr;
998 SmallVector
<DWARFDie
, 4> InlinedChain
;
999 CU
->getInlinedChainForAddress(Address
, InlinedChain
);
1000 if (InlinedChain
.size() == 0) {
1001 // If there is no DIE for address (e.g. it is in unavailable .dwo file),
1002 // try to at least get file/line info from symbol table.
1003 if (Spec
.FLIKind
!= FileLineInfoKind::None
) {
1005 LineTable
= getLineTableForUnit(CU
);
1007 LineTable
->getFileLineInfoForAddress(Address
, CU
->getCompilationDir(),
1008 Spec
.FLIKind
, Frame
))
1009 InliningInfo
.addFrame(Frame
);
1011 return InliningInfo
;
1014 uint32_t CallFile
= 0, CallLine
= 0, CallColumn
= 0, CallDiscriminator
= 0;
1015 for (uint32_t i
= 0, n
= InlinedChain
.size(); i
!= n
; i
++) {
1016 DWARFDie
&FunctionDIE
= InlinedChain
[i
];
1018 // Get function name if necessary.
1019 if (const char *Name
= FunctionDIE
.getSubroutineName(Spec
.FNKind
))
1020 Frame
.FunctionName
= Name
;
1021 if (auto DeclLineResult
= FunctionDIE
.getDeclLine())
1022 Frame
.StartLine
= DeclLineResult
;
1023 if (Spec
.FLIKind
!= FileLineInfoKind::None
) {
1025 // For the topmost frame, initialize the line table of this
1026 // compile unit and fetch file/line info from it.
1027 LineTable
= getLineTableForUnit(CU
);
1028 // For the topmost routine, get file/line info from line table.
1030 LineTable
->getFileLineInfoForAddress(Address
, CU
->getCompilationDir(),
1031 Spec
.FLIKind
, Frame
);
1033 // Otherwise, use call file, call line and call column from
1034 // previous DIE in inlined chain.
1036 LineTable
->getFileNameByIndex(CallFile
, CU
->getCompilationDir(),
1037 Spec
.FLIKind
, Frame
.FileName
);
1038 Frame
.Line
= CallLine
;
1039 Frame
.Column
= CallColumn
;
1040 Frame
.Discriminator
= CallDiscriminator
;
1042 // Get call file/line/column of a current DIE.
1044 FunctionDIE
.getCallerFrame(CallFile
, CallLine
, CallColumn
,
1048 InliningInfo
.addFrame(Frame
);
1050 return InliningInfo
;
1053 std::shared_ptr
<DWARFContext
>
1054 DWARFContext::getDWOContext(StringRef AbsolutePath
) {
1055 if (auto S
= DWP
.lock()) {
1056 DWARFContext
*Ctxt
= S
->Context
.get();
1057 return std::shared_ptr
<DWARFContext
>(std::move(S
), Ctxt
);
1060 std::weak_ptr
<DWOFile
> *Entry
= &DWOFiles
[AbsolutePath
];
1062 if (auto S
= Entry
->lock()) {
1063 DWARFContext
*Ctxt
= S
->Context
.get();
1064 return std::shared_ptr
<DWARFContext
>(std::move(S
), Ctxt
);
1067 Expected
<OwningBinary
<ObjectFile
>> Obj
= [&] {
1068 if (!CheckedForDWP
) {
1069 SmallString
<128> DWPName
;
1070 auto Obj
= object::ObjectFile::createObjectFile(
1071 this->DWPName
.empty()
1072 ? (DObj
->getFileName() + ".dwp").toStringRef(DWPName
)
1073 : StringRef(this->DWPName
));
1078 CheckedForDWP
= true;
1079 // TODO: Should this error be handled (maybe in a high verbosity mode)
1080 // before falling back to .dwo files?
1081 consumeError(Obj
.takeError());
1085 return object::ObjectFile::createObjectFile(AbsolutePath
);
1089 // TODO: Actually report errors helpfully.
1090 consumeError(Obj
.takeError());
1094 auto S
= std::make_shared
<DWOFile
>();
1095 S
->File
= std::move(Obj
.get());
1096 S
->Context
= DWARFContext::create(*S
->File
.getBinary());
1098 auto *Ctxt
= S
->Context
.get();
1099 return std::shared_ptr
<DWARFContext
>(std::move(S
), Ctxt
);
1102 static Error
createError(const Twine
&Reason
, llvm::Error E
) {
1103 return make_error
<StringError
>(Reason
+ toString(std::move(E
)),
1104 inconvertibleErrorCode());
1107 /// SymInfo contains information about symbol: it's address
1108 /// and section index which is -1LL for absolute symbols.
1111 uint64_t SectionIndex
;
1114 /// Returns the address of symbol relocation used against and a section index.
1115 /// Used for futher relocations computation. Symbol's section load address is
1116 static Expected
<SymInfo
> getSymbolInfo(const object::ObjectFile
&Obj
,
1117 const RelocationRef
&Reloc
,
1118 const LoadedObjectInfo
*L
,
1119 std::map
<SymbolRef
, SymInfo
> &Cache
) {
1120 SymInfo Ret
= {0, (uint64_t)-1LL};
1121 object::section_iterator RSec
= Obj
.section_end();
1122 object::symbol_iterator Sym
= Reloc
.getSymbol();
1124 std::map
<SymbolRef
, SymInfo
>::iterator CacheIt
= Cache
.end();
1125 // First calculate the address of the symbol or section as it appears
1126 // in the object file
1127 if (Sym
!= Obj
.symbol_end()) {
1129 std::tie(CacheIt
, New
) = Cache
.insert({*Sym
, {0, 0}});
1131 return CacheIt
->second
;
1133 Expected
<uint64_t> SymAddrOrErr
= Sym
->getAddress();
1135 return createError("failed to compute symbol address: ",
1136 SymAddrOrErr
.takeError());
1138 // Also remember what section this symbol is in for later
1139 auto SectOrErr
= Sym
->getSection();
1141 return createError("failed to get symbol section: ",
1142 SectOrErr
.takeError());
1145 Ret
.Address
= *SymAddrOrErr
;
1146 } else if (auto *MObj
= dyn_cast
<MachOObjectFile
>(&Obj
)) {
1147 RSec
= MObj
->getRelocationSection(Reloc
.getRawDataRefImpl());
1148 Ret
.Address
= RSec
->getAddress();
1151 if (RSec
!= Obj
.section_end())
1152 Ret
.SectionIndex
= RSec
->getIndex();
1154 // If we are given load addresses for the sections, we need to adjust:
1155 // SymAddr = (Address of Symbol Or Section in File) -
1156 // (Address of Section in File) +
1157 // (Load Address of Section)
1158 // RSec is now either the section being targeted or the section
1159 // containing the symbol being targeted. In either case,
1160 // we need to perform the same computation.
1161 if (L
&& RSec
!= Obj
.section_end())
1162 if (uint64_t SectionLoadAddress
= L
->getSectionLoadAddress(*RSec
))
1163 Ret
.Address
+= SectionLoadAddress
- RSec
->getAddress();
1165 if (CacheIt
!= Cache
.end())
1166 CacheIt
->second
= Ret
;
1171 static bool isRelocScattered(const object::ObjectFile
&Obj
,
1172 const RelocationRef
&Reloc
) {
1173 const MachOObjectFile
*MachObj
= dyn_cast
<MachOObjectFile
>(&Obj
);
1176 // MachO also has relocations that point to sections and
1177 // scattered relocations.
1178 auto RelocInfo
= MachObj
->getRelocation(Reloc
.getRawDataRefImpl());
1179 return MachObj
->isRelocationScattered(RelocInfo
);
1182 ErrorPolicy
DWARFContext::defaultErrorHandler(Error E
) {
1183 WithColor::error() << toString(std::move(E
)) << '\n';
1184 return ErrorPolicy::Continue
;
1188 struct DWARFSectionMap final
: public DWARFSection
{
1189 RelocAddrMap Relocs
;
1192 class DWARFObjInMemory final
: public DWARFObject
{
1193 bool IsLittleEndian
;
1194 uint8_t AddressSize
;
1196 const object::ObjectFile
*Obj
= nullptr;
1197 std::vector
<SectionName
> SectionNames
;
1199 using TypeSectionMap
= MapVector
<object::SectionRef
, DWARFSectionMap
,
1200 std::map
<object::SectionRef
, unsigned>>;
1202 TypeSectionMap TypesSections
;
1203 TypeSectionMap TypesDWOSections
;
1205 DWARFSectionMap InfoSection
;
1206 DWARFSectionMap LocSection
;
1207 DWARFSectionMap LineSection
;
1208 DWARFSectionMap RangeSection
;
1209 DWARFSectionMap RnglistsSection
;
1210 DWARFSectionMap StringOffsetSection
;
1211 DWARFSectionMap InfoDWOSection
;
1212 DWARFSectionMap LineDWOSection
;
1213 DWARFSectionMap LocDWOSection
;
1214 DWARFSectionMap StringOffsetDWOSection
;
1215 DWARFSectionMap RangeDWOSection
;
1216 DWARFSectionMap RnglistsDWOSection
;
1217 DWARFSectionMap AddrSection
;
1218 DWARFSectionMap AppleNamesSection
;
1219 DWARFSectionMap AppleTypesSection
;
1220 DWARFSectionMap AppleNamespacesSection
;
1221 DWARFSectionMap AppleObjCSection
;
1222 DWARFSectionMap DebugNamesSection
;
1224 DWARFSectionMap
*mapNameToDWARFSection(StringRef Name
) {
1225 return StringSwitch
<DWARFSectionMap
*>(Name
)
1226 .Case("debug_info", &InfoSection
)
1227 .Case("debug_loc", &LocSection
)
1228 .Case("debug_line", &LineSection
)
1229 .Case("debug_str_offsets", &StringOffsetSection
)
1230 .Case("debug_ranges", &RangeSection
)
1231 .Case("debug_rnglists", &RnglistsSection
)
1232 .Case("debug_info.dwo", &InfoDWOSection
)
1233 .Case("debug_loc.dwo", &LocDWOSection
)
1234 .Case("debug_line.dwo", &LineDWOSection
)
1235 .Case("debug_names", &DebugNamesSection
)
1236 .Case("debug_rnglists.dwo", &RnglistsDWOSection
)
1237 .Case("debug_str_offsets.dwo", &StringOffsetDWOSection
)
1238 .Case("debug_addr", &AddrSection
)
1239 .Case("apple_names", &AppleNamesSection
)
1240 .Case("apple_types", &AppleTypesSection
)
1241 .Case("apple_namespaces", &AppleNamespacesSection
)
1242 .Case("apple_namespac", &AppleNamespacesSection
)
1243 .Case("apple_objc", &AppleObjCSection
)
1247 StringRef AbbrevSection
;
1248 StringRef ARangeSection
;
1249 StringRef DebugFrameSection
;
1250 StringRef EHFrameSection
;
1251 StringRef StringSection
;
1252 StringRef MacinfoSection
;
1253 StringRef PubNamesSection
;
1254 StringRef PubTypesSection
;
1255 StringRef GnuPubNamesSection
;
1256 StringRef AbbrevDWOSection
;
1257 StringRef StringDWOSection
;
1258 StringRef GnuPubTypesSection
;
1259 StringRef CUIndexSection
;
1260 StringRef GdbIndexSection
;
1261 StringRef TUIndexSection
;
1262 StringRef LineStringSection
;
1264 // A deque holding section data whose iterators are not invalidated when
1265 // new decompressed sections are inserted at the end.
1266 std::deque
<SmallString
<0>> UncompressedSections
;
1268 StringRef
*mapSectionToMember(StringRef Name
) {
1269 if (DWARFSection
*Sec
= mapNameToDWARFSection(Name
))
1271 return StringSwitch
<StringRef
*>(Name
)
1272 .Case("debug_abbrev", &AbbrevSection
)
1273 .Case("debug_aranges", &ARangeSection
)
1274 .Case("debug_frame", &DebugFrameSection
)
1275 .Case("eh_frame", &EHFrameSection
)
1276 .Case("debug_str", &StringSection
)
1277 .Case("debug_macinfo", &MacinfoSection
)
1278 .Case("debug_pubnames", &PubNamesSection
)
1279 .Case("debug_pubtypes", &PubTypesSection
)
1280 .Case("debug_gnu_pubnames", &GnuPubNamesSection
)
1281 .Case("debug_gnu_pubtypes", &GnuPubTypesSection
)
1282 .Case("debug_abbrev.dwo", &AbbrevDWOSection
)
1283 .Case("debug_str.dwo", &StringDWOSection
)
1284 .Case("debug_cu_index", &CUIndexSection
)
1285 .Case("debug_tu_index", &TUIndexSection
)
1286 .Case("gdb_index", &GdbIndexSection
)
1287 .Case("debug_line_str", &LineStringSection
)
1288 // Any more debug info sections go here.
1292 /// If Sec is compressed section, decompresses and updates its contents
1293 /// provided by Data. Otherwise leaves it unchanged.
1294 Error
maybeDecompress(const object::SectionRef
&Sec
, StringRef Name
,
1296 if (!Decompressor::isCompressed(Sec
))
1297 return Error::success();
1299 Expected
<Decompressor
> Decompressor
=
1300 Decompressor::create(Name
, Data
, IsLittleEndian
, AddressSize
== 8);
1302 return Decompressor
.takeError();
1305 if (auto Err
= Decompressor
->resizeAndDecompress(Out
))
1308 UncompressedSections
.push_back(std::move(Out
));
1309 Data
= UncompressedSections
.back();
1311 return Error::success();
1315 DWARFObjInMemory(const StringMap
<std::unique_ptr
<MemoryBuffer
>> &Sections
,
1316 uint8_t AddrSize
, bool IsLittleEndian
)
1317 : IsLittleEndian(IsLittleEndian
) {
1318 for (const auto &SecIt
: Sections
) {
1319 if (StringRef
*SectionData
= mapSectionToMember(SecIt
.first()))
1320 *SectionData
= SecIt
.second
->getBuffer();
1323 DWARFObjInMemory(const object::ObjectFile
&Obj
, const LoadedObjectInfo
*L
,
1324 function_ref
<ErrorPolicy(Error
)> HandleError
)
1325 : IsLittleEndian(Obj
.isLittleEndian()),
1326 AddressSize(Obj
.getBytesInAddress()), FileName(Obj
.getFileName()),
1329 StringMap
<unsigned> SectionAmountMap
;
1330 for (const SectionRef
&Section
: Obj
.sections()) {
1332 Section
.getName(Name
);
1333 ++SectionAmountMap
[Name
];
1334 SectionNames
.push_back({ Name
, true });
1336 // Skip BSS and Virtual sections, they aren't interesting.
1337 if (Section
.isBSS() || Section
.isVirtual())
1340 // Skip sections stripped by dsymutil.
1341 if (Section
.isStripped())
1345 section_iterator RelocatedSection
= Section
.getRelocatedSection();
1346 // Try to obtain an already relocated version of this section.
1347 // Else use the unrelocated section from the object file. We'll have to
1348 // apply relocations ourselves later.
1349 if (!L
|| !L
->getLoadedSectionContents(*RelocatedSection
, Data
))
1350 Section
.getContents(Data
);
1352 if (auto Err
= maybeDecompress(Section
, Name
, Data
)) {
1353 ErrorPolicy EP
= HandleError(createError(
1354 "failed to decompress '" + Name
+ "', ", std::move(Err
)));
1355 if (EP
== ErrorPolicy::Halt
)
1360 // Compressed sections names in GNU style starts from ".z",
1361 // at this point section is decompressed and we drop compression prefix.
1363 Name
.find_first_not_of("._z")); // Skip ".", "z" and "_" prefixes.
1365 // Map platform specific debug section names to DWARF standard section
1367 Name
= Obj
.mapDebugSectionName(Name
);
1369 if (StringRef
*SectionData
= mapSectionToMember(Name
)) {
1370 *SectionData
= Data
;
1371 if (Name
== "debug_ranges") {
1372 // FIXME: Use the other dwo range section when we emit it.
1373 RangeDWOSection
.Data
= Data
;
1375 } else if (Name
== "debug_types") {
1376 // Find debug_types data by section rather than name as there are
1377 // multiple, comdat grouped, debug_types sections.
1378 TypesSections
[Section
].Data
= Data
;
1379 } else if (Name
== "debug_types.dwo") {
1380 TypesDWOSections
[Section
].Data
= Data
;
1383 if (RelocatedSection
== Obj
.section_end())
1386 StringRef RelSecName
;
1387 StringRef RelSecData
;
1388 RelocatedSection
->getName(RelSecName
);
1390 // If the section we're relocating was relocated already by the JIT,
1391 // then we used the relocated version above, so we do not need to process
1392 // relocations for it now.
1393 if (L
&& L
->getLoadedSectionContents(*RelocatedSection
, RelSecData
))
1396 // In Mach-o files, the relocations do not need to be applied if
1397 // there is no load offset to apply. The value read at the
1398 // relocation point already factors in the section address
1399 // (actually applying the relocations will produce wrong results
1400 // as the section address will be added twice).
1401 if (!L
&& isa
<MachOObjectFile
>(&Obj
))
1404 RelSecName
= RelSecName
.substr(
1405 RelSecName
.find_first_not_of("._z")); // Skip . and _ prefixes.
1407 // TODO: Add support for relocations in other sections as needed.
1408 // Record relocations for the debug_info and debug_line sections.
1409 DWARFSectionMap
*Sec
= mapNameToDWARFSection(RelSecName
);
1410 RelocAddrMap
*Map
= Sec
? &Sec
->Relocs
: nullptr;
1412 // Find debug_types relocs by section rather than name as there are
1413 // multiple, comdat grouped, debug_types sections.
1414 if (RelSecName
== "debug_types")
1416 &static_cast<DWARFSectionMap
&>(TypesSections
[*RelocatedSection
])
1418 else if (RelSecName
== "debug_types.dwo")
1419 Map
= &static_cast<DWARFSectionMap
&>(
1420 TypesDWOSections
[*RelocatedSection
])
1426 if (Section
.relocation_begin() == Section
.relocation_end())
1429 // Symbol to [address, section index] cache mapping.
1430 std::map
<SymbolRef
, SymInfo
> AddrCache
;
1431 for (const RelocationRef
&Reloc
: Section
.relocations()) {
1432 // FIXME: it's not clear how to correctly handle scattered
1434 if (isRelocScattered(Obj
, Reloc
))
1437 Expected
<SymInfo
> SymInfoOrErr
=
1438 getSymbolInfo(Obj
, Reloc
, L
, AddrCache
);
1439 if (!SymInfoOrErr
) {
1440 if (HandleError(SymInfoOrErr
.takeError()) == ErrorPolicy::Halt
)
1445 object::RelocVisitor
V(Obj
);
1446 uint64_t Val
= V
.visit(Reloc
.getType(), Reloc
, SymInfoOrErr
->Address
);
1448 SmallString
<32> Type
;
1449 Reloc
.getTypeName(Type
);
1450 ErrorPolicy EP
= HandleError(
1451 createError("failed to compute relocation: " + Type
+ ", ",
1452 errorCodeToError(object_error::parse_failed
)));
1453 if (EP
== ErrorPolicy::Halt
)
1457 RelocAddrEntry Rel
= {SymInfoOrErr
->SectionIndex
, Val
};
1458 Map
->insert({Reloc
.getOffset(), Rel
});
1462 for (SectionName
&S
: SectionNames
)
1463 if (SectionAmountMap
[S
.Name
] > 1)
1464 S
.IsNameUnique
= false;
1467 Optional
<RelocAddrEntry
> find(const DWARFSection
&S
,
1468 uint64_t Pos
) const override
{
1469 auto &Sec
= static_cast<const DWARFSectionMap
&>(S
);
1470 RelocAddrMap::const_iterator AI
= Sec
.Relocs
.find(Pos
);
1471 if (AI
== Sec
.Relocs
.end())
1476 const object::ObjectFile
*getFile() const override
{ return Obj
; }
1478 ArrayRef
<SectionName
> getSectionNames() const override
{
1479 return SectionNames
;
1482 bool isLittleEndian() const override
{ return IsLittleEndian
; }
1483 StringRef
getAbbrevDWOSection() const override
{ return AbbrevDWOSection
; }
1484 const DWARFSection
&getLineDWOSection() const override
{
1485 return LineDWOSection
;
1487 const DWARFSection
&getLocDWOSection() const override
{
1488 return LocDWOSection
;
1490 StringRef
getStringDWOSection() const override
{ return StringDWOSection
; }
1491 const DWARFSection
&getStringOffsetDWOSection() const override
{
1492 return StringOffsetDWOSection
;
1494 const DWARFSection
&getRangeDWOSection() const override
{
1495 return RangeDWOSection
;
1497 const DWARFSection
&getRnglistsDWOSection() const override
{
1498 return RnglistsDWOSection
;
1500 const DWARFSection
&getAddrSection() const override
{ return AddrSection
; }
1501 StringRef
getCUIndexSection() const override
{ return CUIndexSection
; }
1502 StringRef
getGdbIndexSection() const override
{ return GdbIndexSection
; }
1503 StringRef
getTUIndexSection() const override
{ return TUIndexSection
; }
1506 const DWARFSection
&getStringOffsetSection() const override
{
1507 return StringOffsetSection
;
1509 StringRef
getLineStringSection() const override
{ return LineStringSection
; }
1511 // Sections for DWARF5 split dwarf proposal.
1512 const DWARFSection
&getInfoDWOSection() const override
{
1513 return InfoDWOSection
;
1515 void forEachTypesDWOSections(
1516 function_ref
<void(const DWARFSection
&)> F
) const override
{
1517 for (auto &P
: TypesDWOSections
)
1521 StringRef
getAbbrevSection() const override
{ return AbbrevSection
; }
1522 const DWARFSection
&getLocSection() const override
{ return LocSection
; }
1523 StringRef
getARangeSection() const override
{ return ARangeSection
; }
1524 StringRef
getDebugFrameSection() const override
{ return DebugFrameSection
; }
1525 StringRef
getEHFrameSection() const override
{ return EHFrameSection
; }
1526 const DWARFSection
&getLineSection() const override
{ return LineSection
; }
1527 StringRef
getStringSection() const override
{ return StringSection
; }
1528 const DWARFSection
&getRangeSection() const override
{ return RangeSection
; }
1529 const DWARFSection
&getRnglistsSection() const override
{
1530 return RnglistsSection
;
1532 StringRef
getMacinfoSection() const override
{ return MacinfoSection
; }
1533 StringRef
getPubNamesSection() const override
{ return PubNamesSection
; }
1534 StringRef
getPubTypesSection() const override
{ return PubTypesSection
; }
1535 StringRef
getGnuPubNamesSection() const override
{
1536 return GnuPubNamesSection
;
1538 StringRef
getGnuPubTypesSection() const override
{
1539 return GnuPubTypesSection
;
1541 const DWARFSection
&getAppleNamesSection() const override
{
1542 return AppleNamesSection
;
1544 const DWARFSection
&getAppleTypesSection() const override
{
1545 return AppleTypesSection
;
1547 const DWARFSection
&getAppleNamespacesSection() const override
{
1548 return AppleNamespacesSection
;
1550 const DWARFSection
&getAppleObjCSection() const override
{
1551 return AppleObjCSection
;
1553 const DWARFSection
&getDebugNamesSection() const override
{
1554 return DebugNamesSection
;
1557 StringRef
getFileName() const override
{ return FileName
; }
1558 uint8_t getAddressSize() const override
{ return AddressSize
; }
1559 const DWARFSection
&getInfoSection() const override
{ return InfoSection
; }
1560 void forEachTypesSections(
1561 function_ref
<void(const DWARFSection
&)> F
) const override
{
1562 for (auto &P
: TypesSections
)
1568 std::unique_ptr
<DWARFContext
>
1569 DWARFContext::create(const object::ObjectFile
&Obj
, const LoadedObjectInfo
*L
,
1570 function_ref
<ErrorPolicy(Error
)> HandleError
,
1571 std::string DWPName
) {
1572 auto DObj
= llvm::make_unique
<DWARFObjInMemory
>(Obj
, L
, HandleError
);
1573 return llvm::make_unique
<DWARFContext
>(std::move(DObj
), std::move(DWPName
));
1576 std::unique_ptr
<DWARFContext
>
1577 DWARFContext::create(const StringMap
<std::unique_ptr
<MemoryBuffer
>> &Sections
,
1578 uint8_t AddrSize
, bool isLittleEndian
) {
1580 llvm::make_unique
<DWARFObjInMemory
>(Sections
, AddrSize
, isLittleEndian
);
1581 return llvm::make_unique
<DWARFContext
>(std::move(DObj
), "");
1584 Error
DWARFContext::loadRegisterInfo(const object::ObjectFile
&Obj
) {
1585 // Detect the architecture from the object file. We usually don't need OS
1586 // info to lookup a target and create register info.
1588 TT
.setArch(Triple::ArchType(Obj
.getArch()));
1589 TT
.setVendor(Triple::UnknownVendor
);
1590 TT
.setOS(Triple::UnknownOS
);
1591 std::string TargetLookupError
;
1592 const Target
*TheTarget
=
1593 TargetRegistry::lookupTarget(TT
.str(), TargetLookupError
);
1594 if (!TargetLookupError
.empty())
1595 return createStringError(errc::invalid_argument
,
1596 TargetLookupError
.c_str());
1597 RegInfo
.reset(TheTarget
->createMCRegInfo(TT
.str()));
1598 return Error::success();
1601 uint8_t DWARFContext::getCUAddrSize() {
1602 // In theory, different compile units may have different address byte
1603 // sizes, but for simplicity we just use the address byte size of the
1604 // last compile unit. In practice the address size field is repeated across
1605 // various DWARF headers (at least in version 5) to make it easier to dump
1606 // them independently, not to enable varying the address size.
1608 for (const auto &CU
: compile_units()) {
1609 Addr
= CU
->getAddressByteSize();
1615 void DWARFContext::dumpWarning(Error Warning
) {
1616 handleAllErrors(std::move(Warning
), [](ErrorInfoBase
&Info
) {
1617 WithColor::warning() << Info
.message() << '\n';