mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-23 17:24:48 +00:00
Merge DWARFDIE::extractFast and DWARFDIE::extract into one function.
Complicated CU-DIE-specific logic in the latter was never used, and it makes sense to have safety checks for broken dwarf in the former. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193563 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -96,41 +96,8 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
|
|||||||
uint32_t *OffsetPtr) {
|
uint32_t *OffsetPtr) {
|
||||||
Offset = *OffsetPtr;
|
Offset = *OffsetPtr;
|
||||||
DataExtractor DebugInfoData = U->getDebugInfoExtractor();
|
DataExtractor DebugInfoData = U->getDebugInfoExtractor();
|
||||||
uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
|
uint32_t UEndOffset = U->getNextUnitOffset();
|
||||||
if (0 == AbbrCode) {
|
if (Offset >= UEndOffset || !DebugInfoData.isValidOffset(Offset))
|
||||||
// NULL debug tag entry.
|
|
||||||
AbbrevDecl = NULL;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode);
|
|
||||||
assert(AbbrevDecl);
|
|
||||||
ArrayRef<uint8_t> FixedFormSizes = DWARFFormValue::getFixedFormSizes(
|
|
||||||
U->getAddressByteSize(), U->getVersion());
|
|
||||||
assert(FixedFormSizes.size() > 0);
|
|
||||||
|
|
||||||
// Skip all data in the .debug_info for the attributes
|
|
||||||
for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) {
|
|
||||||
uint16_t Form = AbbrevDecl->getFormByIndex(i);
|
|
||||||
|
|
||||||
uint8_t FixedFormSize =
|
|
||||||
(Form < FixedFormSizes.size()) ? FixedFormSizes[Form] : 0;
|
|
||||||
if (FixedFormSize)
|
|
||||||
*OffsetPtr += FixedFormSize;
|
|
||||||
else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) {
|
|
||||||
// Restore the original offset.
|
|
||||||
*OffsetPtr = Offset;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DWARFDebugInfoEntryMinimal::extract(const DWARFUnit *U,
|
|
||||||
uint32_t *OffsetPtr) {
|
|
||||||
DataExtractor DebugInfoData = U->getDebugInfoExtractor();
|
|
||||||
const uint32_t UEndOffset = U->getNextUnitOffset();
|
|
||||||
Offset = *OffsetPtr;
|
|
||||||
if ((Offset >= UEndOffset) || !DebugInfoData.isValidOffset(Offset))
|
|
||||||
return false;
|
return false;
|
||||||
uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
|
uint64_t AbbrCode = DebugInfoData.getULEB128(OffsetPtr);
|
||||||
if (0 == AbbrCode) {
|
if (0 == AbbrCode) {
|
||||||
@ -144,26 +111,19 @@ bool DWARFDebugInfoEntryMinimal::extract(const DWARFUnit *U,
|
|||||||
*OffsetPtr = Offset;
|
*OffsetPtr = Offset;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool IsCompileUnitTag = (AbbrevDecl->getTag() == DW_TAG_compile_unit);
|
ArrayRef<uint8_t> FixedFormSizes = DWARFFormValue::getFixedFormSizes(
|
||||||
if (IsCompileUnitTag)
|
U->getAddressByteSize(), U->getVersion());
|
||||||
const_cast<DWARFUnit *>(U)->setBaseAddress(0);
|
assert(FixedFormSizes.size() > 0);
|
||||||
|
|
||||||
// Skip all data in the .debug_info for the attributes
|
// Skip all data in the .debug_info for the attributes
|
||||||
for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) {
|
for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) {
|
||||||
uint16_t Attr = AbbrevDecl->getAttrByIndex(i);
|
|
||||||
uint16_t Form = AbbrevDecl->getFormByIndex(i);
|
uint16_t Form = AbbrevDecl->getFormByIndex(i);
|
||||||
|
|
||||||
if (IsCompileUnitTag &&
|
uint8_t FixedFormSize =
|
||||||
((Attr == DW_AT_entry_pc) || (Attr == DW_AT_low_pc))) {
|
(Form < FixedFormSizes.size()) ? FixedFormSizes[Form] : 0;
|
||||||
DWARFFormValue FormValue(Form);
|
if (FixedFormSize)
|
||||||
if (FormValue.extractValue(DebugInfoData, OffsetPtr, U)) {
|
*OffsetPtr += FixedFormSize;
|
||||||
if (Attr == DW_AT_low_pc || Attr == DW_AT_entry_pc) {
|
else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) {
|
||||||
Optional<uint64_t> BaseAddr = FormValue.getAsAddress(U);
|
|
||||||
if (BaseAddr.hasValue())
|
|
||||||
const_cast<DWARFUnit *>(U)->setBaseAddress(BaseAddr.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) {
|
|
||||||
// Restore the original offset.
|
// Restore the original offset.
|
||||||
*OffsetPtr = Offset;
|
*OffsetPtr = Offset;
|
||||||
return false;
|
return false;
|
||||||
@ -323,7 +283,7 @@ DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U) const {
|
|||||||
getAttributeValueAsReference(U, DW_AT_specification, -1U);
|
getAttributeValueAsReference(U, DW_AT_specification, -1U);
|
||||||
if (spec_ref != -1U) {
|
if (spec_ref != -1U) {
|
||||||
DWARFDebugInfoEntryMinimal spec_die;
|
DWARFDebugInfoEntryMinimal spec_die;
|
||||||
if (spec_die.extract(U, &spec_ref)) {
|
if (spec_die.extractFast(U, &spec_ref)) {
|
||||||
if (const char *name = spec_die.getSubroutineName(U))
|
if (const char *name = spec_die.getSubroutineName(U))
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@ -333,7 +293,7 @@ DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFUnit *U) const {
|
|||||||
getAttributeValueAsReference(U, DW_AT_abstract_origin, -1U);
|
getAttributeValueAsReference(U, DW_AT_abstract_origin, -1U);
|
||||||
if (abs_origin_ref != -1U) {
|
if (abs_origin_ref != -1U) {
|
||||||
DWARFDebugInfoEntryMinimal abs_origin_die;
|
DWARFDebugInfoEntryMinimal abs_origin_die;
|
||||||
if (abs_origin_die.extract(U, &abs_origin_ref)) {
|
if (abs_origin_die.extractFast(U, &abs_origin_ref)) {
|
||||||
if (const char *name = abs_origin_die.getSubroutineName(U))
|
if (const char *name = abs_origin_die.getSubroutineName(U))
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
@ -50,12 +50,6 @@ public:
|
|||||||
/// doesn't change OffsetPtr.
|
/// doesn't change OffsetPtr.
|
||||||
bool extractFast(const DWARFUnit *U, uint32_t *OffsetPtr);
|
bool extractFast(const DWARFUnit *U, uint32_t *OffsetPtr);
|
||||||
|
|
||||||
/// Extract a debug info entry for a given compile unit from the
|
|
||||||
/// .debug_info and .debug_abbrev data starting at the given offset.
|
|
||||||
/// If compile unit can't be parsed, returns false and doesn't change
|
|
||||||
/// OffsetPtr.
|
|
||||||
bool extract(const DWARFUnit *U, uint32_t *OffsetPtr);
|
|
||||||
|
|
||||||
uint32_t getTag() const { return AbbrevDecl ? AbbrevDecl->getTag() : 0; }
|
uint32_t getTag() const { return AbbrevDecl ? AbbrevDecl->getTag() : 0; }
|
||||||
bool isNULL() const { return AbbrevDecl == 0; }
|
bool isNULL() const { return AbbrevDecl == 0; }
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user