diff options
-rw-r--r-- | lldb/include/lldb/Core/ModuleList.h | 7 | ||||
-rw-r--r-- | lldb/include/lldb/Core/Section.h | 85 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectImage.cpp | 56 | ||||
-rw-r--r-- | lldb/source/Core/ModuleList.cpp | 14 | ||||
-rw-r--r-- | lldb/source/Core/Section.cpp | 121 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 14 |
6 files changed, 151 insertions, 146 deletions
diff --git a/lldb/include/lldb/Core/ModuleList.h b/lldb/include/lldb/Core/ModuleList.h index 6a392b1e120..5113b9088e9 100644 --- a/lldb/include/lldb/Core/ModuleList.h +++ b/lldb/include/lldb/Core/ModuleList.h @@ -327,6 +327,13 @@ public: lldb::ModuleSP *old_module_sp_ptr, bool *did_create_ptr); + static size_t + FindSharedModules (const FileSpec& in_file_spec, + const ArchSpec& arch, + const UUID *uuid_ptr, + const ConstString *object_name_ptr, + ModuleList &matching_module_list); + protected: //------------------------------------------------------------------ // Class typedefs. diff --git a/lldb/include/lldb/Core/Section.h b/lldb/include/lldb/Core/Section.h index 7345958c921..8ea652a3f01 100644 --- a/lldb/include/lldb/Core/Section.h +++ b/lldb/include/lldb/Core/Section.h @@ -51,9 +51,6 @@ public: lldb::SectionSP FindSectionByName (const ConstString §ion_dstr) const; -// lldb::SectionSP -// FindSectionByNames (const char *sect, ...) const; - lldb::SectionSP FindSectionByID (lldb::user_id_t sect_id) const; @@ -71,7 +68,10 @@ public: // Get the number of sections in this list only size_t - GetSize () const; + GetSize () const + { + return m_sections.size(); + } // Get the number of sections in this list, and any contained child sections size_t @@ -122,10 +122,16 @@ public: ContainsFileAddress (lldb::addr_t vm_addr) const; SectionList& - GetChildren (); + GetChildren () + { + return m_children; + } const SectionList& - GetChildren () const; + GetChildren () const + { + return m_children; + } void Dump (Stream *s, Process *process) const; @@ -140,31 +146,70 @@ public: ResolveContainedAddress (lldb::addr_t offset, Address &so_addr) const; uint64_t - GetFileOffset () const; + GetFileOffset () const + { + return m_file_offset; + } + + void + SetFileOffset (uint64_t file_offset) + { + m_file_offset = file_offset; + } uint64_t - GetFileSize () const; + GetFileSize () const + { + return m_file_size; + } + + void + SetFileSize (uint64_t file_size) + { + m_file_size = file_size; + } lldb::addr_t GetFileAddress () const; lldb::addr_t - GetOffset () const; + GetOffset () const + { + // This section has a parent which means m_file_addr is an offset. + if (m_parent) + return m_file_addr; - lldb::addr_t - GetByteSize () const; + // This section has no parent, so there is no offset to be had + return 0; + } - void - SetByteSize (lldb::addr_t byte_size); + lldb::addr_t + GetByteSize () const + { + return m_byte_size; + } + + void + SetByteSize (lldb::addr_t byte_size) + { + m_byte_size = byte_size; + } + size_t GetSectionDataFromImage (const DataExtractor& image_data, DataExtractor& section_data) const; bool - IsFake() const; + IsFake() const + { + return m_fake; + } void - SetIsFake(bool fake); + SetIsFake(bool fake) + { + m_fake = fake; + } bool IsDescendant (const Section *section); @@ -191,10 +236,16 @@ public: ContainsLinkedFileAddress (lldb::addr_t vm_addr) const; const Section * - GetLinkedSection () const; + GetLinkedSection () const + { + return m_linked_section; + } uint64_t - GetLinkedOffset () const; + GetLinkedOffset () const + { + return m_linked_offset; + } lldb::addr_t GetLinkedFileAddress () const; diff --git a/lldb/source/Commands/CommandObjectImage.cpp b/lldb/source/Commands/CommandObjectImage.cpp index cb717c41bbd..0bf339c0165 100644 --- a/lldb/source/Commands/CommandObjectImage.cpp +++ b/lldb/source/Commands/CommandObjectImage.cpp @@ -544,8 +544,18 @@ public: { FileSpec image_file(arg_cstr); ModuleList matching_modules; - const size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); - + size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); + + // Not found in our module list for our target, check the main + // shared module list in case it is a extra file used somewhere + // else + if (num_matching_modules == 0) + num_matching_modules = ModuleList::FindSharedModules (image_file, + target->GetArchitecture(), + NULL, + NULL, + matching_modules); + if (num_matching_modules > 0) { for (size_t i=0; i<num_matching_modules; ++i) @@ -642,8 +652,18 @@ public: { FileSpec image_file(arg_cstr); ModuleList matching_modules; - const size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); - + size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); + + // Not found in our module list for our target, check the main + // shared module list in case it is a extra file used somewhere + // else + if (num_matching_modules == 0) + num_matching_modules = ModuleList::FindSharedModules (image_file, + target->GetArchitecture(), + NULL, + NULL, + matching_modules); + if (num_matching_modules > 0) { for (size_t i=0; i<num_matching_modules; ++i) @@ -739,8 +759,18 @@ public: { FileSpec image_file(arg_cstr); ModuleList matching_modules; - const size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); - + size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); + + // Not found in our module list for our target, check the main + // shared module list in case it is a extra file used somewhere + // else + if (num_matching_modules == 0) + num_matching_modules = ModuleList::FindSharedModules (image_file, + target->GetArchitecture(), + NULL, + NULL, + matching_modules); + if (num_matching_modules > 0) { for (size_t i=0; i<num_matching_modules; ++i) @@ -1343,8 +1373,18 @@ public: { FileSpec image_file(arg_cstr); ModuleList matching_modules; - const size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); - + size_t num_matching_modules = target->GetImages().FindModules(&image_file, NULL, NULL, NULL, matching_modules); + + // Not found in our module list for our target, check the main + // shared module list in case it is a extra file used somewhere + // else + if (num_matching_modules == 0) + num_matching_modules = ModuleList::FindSharedModules (image_file, + target->GetArchitecture(), + NULL, + NULL, + matching_modules); + if (num_matching_modules > 0) { for (size_t i=0; i<num_matching_modules; ++i) diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index c928508b340..ae9bb880a20 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -437,6 +437,20 @@ ModuleList::GetModuleSP (lldb_private::Module *module_ptr) return module_sp; } +size_t +ModuleList::FindSharedModules +( + const FileSpec& in_file_spec, + const ArchSpec& arch, + const UUID *uuid_ptr, + const ConstString *object_name_ptr, + ModuleList &matching_module_list +) +{ + ModuleList &shared_module_list = GetSharedModuleList (); + Mutex::Locker locker(shared_module_list.m_modules_mutex); + return shared_module_list.FindModules (&in_file_spec, &arch, uuid_ptr, object_name_ptr, matching_module_list); +} Error ModuleList::GetSharedModule diff --git a/lldb/source/Core/Section.cpp b/lldb/source/Core/Section.cpp index 57c519918f2..6ed47730c6f 100644 --- a/lldb/source/Core/Section.cpp +++ b/lldb/source/Core/Section.cpp @@ -45,32 +45,6 @@ Section::Section { } -//Section::Section -//( -// Section *parent, -// Module* module, -// user_id_t sect_id, -// const ConstString &name, -// const AddressRange *file_vm_range, -// uint64_t file_offset, -// uint64_t file_size, -// uint32_t flags -//) : -// ModuleChild (module), -// UserID (sect_id), -// Flags (flags), -// m_parent (parent), -// m_name (name), -// m_range (), -// m_file_offset (file_offset), -// m_file_size (file_size), -// m_children (), -// m_fake (false) -//{ -// if (file_vm_range) -// m_range = *file_vm_range; -//} - Section::~Section() { } @@ -114,18 +88,6 @@ Section::GetName() const return m_name; } -SectionList& -Section::GetChildren() -{ - return m_children; -} - -const SectionList& -Section::GetChildren() const -{ - return m_children; -} - addr_t Section::GetFileAddress () const { @@ -148,31 +110,6 @@ Section::GetLinkedFileAddress () const return LLDB_INVALID_ADDRESS; } -addr_t -Section::GetOffset () const -{ - if (m_parent) - { - // This section has a parent which means m_file_addr is an offset. - return m_file_addr; - } - - // This section has no parent, so there is no offset to be had - return 0; -} - -addr_t -Section::GetByteSize () const -{ - return m_byte_size; -} - -void -Section::SetByteSize (addr_t byte_size) -{ - m_byte_size = byte_size; -} - addr_t Section::GetLoadBaseAddress (Process *process) const @@ -225,18 +162,6 @@ Section::ResolveContainedAddress (addr_t offset, Address &so_addr) const return true; } -uint64_t -Section::GetFileOffset() const -{ - return m_file_offset; -} - -uint64_t -Section::GetFileSize() const -{ - return m_file_size; -} - bool Section::ContainsFileAddress (addr_t vm_addr) const { @@ -449,19 +374,6 @@ Section::MemoryMapSectionDataFromObjectFile(const ObjectFile* objfile, DataExtra } bool -Section::IsFake() const -{ - return m_fake; -} - -void -Section::SetIsFake(bool fake) -{ - m_fake = fake; -} - - -bool Section::IsDescendant (const Section *section) { if (this == section) @@ -498,18 +410,6 @@ Section::SetLinkedLocation (const Section *linked_section, uint64_t linked_offse m_linked_offset = linked_offset; } -const Section * -Section::GetLinkedSection () const -{ - return m_linked_section; -} - -uint64_t -Section::GetLinkedOffset () const -{ - return m_linked_offset; -} - #pragma mark SectionList SectionList::SectionList () : @@ -579,12 +479,6 @@ SectionList::ReplaceSection (user_id_t sect_id, SectionSP& sect_sp, uint32_t dep size_t -SectionList::GetSize () const -{ - return m_sections.size(); -} - -size_t SectionList::GetNumSections (uint32_t depth) const { size_t count = m_sections.size(); @@ -631,21 +525,6 @@ SectionList::FindSectionByName (const ConstString §ion_dstr) const } return sect_sp; } -// -//SectionSP -//SectionList::FindSectionByNames (const char *s, ...) const -//{ -// SectionSP sect_sp; -// va_list ap; -// va_start(ap, s); -// uint32_t idx = 0; -// for (const char *sect_name = s; sect_name != NULL; sect_name = va_arg(ap, const char *)) -// { -// printf("[%u] %s\n", idx++, sect_name); -// } -// va_end(ap); -// return sect_sp; -//} SectionSP SectionList::FindSectionByID (user_id_t sect_id) const diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 21860e1e4fb..89b0bce4be7 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -341,6 +341,20 @@ ObjectFileMachO::ParseSections () segment->GetChildren().Slide (-slide_amount, false); segment->SetByteSize (curr_seg_max_addr - sect64_min_addr); } + + // Grow the section size as needed. + if (sect64.offset) + { + const lldb::addr_t segment_min_file_offset = segment->GetFileOffset(); + const lldb::addr_t segment_max_file_offset = segment_min_file_offset + segment->GetFileSize(); + + const lldb::addr_t section_min_file_offset = sect64.offset; + const lldb::addr_t section_max_file_offset = section_min_file_offset + sect64.size; + const lldb::addr_t new_file_offset = std::min (section_min_file_offset, segment_min_file_offset); + const lldb::addr_t new_file_size = std::max (section_max_file_offset, segment_max_file_offset) - new_file_offset; + segment->SetFileOffset (new_file_offset); + segment->SetFileSize (new_file_size); + } } else { |