DWARFUnit.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie//===-- DWARFUnit.h ---------------------------------------------*- C++ -*-===//
2cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie//
3cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie//                     The LLVM Compiler Infrastructure
4cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie//
5cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie// This file is distributed under the University of Illinois Open Source
6cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie// License. See LICENSE.TXT for details.
7cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie//
8cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie//===----------------------------------------------------------------------===//
9cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
10cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#ifndef LLVM_DEBUGINFO_DWARFUNIT_H
11cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#define LLVM_DEBUGINFO_DWARFUNIT_H
12cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
13cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#include "DWARFDebugAbbrev.h"
14cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#include "DWARFDebugInfoEntry.h"
15cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#include "DWARFDebugRangeList.h"
16cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#include "DWARFRelocMap.h"
17cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#include <vector>
18cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
19cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikienamespace llvm {
20cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
21cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikienamespace object {
22cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieclass ObjectFile;
23cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie}
24cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
25cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieclass DWARFDebugAbbrev;
26cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieclass StringRef;
27cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieclass raw_ostream;
28cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
29cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieclass DWARFUnit {
30cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const DWARFDebugAbbrev *Abbrev;
31cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef InfoSection;
32cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef AbbrevSection;
33cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef RangeSection;
34cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t RangeSectionBase;
35cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef StringSection;
36cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef StringOffsetSection;
37cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef AddrOffsetSection;
38cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t AddrOffsetSectionBase;
39cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const RelocAddrMap *RelocMap;
40cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  bool isLittleEndian;
41cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
42cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t Offset;
43cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t Length;
44cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint16_t Version;
45cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const DWARFAbbreviationDeclarationSet *Abbrevs;
46cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint8_t AddrSize;
47cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint64_t BaseAddr;
48cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  // The compile unit debug information entry items.
49cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  std::vector<DWARFDebugInfoEntryMinimal> DieArray;
50cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
51cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  class DWOHolder {
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::unique_ptr<object::ObjectFile> DWOFile;
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::unique_ptr<DWARFContext> DWOContext;
54cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    DWARFUnit *DWOU;
55cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  public:
56cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    DWOHolder(object::ObjectFile *DWOFile);
57cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    DWARFUnit *getUnit() const { return DWOU; }
58cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  };
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<DWOHolder> DWO;
60cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
61cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieprotected:
62cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  virtual bool extractImpl(DataExtractor debug_info, uint32_t *offset_ptr);
63cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
64cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikiepublic:
65cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
66cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  DWARFUnit(const DWARFDebugAbbrev *DA, StringRef IS, StringRef AS,
67cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie            StringRef RS, StringRef SS, StringRef SOS, StringRef AOS,
68cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie            const RelocAddrMap *M, bool LE);
69cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
70cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  virtual ~DWARFUnit();
71cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
72cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef getStringSection() const { return StringSection; }
73cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  StringRef getStringOffsetSection() const { return StringOffsetSection; }
74cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void setAddrOffsetSection(StringRef AOS, uint32_t Base) {
75cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    AddrOffsetSection = AOS;
76cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    AddrOffsetSectionBase = Base;
77cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  }
78cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void setRangesSection(StringRef RS, uint32_t Base) {
79cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    RangeSection = RS;
80cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    RangeSectionBase = Base;
81cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  }
82cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
83cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  bool getAddrOffsetSectionItem(uint32_t Index, uint64_t &Result) const;
84cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  // FIXME: Result should be uint64_t in DWARF64.
85cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  bool getStringOffsetSectionItem(uint32_t Index, uint32_t &Result) const;
86cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
87cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  DataExtractor getDebugInfoExtractor() const {
88cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    return DataExtractor(InfoSection, isLittleEndian, AddrSize);
89cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  }
90cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  DataExtractor getStringExtractor() const {
91cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    return DataExtractor(StringSection, false, 0);
92cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  }
93cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
94cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const RelocAddrMap *getRelocMap() const { return RelocMap; }
95cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
96cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  bool extract(DataExtractor debug_info, uint32_t* offset_ptr);
97cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
98cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// extractRangeList - extracts the range list referenced by this compile
99cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// unit from .debug_ranges section. Returns true on success.
100cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// Requires that compile unit is already extracted.
101cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  bool extractRangeList(uint32_t RangeListOffset,
102cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie                        DWARFDebugRangeList &RangeList) const;
103cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void clear();
104cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t getOffset() const { return Offset; }
105cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// Size in bytes of the compile unit header.
106cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  virtual uint32_t getSize() const { return 11; }
107cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t getFirstDIEOffset() const { return Offset + getSize(); }
108cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t getNextUnitOffset() const { return Offset + Length + 4; }
109cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// Size in bytes of the .debug_info data associated with this compile unit.
110cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  size_t getDebugInfoSize() const { return Length + 4 - getSize(); }
111cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint32_t getLength() const { return Length; }
112cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint16_t getVersion() const { return Version; }
113cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const DWARFAbbreviationDeclarationSet *getAbbreviations() const {
114cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    return Abbrevs;
115cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  }
116cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint8_t getAddressByteSize() const { return AddrSize; }
117cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint64_t getBaseAddress() const { return BaseAddr; }
118cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
119cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void setBaseAddress(uint64_t base_addr) {
120cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    BaseAddr = base_addr;
121cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  }
122cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
123cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const DWARFDebugInfoEntryMinimal *
124cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  getCompileUnitDIE(bool extract_cu_die_only = true) {
125cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    extractDIEsIfNeeded(extract_cu_die_only);
126cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie    return DieArray.empty() ? NULL : &DieArray[0];
127cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  }
128cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
129cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const char *getCompilationDir();
130cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  uint64_t getDWOId();
131cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
132cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void buildAddressRangeTable(DWARFDebugAranges *debug_aranges,
133cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie                              bool clear_dies_if_already_not_parsed,
134cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie                              uint32_t CUOffsetInAranges);
135cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
136cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// getInlinedChainForAddress - fetches inlined chain for a given address.
137cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// Returns empty chain if there is no subprogram containing address. The
138cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// chain is valid as long as parsed compile unit DIEs are not cleared.
139cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  DWARFDebugInfoEntryInlinedChain getInlinedChainForAddress(uint64_t Address);
140cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
141cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieprivate:
1427d82b4284984143a093b793d0979a6bee4490332Alexey Samsonov  /// extractDIEsIfNeeded - Parses a compile unit and indexes its DIEs if it
1437d82b4284984143a093b793d0979a6bee4490332Alexey Samsonov  /// hasn't already been done. Returns the number of DIEs parsed at this call.
1447d82b4284984143a093b793d0979a6bee4490332Alexey Samsonov  size_t extractDIEsIfNeeded(bool CUDieOnly);
145cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// extractDIEsToVector - Appends all parsed DIEs to a vector.
146cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void extractDIEsToVector(bool AppendCUDie, bool AppendNonCUDIEs,
147cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie                           std::vector<DWARFDebugInfoEntryMinimal> &DIEs) const;
1487d82b4284984143a093b793d0979a6bee4490332Alexey Samsonov  /// setDIERelations - We read in all of the DIE entries into our flat list
1497d82b4284984143a093b793d0979a6bee4490332Alexey Samsonov  /// of DIE entries and now we need to go back through all of them and set the
1507d82b4284984143a093b793d0979a6bee4490332Alexey Samsonov  /// parent, sibling and child pointers for quick DIE navigation.
1517d82b4284984143a093b793d0979a6bee4490332Alexey Samsonov  void setDIERelations();
152cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// clearDIEs - Clear parsed DIEs to keep memory usage low.
153cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void clearDIEs(bool KeepCUDie);
154cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
155cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// parseDWO - Parses .dwo file for current compile unit. Returns true if
156cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// it was actually constructed.
157cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  bool parseDWO();
158cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
159cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// getSubprogramForAddress - Returns subprogram DIE with address range
160cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// encompassing the provided address. The pointer is alive as long as parsed
161cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  /// compile unit DIEs are not cleared.
162cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  const DWARFDebugInfoEntryMinimal *getSubprogramForAddress(uint64_t Address);
163cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie};
164cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
165cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie}
166cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie
167cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie#endif
168