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:
Pavel Labath 2017-05-25 13:13:12 +00:00
parent 2a237f19f1
commit e8cd2cca91
2 changed files with 11 additions and 27 deletions

View File

@ -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

View File

@ -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()) {