diff options
Diffstat (limited to 'lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp')
-rw-r--r-- | lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp index fce609b82eb..d7a0bed8c5c 100644 --- a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp +++ b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp @@ -24,8 +24,8 @@ using namespace lldb_private; //---------------------------------------------------------------------- // SymbolVendorMacOSX constructor //---------------------------------------------------------------------- -SymbolVendorMacOSX::SymbolVendorMacOSX(Module *module) : - SymbolVendor(module) +SymbolVendorMacOSX::SymbolVendorMacOSX(const lldb::ModuleSP &module_sp) : + SymbolVendor (module_sp) { } @@ -118,44 +118,50 @@ SymbolVendorMacOSX::GetPluginDescriptionStatic() // also allow for finding separate debug information files. //---------------------------------------------------------------------- SymbolVendor* -SymbolVendorMacOSX::CreateInstance(Module* module) +SymbolVendorMacOSX::CreateInstance (const lldb::ModuleSP &module_sp) { Timer scoped_timer (__PRETTY_FUNCTION__, "SymbolVendorMacOSX::CreateInstance (module = %s/%s)", - module->GetFileSpec().GetDirectory().AsCString(), - module->GetFileSpec().GetFilename().AsCString()); - SymbolVendorMacOSX* symbol_vendor = new SymbolVendorMacOSX(module); + module_sp->GetFileSpec().GetDirectory().AsCString(), + module_sp->GetFileSpec().GetFilename().AsCString()); + SymbolVendorMacOSX* symbol_vendor = new SymbolVendorMacOSX(module_sp); if (symbol_vendor) { char path[PATH_MAX]; path[0] = '\0'; // Try and locate the dSYM file on Mac OS X - ObjectFile * obj_file = module->GetObjectFile(); + ObjectFile * obj_file = module_sp->GetObjectFile(); if (obj_file) { Timer scoped_timer2 ("SymbolVendorMacOSX::CreateInstance () locate dSYM", "SymbolVendorMacOSX::CreateInstance (module = %s/%s) locate dSYM", - module->GetFileSpec().GetDirectory().AsCString(), - module->GetFileSpec().GetFilename().AsCString()); + module_sp->GetFileSpec().GetDirectory().AsCString(), + module_sp->GetFileSpec().GetFilename().AsCString()); - FileSpec dsym_fspec; + // First check to see if the module has a symbol file in mind already. + // If it does, then we MUST use that. + FileSpec dsym_fspec (module_sp->GetSymbolFileFileSpec()); + ObjectFileSP dsym_objfile_sp; - const FileSpec &file_spec = obj_file->GetFileSpec(); - if (file_spec) + if (!dsym_fspec) { - dsym_fspec = Symbols::LocateExecutableSymbolFile (&file_spec, &module->GetArchitecture(), &module->GetUUID()); - - if (dsym_fspec) + // No symbol file was specified in the module, lets try and find + // one ourselves. + const FileSpec &file_spec = obj_file->GetFileSpec(); + if (file_spec) + dsym_fspec = Symbols::LocateExecutableSymbolFile (&file_spec, &module_sp->GetArchitecture(), &module_sp->GetUUID()); + } + + if (dsym_fspec) + { + DataBufferSP dsym_file_data_sp; + dsym_objfile_sp = ObjectFile::FindPlugin(module_sp, &dsym_fspec, 0, dsym_fspec.GetByteSize(), dsym_file_data_sp); + if (UUIDsMatch(module_sp.get(), dsym_objfile_sp.get())) { - DataBufferSP dsym_file_data_sp; - dsym_objfile_sp = ObjectFile::FindPlugin(module, &dsym_fspec, 0, dsym_fspec.GetByteSize(), dsym_file_data_sp); - if (UUIDsMatch(module, dsym_objfile_sp.get())) - { - ReplaceDSYMSectionsWithExecutableSections (obj_file, dsym_objfile_sp.get()); - symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp); - return symbol_vendor; - } + ReplaceDSYMSectionsWithExecutableSections (obj_file, dsym_objfile_sp.get()); + symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp); + return symbol_vendor; } } |