ravitheja updated this revision to Diff 45238.
ravitheja added a comment.

correcting previous revision.


http://reviews.llvm.org/D16107

Files:
  
packages/Python/lldbsuite/test/functionalities/inferior-assert/TestInferiorAssert.py
  
packages/Python/lldbsuite/test/functionalities/unwind/noreturn/TestNoreturnUnwind.py
  packages/Python/lldbsuite/test/python_api/hello_world/TestHelloWorld.py
  source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
  source/Plugins/ObjectFile/ELF/ObjectFileELF.h

Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.h
===================================================================
--- source/Plugins/ObjectFile/ELF/ObjectFileELF.h
+++ source/Plugins/ObjectFile/ELF/ObjectFileELF.h
@@ -14,6 +14,7 @@
 #include <stdint.h>
 
 // C++ Includes
+#include <functional>
 #include <vector>
 
 // Other libraries and framework includes
@@ -231,6 +232,7 @@
     typedef DynamicSymbolColl::const_iterator   DynamicSymbolCollConstIter;
 
     typedef std::map<lldb::addr_t, lldb::AddressClass> FileAddressToAddressClassMap;
+    typedef std::function<lldb::offset_t (lldb_private::DataExtractor &, lldb::offset_t, lldb::offset_t)> SetDataFunction;
 
     /// Version of this reader common to all plugins based on this class.
     static const uint32_t m_plugin_version = 1;
@@ -279,7 +281,7 @@
     // Parses the ELF program headers.
     static size_t
     GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
-                         lldb_private::DataExtractor &data,
+                         const SetDataFunction &set_data,
                          const elf::ELFHeader &header);
 
     // Finds PT_NOTE segments and calculates their crc sum.
@@ -302,7 +304,7 @@
     /// Parses the elf section headers and returns the uuid, debug link name, crc, archspec.
     static size_t
     GetSectionHeaderInfo(SectionHeaderColl &section_headers,
-                         lldb_private::DataExtractor &data,
+                         const SetDataFunction &set_data,
                          const elf::ELFHeader &header,
                          lldb_private::UUID &uuid,
                          std::string &gnu_debuglink_file,
@@ -437,6 +439,13 @@
 
     static lldb_private::Error
     RefineModuleDetailsFromNote (lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch_spec, lldb_private::UUID &uuid);
+
+
+    static lldb::offset_t
+    SetData(const lldb_private::DataExtractor &src, lldb_private::DataExtractor &dst, lldb::offset_t offset, lldb::offset_t length);
+
+    lldb::offset_t
+    SetDataWithReadMemoryFallback(lldb_private::DataExtractor &dst, lldb::offset_t offset, lldb::offset_t length);
 };
 
 #endif // liblldb_ObjectFileELF_h_
Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
===================================================================
--- source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -729,7 +729,10 @@
                     SectionHeaderColl section_headers;
                     lldb_private::UUID &uuid = spec.GetUUID();
 
-                    GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc, spec.GetArchitecture ());
+                    using namespace std::placeholders;
+                    const SetDataFunction set_data = std::bind(&ObjectFileELF::SetData, std::cref(data), _1, _2, _3);
+                    GetSectionHeaderInfo(section_headers, set_data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc, spec.GetArchitecture ());
+
 
                     llvm::Triple &spec_triple = spec.GetArchitecture ().GetTriple ();
 
@@ -759,7 +762,7 @@
                                     data.SetData(data_sp);
                                 }
                                 ProgramHeaderColl program_headers;
