819fc142e50a92abdc66b23c797328c85f5ac45c
[oota-llvm.git] / lib / DebugInfo / DWARFContext.cpp
1 //===-- DWARFContext.cpp --------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "DWARFContext.h"
11 #include "DWARFDebugArangeSet.h"
12
13 #include "llvm/ADT/SmallString.h"
14 #include "llvm/ADT/StringSwitch.h"
15 #include "llvm/Support/Compression.h"
16 #include "llvm/Support/Dwarf.h"
17 #include "llvm/Support/Format.h"
18 #include "llvm/Support/Path.h"
19 #include "llvm/Support/raw_ostream.h"
20 #include <algorithm>
21 using namespace llvm;
22 using namespace dwarf;
23 using namespace object;
24
25 #define DEBUG_TYPE "dwarf"
26
27 typedef DWARFDebugLine::LineTable DWARFLineTable;
28 typedef DILineInfoSpecifier::FileLineInfoKind FileLineInfoKind;
29 typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind;
30
31 static void dumpPubSection(raw_ostream &OS, StringRef Name, StringRef Data,
32                            bool LittleEndian, bool GnuStyle) {
33   OS << "\n." << Name << " contents:\n";
34   DataExtractor pubNames(Data, LittleEndian, 0);
35   uint32_t offset = 0;
36   while (pubNames.isValidOffset(offset)) {
37     OS << "length = " << format("0x%08x", pubNames.getU32(&offset));
38     OS << " version = " << format("0x%04x", pubNames.getU16(&offset));
39     OS << " unit_offset = " << format("0x%08x", pubNames.getU32(&offset));
40     OS << " unit_size = " << format("0x%08x", pubNames.getU32(&offset)) << '\n';
41     if (GnuStyle)
42       OS << "Offset     Linkage  Kind     Name\n";
43     else
44       OS << "Offset     Name\n";
45
46     while (offset < Data.size()) {
47       uint32_t dieRef = pubNames.getU32(&offset);
48       if (dieRef == 0)
49         break;
50       OS << format("0x%8.8x ", dieRef);
51       if (GnuStyle) {
52         PubIndexEntryDescriptor desc(pubNames.getU8(&offset));
53         OS << format("%-8s", dwarf::GDBIndexEntryLinkageString(desc.Linkage))
54            << ' ' << format("%-8s", dwarf::GDBIndexEntryKindString(desc.Kind))
55            << ' ';
56       }
57       OS << '\"' << pubNames.getCStr(&offset) << "\"\n";
58     }
59   }
60 }
61
62 void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) {
63   if (DumpType == DIDT_All || DumpType == DIDT_Abbrev) {
64     OS << ".debug_abbrev contents:\n";
65     getDebugAbbrev()->dump(OS);
66   }
67
68   if (DumpType == DIDT_All || DumpType == DIDT_AbbrevDwo)
69     if (const DWARFDebugAbbrev *D = getDebugAbbrevDWO()) {
70       OS << "\n.debug_abbrev.dwo contents:\n";
71       D->dump(OS);
72     }
73
74   if (DumpType == DIDT_All || DumpType == DIDT_Info) {
75     OS << "\n.debug_info contents:\n";
76     for (const auto &CU : compile_units())
77       CU->dump(OS);
78   }
79
80   if ((DumpType == DIDT_All || DumpType == DIDT_InfoDwo) &&
81       getNumDWOCompileUnits()) {
82     OS << "\n.debug_info.dwo contents:\n";
83     for (const auto &DWOCU : dwo_compile_units())
84       DWOCU->dump(OS);
85   }
86
87   if ((DumpType == DIDT_All || DumpType == DIDT_Types) && getNumTypeUnits()) {
88     OS << "\n.debug_types contents:\n";
89     for (const auto &TUS : type_unit_sections())
90       for (const auto &TU : TUS)
91         TU->dump(OS);
92   }
93
94   if ((DumpType == DIDT_All || DumpType == DIDT_TypesDwo) &&
95       getNumDWOTypeUnits()) {
96     OS << "\n.debug_types.dwo contents:\n";
97     for (const auto &DWOTUS : dwo_type_unit_sections())
98       for (const auto &DWOTU : DWOTUS)
99         DWOTU->dump(OS);
100   }
101
102   if (DumpType == DIDT_All || DumpType == DIDT_Loc) {
103     OS << "\n.debug_loc contents:\n";
104     getDebugLoc()->dump(OS);
105   }
106
107   if (DumpType == DIDT_All || DumpType == DIDT_LocDwo) {
108     OS << "\n.debug_loc.dwo contents:\n";
109     getDebugLocDWO()->dump(OS);
110   }
111
112   if (DumpType == DIDT_All || DumpType == DIDT_Frames) {
113     OS << "\n.debug_frame contents:\n";
114     getDebugFrame()->dump(OS);
115   }
116
117   uint32_t offset = 0;
118   if (DumpType == DIDT_All || DumpType == DIDT_Aranges) {
119     OS << "\n.debug_aranges contents:\n";
120     DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0);
121     DWARFDebugArangeSet set;
122     while (set.extract(arangesData, &offset))
123       set.dump(OS);
124   }
125
126   uint8_t savedAddressByteSize = 0;
127   if (DumpType == DIDT_All || DumpType == DIDT_Line) {
128     OS << "\n.debug_line contents:\n";
129     for (const auto &CU : compile_units()) {
130       savedAddressByteSize = CU->getAddressByteSize();
131       unsigned stmtOffset =
132           CU->getCompileUnitDIE()->getAttributeValueAsSectionOffset(
133               CU.get(), DW_AT_stmt_list, -1U);
134       if (stmtOffset != -1U) {
135         DataExtractor lineData(getLineSection().Data, isLittleEndian(),
136                                savedAddressByteSize);
137         DWARFDebugLine::LineTable LineTable;
138         LineTable.parse(lineData, &getLineSection().Relocs, &stmtOffset);
139         LineTable.dump(OS);
140       }
141     }
142   }
143
144   if (DumpType == DIDT_All || DumpType == DIDT_LineDwo) {
145     OS << "\n.debug_line.dwo contents:\n";
146     unsigned stmtOffset = 0;
147     DataExtractor lineData(getLineDWOSection().Data, isLittleEndian(),
148                            savedAddressByteSize);
149     DWARFDebugLine::LineTable LineTable;
150     while (LineTable.Prologue.parse(lineData, &stmtOffset)) {
151       LineTable.dump(OS);
152       LineTable.clear();
153     }
154   }
155
156   if (DumpType == DIDT_All || DumpType == DIDT_Str) {
157     OS << "\n.debug_str contents:\n";
158     DataExtractor strData(getStringSection(), isLittleEndian(), 0);
159     offset = 0;
160     uint32_t strOffset = 0;
161     while (const char *s = strData.getCStr(&offset)) {
162       OS << format("0x%8.8x: \"%s\"\n", strOffset, s);
163       strOffset = offset;
164     }
165   }
166
167   if ((DumpType == DIDT_All || DumpType == DIDT_StrDwo) &&
168       !getStringDWOSection().empty()) {
169     OS << "\n.debug_str.dwo contents:\n";
170     DataExtractor strDWOData(getStringDWOSection(), isLittleEndian(), 0);
171     offset = 0;
172     uint32_t strDWOOffset = 0;
173     while (const char *s = strDWOData.getCStr(&offset)) {
174       OS << format("0x%8.8x: \"%s\"\n", strDWOOffset, s);
175       strDWOOffset = offset;
176     }
177   }
178
179   if (DumpType == DIDT_All || DumpType == DIDT_Ranges) {
180     OS << "\n.debug_ranges contents:\n";
181     // In fact, different compile units may have different address byte
182     // sizes, but for simplicity we just use the address byte size of the last
183     // compile unit (there is no easy and fast way to associate address range
184     // list and the compile unit it describes).
185     DataExtractor rangesData(getRangeSection(), isLittleEndian(),
186                              savedAddressByteSize);
187     offset = 0;
188     DWARFDebugRangeList rangeList;
189     while (rangeList.extract(rangesData, &offset))
190       rangeList.dump(OS);
191   }
192
193   if (DumpType == DIDT_All || DumpType == DIDT_Pubnames)
194     dumpPubSection(OS, "debug_pubnames", getPubNamesSection(),
195                    isLittleEndian(), false);
196
197   if (DumpType == DIDT_All || DumpType == DIDT_Pubtypes)
198     dumpPubSection(OS, "debug_pubtypes", getPubTypesSection(),
199                    isLittleEndian(), false);
200
201   if (DumpType == DIDT_All || DumpType == DIDT_GnuPubnames)
202     dumpPubSection(OS, "debug_gnu_pubnames", getGnuPubNamesSection(),
203                    isLittleEndian(), true /* GnuStyle */);
204
205   if (DumpType == DIDT_All || DumpType == DIDT_GnuPubtypes)
206     dumpPubSection(OS, "debug_gnu_pubtypes", getGnuPubTypesSection(),
207                    isLittleEndian(), true /* GnuStyle */);
208
209   if ((DumpType == DIDT_All || DumpType == DIDT_StrOffsetsDwo) &&
210       !getStringOffsetDWOSection().empty()) {
211     OS << "\n.debug_str_offsets.dwo contents:\n";
212     DataExtractor strOffsetExt(getStringOffsetDWOSection(), isLittleEndian(),
213                                0);
214     offset = 0;
215     uint64_t size = getStringOffsetDWOSection().size();
216     while (offset < size) {
217       OS << format("0x%8.8x: ", offset);
218       OS << format("%8.8x\n", strOffsetExt.getU32(&offset));
219     }
220   }
221 }
222
223 const DWARFDebugAbbrev *DWARFContext::getDebugAbbrev() {
224   if (Abbrev)
225     return Abbrev.get();
226
227   DataExtractor abbrData(getAbbrevSection(), isLittleEndian(), 0);
228
229   Abbrev.reset(new DWARFDebugAbbrev());
230   Abbrev->extract(abbrData);
231   return Abbrev.get();
232 }
233
234 const DWARFDebugAbbrev *DWARFContext::getDebugAbbrevDWO() {
235   if (AbbrevDWO)
236     return AbbrevDWO.get();
237
238   DataExtractor abbrData(getAbbrevDWOSection(), isLittleEndian(), 0);
239   AbbrevDWO.reset(new DWARFDebugAbbrev());
240   AbbrevDWO->extract(abbrData);
241   return AbbrevDWO.get();
242 }
243
244 const DWARFDebugLoc *DWARFContext::getDebugLoc() {
245   if (Loc)
246     return Loc.get();
247
248   DataExtractor LocData(getLocSection().Data, isLittleEndian(), 0);
249   Loc.reset(new DWARFDebugLoc(getLocSection().Relocs));
250   // assume all compile units have the same address byte size
251   if (getNumCompileUnits())
252     Loc->parse(LocData, getCompileUnitAtIndex(0)->getAddressByteSize());
253   return Loc.get();
254 }
255
256 const DWARFDebugLocDWO *DWARFContext::getDebugLocDWO() {
257   if (LocDWO)
258     return LocDWO.get();
259
260   DataExtractor LocData(getLocDWOSection().Data, isLittleEndian(), 0);
261   LocDWO.reset(new DWARFDebugLocDWO());
262   LocDWO->parse(LocData);
263   return LocDWO.get();
264 }
265
266 const DWARFDebugAranges *DWARFContext::getDebugAranges() {
267   if (Aranges)
268     return Aranges.get();
269
270   Aranges.reset(new DWARFDebugAranges());
271   Aranges->generate(this);
272   return Aranges.get();
273 }
274
275 const DWARFDebugFrame *DWARFContext::getDebugFrame() {
276   if (DebugFrame)
277     return DebugFrame.get();
278
279   // There's a "bug" in the DWARFv3 standard with respect to the target address
280   // size within debug frame sections. While DWARF is supposed to be independent
281   // of its container, FDEs have fields with size being "target address size",
282   // which isn't specified in DWARF in general. It's only specified for CUs, but
283   // .eh_frame can appear without a .debug_info section. Follow the example of
284   // other tools (libdwarf) and extract this from the container (ObjectFile
285   // provides this information). This problem is fixed in DWARFv4
286   // See this dwarf-discuss discussion for more details:
287   // http://lists.dwarfstd.org/htdig.cgi/dwarf-discuss-dwarfstd.org/2011-December/001173.html
288   DataExtractor debugFrameData(getDebugFrameSection(), isLittleEndian(),
289                                getAddressSize());
290   DebugFrame.reset(new DWARFDebugFrame());
291   DebugFrame->parse(debugFrameData);
292   return DebugFrame.get();
293 }
294
295 const DWARFLineTable *
296 DWARFContext::getLineTableForUnit(DWARFUnit *cu) {
297   if (!Line)
298     Line.reset(new DWARFDebugLine(&getLineSection().Relocs));
299
300   unsigned stmtOffset =
301       cu->getCompileUnitDIE()->getAttributeValueAsSectionOffset(
302           cu, DW_AT_stmt_list, -1U);
303   if (stmtOffset == -1U)
304     return nullptr; // No line table for this compile unit.
305
306   // See if the line table is cached.
307   if (const DWARFLineTable *lt = Line->getLineTable(stmtOffset))
308     return lt;
309
310   // We have to parse it first.
311   DataExtractor lineData(getLineSection().Data, isLittleEndian(),
312                          cu->getAddressByteSize());
313   return Line->getOrParseLineTable(lineData, stmtOffset);
314 }
315
316 void DWARFContext::parseCompileUnits() {
317   if (!CUs.empty())
318     return;
319   uint32_t offset = 0;
320   const DataExtractor &DIData = DataExtractor(getInfoSection().Data,
321                                               isLittleEndian(), 0);
322   while (DIData.isValidOffset(offset)) {
323     std::unique_ptr<DWARFCompileUnit> CU(new DWARFCompileUnit(*this,
324         getDebugAbbrev(), getInfoSection().Data, getRangeSection(),
325         getStringSection(), StringRef(), getAddrSection(),
326         &getInfoSection().Relocs, isLittleEndian(), CUs));
327     if (!CU->extract(DIData, &offset)) {
328       break;
329     }
330     CUs.push_back(std::move(CU));
331     offset = CUs.back()->getNextUnitOffset();
332   }
333 }
334
335 void DWARFContext::parseTypeUnits() {
336   if (!TUs.empty())
337     return;
338   for (const auto &I : getTypesSections()) {
339     uint32_t offset = 0;
340     const DataExtractor &DIData =
341         DataExtractor(I.second.Data, isLittleEndian(), 0);
342     TUs.push_back(DWARFUnitSection<DWARFTypeUnit>());
343     auto &TUS = TUs.back();
344     while (DIData.isValidOffset(offset)) {
345       std::unique_ptr<DWARFTypeUnit> TU(new DWARFTypeUnit(*this,
346            getDebugAbbrev(), I.second.Data, getRangeSection(),
347            getStringSection(), StringRef(), getAddrSection(),
348            &I.second.Relocs, isLittleEndian(), TUS));
349       if (!TU->extract(DIData, &offset))
350         break;
351       TUS.push_back(std::move(TU));
352       offset = TUS.back()->getNextUnitOffset();
353     }
354   }
355 }
356
357 void DWARFContext::parseDWOCompileUnits() {
358   if (!DWOCUs.empty())
359     return;
360   uint32_t offset = 0;
361   const DataExtractor &DIData =
362       DataExtractor(getInfoDWOSection().Data, isLittleEndian(), 0);
363   while (DIData.isValidOffset(offset)) {
364     std::unique_ptr<DWARFCompileUnit> DWOCU(new DWARFCompileUnit(*this,
365         getDebugAbbrevDWO(), getInfoDWOSection().Data, getRangeDWOSection(),
366         getStringDWOSection(), getStringOffsetDWOSection(), getAddrSection(),
367         &getInfoDWOSection().Relocs, isLittleEndian(), DWOCUs));
368     if (!DWOCU->extract(DIData, &offset)) {
369       break;
370     }
371     DWOCUs.push_back(std::move(DWOCU));
372     offset = DWOCUs.back()->getNextUnitOffset();
373   }
374 }
375
376 void DWARFContext::parseDWOTypeUnits() {
377   if (!DWOTUs.empty())
378     return;
379   for (const auto &I : getTypesDWOSections()) {
380     uint32_t offset = 0;
381     const DataExtractor &DIData =
382         DataExtractor(I.second.Data, isLittleEndian(), 0);
383     DWOTUs.push_back(DWARFUnitSection<DWARFTypeUnit>());
384     auto &TUS = DWOTUs.back();
385     while (DIData.isValidOffset(offset)) {
386       std::unique_ptr<DWARFTypeUnit> TU(new DWARFTypeUnit(*this,
387           getDebugAbbrevDWO(), I.second.Data, getRangeDWOSection(),
388           getStringDWOSection(), getStringOffsetDWOSection(), getAddrSection(),
389           &I.second.Relocs, isLittleEndian(), TUS));
390       if (!TU->extract(DIData, &offset))
391         break;
392       TUS.push_back(std::move(TU));
393       offset = TUS.back()->getNextUnitOffset();
394     }
395   }
396 }
397
398 DWARFCompileUnit *DWARFContext::getCompileUnitForOffset(uint32_t Offset) {
399   parseCompileUnits();
400   return CUs.getUnitForOffset(Offset);
401 }
402
403 DWARFCompileUnit *DWARFContext::getCompileUnitForAddress(uint64_t Address) {
404   // First, get the offset of the compile unit.
405   uint32_t CUOffset = getDebugAranges()->findAddress(Address);
406   // Retrieve the compile unit.
407   return getCompileUnitForOffset(CUOffset);
408 }
409
410 static bool getFunctionNameForAddress(DWARFCompileUnit *CU, uint64_t Address,
411                                       FunctionNameKind Kind,
412                                       std::string &FunctionName) {
413   if (Kind == FunctionNameKind::None)
414     return false;
415   // The address may correspond to instruction in some inlined function,
416   // so we have to build the chain of inlined functions and take the
417   // name of the topmost function in it.
418   const DWARFDebugInfoEntryInlinedChain &InlinedChain =
419       CU->getInlinedChainForAddress(Address);
420   if (InlinedChain.DIEs.size() == 0)
421     return false;
422   const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain.DIEs[0];
423   if (const char *Name =
424           TopFunctionDIE.getSubroutineName(InlinedChain.U, Kind)) {
425     FunctionName = Name;
426     return true;
427   }
428   return false;
429 }
430
431 DILineInfo DWARFContext::getLineInfoForAddress(uint64_t Address,
432                                                DILineInfoSpecifier Spec) {
433   DILineInfo Result;
434
435   DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
436   if (!CU)
437     return Result;
438   getFunctionNameForAddress(CU, Address, Spec.FNKind, Result.FunctionName);
439   if (Spec.FLIKind != FileLineInfoKind::None) {
440     if (const DWARFLineTable *LineTable = getLineTableForUnit(CU))
441       LineTable->getFileLineInfoForAddress(Address, CU->getCompilationDir(),
442                                            Spec.FLIKind, Result);
443   }
444   return Result;
445 }
446
447 DILineInfoTable
448 DWARFContext::getLineInfoForAddressRange(uint64_t Address, uint64_t Size,
449                                          DILineInfoSpecifier Spec) {
450   DILineInfoTable  Lines;
451   DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
452   if (!CU)
453     return Lines;
454
455   std::string FunctionName = "<invalid>";
456   getFunctionNameForAddress(CU, Address, Spec.FNKind, FunctionName);
457
458   // If the Specifier says we don't need FileLineInfo, just
459   // return the top-most function at the starting address.
460   if (Spec.FLIKind == FileLineInfoKind::None) {
461     DILineInfo Result;
462     Result.FunctionName = FunctionName;
463     Lines.push_back(std::make_pair(Address, Result));
464     return Lines;
465   }
466
467   const DWARFLineTable *LineTable = getLineTableForUnit(CU);
468
469   // Get the index of row we're looking for in the line table.
470   std::vector<uint32_t> RowVector;
471   if (!LineTable->lookupAddressRange(Address, Size, RowVector))
472     return Lines;
473
474   for (uint32_t RowIndex : RowVector) {
475     // Take file number and line/column from the row.
476     const DWARFDebugLine::Row &Row = LineTable->Rows[RowIndex];
477     DILineInfo Result;
478     LineTable->getFileNameByIndex(Row.File, CU->getCompilationDir(),
479                                   Spec.FLIKind, Result.FileName);
480     Result.FunctionName = FunctionName;
481     Result.Line = Row.Line;
482     Result.Column = Row.Column;
483     Lines.push_back(std::make_pair(Row.Address, Result));
484   }
485
486   return Lines;
487 }
488
489 DIInliningInfo
490 DWARFContext::getInliningInfoForAddress(uint64_t Address,
491                                         DILineInfoSpecifier Spec) {
492   DIInliningInfo InliningInfo;
493
494   DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
495   if (!CU)
496     return InliningInfo;
497
498   const DWARFLineTable *LineTable = nullptr;
499   const DWARFDebugInfoEntryInlinedChain &InlinedChain =
500       CU->getInlinedChainForAddress(Address);
501   if (InlinedChain.DIEs.size() == 0) {
502     // If there is no DIE for address (e.g. it is in unavailable .dwo file),
503     // try to at least get file/line info from symbol table.
504     if (Spec.FLIKind != FileLineInfoKind::None) {
505       DILineInfo Frame;
506       LineTable = getLineTableForUnit(CU);
507       if (LineTable &&
508           LineTable->getFileLineInfoForAddress(Address, CU->getCompilationDir(),
509                                                Spec.FLIKind, Frame))
510         InliningInfo.addFrame(Frame);
511     }
512     return InliningInfo;
513   }
514
515   uint32_t CallFile = 0, CallLine = 0, CallColumn = 0;
516   for (uint32_t i = 0, n = InlinedChain.DIEs.size(); i != n; i++) {
517     const DWARFDebugInfoEntryMinimal &FunctionDIE = InlinedChain.DIEs[i];
518     DILineInfo Frame;
519     // Get function name if necessary.
520     if (const char *Name =
521             FunctionDIE.getSubroutineName(InlinedChain.U, Spec.FNKind))
522       Frame.FunctionName = Name;
523     if (Spec.FLIKind != FileLineInfoKind::None) {
524       if (i == 0) {
525         // For the topmost frame, initialize the line table of this
526         // compile unit and fetch file/line info from it.
527         LineTable = getLineTableForUnit(CU);
528         // For the topmost routine, get file/line info from line table.
529         if (LineTable)
530           LineTable->getFileLineInfoForAddress(Address, CU->getCompilationDir(),
531                                                Spec.FLIKind, Frame);
532       } else {
533         // Otherwise, use call file, call line and call column from
534         // previous DIE in inlined chain.
535         if (LineTable)
536           LineTable->getFileNameByIndex(CallFile, CU->getCompilationDir(),
537                                         Spec.FLIKind, Frame.FileName);
538         Frame.Line = CallLine;
539         Frame.Column = CallColumn;
540       }
541       // Get call file/line/column of a current DIE.
542       if (i + 1 < n) {
543         FunctionDIE.getCallerFrame(InlinedChain.U, CallFile, CallLine,
544                                    CallColumn);
545       }
546     }
547     InliningInfo.addFrame(Frame);
548   }
549   return InliningInfo;
550 }
551
552 static bool consumeCompressedDebugSectionHeader(StringRef &data,
553                                                 uint64_t &OriginalSize) {
554   // Consume "ZLIB" prefix.
555   if (!data.startswith("ZLIB"))
556     return false;
557   data = data.substr(4);
558   // Consume uncompressed section size (big-endian 8 bytes).
559   DataExtractor extractor(data, false, 8);
560   uint32_t Offset = 0;
561   OriginalSize = extractor.getU64(&Offset);
562   if (Offset == 0)
563     return false;
564   data = data.substr(Offset);
565   return true;
566 }
567
568 DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile &Obj)
569     : IsLittleEndian(Obj.isLittleEndian()),
570       AddressSize(Obj.getBytesInAddress()) {
571   for (const SectionRef &Section : Obj.sections()) {
572     StringRef name;
573     Section.getName(name);
574     // Skip BSS and Virtual sections, they aren't interesting.
575     bool IsBSS;
576     Section.isBSS(IsBSS);
577     if (IsBSS)
578       continue;
579     bool IsVirtual;
580     Section.isVirtual(IsVirtual);
581     if (IsVirtual)
582       continue;
583     StringRef data;
584     Section.getContents(data);
585
586     name = name.substr(name.find_first_not_of("._")); // Skip . and _ prefixes.
587
588     // Check if debug info section is compressed with zlib.
589     if (name.startswith("zdebug_")) {
590       uint64_t OriginalSize;
591       if (!zlib::isAvailable() ||
592           !consumeCompressedDebugSectionHeader(data, OriginalSize))
593         continue;
594       UncompressedSections.resize(UncompressedSections.size() + 1);
595       if (zlib::uncompress(data, UncompressedSections.back(), OriginalSize) !=
596           zlib::StatusOK) {
597         UncompressedSections.pop_back();
598         continue;
599       }
600       // Make data point to uncompressed section contents and save its contents.
601       name = name.substr(1);
602       data = UncompressedSections.back();
603     }
604
605     StringRef *SectionData =
606         StringSwitch<StringRef *>(name)
607             .Case("debug_info", &InfoSection.Data)
608             .Case("debug_abbrev", &AbbrevSection)
609             .Case("debug_loc", &LocSection.Data)
610             .Case("debug_line", &LineSection.Data)
611             .Case("debug_aranges", &ARangeSection)
612             .Case("debug_frame", &DebugFrameSection)
613             .Case("debug_str", &StringSection)
614             .Case("debug_ranges", &RangeSection)
615             .Case("debug_pubnames", &PubNamesSection)
616             .Case("debug_pubtypes", &PubTypesSection)
617             .Case("debug_gnu_pubnames", &GnuPubNamesSection)
618             .Case("debug_gnu_pubtypes", &GnuPubTypesSection)
619             .Case("debug_info.dwo", &InfoDWOSection.Data)
620             .Case("debug_abbrev.dwo", &AbbrevDWOSection)
621             .Case("debug_loc.dwo", &LocDWOSection.Data)
622             .Case("debug_line.dwo", &LineDWOSection.Data)
623             .Case("debug_str.dwo", &StringDWOSection)
624             .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
625             .Case("debug_addr", &AddrSection)
626             // Any more debug info sections go here.
627             .Default(nullptr);
628     if (SectionData) {
629       *SectionData = data;
630       if (name == "debug_ranges") {
631         // FIXME: Use the other dwo range section when we emit it.
632         RangeDWOSection = data;
633       }
634     } else if (name == "debug_types") {
635       // Find debug_types data by section rather than name as there are
636       // multiple, comdat grouped, debug_types sections.
637       TypesSections[Section].Data = data;
638     } else if (name == "debug_types.dwo") {
639       TypesDWOSections[Section].Data = data;
640     }
641
642     section_iterator RelocatedSection = Section.getRelocatedSection();
643     if (RelocatedSection == Obj.section_end())
644       continue;
645
646     StringRef RelSecName;
647     RelocatedSection->getName(RelSecName);
648     RelSecName = RelSecName.substr(
649         RelSecName.find_first_not_of("._")); // Skip . and _ prefixes.
650
651     // TODO: Add support for relocations in other sections as needed.
652     // Record relocations for the debug_info and debug_line sections.
653     RelocAddrMap *Map = StringSwitch<RelocAddrMap*>(RelSecName)
654         .Case("debug_info", &InfoSection.Relocs)
655         .Case("debug_loc", &LocSection.Relocs)
656         .Case("debug_info.dwo", &InfoDWOSection.Relocs)
657         .Case("debug_line", &LineSection.Relocs)
658         .Default(nullptr);
659     if (!Map) {
660       // Find debug_types relocs by section rather than name as there are
661       // multiple, comdat grouped, debug_types sections.
662       if (RelSecName == "debug_types")
663         Map = &TypesSections[*RelocatedSection].Relocs;
664       else if (RelSecName == "debug_types.dwo")
665         Map = &TypesDWOSections[*RelocatedSection].Relocs;
666       else
667         continue;
668     }
669
670     if (Section.relocation_begin() != Section.relocation_end()) {
671       uint64_t SectionSize;
672       RelocatedSection->getSize(SectionSize);
673       for (const RelocationRef &Reloc : Section.relocations()) {
674         uint64_t Address;
675         Reloc.getOffset(Address);
676         uint64_t Type;
677         Reloc.getType(Type);
678         uint64_t SymAddr = 0;
679         // ELF relocations may need the symbol address
680         if (Obj.isELF()) {
681           object::symbol_iterator Sym = Reloc.getSymbol();
682           Sym->getAddress(SymAddr);
683         }
684
685         object::RelocVisitor V(Obj.getFileFormatName());
686         // The section address is always 0 for debug sections.
687         object::RelocToApply R(V.visit(Type, Reloc, 0, SymAddr));
688         if (V.error()) {
689           SmallString<32> Name;
690           std::error_code ec(Reloc.getTypeName(Name));
691           if (ec) {
692             errs() << "Aaaaaa! Nameless relocation! Aaaaaa!\n";
693           }
694           errs() << "error: failed to compute relocation: "
695                  << Name << "\n";
696           continue;
697         }
698
699         if (Address + R.Width > SectionSize) {
700           errs() << "error: " << R.Width << "-byte relocation starting "
701                  << Address << " bytes into section " << name << " which is "
702                  << SectionSize << " bytes long.\n";
703           continue;
704         }
705         if (R.Width > 8) {
706           errs() << "error: can't handle a relocation of more than 8 bytes at "
707                     "a time.\n";
708           continue;
709         }
710         DEBUG(dbgs() << "Writing " << format("%p", R.Value)
711                      << " at " << format("%p", Address)
712                      << " with width " << format("%d", R.Width)
713                      << "\n");
714         Map->insert(std::make_pair(Address, std::make_pair(R.Width, R.Value)));
715       }
716     }
717   }
718 }
719
720 void DWARFContextInMemory::anchor() { }