IR: MDNode => Value: Add Instruction::getMDNode()
[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   CUs.parse(*this, getInfoSection());
318 }
319
320 void DWARFContext::parseTypeUnits() {
321   if (!TUs.empty())
322     return;
323   for (const auto &I : getTypesSections()) {
324     TUs.push_back(DWARFUnitSection<DWARFTypeUnit>());
325     TUs.back().parse(*this, I.second);
326   }
327 }
328
329 void DWARFContext::parseDWOCompileUnits() {
330   DWOCUs.parseDWO(*this, getInfoDWOSection());
331 }
332
333 void DWARFContext::parseDWOTypeUnits() {
334   if (!DWOTUs.empty())
335     return;
336   for (const auto &I : getTypesDWOSections()) {
337     DWOTUs.push_back(DWARFUnitSection<DWARFTypeUnit>());
338     DWOTUs.back().parseDWO(*this, I.second);
339   }
340 }
341
342 DWARFCompileUnit *DWARFContext::getCompileUnitForOffset(uint32_t Offset) {
343   parseCompileUnits();
344   return CUs.getUnitForOffset(Offset);
345 }
346
347 DWARFCompileUnit *DWARFContext::getCompileUnitForAddress(uint64_t Address) {
348   // First, get the offset of the compile unit.
349   uint32_t CUOffset = getDebugAranges()->findAddress(Address);
350   // Retrieve the compile unit.
351   return getCompileUnitForOffset(CUOffset);
352 }
353
354 static bool getFunctionNameForAddress(DWARFCompileUnit *CU, uint64_t Address,
355                                       FunctionNameKind Kind,
356                                       std::string &FunctionName) {
357   if (Kind == FunctionNameKind::None)
358     return false;
359   // The address may correspond to instruction in some inlined function,
360   // so we have to build the chain of inlined functions and take the
361   // name of the topmost function in it.
362   const DWARFDebugInfoEntryInlinedChain &InlinedChain =
363       CU->getInlinedChainForAddress(Address);
364   if (InlinedChain.DIEs.size() == 0)
365     return false;
366   const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain.DIEs[0];
367   if (const char *Name =
368           TopFunctionDIE.getSubroutineName(InlinedChain.U, Kind)) {
369     FunctionName = Name;
370     return true;
371   }
372   return false;
373 }
374
375 DILineInfo DWARFContext::getLineInfoForAddress(uint64_t Address,
376                                                DILineInfoSpecifier Spec) {
377   DILineInfo Result;
378
379   DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
380   if (!CU)
381     return Result;
382   getFunctionNameForAddress(CU, Address, Spec.FNKind, Result.FunctionName);
383   if (Spec.FLIKind != FileLineInfoKind::None) {
384     if (const DWARFLineTable *LineTable = getLineTableForUnit(CU))
385       LineTable->getFileLineInfoForAddress(Address, CU->getCompilationDir(),
386                                            Spec.FLIKind, Result);
387   }
388   return Result;
389 }
390
391 DILineInfoTable
392 DWARFContext::getLineInfoForAddressRange(uint64_t Address, uint64_t Size,
393                                          DILineInfoSpecifier Spec) {
394   DILineInfoTable  Lines;
395   DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
396   if (!CU)
397     return Lines;
398
399   std::string FunctionName = "<invalid>";
400   getFunctionNameForAddress(CU, Address, Spec.FNKind, FunctionName);
401
402   // If the Specifier says we don't need FileLineInfo, just
403   // return the top-most function at the starting address.
404   if (Spec.FLIKind == FileLineInfoKind::None) {
405     DILineInfo Result;
406     Result.FunctionName = FunctionName;
407     Lines.push_back(std::make_pair(Address, Result));
408     return Lines;
409   }
410
411   const DWARFLineTable *LineTable = getLineTableForUnit(CU);
412
413   // Get the index of row we're looking for in the line table.
414   std::vector<uint32_t> RowVector;
415   if (!LineTable->lookupAddressRange(Address, Size, RowVector))
416     return Lines;
417
418   for (uint32_t RowIndex : RowVector) {
419     // Take file number and line/column from the row.
420     const DWARFDebugLine::Row &Row = LineTable->Rows[RowIndex];
421     DILineInfo Result;
422     LineTable->getFileNameByIndex(Row.File, CU->getCompilationDir(),
423                                   Spec.FLIKind, Result.FileName);
424     Result.FunctionName = FunctionName;
425     Result.Line = Row.Line;
426     Result.Column = Row.Column;
427     Lines.push_back(std::make_pair(Row.Address, Result));
428   }
429
430   return Lines;
431 }
432
433 DIInliningInfo
434 DWARFContext::getInliningInfoForAddress(uint64_t Address,
435                                         DILineInfoSpecifier Spec) {
436   DIInliningInfo InliningInfo;
437
438   DWARFCompileUnit *CU = getCompileUnitForAddress(Address);
439   if (!CU)
440     return InliningInfo;
441
442   const DWARFLineTable *LineTable = nullptr;
443   const DWARFDebugInfoEntryInlinedChain &InlinedChain =
444       CU->getInlinedChainForAddress(Address);
445   if (InlinedChain.DIEs.size() == 0) {
446     // If there is no DIE for address (e.g. it is in unavailable .dwo file),
447     // try to at least get file/line info from symbol table.
448     if (Spec.FLIKind != FileLineInfoKind::None) {
449       DILineInfo Frame;
450       LineTable = getLineTableForUnit(CU);
451       if (LineTable &&
452           LineTable->getFileLineInfoForAddress(Address, CU->getCompilationDir(),
453                                                Spec.FLIKind, Frame))
454         InliningInfo.addFrame(Frame);
455     }
456     return InliningInfo;
457   }
458
459   uint32_t CallFile = 0, CallLine = 0, CallColumn = 0;
460   for (uint32_t i = 0, n = InlinedChain.DIEs.size(); i != n; i++) {
461     const DWARFDebugInfoEntryMinimal &FunctionDIE = InlinedChain.DIEs[i];
462     DILineInfo Frame;
463     // Get function name if necessary.
464     if (const char *Name =
465             FunctionDIE.getSubroutineName(InlinedChain.U, Spec.FNKind))
466       Frame.FunctionName = Name;
467     if (Spec.FLIKind != FileLineInfoKind::None) {
468       if (i == 0) {
469         // For the topmost frame, initialize the line table of this
470         // compile unit and fetch file/line info from it.
471         LineTable = getLineTableForUnit(CU);
472         // For the topmost routine, get file/line info from line table.
473         if (LineTable)
474           LineTable->getFileLineInfoForAddress(Address, CU->getCompilationDir(),
475                                                Spec.FLIKind, Frame);
476       } else {
477         // Otherwise, use call file, call line and call column from
478         // previous DIE in inlined chain.
479         if (LineTable)
480           LineTable->getFileNameByIndex(CallFile, CU->getCompilationDir(),
481                                         Spec.FLIKind, Frame.FileName);
482         Frame.Line = CallLine;
483         Frame.Column = CallColumn;
484       }
485       // Get call file/line/column of a current DIE.
486       if (i + 1 < n) {
487         FunctionDIE.getCallerFrame(InlinedChain.U, CallFile, CallLine,
488                                    CallColumn);
489       }
490     }
491     InliningInfo.addFrame(Frame);
492   }
493   return InliningInfo;
494 }
495
496 static bool consumeCompressedDebugSectionHeader(StringRef &data,
497                                                 uint64_t &OriginalSize) {
498   // Consume "ZLIB" prefix.
499   if (!data.startswith("ZLIB"))
500     return false;
501   data = data.substr(4);
502   // Consume uncompressed section size (big-endian 8 bytes).
503   DataExtractor extractor(data, false, 8);
504   uint32_t Offset = 0;
505   OriginalSize = extractor.getU64(&Offset);
506   if (Offset == 0)
507     return false;
508   data = data.substr(Offset);
509   return true;
510 }
511
512 DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj)
513     : IsLittleEndian(Obj.isLittleEndian()),
514       AddressSize(Obj.getBytesInAddress()) {
515   for (const SectionRef &Section : Obj.sections()) {
516     StringRef name;
517     Section.getName(name);
518     // Skip BSS and Virtual sections, they aren't interesting.
519     bool IsBSS = Section.isBSS();
520     if (IsBSS)
521       continue;
522     bool IsVirtual = Section.isVirtual();
523     if (IsVirtual)
524       continue;
525     StringRef data;
526     Section.getContents(data);
527
528     name = name.substr(name.find_first_not_of("._")); // Skip . and _ prefixes.
529
530     // Check if debug info section is compressed with zlib.
531     if (name.startswith("zdebug_")) {
532       uint64_t OriginalSize;
533       if (!zlib::isAvailable() ||
534           !consumeCompressedDebugSectionHeader(data, OriginalSize))
535         continue;
536       UncompressedSections.resize(UncompressedSections.size() + 1);
537       if (zlib::uncompress(data, UncompressedSections.back(), OriginalSize) !=
538           zlib::StatusOK) {
539         UncompressedSections.pop_back();
540         continue;
541       }
542       // Make data point to uncompressed section contents and save its contents.
543       name = name.substr(1);
544       data = UncompressedSections.back();
545     }
546
547     StringRef *SectionData =
548         StringSwitch<StringRef *>(name)
549             .Case("debug_info", &InfoSection.Data)
550             .Case("debug_abbrev", &AbbrevSection)
551             .Case("debug_loc", &LocSection.Data)
552             .Case("debug_line", &LineSection.Data)
553             .Case("debug_aranges", &ARangeSection)
554             .Case("debug_frame", &DebugFrameSection)
555             .Case("debug_str", &StringSection)
556             .Case("debug_ranges", &RangeSection)
557             .Case("debug_pubnames", &PubNamesSection)
558             .Case("debug_pubtypes", &PubTypesSection)
559             .Case("debug_gnu_pubnames", &GnuPubNamesSection)
560             .Case("debug_gnu_pubtypes", &GnuPubTypesSection)
561             .Case("debug_info.dwo", &InfoDWOSection.Data)
562             .Case("debug_abbrev.dwo", &AbbrevDWOSection)
563             .Case("debug_loc.dwo", &LocDWOSection.Data)
564             .Case("debug_line.dwo", &LineDWOSection.Data)
565             .Case("debug_str.dwo", &StringDWOSection)
566             .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
567             .Case("debug_addr", &AddrSection)
568             // Any more debug info sections go here.
569             .Default(nullptr);
570     if (SectionData) {
571       *SectionData = data;
572       if (name == "debug_ranges") {
573         // FIXME: Use the other dwo range section when we emit it.
574         RangeDWOSection = data;
575       }
576     } else if (name == "debug_types") {
577       // Find debug_types data by section rather than name as there are
578       // multiple, comdat grouped, debug_types sections.
579       TypesSections[Section].Data = data;
580     } else if (name == "debug_types.dwo") {
581       TypesDWOSections[Section].Data = data;
582     }
583
584     section_iterator RelocatedSection = Section.getRelocatedSection();
585     if (RelocatedSection == Obj.section_end())
586       continue;
587
588     StringRef RelSecName;
589     RelocatedSection->getName(RelSecName);
590     RelSecName = RelSecName.substr(
591         RelSecName.find_first_not_of("._")); // Skip . and _ prefixes.
592
593     // TODO: Add support for relocations in other sections as needed.
594     // Record relocations for the debug_info and debug_line sections.
595     RelocAddrMap *Map = StringSwitch<RelocAddrMap*>(RelSecName)
596         .Case("debug_info", &InfoSection.Relocs)
597         .Case("debug_loc", &LocSection.Relocs)
598         .Case("debug_info.dwo", &InfoDWOSection.Relocs)
599         .Case("debug_line", &LineSection.Relocs)
600         .Default(nullptr);
601     if (!Map) {
602       // Find debug_types relocs by section rather than name as there are
603       // multiple, comdat grouped, debug_types sections.
604       if (RelSecName == "debug_types")
605         Map = &TypesSections[*RelocatedSection].Relocs;
606       else if (RelSecName == "debug_types.dwo")
607         Map = &TypesDWOSections[*RelocatedSection].Relocs;
608       else
609         continue;
610     }
611
612     if (Section.relocation_begin() != Section.relocation_end()) {
613       uint64_t SectionSize = RelocatedSection->getSize();
614       for (const RelocationRef &Reloc : Section.relocations()) {
615         uint64_t Address;
616         Reloc.getOffset(Address);
617         uint64_t Type;
618         Reloc.getType(Type);
619         uint64_t SymAddr = 0;
620         object::symbol_iterator Sym = Reloc.getSymbol();
621         if (Sym != Obj.symbol_end())
622           Sym->getAddress(SymAddr);
623
624         object::RelocVisitor V(Obj);
625         object::RelocToApply R(V.visit(Type, Reloc, SymAddr));
626         if (V.error()) {
627           SmallString<32> Name;
628           std::error_code ec(Reloc.getTypeName(Name));
629           if (ec) {
630             errs() << "Aaaaaa! Nameless relocation! Aaaaaa!\n";
631           }
632           errs() << "error: failed to compute relocation: "
633                  << Name << "\n";
634           continue;
635         }
636
637         if (Address + R.Width > SectionSize) {
638           errs() << "error: " << R.Width << "-byte relocation starting "
639                  << Address << " bytes into section " << name << " which is "
640                  << SectionSize << " bytes long.\n";
641           continue;
642         }
643         if (R.Width > 8) {
644           errs() << "error: can't handle a relocation of more than 8 bytes at "
645                     "a time.\n";
646           continue;
647         }
648         DEBUG(dbgs() << "Writing " << format("%p", R.Value)
649                      << " at " << format("%p", Address)
650                      << " with width " << format("%d", R.Width)
651                      << "\n");
652         Map->insert(std::make_pair(Address, std::make_pair(R.Width, R.Value)));
653       }
654     }
655   }
656 }
657
658 void DWARFContextInMemory::anchor() { }