20 using namespace dwarf;
23 unsigned recurseDepth,
24 unsigned indent)
const {
26 uint32_t offset = Offset;
29 uint32_t abbrCode = debug_info_data.
getULEB128(&offset);
31 OS <<
format(
"\n0x%8.8x: ", Offset);
34 const char *tagString =
TagString(getTag());
36 OS.
indent(indent) << tagString;
38 OS.
indent(indent) <<
format(
"DW_TAG_Unknown_%x", getTag());
39 OS <<
format(
" [%u] %c\n", abbrCode,
40 AbbrevDecl->hasChildren() ?
'*' :
' ');
43 const uint32_t numAttributes = AbbrevDecl->getNumAttributes();
44 for (uint32_t i = 0; i != numAttributes; ++i) {
45 uint16_t attr = AbbrevDecl->getAttrByIndex(i);
46 uint16_t form = AbbrevDecl->getFormByIndex(i);
47 dumpAttribute(OS, u, &offset, attr, form, indent);
51 if (recurseDepth > 0 && child) {
53 child->
dump(OS, u, recurseDepth-1, indent+2);
58 OS <<
"Abbreviation code not found in 'debug_abbrev' class for code: "
62 OS.
indent(indent) <<
"NULL\n";
70 uint16_t attr, uint16_t form,
71 unsigned indent)
const {
78 OS <<
format(
"DW_AT_Unknown_%x", attr);
81 OS <<
" [" << formString <<
']';
83 OS <<
format(
" [DW_FORM_Unknown_%x]", form);
91 formValue.
dump(OS, u);
96 uint32_t *OffsetPtr) {
100 if (Offset >= UEndOffset || !DebugInfoData.
isValidOffset(Offset))
102 uint64_t AbbrCode = DebugInfoData.
getULEB128(OffsetPtr);
109 if (0 == AbbrevDecl) {
116 assert(FixedFormSizes.
size() > 0);
119 for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) {
120 uint16_t Form = AbbrevDecl->getFormByIndex(i);
122 uint8_t FixedFormSize =
123 (Form < FixedFormSizes.
size()) ? FixedFormSizes[Form] : 0;
125 *OffsetPtr += FixedFormSize;
136 return getTag() == DW_TAG_subprogram;
140 uint32_t Tag = getTag();
141 return Tag == DW_TAG_subprogram ||
142 Tag == DW_TAG_inlined_subroutine;
150 uint32_t AttrIdx = AbbrevDecl->findAttributeIndex(Attr);
155 uint32_t DebugInfoOffset = getOffset();
161 for (uint32_t i = 0; i < AttrIdx; ++i) {
163 DebugInfoData, &DebugInfoOffset, U);
167 return FormValue.
extractValue(DebugInfoData, &DebugInfoOffset, U);
171 const DWARFUnit *U,
const uint16_t Attr,
const char *FailValue)
const {
173 if (!getAttributeValue(U, Attr, FormValue))
180 const DWARFUnit *U,
const uint16_t Attr, uint64_t FailValue)
const {
182 if (!getAttributeValue(U, Attr, FormValue))
189 const DWARFUnit *U,
const uint16_t Attr, uint64_t FailValue)
const {
191 if (!getAttributeValue(U, Attr, FormValue))
198 const DWARFUnit *U,
const uint16_t Attr, uint64_t FailValue)
const {
200 if (!getAttributeValue(U, Attr, FormValue))
207 const DWARFUnit *U,
const uint16_t Attr, uint64_t FailValue)
const {
209 if (!getAttributeValue(U, Attr, FormValue))
217 uint64_t &HighPC)
const {
218 LowPC = getAttributeValueAsAddress(U, DW_AT_low_pc, -1ULL);
221 HighPC = getAttributeValueAsAddress(U, DW_AT_high_pc, -1ULL);
222 if (HighPC == -1ULL) {
225 HighPC = getAttributeValueAsUnsignedConstant(U, DW_AT_high_pc, -1ULL);
229 return (HighPC != -1ULL);
234 uint32_t UOffsetInAranges)
const {
236 if (isSubprogramDIE()) {
237 uint64_t LowPC, HighPC;
238 if (getLowAndHighPC(U, LowPC, HighPC))
239 DebugAranges->
appendRange(UOffsetInAranges, LowPC, HighPC);
252 const DWARFUnit *U,
const uint64_t Address)
const {
255 uint64_t LowPC, HighPC;
256 if (getLowAndHighPC(U, LowPC, HighPC))
257 return (LowPC <= Address && Address <= HighPC);
259 uint32_t RangesOffset =
260 getAttributeValueAsSectionOffset(U, DW_AT_ranges, -1U);
261 if (RangesOffset != -1U) {
271 if (!isSubroutineDIE())
274 if (
const char *name =
275 getAttributeValueAsString(U, DW_AT_MIPS_linkage_name, 0))
277 if (
const char *name = getAttributeValueAsString(U, DW_AT_linkage_name, 0))
279 if (
const char *name = getAttributeValueAsString(U, DW_AT_name, 0))
283 getAttributeValueAsReference(U, DW_AT_specification, -1U);
284 if (spec_ref != -1U) {
292 uint32_t abs_origin_ref =
293 getAttributeValueAsReference(U, DW_AT_abstract_origin, -1U);
294 if (abs_origin_ref != -1U) {
296 if (abs_origin_die.
extractFast(U, &abs_origin_ref)) {
307 uint32_t &CallColumn)
const {
308 CallFile = getAttributeValueAsUnsignedConstant(U, DW_AT_call_file, 0);
309 CallLine = getAttributeValueAsUnsignedConstant(U, DW_AT_call_line, 0);
310 CallColumn = getAttributeValueAsUnsignedConstant(U, DW_AT_call_column, 0);
315 const DWARFUnit *U,
const uint64_t Address)
const {
323 if (
DIE->isSubroutineDIE()) {
324 InlinedChain.
DIEs.push_back(*
DIE);
338 std::reverse(InlinedChain.
DIEs.begin(), InlinedChain.
DIEs.end());
const char * FormEncodingString(unsigned Encoding)
void dumpAttribute(raw_ostream &OS, const DWARFUnit *u, uint32_t *offset_ptr, uint16_t attr, uint16_t form, unsigned indent=0) const
uint64_t getBaseAddress() const
uint64_t getAttributeValueAsAddress(const DWARFUnit *U, const uint16_t Attr, uint64_t FailValue) const
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
DWARFDebugInfoEntryInlinedChain getInlinedChainForAddress(const DWARFUnit *U, const uint64_t Address) const
bool extractRangeList(uint32_t RangeListOffset, DWARFDebugRangeList &RangeList) const
uint32_t getNextUnitOffset() const
const DWARFAbbreviationDeclarationSet * getAbbreviations() const
const char * getSubroutineName(const DWARFUnit *U) const
const char * getAttributeValueAsString(const DWARFUnit *U, const uint16_t Attr, const char *FailValue) const
format_object1< T > format(const char *Fmt, const T &Val)
const T & getValue() const LLVM_LVALUE_FUNCTION
bool addressRangeContainsAddress(const DWARFUnit *U, const uint64_t Address) const
const DWARFAbbreviationDeclaration * getAbbreviationDeclaration(uint32_t abbrCode) const
SmallVector< DWARFDebugInfoEntryMinimal, 4 > DIEs
size_t size() const
size - Get the array size.
uint64_t getAttributeValueAsReference(const DWARFUnit *U, const uint16_t Attr, uint64_t FailValue) const
uint16_t getVersion() const
DWARFDebugInfoEntryMinimal * getSibling()
DWARFDebugInfoEntryMinimal - A DIE with only the minimum required data.
const char * TagString(unsigned Tag)
bool containsAddress(uint64_t BaseAddress, uint64_t Address) const
void buildAddressRangeTable(const DWARFUnit *U, DWARFDebugAranges *DebugAranges, uint32_t CUOffsetInAranges) const
uint64_t getAttributeValueAsUnsignedConstant(const DWARFUnit *U, const uint16_t Attr, uint64_t FailValue) const
uint64_t getAttributeValueAsSectionOffset(const DWARFUnit *U, const uint16_t Attr, uint64_t FailValue) const
void getCallerFrame(const DWARFUnit *U, uint32_t &CallFile, uint32_t &CallLine, uint32_t &CallColumn) const
const char * AttributeString(unsigned Attribute)
DataExtractor getDebugInfoExtractor() const
void appendRange(uint32_t CUOffset, uint64_t LowPC, uint64_t HighPC)
void dump(raw_ostream &OS, const DWARFUnit *u, unsigned recurseDepth, unsigned indent=0) const
bool isSubroutineDIE() const
uint8_t getAddressByteSize() const
bool getLowAndHighPC(const DWARFUnit *U, uint64_t &LowPC, uint64_t &HighPC) const
bool isSubprogramDIE() const
Returns true if DIE represents a subprogram (not inlined).
bool getAttributeValue(const DWARFUnit *U, const uint16_t Attr, DWARFFormValue &FormValue) const
bool extractFast(const DWARFUnit *U, uint32_t *OffsetPtr)