summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/Section.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2012-01-12 05:25:17 +0000
committerGreg Clayton <gclayton@apple.com>2012-01-12 05:25:17 +0000
commit44435ed07a3688b737813ca691c7cf78e086a6c8 (patch)
treeff29a9839c89f35cea5a5803be632f01b294936a /lldb/source/Core/Section.cpp
parentc7f03b6155efa4deb35d0d33f87113606e8d8394 (diff)
downloadbcm5719-llvm-44435ed07a3688b737813ca691c7cf78e086a6c8.tar.gz
bcm5719-llvm-44435ed07a3688b737813ca691c7cf78e086a6c8.zip
Big change in the way ObjectFile file contents are managed. We now
mmap() the entire object file contents into memory with MAP_PRIVATE. We do this because object file contents can change on us and currently this helps alleviate this situation. It also make the code for accessing object file data much easier to manage and we don't end up opening the file, reading some data and closing the file over and over. llvm-svn: 148017
Diffstat (limited to 'lldb/source/Core/Section.cpp')
-rw-r--r--lldb/source/Core/Section.cpp101
1 files changed, 12 insertions, 89 deletions
diff --git a/lldb/source/Core/Section.cpp b/lldb/source/Core/Section.cpp
index 09394b266f3..30ecc2fa43e 100644
--- a/lldb/source/Core/Section.cpp
+++ b/lldb/source/Core/Section.cpp
@@ -228,7 +228,7 @@ Section::Dump (Stream *s, Target *target, uint32_t depth) const
{
// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
s->Indent();
- s->Printf("0x%8.8llx %-14s ", GetID(), GetSectionTypeAsCString (m_type));
+ s->Printf("0x%8.8llx %-16s ", GetID(), GetSectionTypeAsCString (m_type));
bool resolved = true;
addr_t addr = LLDB_INVALID_ADDRESS;
@@ -307,53 +307,12 @@ Section::DumpName (Stream *s) const
m_name.Dump(s);
}
-//----------------------------------------------------------------------
-// Get the section data from a complete contiguous copy of the
-// entire executable image.
-//----------------------------------------------------------------------
-size_t
-Section::GetSectionDataFromImage (const DataExtractor& image_data, DataExtractor& section_data) const
-{
- size_t file_size = GetByteSize();
- if (file_size > 0)
- {
- off_t file_offset = GetFileOffset();
- if (section_data.SetData (image_data, file_offset, file_size) == file_size)
- return true;
- }
- return false;
-}
-
size_t
Section::ReadSectionDataFromObjectFile (const ObjectFile* objfile, off_t section_offset, void *dst, size_t dst_len) const
{
- if (objfile && dst && dst_len)
- {
- const FileSpec& file = objfile->GetFileSpec();
-
- if (file)
- {
- size_t bytes_left = dst_len;
- size_t bytes_read = 0;
- const uint64_t file_size = GetFileSize();
- if (section_offset < file_size)
- {
- off_t section_file_offset = objfile->GetOffset() + GetFileOffset() + section_offset;
- bytes_read = file.ReadFileContents (section_file_offset, dst, dst_len, NULL);
- if (bytes_read >= dst_len)
- return bytes_read;
- bytes_left -= bytes_read;
- }
-
- const uint64_t byte_size = GetByteSize();
- if (section_offset + bytes_read < byte_size)
- {
- memset ((uint8_t*)dst + bytes_read, 0, bytes_left);
- bytes_read += bytes_left;
- }
- return bytes_read;
- }
- }
+ // The object file now contains a full mmap'ed copy of the object file data, so just use this
+ if (objfile)
+ return objfile->CopyData (GetFileOffset() + section_offset, dst_len, dst);
return 0;
}
@@ -363,47 +322,17 @@ Section::ReadSectionDataFromObjectFile (const ObjectFile* objfile, off_t section
size_t
Section::ReadSectionDataFromObjectFile(const ObjectFile* objfile, DataExtractor& section_data) const
{
- if (objfile == NULL)
- return 0;
-
- const FileSpec& file = objfile->GetFileSpec();
-
- if (file)
- {
- size_t section_file_size = GetByteSize();
- if (section_file_size > 0)
- {
- off_t section_file_offset = GetFileOffset() + objfile->GetOffset();
- DataBufferSP section_data_sp(file.ReadFileContents(section_file_offset, section_file_size));
-
- section_data.SetByteOrder(objfile->GetByteOrder());
- section_data.SetAddressByteSize(objfile->GetAddressByteSize());
- return section_data.SetData (section_data_sp);
- }
- }
- return 0;
+ // The object file now contains a full mmap'ed copy of the object file data, so just use this
+ return MemoryMapSectionDataFromObjectFile (objfile, section_data);
}
size_t
Section::MemoryMapSectionDataFromObjectFile(const ObjectFile* objfile, DataExtractor& section_data) const
{
- if (objfile == NULL)
- return 0;
-
- const FileSpec& file = objfile->GetFileSpec();
-
- if (file)
- {
- size_t section_file_size = GetFileSize();
- if (section_file_size > 0)
- {
- off_t section_file_offset = GetFileOffset() + objfile->GetOffset();
- DataBufferSP section_data_sp(file.MemoryMapFileContents(section_file_offset, section_file_size));
- section_data.SetByteOrder(objfile->GetByteOrder());
- section_data.SetAddressByteSize(objfile->GetAddressByteSize());
- return section_data.SetData (section_data_sp);
- }
- }
+ // The object file now contains a full mmap'ed copy of the object file data, so just use this
+ if (objfile)
+ return objfile->GetData(GetFileOffset(), GetByteSize(), section_data);
+ section_data.Clear();
return 0;
}
@@ -691,16 +620,10 @@ SectionList::Dump (Stream *s, Target *target, bool show_header, uint32_t depth)
bool target_has_loaded_sections = target && !target->GetSectionLoadList().IsEmpty();
if (show_header && !m_sections.empty())
{
-// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
-// s->Indent();
-// s->PutCString( "SectionList\n");
-// s->IndentMore();
-// s->Printf("%*s", 2*(sizeof(void *) + 2), "");
s->Indent();
- s->Printf("SectID Type %s Address File Off. File Size Flags Section Name\n", target_has_loaded_sections ? "Load" : "File");
-// s->Printf("%*s", 2*(sizeof(void *) + 2), "");
+ s->Printf( "SectID Type %s Address File Off. File Size Flags Section Name\n", target_has_loaded_sections ? "Load" : "File");
s->Indent();
- s->PutCString("---------- -------------- --------------------------------------- ---------- ---------- ---------- ----------------------------\n");
+ s->PutCString("---------- ---------------- --------------------------------------- ---------- ---------- ---------- ----------------------------\n");
}
OpenPOWER on IntegriCloud