DWARFDebugInfoEntry.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1//===-- DWARFDebugInfoEntry.h -----------------------------------*- C++ -*-===// 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#ifndef LLVM_DEBUGINFO_DWARFDEBUGINFOENTRY_H 11#define LLVM_DEBUGINFO_DWARFDEBUGINFOENTRY_H 12 13#include "DWARFAbbreviationDeclaration.h" 14#include "llvm/ADT/SmallVector.h" 15#include "llvm/Support/DataTypes.h" 16 17namespace llvm { 18 19class DWARFDebugAranges; 20class DWARFCompileUnit; 21class DWARFUnit; 22class DWARFContext; 23class DWARFFormValue; 24struct DWARFDebugInfoEntryInlinedChain; 25 26/// DWARFDebugInfoEntryMinimal - A DIE with only the minimum required data. 27class DWARFDebugInfoEntryMinimal { 28 /// Offset within the .debug_info of the start of this entry. 29 uint32_t Offset; 30 31 /// How many to subtract from "this" to get the parent. 32 /// If zero this die has no parent. 33 uint32_t ParentIdx; 34 35 /// How many to add to "this" to get the sibling. 36 uint32_t SiblingIdx; 37 38 const DWARFAbbreviationDeclaration *AbbrevDecl; 39public: 40 DWARFDebugInfoEntryMinimal() 41 : Offset(0), ParentIdx(0), SiblingIdx(0), AbbrevDecl(0) {} 42 43 void dump(raw_ostream &OS, const DWARFUnit *u, unsigned recurseDepth, 44 unsigned indent = 0) const; 45 void dumpAttribute(raw_ostream &OS, const DWARFUnit *u, uint32_t *offset_ptr, 46 uint16_t attr, uint16_t form, unsigned indent = 0) const; 47 48 /// Extracts a debug info entry, which is a child of a given unit, 49 /// starting at a given offset. If DIE can't be extracted, returns false and 50 /// doesn't change OffsetPtr. 51 bool extractFast(const DWARFUnit *U, uint32_t *OffsetPtr); 52 53 uint32_t getTag() const { return AbbrevDecl ? AbbrevDecl->getTag() : 0; } 54 bool isNULL() const { return AbbrevDecl == 0; } 55 56 /// Returns true if DIE represents a subprogram (not inlined). 57 bool isSubprogramDIE() const; 58 /// Returns true if DIE represents a subprogram or an inlined 59 /// subroutine. 60 bool isSubroutineDIE() const; 61 62 uint32_t getOffset() const { return Offset; } 63 bool hasChildren() const { return !isNULL() && AbbrevDecl->hasChildren(); } 64 65 // We know we are kept in a vector of contiguous entries, so we know 66 // our parent will be some index behind "this". 67 DWARFDebugInfoEntryMinimal *getParent() { 68 return ParentIdx > 0 ? this - ParentIdx : 0; 69 } 70 const DWARFDebugInfoEntryMinimal *getParent() const { 71 return ParentIdx > 0 ? this - ParentIdx : 0; 72 } 73 // We know we are kept in a vector of contiguous entries, so we know 74 // our sibling will be some index after "this". 75 DWARFDebugInfoEntryMinimal *getSibling() { 76 return SiblingIdx > 0 ? this + SiblingIdx : 0; 77 } 78 const DWARFDebugInfoEntryMinimal *getSibling() const { 79 return SiblingIdx > 0 ? this + SiblingIdx : 0; 80 } 81 // We know we are kept in a vector of contiguous entries, so we know 82 // we don't need to store our child pointer, if we have a child it will 83 // be the next entry in the list... 84 DWARFDebugInfoEntryMinimal *getFirstChild() { 85 return hasChildren() ? this + 1 : 0; 86 } 87 const DWARFDebugInfoEntryMinimal *getFirstChild() const { 88 return hasChildren() ? this + 1 : 0; 89 } 90 91 void setParent(DWARFDebugInfoEntryMinimal *parent) { 92 if (parent) { 93 // We know we are kept in a vector of contiguous entries, so we know 94 // our parent will be some index behind "this". 95 ParentIdx = this - parent; 96 } else 97 ParentIdx = 0; 98 } 99 void setSibling(DWARFDebugInfoEntryMinimal *sibling) { 100 if (sibling) { 101 // We know we are kept in a vector of contiguous entries, so we know 102 // our sibling will be some index after "this". 103 SiblingIdx = sibling - this; 104 sibling->setParent(getParent()); 105 } else 106 SiblingIdx = 0; 107 } 108 109 const DWARFAbbreviationDeclaration *getAbbreviationDeclarationPtr() const { 110 return AbbrevDecl; 111 } 112 113 bool getAttributeValue(const DWARFUnit *U, const uint16_t Attr, 114 DWARFFormValue &FormValue) const; 115 116 const char *getAttributeValueAsString(const DWARFUnit *U, const uint16_t Attr, 117 const char *FailValue) const; 118 119 uint64_t getAttributeValueAsAddress(const DWARFUnit *U, const uint16_t Attr, 120 uint64_t FailValue) const; 121 122 uint64_t getAttributeValueAsUnsignedConstant(const DWARFUnit *U, 123 const uint16_t Attr, 124 uint64_t FailValue) const; 125 126 uint64_t getAttributeValueAsReference(const DWARFUnit *U, const uint16_t Attr, 127 uint64_t FailValue) const; 128 129 uint64_t getAttributeValueAsSectionOffset(const DWARFUnit *U, 130 const uint16_t Attr, 131 uint64_t FailValue) const; 132 133 /// Retrieves DW_AT_low_pc and DW_AT_high_pc from CU. 134 /// Returns true if both attributes are present. 135 bool getLowAndHighPC(const DWARFUnit *U, uint64_t &LowPC, 136 uint64_t &HighPC) const; 137 138 void buildAddressRangeTable(const DWARFUnit *U, 139 DWARFDebugAranges *DebugAranges, 140 uint32_t CUOffsetInAranges) const; 141 142 bool addressRangeContainsAddress(const DWARFUnit *U, 143 const uint64_t Address) const; 144 145 /// If a DIE represents a subprogram (or inlined subroutine), 146 /// returns its mangled name (or short name, if mangled is missing). 147 /// This name may be fetched from specification or abstract origin 148 /// for this subprogram. Returns null if no name is found. 149 const char *getSubroutineName(const DWARFUnit *U) const; 150 151 /// Retrieves values of DW_AT_call_file, DW_AT_call_line and 152 /// DW_AT_call_column from DIE (or zeroes if they are missing). 153 void getCallerFrame(const DWARFUnit *U, uint32_t &CallFile, 154 uint32_t &CallLine, uint32_t &CallColumn) const; 155 156 /// Get inlined chain for a given address, rooted at the current DIE. 157 /// Returns empty chain if address is not contained in address range 158 /// of current DIE. 159 DWARFDebugInfoEntryInlinedChain 160 getInlinedChainForAddress(const DWARFUnit *U, const uint64_t Address) const; 161}; 162 163/// DWARFDebugInfoEntryInlinedChain - represents a chain of inlined_subroutine 164/// DIEs, (possibly ending with subprogram DIE), all of which are contained 165/// in some concrete inlined instance tree. Address range for each DIE 166/// (except the last DIE) in this chain is contained in address 167/// range for next DIE in the chain. 168struct DWARFDebugInfoEntryInlinedChain { 169 DWARFDebugInfoEntryInlinedChain() : U(0) {} 170 SmallVector<DWARFDebugInfoEntryMinimal, 4> DIEs; 171 const DWARFUnit *U; 172}; 173 174} 175 176#endif 177