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