[Lldb-commits] [lldb] r303854 - Revert "Fix FDE indexing while scan debug_info section."

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Thu May 25 06:13:13 PDT 2017


Author: labath
Date: Thu May 25 08:13:12 2017
New Revision: 303854

URL: http://llvm.org/viewvc/llvm-project?rev=303854&view=rev
Log:
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.

Modified:
    lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp
    lldb/trunk/source/Symbol/UnwindTable.cpp

Modified: lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp?rev=303854&r1=303853&r2=303854&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp (original)
+++ lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp Thu May 25 08:13:12 2017
@@ -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
     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

Modified: lldb/trunk/source/Symbol/UnwindTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/UnwindTable.cpp?rev=303854&r1=303853&r2=303854&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/UnwindTable.cpp (original)
+++ lldb/trunk/source/Symbol/UnwindTable.cpp Thu May 25 08:13:12 2017
@@ -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()) {




More information about the lldb-commits mailing list