-                                GetProgramHeaderInfo(program_headers, data, header);
+                                GetProgramHeaderInfo(program_headers, set_data, header);
 
                                 size_t segment_data_end = 0;
                                 for (ProgramHeaderCollConstIter I = program_headers.begin();
@@ -1256,7 +1259,7 @@
 //----------------------------------------------------------------------
 size_t
 ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
-                                    DataExtractor &object_data,
+                                    const SetDataFunction &set_data,
                                     const ELFHeader &header)
 {
     // We have already parsed the program headers
@@ -1274,7 +1277,7 @@
     const size_t ph_size = header.e_phnum * header.e_phentsize;
     const elf_off ph_offset = header.e_phoff;
     DataExtractor data;
-    if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
+    if (set_data(data, ph_offset, ph_size) != ph_size)
         return 0;
 
     uint32_t idx;
@@ -1298,7 +1301,10 @@
 size_t
 ObjectFileELF::ParseProgramHeaders()
 {
-    return GetProgramHeaderInfo(m_program_headers, m_data, m_header);
+    using namespace std::placeholders;
+    return GetProgramHeaderInfo(m_program_headers,
+                                std::bind(&ObjectFileELF::SetDataWithReadMemoryFallback, this, _1, _2, _3),
+                                m_header);
 }
 
 lldb_private::Error
@@ -1511,7 +1517,7 @@
 //----------------------------------------------------------------------
 size_t
 ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
-                                    lldb_private::DataExtractor &object_data,
+                                    const SetDataFunction &set_data,
                                     const elf::ELFHeader &header,
                                     lldb_private::UUID &uuid,
                                     std::string &gnu_debuglink_file,
@@ -1569,7 +1575,7 @@
     const size_t sh_size = header.e_shnum * header.e_shentsize;
     const elf_off sh_offset = header.e_shoff;
     DataExtractor sh_data;
-    if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size)
+    if (set_data (sh_data, sh_offset, sh_size) != sh_size)
         return 0;
 
     uint32_t idx;
@@ -1590,7 +1596,7 @@
         const Elf64_Off offset = sheader.sh_offset;
         lldb_private::DataExtractor shstr_data;
 
