forked from OSchip/llvm-project
Revert "Fix FDE indexing while scan debug_info section."
This reverts commit r303847 as it introduces a number of regressions. Investigation has showed that we are parsing the CIE entries in the debug_frame section incorrectly -- we are parsing them the same way as eh_frame, but the entries in debug_frame have a couple of extra entries which have not been taken into account. llvm-svn: 303854
This commit is contained in:
parent
2a237f19f1
commit
e8cd2cca91
|
@ -461,24 +461,10 @@ void DWARFCallFrameInfo::GetFDEIndex() {
|
||||||
m_fde_index_initialized = true;
|
m_fde_index_initialized = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// An FDE entry contains CIE_pointer in debug_frame in same place as cie_id
|
|
||||||
// in eh_frame. CIE_pointer is an offset into the .debug_frame section.
|
|
||||||
// So, variable cie_offset should be equal cie_id for debug_frame.
|
|
||||||
// FDE entries with cie_id == 0 shouldn't be ignored for it.
|
|
||||||
if ((cie_id == 0 && m_is_eh_frame) || cie_id == UINT32_MAX || len == 0) {
|
|
||||||
m_cie_map[current_entry] = ParseCIE(current_entry);
|
|
||||||
offset = next_entry;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_is_eh_frame)
|
|
||||||
cie_offset = cie_id;
|
|
||||||
|
|
||||||
if (cie_offset > m_cfi_data.GetByteSize()) {
|
if (cie_offset > m_cfi_data.GetByteSize()) {
|
||||||
Host::SystemLog(Host::eSystemLogError,
|
Host::SystemLog(
|
||||||
"error: Invalid cie offset of 0x%x "
|
Host::eSystemLogError,
|
||||||
"found in cie/fde at 0x%x\n",
|
"error: Invalid cie offset of 0x%x found in cie/fde at 0x%x\n",
|
||||||
cie_offset, current_entry);
|
cie_offset, current_entry);
|
||||||
// Don't trust anything in this eh_frame section if we find blatantly
|
// Don't trust anything in this eh_frame section if we find blatantly
|
||||||
// invalid data.
|
// invalid data.
|
||||||
|
@ -487,6 +473,12 @@ void DWARFCallFrameInfo::GetFDEIndex() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cie_id == 0 || cie_id == UINT32_MAX || len == 0) {
|
||||||
|
m_cie_map[current_entry] = ParseCIE(current_entry);
|
||||||
|
offset = next_entry;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const CIE *cie = GetCIE(cie_offset);
|
const CIE *cie = GetCIE(cie_offset);
|
||||||
if (cie) {
|
if (cie) {
|
||||||
const lldb::addr_t pc_rel_addr = m_section_sp->GetFileAddress();
|
const lldb::addr_t pc_rel_addr = m_section_sp->GetFileAddress();
|
||||||
|
@ -539,8 +531,7 @@ bool DWARFCallFrameInfo::FDEToUnwindPlan(dw_offset_t dwarf_offset,
|
||||||
cie_offset = m_cfi_data.GetU32(&offset);
|
cie_offset = m_cfi_data.GetU32(&offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FDE entries with zero cie_offset may occur for debug_frame.
|
assert(cie_offset != 0 && cie_offset != UINT32_MAX);
|
||||||
assert(!(m_is_eh_frame && 0 == cie_offset) && cie_offset != UINT32_MAX);
|
|
||||||
|
|
||||||
// Translate the CIE_id from the eh_frame format, which
|
// Translate the CIE_id from the eh_frame format, which
|
||||||
// is relative to the FDE offset, into a __eh_frame section
|
// is relative to the FDE offset, into a __eh_frame section
|
||||||
|
|
|
@ -51,13 +51,6 @@ void UnwindTable::Initialize() {
|
||||||
if (sect.get()) {
|
if (sect.get()) {
|
||||||
m_eh_frame_up.reset(new DWARFCallFrameInfo(m_object_file, sect,
|
m_eh_frame_up.reset(new DWARFCallFrameInfo(m_object_file, sect,
|
||||||
eRegisterKindEHFrame, true));
|
eRegisterKindEHFrame, true));
|
||||||
} else {
|
|
||||||
// Try to find .debug_frame section if .eh_frame doesn't exist.
|
|
||||||
sect = sl->FindSectionByType(eSectionTypeDWARFDebugFrame, true);
|
|
||||||
if (sect.get()) {
|
|
||||||
m_eh_frame_up.reset(new DWARFCallFrameInfo(m_object_file, sect,
|
|
||||||
eRegisterKindDWARF, false));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sect = sl->FindSectionByType(eSectionTypeCompactUnwind, true);
|
sect = sl->FindSectionByType(eSectionTypeCompactUnwind, true);
|
||||||
if (sect.get()) {
|
if (sect.get()) {
|
||||||
|
|
Loading…
Reference in New Issue