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() 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/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: source/Plugins/ObjectFile/ELF/ObjectFileELF.h =================================================================== --- source/Plugins/ObjectFile/ELF/ObjectFileELF.h +++ source/Plugins/ObjectFile/ELF/ObjectFileELF.h @@ -14,6 +14,7 @@ #include // C++ Includes +#include #include // Other libraries and framework includes @@ -231,6 +232,7 @@ typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter; typedef std::map FileAddressToAddressClassMap; + typedef std::function 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 §ion_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 §ion_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 *