-        if (shstr_data.SetData (object_data, offset, byte_size) == byte_size)
+        if (set_data (shstr_data, offset, byte_size) == byte_size)
         {
             for (SectionHeaderCollIter I = section_headers.begin();
                  I != section_headers.end(); ++I)
@@ -1610,7 +1616,7 @@
                     if (sheader.sh_type == SHT_MIPS_ABIFLAGS)
                     {
 
-                        if (section_size && (data.SetData (object_data, sheader.sh_offset, section_size) == section_size))
+                        if (section_size && (set_data (data, sheader.sh_offset, section_size) == section_size))
                         {
                             lldb::offset_t ase_offset = 12; // MIPS ABI Flags Version: 0
                             arch_flags |= data.GetU32 (&ase_offset);
@@ -1631,7 +1637,7 @@
                 if (name == g_sect_name_gnu_debuglink)
                 {
                     DataExtractor data;
-                    if (section_size && (data.SetData (object_data, sheader.sh_offset, section_size) == section_size))
+                    if (section_size && (set_data (data, sheader.sh_offset, section_size) == section_size))
                     {
                         lldb::offset_t gnu_debuglink_offset = 0;
                         gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
@@ -1653,7 +1659,7 @@
                 {
                     // Allow notes to refine module info.
                     DataExtractor data;
-                    if (section_size && (data.SetData (object_data, sheader.sh_offset, section_size) == section_size))
+                    if (section_size && (set_data (data, sheader.sh_offset, section_size) == section_size))
                     {
                         Error error = RefineModuleDetailsFromNote (data, arch_spec, uuid);
                         if (error.Fail ())
@@ -1719,7 +1725,41 @@
 size_t
 ObjectFileELF::ParseSectionHeaders()
 {
-    return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc, m_arch_spec);
+    using namespace std::placeholders;
+
+    return GetSectionHeaderInfo(m_section_headers,
+                                std::bind(&ObjectFileELF::SetDataWithReadMemoryFallback, this, _1, _2, _3),
+                                m_header,
+                                m_uuid,
+                                m_gnu_debuglink_file,
+                                m_gnu_debuglink_crc,
+                                m_arch_spec);
+}
+
+lldb::offset_t
+ObjectFileELF::SetData(const lldb_private::DataExtractor &src, lldb_private::DataExtractor &dst, lldb::offset_t offset, lldb::offset_t length)
+{
+    return dst.SetData(src, offset, length);
+}
+
+lldb::offset_t
+ObjectFileELF::SetDataWithReadMemoryFallback(lldb_private::DataExtractor &dst, lldb::offset_t offset, lldb::offset_t length)
+{
+    if (offset + length <= m_data.GetByteSize())
+        return dst.SetData(m_data, offset, length);
+
+    const auto process_sp = m_process_wp.lock();
+    if (process_sp != nullptr)
+    {
+        addr_t file_size = offset + length;
+
+        DataBufferSP data_sp = ReadMemory(process_sp, m_memory_addr, file_size);
+        if (!data_sp)
+            return false;
+        m_data.SetData(data_sp, 0, file_size);
+    }
+
+    return dst.SetData(m_data, offset, length);
 }
 
 const ObjectFileELF::ELFSectionHeaderInfo *
Index: packages/Python/lldbsuite/test/python_api/hello_world/TestHelloWorld.py
===================================================================
--- packages/Python/lldbsuite/test/python_api/hello_world/TestHelloWorld.py
+++ packages/Python/lldbsuite/test/python_api/hello_world/TestHelloWorld.py
@@ -75,7 +75,6 @@
 
     @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24600")
-    @expectedFailurei386("llvm.org/pr25338")
     @skipIfiOSSimulator
     def test_with_attach_to_process_with_id_api(self):
         """Create target, spawn a process, and attach to it with process id."""
@@ -105,7 +104,6 @@
 
     @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24600")
-    @expectedFailurei386("llvm.org/pr25338")
     @skipIfiOSSimulator
     def test_with_attach_to_process_with_name_api(self):
         """Create target, spawn a process, and attach to it with process name."""
Index: packages/Python/lldbsuite/test/functionalities/unwind/noreturn/TestNoreturnUnwind.py
===================================================================
--- packages/Python/lldbsuite/test/functionalities/unwind/noreturn/TestNoreturnUnwind.py
+++ packages/Python/lldbsuite/test/functionalities/unwind/noreturn/TestNoreturnUnwind.py
@@ -14,7 +14,6 @@
 class NoreturnUnwind(TestBase):
     mydir = TestBase.compute_mydir(__file__)
 
-    @expectedFailurei386("llvm.org/pr25338")
     @skipIfWindows # clang-cl does not support gcc style attributes.
     def test (self):
         """Test that we can backtrace correctly with 'noreturn' functions on the stack"""
Index: packages/Python/lldbsuite/test/functionalities/inferior-assert/TestInferiorAssert.py
===================================================================
--- packages/Python/lldbsuite/test/functionalities/inferior-assert/TestInferiorAssert.py
+++ packages/Python/lldbsuite/test/functionalities/inferior-assert/TestInferiorAssert.py
@@ -15,8 +15,7 @@
     mydir = TestBase.compute_mydir(__file__)
 
     @expectedFailureWindows("llvm.org/pr21793: need to implement support for detecting assertion / abort on Windows")
-    @expectedFailurei386("llvm.org/pr25338")
-    @expectedFailureLinux("llvm.org/pr25338", archs=['arm', 'i386'])
+    @expectedFailureLinux("llvm.org/pr25338", archs=['arm'])
     def test_inferior_asserting(self):
         """Test that lldb reliably catches the inferior asserting (command)."""
         self.build()
@@ -30,8 +29,7 @@
         self.inferior_asserting_registers()
 
     @expectedFailureWindows("llvm.org/pr21793: need to implement support for detecting assertion / abort on Windows")
-    @expectedFailurei386("llvm.org/pr25338")
-    @expectedFailureLinux("llvm.org/pr25338", archs=['arm', 'i386'])
+    @expectedFailureLinux("llvm.org/pr25338", archs=['arm'])
     def test_inferior_asserting_disassemble(self):
         """Test that lldb reliably disassembles frames after asserting (command)."""
         self.build()
@@ -45,16 +43,14 @@
         self.inferior_asserting_python()
 
     @expectedFailureWindows("llvm.org/pr21793: need to implement support for detecting assertion / abort on Windows")
-    @expectedFailurei386("llvm.org/pr25338")
-    @expectedFailureLinux("llvm.org/pr25338", archs=['arm', 'i386'])
+    @expectedFailureLinux("llvm.org/pr25338", archs=['arm'])
     def test_inferior_asserting_expr(self):
         """Test that the lldb expression interpreter can read from the inferior after asserting (command)."""
         self.build()
         self.inferior_asserting_expr()
 
     @expectedFailureWindows("llvm.org/pr21793: need to implement support for detecting assertion / abort on Windows")
-    @expectedFailurei386("llvm.org/pr25338")
-    @expectedFailureLinux("llvm.org/pr25338", archs=['arm', 'i386'])
+    @expectedFailureLinux("llvm.org/pr25338", archs=['arm'])
     def test_inferior_asserting_step(self):
         """Test that lldb functions correctly after stepping through a call to assert()."""
         self.build()
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to