diff options
author | David Blaikie <dblaikie@gmail.com> | 2013-09-23 22:44:40 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2013-09-23 22:44:40 +0000 |
commit | cd7c4980d4ee2d22d92a4907f2d029e67b52d732 (patch) | |
tree | 424cf437838c0b79260958a152a738e5e519fe74 /lib/DebugInfo/DWARFDebugInfoEntry.cpp | |
parent | f2058addc2aa221d0fd744180a2c04a38ebddcd0 (diff) | |
download | llvm-cd7c4980d4ee2d22d92a4907f2d029e67b52d732.tar.gz llvm-cd7c4980d4ee2d22d92a4907f2d029e67b52d732.tar.bz2 llvm-cd7c4980d4ee2d22d92a4907f2d029e67b52d732.tar.xz |
Exract most of DWARFCompileUnit into a new DWARFUnit to prepare for the coming DWARFTypeUnit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191233 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/DebugInfo/DWARFDebugInfoEntry.cpp')
-rw-r--r-- | lib/DebugInfo/DWARFDebugInfoEntry.cpp | 177 |
1 files changed, 77 insertions, 100 deletions
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/lib/DebugInfo/DWARFDebugInfoEntry.cpp index 775e68fa23..fd801a22c2 100644 --- a/lib/DebugInfo/DWARFDebugInfoEntry.cpp +++ b/lib/DebugInfo/DWARFDebugInfoEntry.cpp @@ -19,11 +19,10 @@ using namespace llvm; using namespace dwarf; -void DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS, - const DWARFCompileUnit *cu, +void DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS, const DWARFUnit *u, unsigned recurseDepth, unsigned indent) const { - DataExtractor debug_info_data = cu->getDebugInfoExtractor(); + DataExtractor debug_info_data = u->getDebugInfoExtractor(); uint32_t offset = Offset; if (debug_info_data.isValidOffset(offset)) { @@ -45,13 +44,13 @@ void DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS, for (uint32_t i = 0; i != numAttributes; ++i) { uint16_t attr = AbbrevDecl->getAttrByIndex(i); uint16_t form = AbbrevDecl->getFormByIndex(i); - dumpAttribute(OS, cu, &offset, attr, form, indent); + dumpAttribute(OS, u, &offset, attr, form, indent); } const DWARFDebugInfoEntryMinimal *child = getFirstChild(); if (recurseDepth > 0 && child) { while (child) { - child->dump(OS, cu, recurseDepth-1, indent+2); + child->dump(OS, u, recurseDepth-1, indent+2); child = child->getSibling(); } } @@ -66,10 +65,9 @@ void DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS, } void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS, - const DWARFCompileUnit *cu, - uint32_t* offset_ptr, - uint16_t attr, - uint16_t form, + const DWARFUnit *u, + uint32_t *offset_ptr, + uint16_t attr, uint16_t form, unsigned indent) const { OS << " "; OS.indent(indent+2); @@ -86,26 +84,26 @@ void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS, DWARFFormValue formValue(form); - if (!formValue.extractValue(cu->getDebugInfoExtractor(), offset_ptr, cu)) + if (!formValue.extractValue(u->getDebugInfoExtractor(), offset_ptr, u)) return; OS << "\t("; - formValue.dump(OS, cu); + formValue.dump(OS, u); OS << ")\n"; } -bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFCompileUnit *CU, +bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U, const uint8_t *FixedFormSizes, uint32_t *OffsetPtr) { Offset = *OffsetPtr; - DataExtractor DebugInfoData = CU->getDebugInfoExtractor(); + DataExtractor DebugInfoData = U->getDebugInfoExtractor(); uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr); if (0 == AbbrCode) { // NULL debug tag entry. AbbrevDecl = NULL; return true; } - AbbrevDecl = CU->getAbbreviations()->getAbbreviationDeclaration(AbbrCode); + AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode); assert(AbbrevDecl); assert(FixedFormSizes); // For best performance this should be specified! @@ -121,7 +119,7 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFCompileUnit *CU, if (FixedFormSize) *OffsetPtr += FixedFormSize; else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, - CU)) { + U)) { // Restore the original offset. *OffsetPtr = Offset; return false; @@ -130,13 +128,12 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFCompileUnit *CU, return true; } -bool -DWARFDebugInfoEntryMinimal::extract(const DWARFCompileUnit *CU, - uint32_t *OffsetPtr) { - DataExtractor DebugInfoData = CU->getDebugInfoExtractor(); - const uint32_t CUEndOffset = CU->getNextCompileUnitOffset(); +bool DWARFDebugInfoEntryMinimal::extract(const DWARFUnit *U, + uint32_t *OffsetPtr) { + DataExtractor DebugInfoData = U->getDebugInfoExtractor(); + const uint32_t UEndOffset = U->getNextUnitOffset(); Offset = *OffsetPtr; - if ((Offset >= CUEndOffset) || !DebugInfoData.isValidOffset(Offset)) + if ((Offset >= UEndOffset) || !DebugInfoData.isValidOffset(Offset)) return false; uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr); if (0 == AbbrCode) { @@ -144,7 +141,7 @@ DWARFDebugInfoEntryMinimal::extract(const DWARFCompileUnit *CU, AbbrevDecl = NULL; return true; } - AbbrevDecl = CU->getAbbreviations()->getAbbreviationDeclaration(AbbrCode); + AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode); if (0 == AbbrevDecl) { // Restore the original offset. *OffsetPtr = Offset; @@ -152,7 +149,7 @@ DWARFDebugInfoEntryMinimal::extract(const DWARFCompileUnit *CU, } bool IsCompileUnitTag = (AbbrevDecl->getTag() == DW_TAG_compile_unit); if (IsCompileUnitTag) - const_cast<DWARFCompileUnit*>(CU)->setBaseAddress(0); + const_cast<DWARFUnit *>(U)->setBaseAddress(0); // Skip all data in the .debug_info for the attributes for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) { @@ -162,13 +159,11 @@ DWARFDebugInfoEntryMinimal::extract(const DWARFCompileUnit *CU, if (IsCompileUnitTag && ((Attr == DW_AT_entry_pc) || (Attr == DW_AT_low_pc))) { DWARFFormValue FormValue(Form); - if (FormValue.extractValue(DebugInfoData, OffsetPtr, CU)) { + if (FormValue.extractValue(DebugInfoData, OffsetPtr, U)) { if (Attr == DW_AT_low_pc || Attr == DW_AT_entry_pc) - const_cast<DWARFCompileUnit*>(CU) - ->setBaseAddress(FormValue.getUnsigned()); + const_cast<DWARFUnit *>(U)->setBaseAddress(FormValue.getUnsigned()); } - } else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, - CU)) { + } else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) { // Restore the original offset. *OffsetPtr = Offset; return false; @@ -187,19 +182,16 @@ bool DWARFDebugInfoEntryMinimal::isSubroutineDIE() const { Tag == DW_TAG_inlined_subroutine; } -uint32_t -DWARFDebugInfoEntryMinimal::getAttributeValue(const DWARFCompileUnit *cu, - const uint16_t attr, - DWARFFormValue &form_value, - uint32_t *end_attr_offset_ptr) - const { +uint32_t DWARFDebugInfoEntryMinimal::getAttributeValue( + const DWARFUnit *u, const uint16_t attr, DWARFFormValue &form_value, + uint32_t *end_attr_offset_ptr) const { if (AbbrevDecl) { uint32_t attr_idx = AbbrevDecl->findAttributeIndex(attr); if (attr_idx != -1U) { uint32_t offset = getOffset(); - DataExtractor debug_info_data = cu->getDebugInfoExtractor(); + DataExtractor debug_info_data = u->getDebugInfoExtractor(); // Skip the abbreviation code so we are at the data for the attributes debug_info_data.getULEB128(&offset); @@ -207,11 +199,11 @@ DWARFDebugInfoEntryMinimal::getAttributeValue(const DWARFCompileUnit *cu, uint32_t idx = 0; while (idx < attr_idx) DWARFFormValue::skipValue(AbbrevDecl->getFormByIndex(idx++), - debug_info_data, &offset, cu); + debug_info_data, &offset, u); const uint32_t attr_offset = offset; form_value = DWARFFormValue(AbbrevDecl->getFormByIndex(idx)); - if (form_value.extractValue(debug_info_data, &offset, cu)) { + if (form_value.extractValue(debug_info_data, &offset, u)) { if (end_attr_offset_ptr) *end_attr_offset_ptr = offset; return attr_offset; @@ -223,155 +215,140 @@ DWARFDebugInfoEntryMinimal::getAttributeValue(const DWARFCompileUnit *cu, } const char *DWARFDebugInfoEntryMinimal::getAttributeValueAsString( - const DWARFCompileUnit *CU, const uint16_t Attr, - const char *FailValue) const { + const DWARFUnit *U, const uint16_t Attr, const char *FailValue) const { DWARFFormValue FormValue; - if (getAttributeValue(CU, Attr, FormValue)) - return FormValue.getAsCString(CU); + if (getAttributeValue(U, Attr, FormValue)) + return FormValue.getAsCString(U); return FailValue; } uint64_t DWARFDebugInfoEntryMinimal::getAttributeValueAsAddress( - const DWARFCompileUnit *CU, const uint16_t Attr, uint64_t FailValue) const { + const DWARFUnit *U, const uint16_t Attr, uint64_t FailValue) const { DWARFFormValue FormValue; - if (getAttributeValue(CU, Attr, FormValue)) - return FormValue.getAsAddress(CU); + if (getAttributeValue(U, Attr, FormValue)) + return FormValue.getAsAddress(U); return FailValue; } uint64_t DWARFDebugInfoEntryMinimal::getAttributeValueAsUnsigned( - const DWARFCompileUnit *CU, const uint16_t Attr, uint64_t FailValue) const { + const DWARFUnit *U, const uint16_t Attr, uint64_t FailValue) const { DWARFFormValue FormValue; - if (getAttributeValue(CU, Attr, FormValue)) { + if (getAttributeValue(U, Attr, FormValue)) return FormValue.getUnsigned(); - } return FailValue; } -int64_t -DWARFDebugInfoEntryMinimal::getAttributeValueAsSigned( - const DWARFCompileUnit* cu, - const uint16_t attr, - int64_t fail_value) const { +int64_t DWARFDebugInfoEntryMinimal::getAttributeValueAsSigned( + const DWARFUnit *u, const uint16_t attr, int64_t fail_value) const { DWARFFormValue form_value; - if (getAttributeValue(cu, attr, form_value)) + if (getAttributeValue(u, attr, form_value)) return form_value.getSigned(); return fail_value; } -uint64_t -DWARFDebugInfoEntryMinimal::getAttributeValueAsReference( - const DWARFCompileUnit* cu, - const uint16_t attr, - uint64_t fail_value) - const { +uint64_t DWARFDebugInfoEntryMinimal::getAttributeValueAsReference( + const DWARFUnit *u, const uint16_t attr, uint64_t fail_value) const { DWARFFormValue form_value; - if (getAttributeValue(cu, attr, form_value)) - return form_value.getReference(cu); + if (getAttributeValue(u, attr, form_value)) + return form_value.getReference(u); return fail_value; } -bool DWARFDebugInfoEntryMinimal::getLowAndHighPC(const DWARFCompileUnit *CU, +bool DWARFDebugInfoEntryMinimal::getLowAndHighPC(const DWARFUnit *U, uint64_t &LowPC, uint64_t &HighPC) const { HighPC = -1ULL; - LowPC = getAttributeValueAsAddress(CU, DW_AT_low_pc, -1ULL); + LowPC = getAttributeValueAsAddress(U, DW_AT_low_pc, -1ULL); if (LowPC != -1ULL) - HighPC = getAttributeValueAsAddress(CU, DW_AT_high_pc, -1ULL); + HighPC = getAttributeValueAsAddress(U, DW_AT_high_pc, -1ULL); return (HighPC != -1ULL); } -void -DWARFDebugInfoEntryMinimal::buildAddressRangeTable(const DWARFCompileUnit *CU, - DWARFDebugAranges *DebugAranges, - uint32_t CUOffsetInAranges) - const { +void DWARFDebugInfoEntryMinimal::buildAddressRangeTable( + const DWARFUnit *U, DWARFDebugAranges *DebugAranges, + uint32_t UOffsetInAranges) const { if (AbbrevDecl) { if (isSubprogramDIE()) { uint64_t LowPC, HighPC; - if (getLowAndHighPC(CU, LowPC, HighPC)) - DebugAranges->appendRange(CUOffsetInAranges, LowPC, HighPC); + if (getLowAndHighPC(U, LowPC, HighPC)) + DebugAranges->appendRange(UOffsetInAranges, LowPC, HighPC); // FIXME: try to append ranges from .debug_ranges section. } const DWARFDebugInfoEntryMinimal *Child = getFirstChild(); while (Child) { - Child->buildAddressRangeTable(CU, DebugAranges, CUOffsetInAranges); + Child->buildAddressRangeTable(U, DebugAranges, UOffsetInAranges); Child = Child->getSibling(); } } } -bool -DWARFDebugInfoEntryMinimal::addressRangeContainsAddress( - const DWARFCompileUnit *CU, - const uint64_t Address) - const { +bool DWARFDebugInfoEntryMinimal::addressRangeContainsAddress( + const DWARFUnit *U, const uint64_t Address) const { if (isNULL()) return false; uint64_t LowPC, HighPC; - if (getLowAndHighPC(CU, LowPC, HighPC)) + if (getLowAndHighPC(U, LowPC, HighPC)) return (LowPC <= Address && Address <= HighPC); // Try to get address ranges from .debug_ranges section. - uint32_t RangesOffset = getAttributeValueAsReference(CU, DW_AT_ranges, -1U); + uint32_t RangesOffset = getAttributeValueAsReference(U, DW_AT_ranges, -1U); if (RangesOffset != -1U) { DWARFDebugRangeList RangeList; - if (CU->extractRangeList(RangesOffset, RangeList)) - return RangeList.containsAddress(CU->getBaseAddress(), Address); + if (U->extractRangeList(RangesOffset, RangeList)) + return RangeList.containsAddress(U->getBaseAddress(), Address); } return false; } -const char* -DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFCompileUnit *CU) - const { +const char * +DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U) const { if (!isSubroutineDIE()) return 0; // Try to get mangled name if possible. if (const char *name = - getAttributeValueAsString(CU, DW_AT_MIPS_linkage_name, 0)) + getAttributeValueAsString(U, DW_AT_MIPS_linkage_name, 0)) return name; - if (const char *name = getAttributeValueAsString(CU, DW_AT_linkage_name, 0)) + if (const char *name = getAttributeValueAsString(U, DW_AT_linkage_name, 0)) return name; - if (const char *name = getAttributeValueAsString(CU, DW_AT_name, 0)) + if (const char *name = getAttributeValueAsString(U, DW_AT_name, 0)) return name; // Try to get name from specification DIE. uint32_t spec_ref = - getAttributeValueAsReference(CU, DW_AT_specification, -1U); + getAttributeValueAsReference(U, DW_AT_specification, -1U); if (spec_ref != -1U) { DWARFDebugInfoEntryMinimal spec_die; - if (spec_die.extract(CU, &spec_ref)) { - if (const char *name = spec_die.getSubroutineName(CU)) + if (spec_die.extract(U, &spec_ref)) { + if (const char *name = spec_die.getSubroutineName(U)) return name; } } // Try to get name from abstract origin DIE. uint32_t abs_origin_ref = - getAttributeValueAsReference(CU, DW_AT_abstract_origin, -1U); + getAttributeValueAsReference(U, DW_AT_abstract_origin, -1U); if (abs_origin_ref != -1U) { DWARFDebugInfoEntryMinimal abs_origin_die; - if (abs_origin_die.extract(CU, &abs_origin_ref)) { - if (const char *name = abs_origin_die.getSubroutineName(CU)) + if (abs_origin_die.extract(U, &abs_origin_ref)) { + if (const char *name = abs_origin_die.getSubroutineName(U)) return name; } } return 0; } -void DWARFDebugInfoEntryMinimal::getCallerFrame(const DWARFCompileUnit *CU, +void DWARFDebugInfoEntryMinimal::getCallerFrame(const DWARFUnit *U, uint32_t &CallFile, uint32_t &CallLine, uint32_t &CallColumn) const { - CallFile = getAttributeValueAsUnsigned(CU, DW_AT_call_file, 0); - CallLine = getAttributeValueAsUnsigned(CU, DW_AT_call_line, 0); - CallColumn = getAttributeValueAsUnsigned(CU, DW_AT_call_column, 0); + CallFile = getAttributeValueAsUnsigned(U, DW_AT_call_file, 0); + CallLine = getAttributeValueAsUnsigned(U, DW_AT_call_line, 0); + CallColumn = getAttributeValueAsUnsigned(U, DW_AT_call_column, 0); } DWARFDebugInfoEntryInlinedChain DWARFDebugInfoEntryMinimal::getInlinedChainForAddress( - const DWARFCompileUnit *CU, const uint64_t Address) const { + const DWARFUnit *U, const uint64_t Address) const { DWARFDebugInfoEntryInlinedChain InlinedChain; - InlinedChain.CU = CU; + InlinedChain.U = U; if (isNULL()) return InlinedChain; for (const DWARFDebugInfoEntryMinimal *DIE = this; DIE; ) { @@ -383,7 +360,7 @@ DWARFDebugInfoEntryMinimal::getInlinedChainForAddress( // Try to get child which also contains provided address. const DWARFDebugInfoEntryMinimal *Child = DIE->getFirstChild(); while (Child) { - if (Child->addressRangeContainsAddress(CU, Address)) { + if (Child->addressRangeContainsAddress(U, Address)) { // Assume there is only one such child. break; } |