diff options
-rw-r--r-- | lldb/include/lldb/Core/ModuleSpec.h | 22 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/ObjectFile.h | 3 | ||||
-rw-r--r-- | lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme | 6 | ||||
-rw-r--r-- | lldb/source/API/SBModuleSpec.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/Module.cpp | 28 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp | 104 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h | 30 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp | 15 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Symbol/ObjectFile.cpp | 25 | ||||
-rw-r--r-- | lldb/source/Target/TargetList.cpp | 3 |
12 files changed, 194 insertions, 49 deletions
diff --git a/lldb/include/lldb/Core/ModuleSpec.h b/lldb/include/lldb/Core/ModuleSpec.h index 67bd4ba3dd1..10e1ea9f17a 100644 --- a/lldb/include/lldb/Core/ModuleSpec.h +++ b/lldb/include/lldb/Core/ModuleSpec.h @@ -350,7 +350,6 @@ public: strm.PutCString("uuid = "); m_uuid.Dump(&strm); dumped_something = true; - } if (m_object_name) { @@ -359,6 +358,20 @@ public: strm.Printf("object_name = %s", m_object_name.GetCString()); dumped_something = true; } + if (m_object_offset > 0) + { + if (dumped_something) + strm.PutCString(", "); + strm.Printf("object_offset = 0x%" PRIx64, m_object_offset); + dumped_something = true; + } + if (m_object_mod_time.IsValid()) + { + if (dumped_something) + strm.PutCString(", "); + strm.Printf("object_mod_time = 0x%" PRIx64, m_object_mod_time.GetAsSecondsSinceJan1_1970()); + dumped_something = true; + } } bool @@ -479,6 +492,13 @@ public: m_specs.insert(m_specs.end(), rhs.m_specs.begin(), rhs.m_specs.end()); } + // The index "i" must be valid and this can't be used in + // multi-threaded code as no mutex lock is taken. + ModuleSpec & + GetModuleSpecRefAtIndex (size_t i) + { + return m_specs[i]; + } bool GetModuleSpecAtIndex (size_t i, ModuleSpec &module_spec) const { diff --git a/lldb/include/lldb/Symbol/ObjectFile.h b/lldb/include/lldb/Symbol/ObjectFile.h index 37068978eb2..8934c31bb98 100644 --- a/lldb/include/lldb/Symbol/ObjectFile.h +++ b/lldb/include/lldb/Symbol/ObjectFile.h @@ -182,6 +182,7 @@ public: static size_t GetModuleSpecifications (const FileSpec &file, lldb::offset_t file_offset, + lldb::offset_t file_size, ModuleSpecList &specs); static size_t @@ -189,7 +190,7 @@ public: lldb::DataBufferSP& data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, - lldb::offset_t length, + lldb::offset_t file_size, lldb_private::ModuleSpecList &specs); //------------------------------------------------------------------ /// Split a path into a file path with object name. diff --git a/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme b/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme index 6860b549250..34560feaaeb 100644 --- a/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme +++ b/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme @@ -100,12 +100,6 @@ ReferencedContainer = "container:lldb.xcodeproj"> </BuildableReference> </BuildableProductRunnable> - <CommandLineArguments> - <CommandLineArgument - argument = "/Volumes/ThePlayground/Users/jingham/Projects/Sketch/build/Debug/Sketch.app" - isEnabled = "YES"> - </CommandLineArgument> - </CommandLineArguments> <EnvironmentVariables> <EnvironmentVariable key = "LLDB_LAUNCH_FLAG_DISABLE_ASLR" diff --git a/lldb/source/API/SBModuleSpec.cpp b/lldb/source/API/SBModuleSpec.cpp index 8b7ac1d86f9..654a8ca6ec8 100644 --- a/lldb/source/API/SBModuleSpec.cpp +++ b/lldb/source/API/SBModuleSpec.cpp @@ -175,7 +175,7 @@ SBModuleSpecList::GetModuleSpecifications (const char *path) SBModuleSpecList specs; FileSpec file_spec(path, true); Host::ResolveExecutableInBundle(file_spec); - ObjectFile::GetModuleSpecifications(file_spec, 0, *specs.m_opaque_ap); + ObjectFile::GetModuleSpecifications(file_spec, 0, 0, *specs.m_opaque_ap); return specs; } diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 7111a9db7e5..dd0e2a0011b 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -4285,7 +4285,7 @@ protected: size_t num_matches = 0; // First extract all module specs from the symbol file lldb_private::ModuleSpecList symfile_module_specs; - if (ObjectFile::GetModuleSpecifications(module_spec.GetSymbolFileSpec(), 0, symfile_module_specs)) + if (ObjectFile::GetModuleSpecifications(module_spec.GetSymbolFileSpec(), 0, 0, symfile_module_specs)) { // Now extract the module spec that matches the target architecture ModuleSpec target_arch_module_spec; diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index f8e2f8871cb..f8e5b4e410c 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1097,23 +1097,27 @@ Module::GetObjectFile() Mutex::Locker locker (m_mutex); if (m_did_load_objfile == false) { - m_did_load_objfile = true; Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); DataBufferSP data_sp; lldb::offset_t data_offset = 0; - m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(), - &m_file, - m_object_offset, - m_file.GetByteSize(), - data_sp, - data_offset); - if (m_objfile_sp) + const lldb::offset_t file_size = m_file.GetByteSize(); + if (file_size > m_object_offset) { - // Once we get the object file, update our module with the object file's - // architecture since it might differ in vendor/os if some parts were - // unknown. - m_objfile_sp->GetArchitecture (m_arch); + m_did_load_objfile = true; + m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(), + &m_file, + m_object_offset, + file_size - m_object_offset, + data_sp, + data_offset); + if (m_objfile_sp) + { + // Once we get the object file, update our module with the object file's + // architecture since it might differ in vendor/os if some parts were + // unknown. + m_objfile_sp->GetArchitecture (m_arch); + } } } return m_objfile_sp.get(); diff --git a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp index fdd6186ae8d..1ec5f3d733a 100644 --- a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp +++ b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp @@ -11,10 +11,12 @@ #include <ar.h> -#include "lldb/Core/Stream.h" #include "lldb/Core/ArchSpec.h" +#include "lldb/Core/DataBuffer.h" #include "lldb/Core/Module.h" +#include "lldb/Core/ModuleSpec.h" #include "lldb/Core/PluginManager.h" +#include "lldb/Core/Stream.h" #include "lldb/Core/Timer.h" #include "lldb/Host/Mutex.h" #include "lldb/Symbol/ObjectFile.h" @@ -105,10 +107,12 @@ ObjectContainerBSDArchive::Archive::Archive ( const lldb_private::ArchSpec &arch, const lldb_private::TimeValue &time, + lldb::offset_t file_offset, lldb_private::DataExtractor &data ) : m_arch (arch), m_time (time), + m_file_offset (file_offset), m_objects(), m_data (data) { @@ -176,7 +180,7 @@ ObjectContainerBSDArchive::Archive::FindObject (const ConstString &object_name, ObjectContainerBSDArchive::Archive::shared_ptr -ObjectContainerBSDArchive::Archive::FindCachedArchive (const FileSpec &file, const ArchSpec &arch, const TimeValue &time) +ObjectContainerBSDArchive::Archive::FindCachedArchive (const FileSpec &file, const ArchSpec &arch, const TimeValue &time, lldb::offset_t file_offset) { Mutex::Locker locker(Archive::GetArchiveCacheMutex ()); shared_ptr archive_sp; @@ -186,7 +190,12 @@ ObjectContainerBSDArchive::Archive::FindCachedArchive (const FileSpec &file, con // delete an archive entry... while (pos != archive_map.end() && pos->first == file) { - if (pos->second->GetArchitecture().IsCompatibleMatch(arch)) + bool match = true; + if (arch.IsValid() && pos->second->GetArchitecture().IsCompatibleMatch(arch) == false) + match = false; + else if (file_offset != LLDB_INVALID_OFFSET && pos->second->GetFileOffset() != file_offset) + match = false; + if (match) { if (pos->second->GetModificationTime() == time) { @@ -204,7 +213,7 @@ ObjectContainerBSDArchive::Archive::FindCachedArchive (const FileSpec &file, con // remove the old and outdated entry. archive_map.erase (pos); pos = archive_map.find (file); - continue; + continue; // Continue to next iteration so we don't increment pos below... } } ++pos; @@ -218,13 +227,15 @@ ObjectContainerBSDArchive::Archive::ParseAndCacheArchiveForFile const FileSpec &file, const ArchSpec &arch, const TimeValue &time, + lldb::offset_t file_offset, DataExtractor &data ) { - shared_ptr archive_sp(new Archive (arch, time, data)); + shared_ptr archive_sp(new Archive (arch, time, file_offset, data)); if (archive_sp) { - if (archive_sp->ParseObjects () > 0) + const size_t num_objects = archive_sp->ParseObjects (); + if (num_objects > 0) { Mutex::Locker locker(Archive::GetArchiveCacheMutex ()); Archive::GetArchiveCache().insert(std::make_pair(file, archive_sp)); @@ -314,7 +325,10 @@ ObjectContainerBSDArchive::CreateInstance DataBufferSP archive_data_sp (file->MemoryMapFileContents(file_offset, length)); lldb::offset_t archive_data_offset = 0; - Archive::shared_ptr archive_sp (Archive::FindCachedArchive (*file, module_sp->GetArchitecture(), module_sp->GetModificationTime())); + Archive::shared_ptr archive_sp (Archive::FindCachedArchive (*file, + module_sp->GetArchitecture(), + module_sp->GetModificationTime(), + file_offset)); std::unique_ptr<ObjectContainerBSDArchive> container_ap(new ObjectContainerBSDArchive (module_sp, archive_data_sp, archive_data_offset, @@ -338,7 +352,10 @@ ObjectContainerBSDArchive::CreateInstance else { // No data, just check for a cached archive - Archive::shared_ptr archive_sp (Archive::FindCachedArchive (*file, module_sp->GetArchitecture(), module_sp->GetModificationTime())); + Archive::shared_ptr archive_sp (Archive::FindCachedArchive (*file, + module_sp->GetArchitecture(), + module_sp->GetModificationTime(), + file_offset)); if (archive_sp) { std::unique_ptr<ObjectContainerBSDArchive> container_ap(new ObjectContainerBSDArchive (module_sp, data_sp, data_offset, file, file_offset, length)); @@ -409,6 +426,7 @@ ObjectContainerBSDArchive::ParseHeader () m_archive_sp = Archive::ParseAndCacheArchiveForFile (m_file, module_sp->GetArchitecture(), module_sp->GetModificationTime(), + m_offset, m_data); } // Clear the m_data that contains the entire archive @@ -492,8 +510,76 @@ ObjectContainerBSDArchive::GetModuleSpecifications (const lldb_private::FileSpec lldb::DataBufferSP& data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, - lldb::offset_t length, + lldb::offset_t file_size, lldb_private::ModuleSpecList &specs) { + + // We have data, which means this is the first 512 bytes of the file + // Check to see if the magic bytes match and if they do, read the entire + // table of contents for the archive and cache it + DataExtractor data; + data.SetData (data_sp, data_offset, data_sp->GetByteSize()); + if (file && data_sp && ObjectContainerBSDArchive::MagicBytesMatch(data)) + { + const size_t initial_count = specs.GetSize(); + TimeValue file_mod_time = file.GetModificationTime(); + Archive::shared_ptr archive_sp (Archive::FindCachedArchive (file, ArchSpec(), file_mod_time, file_offset)); + bool set_archive_arch = false; + if (!archive_sp) + { + set_archive_arch = true; + DataBufferSP data_sp (file.MemoryMapFileContents(file_offset, file_size)); + data.SetData (data_sp, 0, data_sp->GetByteSize()); + archive_sp = Archive::ParseAndCacheArchiveForFile(file, ArchSpec(), file_mod_time, file_offset, data); + } + + if (archive_sp) + { + const size_t num_objects = archive_sp->GetNumObjects(); + for (size_t idx = 0; idx < num_objects; ++idx) + { + const Object *object = archive_sp->GetObjectAtIndex (idx); + if (object) + { + const lldb::offset_t object_file_offset = file_offset + object->ar_file_offset; + if (object->ar_file_offset < file_size && file_size > object_file_offset) + { + if (ObjectFile::GetModuleSpecifications(file, + object_file_offset, + file_size - object_file_offset, + specs)) + { + ModuleSpec &spec = specs.GetModuleSpecRefAtIndex (specs.GetSize() - 1); + TimeValue object_mod_time; + object_mod_time.OffsetWithSeconds(object->ar_date); + spec.GetObjectName () = object->ar_name; + spec.SetObjectOffset(object_file_offset); + spec.GetObjectModificationTime () = object_mod_time; + } + } + } + } + } + const size_t end_count = specs.GetSize(); + size_t num_specs_added = end_count - initial_count; + if (set_archive_arch && num_specs_added > 0) + { + // The archive was created but we didn't have an architecture + // so we need to set it + for (size_t i=initial_count; i<end_count; ++ i) + { + ModuleSpec module_spec; + if (specs.GetModuleSpecAtIndex(i, module_spec)) + { + if (module_spec.GetArchitecture().IsValid()) + { + archive_sp->SetArchitecture (module_spec.GetArchitecture()); + break; + } + } + } + } + return num_specs_added; + } return 0; } diff --git a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h index a44bb80a965..8093c580ff9 100644 --- a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h +++ b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h @@ -136,16 +136,19 @@ protected: static Archive::shared_ptr FindCachedArchive (const lldb_private::FileSpec &file, const lldb_private::ArchSpec &arch, - const lldb_private::TimeValue &mod_time); + const lldb_private::TimeValue &mod_time, + lldb::offset_t file_offset); static Archive::shared_ptr ParseAndCacheArchiveForFile (const lldb_private::FileSpec &file, const lldb_private::ArchSpec &arch, const lldb_private::TimeValue &mod_time, + lldb::offset_t file_offset, lldb_private::DataExtractor &data); Archive (const lldb_private::ArchSpec &arch, const lldb_private::TimeValue &mod_time, + lldb::offset_t file_offset, lldb_private::DataExtractor &data); ~Archive (); @@ -156,6 +159,14 @@ protected: return m_objects.size(); } + const Object * + GetObjectAtIndex (size_t idx) + { + if (idx < m_objects.size()) + return &m_objects[idx]; + return NULL; + } + size_t ParseObjects (); @@ -163,6 +174,12 @@ protected: FindObject (const lldb_private::ConstString &object_name, const lldb_private::TimeValue &object_mod_time); + lldb::offset_t + GetFileOffset () const + { + return m_file_offset; + } + const lldb_private::TimeValue & GetModificationTime() { @@ -170,11 +187,17 @@ protected: } const lldb_private::ArchSpec & - GetArchitecture () + GetArchitecture () const { return m_arch; } - + + void + SetArchitecture (const lldb_private::ArchSpec &arch) + { + m_arch = arch; + } + bool HasNoExternalReferences() const; @@ -191,6 +214,7 @@ protected: //---------------------------------------------------------------------- lldb_private::ArchSpec m_arch; lldb_private::TimeValue m_time; + lldb::offset_t m_file_offset; Object::collection m_objects; ObjectNameToIndexMap m_object_name_to_index_map; lldb_private::DataExtractor m_data; ///< The data for this object container so we don't lose data if the .a files gets modified diff --git a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp index f28aa3bed05..976d7bf47ed 100644 --- a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp +++ b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp @@ -278,13 +278,13 @@ ObjectContainerUniversalMachO::GetModuleSpecifications (const lldb_private::File lldb::DataBufferSP& data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, - lldb::offset_t length, + lldb::offset_t file_size, lldb_private::ModuleSpecList &specs) { const size_t initial_count = specs.GetSize(); DataExtractor data; - data.SetData (data_sp, data_offset, length); + data.SetData (data_sp, data_offset, data_sp->GetByteSize()); if (ObjectContainerUniversalMachO::MagicBytesMatch(data)) { @@ -294,9 +294,14 @@ ObjectContainerUniversalMachO::GetModuleSpecifications (const lldb_private::File { for (const llvm::MachO::fat_arch &fat_arch : fat_archs) { - ObjectFile::GetModuleSpecifications (file, - fat_arch.offset + file_offset, - specs); + const lldb::offset_t slice_file_offset = fat_arch.offset + file_offset; + if (fat_arch.offset < file_size && file_size > slice_file_offset) + { + ObjectFile::GetModuleSpecifications (file, + slice_file_offset, + file_size - slice_file_offset, + specs); + } } } } diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index bbe2aacd280..179a455b867 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -513,7 +513,8 @@ ObjectFileMachO::GetModuleSpecifications (const lldb_private::FileSpec& file, if (header.sizeofcmds >= data_sp->GetByteSize()) { data_sp = file.ReadFileContents(file_offset, header.sizeofcmds); - data_offset = MachHeaderSizeFromMagic(header.magic) + file_offset; + data.SetData(data_sp); + data_offset = MachHeaderSizeFromMagic(header.magic); } if (data_sp) { diff --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp index 20ed648135e..0c6159122cf 100644 --- a/lldb/source/Symbol/ObjectFile.cpp +++ b/lldb/source/Symbol/ObjectFile.cpp @@ -186,16 +186,25 @@ ObjectFile::FindPlugin (const lldb::ModuleSP &module_sp, size_t ObjectFile::GetModuleSpecifications (const FileSpec &file, lldb::offset_t file_offset, + lldb::offset_t file_size, ModuleSpecList &specs) { DataBufferSP data_sp (file.ReadFileContents(file_offset, 512)); if (data_sp) - return ObjectFile::GetModuleSpecifications (file, // file spec - data_sp, // data bytes - 0, // data offset - file_offset, // file offset - data_sp->GetByteSize(), // data length + { + if (file_size == 0) + { + const lldb::offset_t actual_file_size = file.GetByteSize(); + if (actual_file_size > file_offset) + file_size = actual_file_size - file_offset; + } + return ObjectFile::GetModuleSpecifications (file, // file spec + data_sp, // data bytes + 0, // data offset + file_offset,// file offset + file_size, // file length specs); + } return 0; } @@ -204,7 +213,7 @@ ObjectFile::GetModuleSpecifications (const lldb_private::FileSpec& file, lldb::DataBufferSP& data_sp, lldb::offset_t data_offset, lldb::offset_t file_offset, - lldb::offset_t length, + lldb::offset_t file_size, lldb_private::ModuleSpecList &specs) { const size_t initial_count = specs.GetSize(); @@ -213,14 +222,14 @@ ObjectFile::GetModuleSpecifications (const lldb_private::FileSpec& file, // Try the ObjectFile plug-ins for (i = 0; (callback = PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(i)) != NULL; ++i) { - if (callback (file, data_sp, data_offset, file_offset, length, specs) > 0) + if (callback (file, data_sp, data_offset, file_offset, file_size, specs) > 0) return specs.GetSize() - initial_count; } // Try the ObjectContainer plug-ins for (i = 0; (callback = PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(i)) != NULL; ++i) { - if (callback (file, data_sp, data_offset, file_offset, length, specs) > 0) + if (callback (file, data_sp, data_offset, file_offset, file_size, specs) > 0) return specs.GetSize() - initial_count; } return 0; diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index 96cbc0a2106..5bd6ea9db64 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -92,7 +92,8 @@ TargetList::CreateTarget (Debugger &debugger, ModuleSpec module_spec; module_spec.GetFileSpec().SetFile(user_exe_path, true); lldb::offset_t file_offset = 0; - const size_t num_specs = ObjectFile::GetModuleSpecifications (module_spec.GetFileSpec(), file_offset, module_specs); + lldb::offset_t file_size = 0; + const size_t num_specs = ObjectFile::GetModuleSpecifications (module_spec.GetFileSpec(), file_offset, file_size, module_specs); if (num_specs > 0) { ModuleSpec matching_module_spec; |