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