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).

llvm-svn: 248995
This commit is contained in:
Pavel Labath 2015-10-01 09:03:33 +00:00
parent 2bfb7cbddb
commit 746ffd6980
5 changed files with 142 additions and 128 deletions

View File

@ -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);
//----------------------------------------------------------------------

View File

@ -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);

View File

@ -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 ModuleSpec &module_spec)
(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 (const ModuleSpec &module_spec)
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

View File

@ -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));
}
if (log)
{
std::string searching_for;
if (out_exec_fspec && out_dsym_fspec)
{
searching_for = "executable binary and dSYM";
}
else if (out_exec_fspec)
{
searching_for = "executable binary";
}
else
{
searching_for = "dSYM bundle";
}
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 (::CFURLGetFileSystemRepresentation (dsym_url.get(), true, (UInt8*)path, sizeof(path)-1))
{
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;
}
bool success = false;
if (log)
if (out_dsym_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());
}
}
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)
{
CFStringRef exec_cf_path = static_cast<CFStringRef>(::CFDictionaryGetValue (uuid_dict, CFSTR("DBGSymbolRichExecutable")));
if (exec_cf_path && ::CFStringGetFileSystemRepresentation (exec_cf_path, path, sizeof(path)))
{
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());
}
++items_found;
FileSpec exec_filespec (path, path[0] == '~');
if (exec_filespec.Exists())
out_dsym_fspec->SetFile(path, path[0] == '~');
if (out_dsym_fspec->GetFileType () == FileSpec::eFileTypeDirectory)
{
success = true;
return_module_spec.GetFileSpec() = exec_filespec;
*out_dsym_fspec = Symbols::FindSymbolFileInBundle (*out_dsym_fspec, uuid, arch);
if (*out_dsym_fspec)
++items_found;
}
else
{
++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)
{
char *dsym_extension_pos = ::strstr (path, ".dSYM");
if (dsym_extension_pos)
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)
{
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())
{
case FileSpec::eFileTypeDirectory: // Bundle directory?
{
CFCBundle bundle (path);
CFCReleaser<CFURLRef> bundle_exe_url (bundle.CopyExecutableURL ());
if (bundle_exe_url.get())
{
if (::CFURLGetFileSystemRepresentation (bundle_exe_url.get(), true, (UInt8*)path, sizeof(path)-1))
{
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))
++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)
{
*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?
{
CFCBundle bundle (path);
CFCReleaser<CFURLRef> bundle_exe_url (bundle.CopyExecutableURL ());
if (bundle_exe_url.get())
{
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::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::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;
}
}
}
}

View File

@ -321,13 +321,7 @@ ProcessKDP::DoConnectRemote (Stream *strm, const char *remote_url)
// 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);