diff options
author | Greg Clayton <gclayton@apple.com> | 2010-06-28 23:51:11 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2010-06-28 23:51:11 +0000 |
commit | 8d38ac453673a0cbad6d2a6b5332cbf2c2847d1a (patch) | |
tree | 946670ae4bac7d57b5a7480c9c7a6e3a2eb6b4dc | |
parent | 3dd716c3c31f8cd2172fa53ca5a85b94db2dea65 (diff) | |
download | bcm5719-llvm-8d38ac453673a0cbad6d2a6b5332cbf2c2847d1a.tar.gz bcm5719-llvm-8d38ac453673a0cbad6d2a6b5332cbf2c2847d1a.zip |
Fixed debug map in executable + DWARF in .o debugging on Mac OS X.
Added the ability to dump any file in the global module cache using any of
the "image dump" commands. This allows us to dump the .o files that are used
with DWARF + .o since they don't belong the the target list for the current
target.
llvm-svn: 107100
-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 { |