1259698Sdim//===-- DWARFUnit.h ---------------------------------------------*- C++ -*-===// 2259698Sdim// 3259698Sdim// The LLVM Compiler Infrastructure 4259698Sdim// 5259698Sdim// This file is distributed under the University of Illinois Open Source 6259698Sdim// License. See LICENSE.TXT for details. 7259698Sdim// 8259698Sdim//===----------------------------------------------------------------------===// 9259698Sdim 10259698Sdim#ifndef LLVM_DEBUGINFO_DWARFUNIT_H 11259698Sdim#define LLVM_DEBUGINFO_DWARFUNIT_H 12259698Sdim 13259698Sdim#include "llvm/ADT/OwningPtr.h" 14259698Sdim#include "DWARFDebugAbbrev.h" 15259698Sdim#include "DWARFDebugInfoEntry.h" 16259698Sdim#include "DWARFDebugRangeList.h" 17259698Sdim#include "DWARFRelocMap.h" 18259698Sdim#include <vector> 19259698Sdim 20259698Sdimnamespace llvm { 21259698Sdim 22259698Sdimnamespace object { 23259698Sdimclass ObjectFile; 24259698Sdim} 25259698Sdim 26259698Sdimclass DWARFDebugAbbrev; 27259698Sdimclass StringRef; 28259698Sdimclass raw_ostream; 29259698Sdim 30259698Sdimclass DWARFUnit { 31259698Sdim const DWARFDebugAbbrev *Abbrev; 32259698Sdim StringRef InfoSection; 33259698Sdim StringRef AbbrevSection; 34259698Sdim StringRef RangeSection; 35259698Sdim uint32_t RangeSectionBase; 36259698Sdim StringRef StringSection; 37259698Sdim StringRef StringOffsetSection; 38259698Sdim StringRef AddrOffsetSection; 39259698Sdim uint32_t AddrOffsetSectionBase; 40259698Sdim const RelocAddrMap *RelocMap; 41259698Sdim bool isLittleEndian; 42259698Sdim 43259698Sdim uint32_t Offset; 44259698Sdim uint32_t Length; 45259698Sdim uint16_t Version; 46259698Sdim const DWARFAbbreviationDeclarationSet *Abbrevs; 47259698Sdim uint8_t AddrSize; 48259698Sdim uint64_t BaseAddr; 49259698Sdim // The compile unit debug information entry items. 50259698Sdim std::vector<DWARFDebugInfoEntryMinimal> DieArray; 51259698Sdim 52259698Sdim class DWOHolder { 53259698Sdim OwningPtr<object::ObjectFile> DWOFile; 54259698Sdim OwningPtr<DWARFContext> DWOContext; 55259698Sdim DWARFUnit *DWOU; 56259698Sdim public: 57259698Sdim DWOHolder(object::ObjectFile *DWOFile); 58259698Sdim DWARFUnit *getUnit() const { return DWOU; } 59259698Sdim }; 60259698Sdim OwningPtr<DWOHolder> DWO; 61259698Sdim 62259698Sdimprotected: 63259698Sdim virtual bool extractImpl(DataExtractor debug_info, uint32_t *offset_ptr); 64259698Sdim 65259698Sdimpublic: 66259698Sdim 67259698Sdim DWARFUnit(const DWARFDebugAbbrev *DA, StringRef IS, StringRef AS, 68259698Sdim StringRef RS, StringRef SS, StringRef SOS, StringRef AOS, 69259698Sdim const RelocAddrMap *M, bool LE); 70259698Sdim 71259698Sdim virtual ~DWARFUnit(); 72259698Sdim 73259698Sdim StringRef getStringSection() const { return StringSection; } 74259698Sdim StringRef getStringOffsetSection() const { return StringOffsetSection; } 75259698Sdim void setAddrOffsetSection(StringRef AOS, uint32_t Base) { 76259698Sdim AddrOffsetSection = AOS; 77259698Sdim AddrOffsetSectionBase = Base; 78259698Sdim } 79259698Sdim void setRangesSection(StringRef RS, uint32_t Base) { 80259698Sdim RangeSection = RS; 81259698Sdim RangeSectionBase = Base; 82259698Sdim } 83259698Sdim 84259698Sdim bool getAddrOffsetSectionItem(uint32_t Index, uint64_t &Result) const; 85259698Sdim // FIXME: Result should be uint64_t in DWARF64. 86259698Sdim bool getStringOffsetSectionItem(uint32_t Index, uint32_t &Result) const; 87259698Sdim 88259698Sdim DataExtractor getDebugInfoExtractor() const { 89259698Sdim return DataExtractor(InfoSection, isLittleEndian, AddrSize); 90259698Sdim } 91259698Sdim DataExtractor getStringExtractor() const { 92259698Sdim return DataExtractor(StringSection, false, 0); 93259698Sdim } 94259698Sdim 95259698Sdim const RelocAddrMap *getRelocMap() const { return RelocMap; } 96259698Sdim 97259698Sdim bool extract(DataExtractor debug_info, uint32_t* offset_ptr); 98259698Sdim 99259698Sdim /// extractRangeList - extracts the range list referenced by this compile 100259698Sdim /// unit from .debug_ranges section. Returns true on success. 101259698Sdim /// Requires that compile unit is already extracted. 102259698Sdim bool extractRangeList(uint32_t RangeListOffset, 103259698Sdim DWARFDebugRangeList &RangeList) const; 104259698Sdim void clear(); 105259698Sdim uint32_t getOffset() const { return Offset; } 106259698Sdim /// Size in bytes of the compile unit header. 107259698Sdim virtual uint32_t getSize() const { return 11; } 108259698Sdim uint32_t getFirstDIEOffset() const { return Offset + getSize(); } 109259698Sdim uint32_t getNextUnitOffset() const { return Offset + Length + 4; } 110259698Sdim /// Size in bytes of the .debug_info data associated with this compile unit. 111259698Sdim size_t getDebugInfoSize() const { return Length + 4 - getSize(); } 112259698Sdim uint32_t getLength() const { return Length; } 113259698Sdim uint16_t getVersion() const { return Version; } 114259698Sdim const DWARFAbbreviationDeclarationSet *getAbbreviations() const { 115259698Sdim return Abbrevs; 116259698Sdim } 117259698Sdim uint8_t getAddressByteSize() const { return AddrSize; } 118259698Sdim uint64_t getBaseAddress() const { return BaseAddr; } 119259698Sdim 120259698Sdim void setBaseAddress(uint64_t base_addr) { 121259698Sdim BaseAddr = base_addr; 122259698Sdim } 123259698Sdim 124259698Sdim const DWARFDebugInfoEntryMinimal * 125259698Sdim getCompileUnitDIE(bool extract_cu_die_only = true) { 126259698Sdim extractDIEsIfNeeded(extract_cu_die_only); 127259698Sdim return DieArray.empty() ? NULL : &DieArray[0]; 128259698Sdim } 129259698Sdim 130259698Sdim const char *getCompilationDir(); 131259698Sdim uint64_t getDWOId(); 132259698Sdim 133259698Sdim void buildAddressRangeTable(DWARFDebugAranges *debug_aranges, 134259698Sdim bool clear_dies_if_already_not_parsed, 135259698Sdim uint32_t CUOffsetInAranges); 136259698Sdim 137259698Sdim /// getInlinedChainForAddress - fetches inlined chain for a given address. 138259698Sdim /// Returns empty chain if there is no subprogram containing address. The 139259698Sdim /// chain is valid as long as parsed compile unit DIEs are not cleared. 140259698Sdim DWARFDebugInfoEntryInlinedChain getInlinedChainForAddress(uint64_t Address); 141259698Sdim 142259698Sdimprivate: 143259698Sdim /// extractDIEsIfNeeded - Parses a compile unit and indexes its DIEs if it 144259698Sdim /// hasn't already been done. Returns the number of DIEs parsed at this call. 145259698Sdim size_t extractDIEsIfNeeded(bool CUDieOnly); 146259698Sdim /// extractDIEsToVector - Appends all parsed DIEs to a vector. 147259698Sdim void extractDIEsToVector(bool AppendCUDie, bool AppendNonCUDIEs, 148259698Sdim std::vector<DWARFDebugInfoEntryMinimal> &DIEs) const; 149259698Sdim /// setDIERelations - We read in all of the DIE entries into our flat list 150259698Sdim /// of DIE entries and now we need to go back through all of them and set the 151259698Sdim /// parent, sibling and child pointers for quick DIE navigation. 152259698Sdim void setDIERelations(); 153259698Sdim /// clearDIEs - Clear parsed DIEs to keep memory usage low. 154259698Sdim void clearDIEs(bool KeepCUDie); 155259698Sdim 156259698Sdim /// parseDWO - Parses .dwo file for current compile unit. Returns true if 157259698Sdim /// it was actually constructed. 158259698Sdim bool parseDWO(); 159259698Sdim 160259698Sdim /// getSubprogramForAddress - Returns subprogram DIE with address range 161259698Sdim /// encompassing the provided address. The pointer is alive as long as parsed 162259698Sdim /// compile unit DIEs are not cleared. 163259698Sdim const DWARFDebugInfoEntryMinimal *getSubprogramForAddress(uint64_t Address); 164259698Sdim}; 165259698Sdim 166259698Sdim} 167259698Sdim 168259698Sdim#endif 169