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,25 +461,11 @@ void DWARFCallFrameInfo::GetFDEIndex() {
|
|||
m_fde_index_initialized = true;
|
||||
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()) {
|
||||
Host::SystemLog(Host::eSystemLogError,
|
||||
"error: Invalid cie offset of 0x%x "
|
||||
"found in cie/fde at 0x%x\n",
|
||||
cie_offset, current_entry);
|
||||
Host::SystemLog(
|
||||
Host::eSystemLogError,
|
||||
"error: Invalid cie offset of 0x%x found in cie/fde at 0x%x\n",
|
||||
cie_offset, current_entry);
|
||||
// Don't trust anything in this eh_frame section if we find blatantly
|
||||
// invalid data.
|
||||
m_fde_index.Clear();
|
||||
|
@ -487,6 +473,12 @@ void DWARFCallFrameInfo::GetFDEIndex() {
|
|||
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);
|
||||
if (cie) {
|
||||
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);
|
||||
}
|
||||
|
||||
// FDE entries with zero cie_offset may occur for debug_frame.
|
||||
assert(!(m_is_eh_frame && 0 == cie_offset) && cie_offset != UINT32_MAX);
|
||||
assert(cie_offset != 0 && cie_offset != UINT32_MAX);
|
||||
|
||||
// Translate the CIE_id from the eh_frame format, which
|
||||
// is relative to the FDE offset, into a __eh_frame section
|
||||
|
|
|
@ -51,13 +51,6 @@ void UnwindTable::Initialize() {
|
|||
if (sect.get()) {
|
||||
m_eh_frame_up.reset(new DWARFCallFrameInfo(m_object_file, sect,
|
||||
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);
|
||||
if (sect.get()) {
|
||||
|
|
Loading…
Reference in New Issue