summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp')
-rw-r--r--lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp455
1 files changed, 220 insertions, 235 deletions
diff --git a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
index 94a37f8d2dd..4309d32af64 100644
--- a/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
+++ b/lldb/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
@@ -28,88 +28,69 @@ using namespace lldb_private;
//----------------------------------------------------------------------
// SymbolVendorMacOSX constructor
//----------------------------------------------------------------------
-SymbolVendorMacOSX::SymbolVendorMacOSX(const lldb::ModuleSP &module_sp) :
- SymbolVendor (module_sp)
-{
-}
+SymbolVendorMacOSX::SymbolVendorMacOSX(const lldb::ModuleSP &module_sp)
+ : SymbolVendor(module_sp) {}
//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
-SymbolVendorMacOSX::~SymbolVendorMacOSX()
-{
-}
-
-
-static bool
-UUIDsMatch(Module *module, ObjectFile *ofile, lldb_private::Stream *feedback_strm)
-{
- if (module && ofile)
- {
- // Make sure the UUIDs match
- lldb_private::UUID dsym_uuid;
-
- if (!ofile->GetUUID(&dsym_uuid))
- {
- if (feedback_strm)
- {
- feedback_strm->PutCString("warning: failed to get the uuid for object file: '");
- ofile->GetFileSpec().Dump(feedback_strm);
- feedback_strm->PutCString("\n");
- }
- return false;
- }
+SymbolVendorMacOSX::~SymbolVendorMacOSX() {}
+
+static bool UUIDsMatch(Module *module, ObjectFile *ofile,
+ lldb_private::Stream *feedback_strm) {
+ if (module && ofile) {
+ // Make sure the UUIDs match
+ lldb_private::UUID dsym_uuid;
+
+ if (!ofile->GetUUID(&dsym_uuid)) {
+ if (feedback_strm) {
+ feedback_strm->PutCString(
+ "warning: failed to get the uuid for object file: '");
+ ofile->GetFileSpec().Dump(feedback_strm);
+ feedback_strm->PutCString("\n");
+ }
+ return false;
+ }
- if (dsym_uuid == module->GetUUID())
- return true;
-
- // Emit some warning messages since the UUIDs do not match!
- if (feedback_strm)
- {
- feedback_strm->PutCString("warning: UUID mismatch detected between modules:\n ");
- module->GetUUID().Dump(feedback_strm);
- feedback_strm->PutChar(' ');
- module->GetFileSpec().Dump(feedback_strm);
- feedback_strm->PutCString("\n ");
- dsym_uuid.Dump(feedback_strm);
- feedback_strm->PutChar(' ');
- ofile->GetFileSpec().Dump(feedback_strm);
- feedback_strm->EOL();
- }
+ if (dsym_uuid == module->GetUUID())
+ return true;
+
+ // Emit some warning messages since the UUIDs do not match!
+ if (feedback_strm) {
+ feedback_strm->PutCString(
+ "warning: UUID mismatch detected between modules:\n ");
+ module->GetUUID().Dump(feedback_strm);
+ feedback_strm->PutChar(' ');
+ module->GetFileSpec().Dump(feedback_strm);
+ feedback_strm->PutCString("\n ");
+ dsym_uuid.Dump(feedback_strm);
+ feedback_strm->PutChar(' ');
+ ofile->GetFileSpec().Dump(feedback_strm);
+ feedback_strm->EOL();
}
- return false;
+ }
+ return false;
}
-void
-SymbolVendorMacOSX::Initialize()
-{
- PluginManager::RegisterPlugin (GetPluginNameStatic(),
- GetPluginDescriptionStatic(),
- CreateInstance);
+void SymbolVendorMacOSX::Initialize() {
+ PluginManager::RegisterPlugin(GetPluginNameStatic(),
+ GetPluginDescriptionStatic(), CreateInstance);
}
-void
-SymbolVendorMacOSX::Terminate()
-{
- PluginManager::UnregisterPlugin (CreateInstance);
+void SymbolVendorMacOSX::Terminate() {
+ PluginManager::UnregisterPlugin(CreateInstance);
}
-
-lldb_private::ConstString
-SymbolVendorMacOSX::GetPluginNameStatic()
-{
- static ConstString g_name("macosx");
- return g_name;
+lldb_private::ConstString SymbolVendorMacOSX::GetPluginNameStatic() {
+ static ConstString g_name("macosx");
+ return g_name;
}
-const char *
-SymbolVendorMacOSX::GetPluginDescriptionStatic()
-{
- return "Symbol vendor for MacOSX that looks for dSYM files that match executables.";
+const char *SymbolVendorMacOSX::GetPluginDescriptionStatic() {
+ return "Symbol vendor for MacOSX that looks for dSYM files that match "
+ "executables.";
}
-
-
//----------------------------------------------------------------------
// CreateInstance
//
@@ -117,186 +98,190 @@ SymbolVendorMacOSX::GetPluginDescriptionStatic()
// vendors to allow for complex debug information file setups, and to
// also allow for finding separate debug information files.
//----------------------------------------------------------------------
-SymbolVendor*
-SymbolVendorMacOSX::CreateInstance (const lldb::ModuleSP &module_sp, lldb_private::Stream *feedback_strm)
-{
- if (!module_sp)
- return NULL;
-
- ObjectFile * obj_file = module_sp->GetObjectFile();
- if (!obj_file)
- return NULL;
-
- static ConstString obj_file_macho("mach-o");
- ConstString obj_name = obj_file->GetPluginName();
- if (obj_name != obj_file_macho)
- return NULL;
-
- Timer scoped_timer (LLVM_PRETTY_FUNCTION,
- "SymbolVendorMacOSX::CreateInstance (module = %s)",
- module_sp->GetFileSpec().GetPath().c_str());
- 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
- Timer scoped_timer2 ("SymbolVendorMacOSX::CreateInstance () locate dSYM",
- "SymbolVendorMacOSX::CreateInstance (module = %s) locate dSYM",
- module_sp->GetFileSpec().GetPath().c_str());
-
- // 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;
- if (!dsym_fspec)
- {
- // No symbol file was specified in the module, lets try and find
- // one ourselves.
- FileSpec file_spec = obj_file->GetFileSpec();
- if (!file_spec)
- file_spec = module_sp->GetFileSpec();
-
- ModuleSpec module_spec(file_spec, module_sp->GetArchitecture());
- module_spec.GetUUID() = module_sp->GetUUID();
- dsym_fspec = Symbols::LocateExecutableSymbolFile (module_spec);
- if (module_spec.GetSourceMappingList().GetSize())
- module_sp->GetSourceMappingList().Append (module_spec.GetSourceMappingList (), true);
- }
-
- if (dsym_fspec)
- {
- DataBufferSP dsym_file_data_sp;
- lldb::offset_t dsym_file_data_offset = 0;
- dsym_objfile_sp = ObjectFile::FindPlugin(module_sp, &dsym_fspec, 0, dsym_fspec.GetByteSize(), dsym_file_data_sp, dsym_file_data_offset);
- if (UUIDsMatch(module_sp.get(), dsym_objfile_sp.get(), feedback_strm))
- {
- // We need a XML parser if we hope to parse a plist...
- if (XMLDocument::XMLEnabled())
- {
- char dsym_path[PATH_MAX];
- if (module_sp->GetSourceMappingList().IsEmpty() && dsym_fspec.GetPath(dsym_path, sizeof(dsym_path)))
- {
- lldb_private::UUID dsym_uuid;
- if (dsym_objfile_sp->GetUUID(&dsym_uuid))
- {
- std::string uuid_str = dsym_uuid.GetAsString ();
- if (!uuid_str.empty())
- {
- char *resources = strstr (dsym_path, "/Contents/Resources/");
- if (resources)
- {
- char dsym_uuid_plist_path[PATH_MAX];
- resources[strlen("/Contents/Resources/")] = '\0';
- snprintf(dsym_uuid_plist_path, sizeof(dsym_uuid_plist_path), "%s%s.plist", dsym_path, uuid_str.c_str());
- FileSpec dsym_uuid_plist_spec(dsym_uuid_plist_path, false);
- if (dsym_uuid_plist_spec.Exists())
- {
- ApplePropertyList plist(dsym_uuid_plist_path);
- if (plist)
- {
- std::string DBGBuildSourcePath;
- std::string DBGSourcePath;
-
- plist.GetValueAsString("DBGBuildSourcePath", DBGBuildSourcePath);
- plist.GetValueAsString("DBGSourcePath", DBGSourcePath);
- if (!DBGBuildSourcePath.empty() && !DBGSourcePath.empty())
- {
- if (DBGSourcePath[0] == '~')
- {
- FileSpec resolved_source_path(DBGSourcePath.c_str(), true);
- DBGSourcePath = resolved_source_path.GetPath();
- }
- module_sp->GetSourceMappingList().Append (ConstString(DBGBuildSourcePath), ConstString(DBGSourcePath), true);
- }
-
- // DBGSourcePathRemapping is a dictionary in the plist with
- // keys which are DBGBuildSourcePath file paths and
- // values which are DBGSourcePath file paths
-
- StructuredData::ObjectSP plist_sp = plist.GetStructuredData();
- if (plist_sp.get()
- && plist_sp->GetAsDictionary()
- && plist_sp->GetAsDictionary()->HasKey("DBGSourcePathRemapping")
- && plist_sp->GetAsDictionary()->GetValueForKey("DBGSourcePathRemapping")->GetAsDictionary())
- {
-
- // In an early version of DBGSourcePathRemapping, the DBGSourcePath
- // values were incorrect. If we have a newer style
- // DBGSourcePathRemapping, there will be a DBGVersion key in the plist
- // (we don't care about the value at this point).
- //
- // If this is an old style DBGSourcePathRemapping, ignore the
- // value half of the key-value remappings and use reuse the original
- // gloal DBGSourcePath string.
- bool new_style_source_remapping_dictionary = false;
- std::string original_DBGSourcePath_value = DBGSourcePath;
- if (plist_sp->GetAsDictionary()->HasKey("DBGVersion"))
- {
- new_style_source_remapping_dictionary = true;
- }
-
- StructuredData::Dictionary *remappings_dict = plist_sp->GetAsDictionary()->GetValueForKey("DBGSourcePathRemapping")->GetAsDictionary();
- remappings_dict->ForEach ([&module_sp, new_style_source_remapping_dictionary, original_DBGSourcePath_value](ConstString key, StructuredData::Object *object) -> bool
- {
- if (object && object->GetAsString())
- {
-
- // key is DBGBuildSourcePath
- // object is DBGSourcePath
- std::string DBGSourcePath = object->GetStringValue();
- if (new_style_source_remapping_dictionary == false && !original_DBGSourcePath_value.empty())
- {
- DBGSourcePath = original_DBGSourcePath_value;
- }
- if (DBGSourcePath[0] == '~')
- {
- FileSpec resolved_source_path(DBGSourcePath.c_str(), true);
- DBGSourcePath = resolved_source_path.GetPath();
- }
- module_sp->GetSourceMappingList().Append (key, ConstString(DBGSourcePath), true);
- }
- return true;
- });
-
- }
- }
- }
- }
- }
+SymbolVendor *
+SymbolVendorMacOSX::CreateInstance(const lldb::ModuleSP &module_sp,
+ lldb_private::Stream *feedback_strm) {
+ if (!module_sp)
+ return NULL;
+
+ ObjectFile *obj_file = module_sp->GetObjectFile();
+ if (!obj_file)
+ return NULL;
+
+ static ConstString obj_file_macho("mach-o");
+ ConstString obj_name = obj_file->GetPluginName();
+ if (obj_name != obj_file_macho)
+ return NULL;
+
+ Timer scoped_timer(LLVM_PRETTY_FUNCTION,
+ "SymbolVendorMacOSX::CreateInstance (module = %s)",
+ module_sp->GetFileSpec().GetPath().c_str());
+ 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
+ Timer scoped_timer2(
+ "SymbolVendorMacOSX::CreateInstance () locate dSYM",
+ "SymbolVendorMacOSX::CreateInstance (module = %s) locate dSYM",
+ module_sp->GetFileSpec().GetPath().c_str());
+
+ // 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;
+ if (!dsym_fspec) {
+ // No symbol file was specified in the module, lets try and find
+ // one ourselves.
+ FileSpec file_spec = obj_file->GetFileSpec();
+ if (!file_spec)
+ file_spec = module_sp->GetFileSpec();
+
+ ModuleSpec module_spec(file_spec, module_sp->GetArchitecture());
+ module_spec.GetUUID() = module_sp->GetUUID();
+ dsym_fspec = Symbols::LocateExecutableSymbolFile(module_spec);
+ if (module_spec.GetSourceMappingList().GetSize())
+ module_sp->GetSourceMappingList().Append(
+ module_spec.GetSourceMappingList(), true);
+ }
+
+ if (dsym_fspec) {
+ DataBufferSP dsym_file_data_sp;
+ lldb::offset_t dsym_file_data_offset = 0;
+ dsym_objfile_sp = ObjectFile::FindPlugin(
+ module_sp, &dsym_fspec, 0, dsym_fspec.GetByteSize(),
+ dsym_file_data_sp, dsym_file_data_offset);
+ if (UUIDsMatch(module_sp.get(), dsym_objfile_sp.get(), feedback_strm)) {
+ // We need a XML parser if we hope to parse a plist...
+ if (XMLDocument::XMLEnabled()) {
+ char dsym_path[PATH_MAX];
+ if (module_sp->GetSourceMappingList().IsEmpty() &&
+ dsym_fspec.GetPath(dsym_path, sizeof(dsym_path))) {
+ lldb_private::UUID dsym_uuid;
+ if (dsym_objfile_sp->GetUUID(&dsym_uuid)) {
+ std::string uuid_str = dsym_uuid.GetAsString();
+ if (!uuid_str.empty()) {
+ char *resources = strstr(dsym_path, "/Contents/Resources/");
+ if (resources) {
+ char dsym_uuid_plist_path[PATH_MAX];
+ resources[strlen("/Contents/Resources/")] = '\0';
+ snprintf(dsym_uuid_plist_path, sizeof(dsym_uuid_plist_path),
+ "%s%s.plist", dsym_path, uuid_str.c_str());
+ FileSpec dsym_uuid_plist_spec(dsym_uuid_plist_path, false);
+ if (dsym_uuid_plist_spec.Exists()) {
+ ApplePropertyList plist(dsym_uuid_plist_path);
+ if (plist) {
+ std::string DBGBuildSourcePath;
+ std::string DBGSourcePath;
+
+ plist.GetValueAsString("DBGBuildSourcePath",
+ DBGBuildSourcePath);
+ plist.GetValueAsString("DBGSourcePath", DBGSourcePath);
+ if (!DBGBuildSourcePath.empty() &&
+ !DBGSourcePath.empty()) {
+ if (DBGSourcePath[0] == '~') {
+ FileSpec resolved_source_path(DBGSourcePath.c_str(),
+ true);
+ DBGSourcePath = resolved_source_path.GetPath();
+ }
+ module_sp->GetSourceMappingList().Append(
+ ConstString(DBGBuildSourcePath),
+ ConstString(DBGSourcePath), true);
+ }
+
+ // DBGSourcePathRemapping is a dictionary in the plist
+ // with
+ // keys which are DBGBuildSourcePath file paths and
+ // values which are DBGSourcePath file paths
+
+ StructuredData::ObjectSP plist_sp =
+ plist.GetStructuredData();
+ if (plist_sp.get() && plist_sp->GetAsDictionary() &&
+ plist_sp->GetAsDictionary()->HasKey(
+ "DBGSourcePathRemapping") &&
+ plist_sp->GetAsDictionary()
+ ->GetValueForKey("DBGSourcePathRemapping")
+ ->GetAsDictionary()) {
+
+ // In an early version of DBGSourcePathRemapping, the
+ // DBGSourcePath
+ // values were incorrect. If we have a newer style
+ // DBGSourcePathRemapping, there will be a DBGVersion
+ // key in the plist
+ // (we don't care about the value at this point).
+ //
+ // If this is an old style DBGSourcePathRemapping,
+ // ignore the
+ // value half of the key-value remappings and use reuse
+ // the original
+ // gloal DBGSourcePath string.
+ bool new_style_source_remapping_dictionary = false;
+ std::string original_DBGSourcePath_value =
+ DBGSourcePath;
+ if (plist_sp->GetAsDictionary()->HasKey("DBGVersion")) {
+ new_style_source_remapping_dictionary = true;
}
+
+ StructuredData::Dictionary *remappings_dict =
+ plist_sp->GetAsDictionary()
+ ->GetValueForKey("DBGSourcePathRemapping")
+ ->GetAsDictionary();
+ remappings_dict->ForEach(
+ [&module_sp, new_style_source_remapping_dictionary,
+ original_DBGSourcePath_value](
+ ConstString key,
+ StructuredData::Object *object) -> bool {
+ if (object && object->GetAsString()) {
+
+ // key is DBGBuildSourcePath
+ // object is DBGSourcePath
+ std::string DBGSourcePath =
+ object->GetStringValue();
+ if (new_style_source_remapping_dictionary ==
+ false &&
+ !original_DBGSourcePath_value.empty()) {
+ DBGSourcePath = original_DBGSourcePath_value;
+ }
+ if (DBGSourcePath[0] == '~') {
+ FileSpec resolved_source_path(
+ DBGSourcePath.c_str(), true);
+ DBGSourcePath =
+ resolved_source_path.GetPath();
+ }
+ module_sp->GetSourceMappingList().Append(
+ key, ConstString(DBGSourcePath), true);
+ }
+ return true;
+ });
+ }
}
+ }
}
-
- symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp);
- return symbol_vendor;
+ }
}
+ }
}
- // Just create our symbol vendor using the current objfile as this is either
- // an executable with no dSYM (that we could locate), an executable with
- // a dSYM that has a UUID that doesn't match.
- symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this());
+ symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp);
+ return symbol_vendor;
+ }
}
- return symbol_vendor;
-}
-
+ // Just create our symbol vendor using the current objfile as this is either
+ // an executable with no dSYM (that we could locate), an executable with
+ // a dSYM that has a UUID that doesn't match.
+ symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this());
+ }
+ return symbol_vendor;
+}
//------------------------------------------------------------------
// PluginInterface protocol
//------------------------------------------------------------------
-ConstString
-SymbolVendorMacOSX::GetPluginName()
-{
- return GetPluginNameStatic();
-}
-
-uint32_t
-SymbolVendorMacOSX::GetPluginVersion()
-{
- return 1;
+ConstString SymbolVendorMacOSX::GetPluginName() {
+ return GetPluginNameStatic();
}
+uint32_t SymbolVendorMacOSX::GetPluginVersion() { return 1; }
OpenPOWER on IntegriCloud