Author: labath Date: Thu Oct 1 04:03:33 2015 New Revision: 248995 URL: http://llvm.org/viewvc/llvm-project?rev=248995&view=rev Log: Revert "Fixing a subtle issue on Mac OS X systems with dSYMs..."
This reverts commit r248985, as it was breaking all remote expression-evaluating tests (on android at least). Modified: lldb/trunk/include/lldb/Host/Symbols.h lldb/trunk/source/Core/ModuleList.cpp lldb/trunk/source/Host/common/Symbols.cpp lldb/trunk/source/Host/macosx/Symbols.cpp lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp Modified: lldb/trunk/include/lldb/Host/Symbols.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Symbols.h?rev=248995&r1=248994&r2=248995&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/Symbols.h (original) +++ lldb/trunk/include/lldb/Host/Symbols.h Thu Oct 1 04:03:33 2015 @@ -29,7 +29,7 @@ public: // Locating the file should happen only on the local computer or using // the current computers global settings. //---------------------------------------------------------------------- - static ModuleSpec + static FileSpec LocateExecutableObjectFile (const ModuleSpec &module_spec); //---------------------------------------------------------------------- Modified: lldb/trunk/source/Core/ModuleList.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ModuleList.cpp?rev=248995&r1=248994&r2=248995&view=diff ============================================================================== --- lldb/trunk/source/Core/ModuleList.cpp (original) +++ lldb/trunk/source/Core/ModuleList.cpp Thu Oct 1 04:03:33 2015 @@ -1045,19 +1045,19 @@ ModuleList::GetSharedModule // Fixup the incoming path in case the path points to a valid file, yet // the arch or UUID (if one was passed in) don't match. - ModuleSpec located_binary_modulespec = Symbols::LocateExecutableObjectFile (module_spec); + FileSpec file_spec = Symbols::LocateExecutableObjectFile (module_spec); // Don't look for the file if it appears to be the same one we already // checked for above... - if (located_binary_modulespec.GetFileSpec() != module_file_spec) + if (file_spec != module_file_spec) { - if (!located_binary_modulespec.GetFileSpec().Exists()) + if (!file_spec.Exists()) { - located_binary_modulespec.GetFileSpec().GetPath(path, sizeof(path)); + file_spec.GetPath(path, sizeof(path)); if (path[0] == '\0') module_file_spec.GetPath(path, sizeof(path)); // How can this check ever be true? This branch it is false, and we haven't modified file_spec. - if (located_binary_modulespec.GetFileSpec().Exists()) + if (file_spec.Exists()) { std::string uuid_str; if (uuid_ptr && uuid_ptr->IsValid()) @@ -1084,8 +1084,9 @@ ModuleList::GetSharedModule // Make sure no one else can try and get or create a module while this // function is actively working on it by doing an extra lock on the // global mutex list. - ModuleSpec platform_module_spec(located_binary_modulespec); - platform_module_spec.GetPlatformFileSpec() = located_binary_modulespec.GetFileSpec(); + ModuleSpec platform_module_spec(module_spec); + platform_module_spec.GetFileSpec() = file_spec; + platform_module_spec.GetPlatformFileSpec() = file_spec; ModuleList matching_module_list; if (shared_module_list.FindModules (platform_module_spec, matching_module_list) > 0) { @@ -1095,7 +1096,7 @@ ModuleList::GetSharedModule // then we should make sure the modification time hasn't changed! if (platform_module_spec.GetUUIDPtr() == NULL) { - TimeValue file_spec_mod_time(located_binary_modulespec.GetFileSpec().GetModificationTime()); + TimeValue file_spec_mod_time(file_spec.GetModificationTime()); if (file_spec_mod_time.IsValid()) { if (file_spec_mod_time != module_sp->GetModificationTime()) @@ -1124,9 +1125,9 @@ ModuleList::GetSharedModule } else { - located_binary_modulespec.GetFileSpec().GetPath(path, sizeof(path)); + file_spec.GetPath(path, sizeof(path)); - if (located_binary_modulespec.GetFileSpec()) + if (file_spec) { if (arch.IsValid()) error.SetErrorStringWithFormat("unable to open %s architecture in '%s'", arch.GetArchitectureName(), path); Modified: lldb/trunk/source/Host/common/Symbols.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Symbols.cpp?rev=248995&r1=248994&r2=248995&view=diff ============================================================================== --- lldb/trunk/source/Host/common/Symbols.cpp (original) +++ lldb/trunk/source/Host/common/Symbols.cpp Thu Oct 1 04:03:33 2015 @@ -38,7 +38,8 @@ int LocateMacOSXFilesUsingDebugSymbols ( const ModuleSpec &module_spec, - ModuleSpec &return_module_spec + FileSpec *out_exec_fspec, // If non-NULL, try and find the executable + FileSpec *out_dsym_fspec // If non-NULL try and find the debug symbol file ); #else @@ -47,7 +48,8 @@ int LocateMacOSXFilesUsingDebugSymbols ( const ModuleSpec &module_spec, - ModuleSpec &return_module_spec + FileSpec *out_exec_fspec, // If non-NULL, try and find the executable + FileSpec *out_dsym_fspec // If non-NULL try and find the debug symbol file ) { // Cannot find MacOSX files using debug symbols on non MacOSX. return 0; @@ -176,25 +178,19 @@ LocateExecutableSymbolFileDsym (const Mo (const void*)uuid); FileSpec symbol_fspec; - ModuleSpec dsym_module_spec; // First try and find the dSYM in the same directory as the executable or in // an appropriate parent directory if (LocateDSYMInVincinityOfExecutable (module_spec, symbol_fspec) == false) { // We failed to easily find the dSYM above, so use DebugSymbols - LocateMacOSXFilesUsingDebugSymbols (module_spec, dsym_module_spec); + LocateMacOSXFilesUsingDebugSymbols (module_spec, NULL, &symbol_fspec); } - else - { - dsym_module_spec.GetSymbolFileSpec() = symbol_fspec; - } - return dsym_module_spec.GetSymbolFileSpec(); + return symbol_fspec; } -ModuleSpec +FileSpec Symbols::LocateExecutableObjectFile (const ModuleSpec &module_spec) { - ModuleSpec result = module_spec; const FileSpec *exec_fspec = module_spec.GetFileSpecPtr(); const ArchSpec *arch = module_spec.GetArchitecturePtr(); const UUID *uuid = module_spec.GetUUIDPtr(); @@ -204,19 +200,20 @@ Symbols::LocateExecutableObjectFile (con arch ? arch->GetArchitectureName() : "<NULL>", (const void*)uuid); + FileSpec objfile_fspec; ModuleSpecList module_specs; ModuleSpec matched_module_spec; if (exec_fspec && ObjectFile::GetModuleSpecifications(*exec_fspec, 0, 0, module_specs) && module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec)) { - result.GetFileSpec() = exec_fspec; + objfile_fspec = exec_fspec; } else { - LocateMacOSXFilesUsingDebugSymbols (module_spec, result); + LocateMacOSXFilesUsingDebugSymbols (module_spec, &objfile_fspec, NULL); } - return result; + return objfile_fspec; } FileSpec Modified: lldb/trunk/source/Host/macosx/Symbols.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Symbols.cpp?rev=248995&r1=248994&r2=248995&view=diff ============================================================================== --- lldb/trunk/source/Host/macosx/Symbols.cpp (original) +++ lldb/trunk/source/Host/macosx/Symbols.cpp Thu Oct 1 04:03:33 2015 @@ -55,15 +55,18 @@ int LocateMacOSXFilesUsingDebugSymbols ( const ModuleSpec &module_spec, - ModuleSpec &return_module_spec + FileSpec *out_exec_fspec, // If non-NULL, try and find the executable + FileSpec *out_dsym_fspec // If non-NULL try and find the debug symbol file ) { - return_module_spec = module_spec; - return_module_spec.GetFileSpec().Clear(); - return_module_spec.GetSymbolFileSpec().Clear(); - int items_found = 0; + if (out_exec_fspec) + out_exec_fspec->Clear(); + + if (out_dsym_fspec) + out_dsym_fspec->Clear(); + #if !defined (__arm__) && !defined (__arm64__) && !defined (__aarch64__) // No DebugSymbols on the iOS devices const UUID *uuid = module_spec.GetUUIDPtr(); @@ -107,132 +110,151 @@ LocateMacOSXFilesUsingDebugSymbols strlen(exec_cf_path), FALSE)); } - - CFCReleaser<CFURLRef> dsym_url (::DBGCopyFullDSYMURLForUUID(module_uuid_ref.get(), exec_url.get())); - char path[PATH_MAX]; - - if (dsym_url.get()) + if (log) { - if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1)) + std::string searching_for; + if (out_exec_fspec && out_dsym_fspec) { - if (log) - { - log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for the dSYM", path, uuid->GetAsString().c_str()); - } - FileSpec dsym_filespec(path, path[0] == '~'); - - if (dsym_filespec.GetFileType () == FileSpec::eFileTypeDirectory) - { - dsym_filespec = Symbols::FindSymbolFileInBundle (dsym_filespec, uuid, arch); - ++items_found; - } - else - { - ++items_found; - } - return_module_spec.GetSymbolFileSpec() = dsym_filespec; + searching_for = "executable binary and dSYM"; } - - bool success = false; - if (log) + else if (out_exec_fspec) { - if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1)) - { - log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for an exec file", path, uuid->GetAsString().c_str()); - } - + searching_for = "executable binary"; } - - CFCReleaser<CFDictionaryRef> dict(::DBGCopyDSYMPropertyLists (dsym_url.get())); - CFDictionaryRef uuid_dict = NULL; - if (dict.get()) + else { - CFCString uuid_cfstr (uuid->GetAsString().c_str()); - uuid_dict = static_cast<CFDictionaryRef>(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get())); + searching_for = "dSYM bundle"; } - if (uuid_dict) + log->Printf ("Calling DebugSymbols framework to locate dSYM bundle for UUID %s, searching for %s", uuid->GetAsString().c_str(), searching_for.c_str()); + } + + CFCReleaser<CFURLRef> dsym_url (::DBGCopyFullDSYMURLForUUID(module_uuid_ref.get(), exec_url.get())); + char path[PATH_MAX]; + + if (dsym_url.get()) + { + if (out_dsym_fspec) { - CFStringRef exec_cf_path = static_cast<CFStringRef>(::CFDictionaryGetValue (uuid_dict, CFSTR("DBGSymbolRichExecutable"))); - if (exec_cf_path && ::CFStringGetFileSystemRepresentation (exec_cf_path, path, sizeof(path))) + if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1)) { if (log) { - log->Printf ("plist bundle has exec path of %s for UUID %s", path, uuid->GetAsString().c_str()); + log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for the dSYM", path, uuid->GetAsString().c_str()); + } + out_dsym_fspec->SetFile(path, path[0] == '~'); + + if (out_dsym_fspec->GetFileType () == FileSpec::eFileTypeDirectory) + { + *out_dsym_fspec = Symbols::FindSymbolFileInBundle (*out_dsym_fspec, uuid, arch); + if (*out_dsym_fspec) + ++items_found; } - ++items_found; - FileSpec exec_filespec (path, path[0] == '~'); - if (exec_filespec.Exists()) + else { - success = true; - return_module_spec.GetFileSpec() = exec_filespec; + ++items_found; } } } - if (!success) + if (out_exec_fspec) { - // No dictionary, check near the dSYM bundle for an executable that matches... - if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1)) + bool success = false; + if (log) + { + if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1)) + { + log->Printf ("DebugSymbols framework returned dSYM path of %s for UUID %s -- looking for an exec file", path, uuid->GetAsString().c_str()); + } + + } + CFCReleaser<CFDictionaryRef> dict(::DBGCopyDSYMPropertyLists (dsym_url.get())); + CFDictionaryRef uuid_dict = NULL; + if (dict.get()) + { + CFCString uuid_cfstr (uuid->GetAsString().c_str()); + uuid_dict = static_cast<CFDictionaryRef>(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get())); + } + if (uuid_dict) { - char *dsym_extension_pos = ::strstr (path, ".dSYM"); - if (dsym_extension_pos) + CFStringRef exec_cf_path = static_cast<CFStringRef>(::CFDictionaryGetValue (uuid_dict, CFSTR("DBGSymbolRichExecutable"))); + if (exec_cf_path && ::CFStringGetFileSystemRepresentation (exec_cf_path, path, sizeof(path))) { - *dsym_extension_pos = '\0'; if (log) { - log->Printf ("Looking for executable binary next to dSYM bundle with name with name %s", path); + log->Printf ("plist bundle has exec path of %s for UUID %s", path, uuid->GetAsString().c_str()); } - FileSpec file_spec (path, true); - ModuleSpecList module_specs; - ModuleSpec matched_module_spec; - switch (file_spec.GetFileType()) + ++items_found; + out_exec_fspec->SetFile(path, path[0] == '~'); + if (out_exec_fspec->Exists()) + success = true; + } + } + + if (!success) + { + // No dictionary, check near the dSYM bundle for an executable that matches... + if (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1)) + { + char *dsym_extension_pos = ::strstr (path, ".dSYM"); + if (dsym_extension_pos) { - case FileSpec::eFileTypeDirectory: // Bundle directory? - { - CFCBundle bundle (path); - CFCReleaser<CFURLRef> bundle_exe_url (bundle.CopyExecutableURL ()); - if (bundle_exe_url.get()) + *dsym_extension_pos = '\0'; + if (log) + { + log->Printf ("Looking for executable binary next to dSYM bundle with name with name %s", path); + } + FileSpec file_spec (path, true); + ModuleSpecList module_specs; + ModuleSpec matched_module_spec; + switch (file_spec.GetFileType()) + { + case FileSpec::eFileTypeDirectory: // Bundle directory? { - if (::CFURLGetFileSystemRepresentation (bundle_exe_url.get(), true, (UInt8*)path, sizeof(path)-1)) + CFCBundle bundle (path); + CFCReleaser<CFURLRef> bundle_exe_url (bundle.CopyExecutableURL ()); + if (bundle_exe_url.get()) { - FileSpec bundle_exe_file_spec (path, true); - if (ObjectFile::GetModuleSpecifications(bundle_exe_file_spec, 0, 0, module_specs) && - module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec)) - + if (::CFURLGetFileSystemRepresentation (bundle_exe_url.get(), true, (UInt8*)path, sizeof(path)-1)) { - ++items_found; - return_module_spec.GetFileSpec() = bundle_exe_file_spec; - if (log) + FileSpec bundle_exe_file_spec (path, true); + if (ObjectFile::GetModuleSpecifications(bundle_exe_file_spec, 0, 0, module_specs) && + module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec)) + { - log->Printf ("Executable binary %s next to dSYM is compatible; using", path); + ++items_found; + *out_exec_fspec = bundle_exe_file_spec; + if (log) + { + log->Printf ("Executable binary %s next to dSYM is compatible; using", path); + } } } } } - } - break; + break; + + case FileSpec::eFileTypePipe: // Forget pipes + case FileSpec::eFileTypeSocket: // We can't process socket files + case FileSpec::eFileTypeInvalid: // File doesn't exist... + break; + + case FileSpec::eFileTypeUnknown: + case FileSpec::eFileTypeRegular: + case FileSpec::eFileTypeSymbolicLink: + case FileSpec::eFileTypeOther: + if (ObjectFile::GetModuleSpecifications(file_spec, 0, 0, module_specs) && + module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec)) - case FileSpec::eFileTypePipe: // Forget pipes - case FileSpec::eFileTypeSocket: // We can't process socket files - case FileSpec::eFileTypeInvalid: // File doesn't exist... - break; - - case FileSpec::eFileTypeUnknown: - case FileSpec::eFileTypeRegular: - case FileSpec::eFileTypeSymbolicLink: - case FileSpec::eFileTypeOther: - if (ObjectFile::GetModuleSpecifications(file_spec, 0, 0, module_specs) && - module_specs.FindMatchingModuleSpec(module_spec, matched_module_spec)) - - { - ++items_found; - return_module_spec.GetFileSpec() = file_spec; - if (log) { - log->Printf ("Executable binary %s next to dSYM is compatible; using", path); + ++items_found; + *out_exec_fspec = file_spec; + if (log) + { + log->Printf ("Executable binary %s next to dSYM is compatible; using", path); + } } - } - break; + break; + } } } } Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp?rev=248995&r1=248994&r2=248995&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp (original) +++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp Thu Oct 1 04:03:33 2015 @@ -321,13 +321,7 @@ ProcessKDP::DoConnectRemote (Stream *str // Lookup UUID locally, before attempting dsymForUUID like action module_spec.GetSymbolFileSpec() = Symbols::LocateExecutableSymbolFile(module_spec); if (module_spec.GetSymbolFileSpec()) - { - ModuleSpec executable_module_spec = Symbols::LocateExecutableObjectFile (module_spec); - if (executable_module_spec.GetFileSpec().Exists()) - { - module_spec.GetFileSpec() = executable_module_spec.GetFileSpec(); - } - } + module_spec.GetFileSpec() = Symbols::LocateExecutableObjectFile (module_spec); if (!module_spec.GetSymbolFileSpec() || !module_spec.GetSymbolFileSpec()) Symbols::DownloadObjectAndSymbolFile (module_spec, true); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits