diff options
author | Zachary Turner <zturner@google.com> | 2017-02-24 18:56:49 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2017-02-24 18:56:49 +0000 |
commit | 3f4a4b36818ace88fb0263ba7e999115a2c7d7af (patch) | |
tree | 19d9cc32fa7886197d7c83324ac0febc4063cc59 /lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | |
parent | bb361fcba1ab832ccfde2bc55fef9bbbafd6b9c9 (diff) | |
download | bcm5719-llvm-3f4a4b36818ace88fb0263ba7e999115a2c7d7af.tar.gz bcm5719-llvm-3f4a4b36818ace88fb0263ba7e999115a2c7d7af.zip |
Delete DataBufferMemoryMap.
After a series of patches on the LLVM side to get the mmaping
code up to compatibility with LLDB's needs, it is now ready
to go, which means LLDB's custom mmapping code is redundant.
So this patch deletes it all and uses LLVM's code instead.
In the future, we could take this one step further and delete
even the lldb DataBuffer base class and rely entirely on
LLVM's facilities, but this is a job for another day.
Differential Revision: https://reviews.llvm.org/D30054
llvm-svn: 296159
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 107 |
1 files changed, 61 insertions, 46 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index a2febba9f9c..0191f8a3bd1 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -14,7 +14,7 @@ #include <unordered_map> #include "lldb/Core/ArchSpec.h" -#include "lldb/Core/DataBuffer.h" +#include "lldb/Core/DataBufferLLVM.h" #include "lldb/Core/FileSpecList.h" #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" @@ -33,6 +33,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/ARMBuildAttributes.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MipsABIFlags.h" #define CASE_AND_STREAM(s, def, width) \ @@ -386,31 +387,40 @@ ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp, lldb::offset_t file_offset, lldb::offset_t length) { if (!data_sp) { - data_sp = file->MemoryMapFileContentsIfLocal(file_offset, length); + data_sp = DataBufferLLVM::CreateFromFileSpec(*file, length, file_offset); + if (!data_sp) + return nullptr; data_offset = 0; } - if (data_sp && - data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) { - const uint8_t *magic = data_sp->GetBytes() + data_offset; - if (ELFHeader::MagicBytesMatch(magic)) { - // Update the data to contain the entire file if it doesn't already - if (data_sp->GetByteSize() < length) { - data_sp = file->MemoryMapFileContentsIfLocal(file_offset, length); - data_offset = 0; - magic = data_sp->GetBytes(); - } - unsigned address_size = ELFHeader::AddressSizeInBytes(magic); - if (address_size == 4 || address_size == 8) { - std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF( - module_sp, data_sp, data_offset, file, file_offset, length)); - ArchSpec spec; - if (objfile_ap->GetArchitecture(spec) && - objfile_ap->SetModulesArchitecture(spec)) - return objfile_ap.release(); - } - } + assert(data_sp); + + if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset)) + return nullptr; + + const uint8_t *magic = data_sp->GetBytes() + data_offset; + if (!ELFHeader::MagicBytesMatch(magic)) + return nullptr; + + // Update the data to contain the entire file if it doesn't already + if (data_sp->GetByteSize() < length) { + data_sp = DataBufferLLVM::CreateFromFileSpec(*file, length, file_offset); + if (!data_sp) + return nullptr; + data_offset = 0; + magic = data_sp->GetBytes(); + } + + unsigned address_size = ELFHeader::AddressSizeInBytes(magic); + if (address_size == 4 || address_size == 8) { + std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF( + module_sp, data_sp, data_offset, file, file_offset, length)); + ArchSpec spec; + if (objfile_ap->GetArchitecture(spec) && + objfile_ap->SetModulesArchitecture(spec)) + return objfile_ap.release(); } + return NULL; } @@ -653,22 +663,24 @@ size_t ObjectFileELF::GetModuleSpecifications( size_t section_header_end = header.e_shoff + header.e_shentsize; if (header.HasHeaderExtension() && section_header_end > data_sp->GetByteSize()) { - data_sp = file.MemoryMapFileContentsIfLocal (file_offset, - section_header_end); - data.SetData(data_sp); - lldb::offset_t header_offset = data_offset; - header.Parse(data, &header_offset); + data_sp = DataBufferLLVM::CreateFromFileSpec( + file, section_header_end, file_offset); + if (data_sp) { + data.SetData(data_sp); + lldb::offset_t header_offset = data_offset; + header.Parse(data, &header_offset); + } } // Try to get the UUID from the section list. Usually that's at the - // end, so - // map the file in if we don't have it already. + // end, so map the file in if we don't have it already. section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize; if (section_header_end > data_sp->GetByteSize()) { - data_sp = file.MemoryMapFileContentsIfLocal(file_offset, - section_header_end); - data.SetData(data_sp); + data_sp = DataBufferLLVM::CreateFromFileSpec( + file, section_header_end, file_offset); + if (data_sp) + data.SetData(data_sp); } uint32_t gnu_debuglink_crc = 0; @@ -703,17 +715,17 @@ size_t ObjectFileELF::GetModuleSpecifications( (file.GetByteSize() - file_offset) / 1024); // For core files - which usually don't happen to have a - // gnu_debuglink, - // and are pretty bulky - calculating whole contents crc32 would - // be too much of luxury. - // Thus we will need to fallback to something simpler. + // gnu_debuglink, and are pretty bulky - calculating whole + // contents crc32 would be too much of luxury. Thus we will need + // to fallback to something simpler. if (header.e_type == llvm::ELF::ET_CORE) { size_t program_headers_end = header.e_phoff + header.e_phnum * header.e_phentsize; if (program_headers_end > data_sp->GetByteSize()) { - data_sp = file.MemoryMapFileContentsIfLocal( - file_offset, program_headers_end); - data.SetData(data_sp); + data_sp = DataBufferLLVM::CreateFromFileSpec( + file, program_headers_end, file_offset); + if (data_sp) + data.SetData(data_sp); } ProgramHeaderColl program_headers; GetProgramHeaderInfo(program_headers, set_data, header); @@ -726,9 +738,10 @@ size_t ObjectFileELF::GetModuleSpecifications( } if (segment_data_end > data_sp->GetByteSize()) { - data_sp = file.MemoryMapFileContentsIfLocal(file_offset, - segment_data_end); - data.SetData(data_sp); + data_sp = DataBufferLLVM::CreateFromFileSpec( + file, segment_data_end, file_offset); + if (data_sp) + data.SetData(data_sp); } core_notes_crc = @@ -736,10 +749,12 @@ size_t ObjectFileELF::GetModuleSpecifications( } else { // Need to map entire file into memory to calculate the crc. data_sp = - file.MemoryMapFileContentsIfLocal(file_offset, SIZE_MAX); - data.SetData(data_sp); - gnu_debuglink_crc = calc_gnu_debuglink_crc32( - data.GetDataStart(), data.GetByteSize()); + DataBufferLLVM::CreateFromFileSpec(file, -1, file_offset); + if (data_sp) { + data.SetData(data_sp); + gnu_debuglink_crc = calc_gnu_debuglink_crc32( + data.GetDataStart(), data.GetByteSize()); + } } } if (gnu_debuglink_crc) { |