Add support to PlatformRemoteiOS, PlatformRemoteAppleWatch, and

PlatformRemoteAppleTV to check the target.exec-search-paths 
directories for files after looking in the SDK.  An additional
wrinkle is that the remote file path may be something like
".../UIFoundation.framework/UIFoundation" and in 
target.exec-search-paths we will have "UIFoundation.framework".
Looking for just the filename of the path is not sufficient -
we need to also look for it by the parent directories because
this may be a darwin bundle/framework like the UIFoundation
example.

We really need to make a PlatformRemoteAppleDevice and have
PlatformRemoteiOS, PlatformRemoteAppleWatch, and PlatformRemoteAppleTV
inherit from it.  These three classes are 98% identical code.

<rdar://problem/25976619> 

llvm-svn: 272635
This commit is contained in:
Jason Molenda 2016-06-14 03:49:13 +00:00
parent 48f35e074e
commit 27be91ca16
3 changed files with 210 additions and 0 deletions

View File

@ -880,6 +880,76 @@ PlatformRemoteAppleTV::GetSharedModule (const ModuleSpec &module_spec,
if (error.Success())
return error;
// See if the file is present in any of the module_search_paths_ptr directories.
if (!module_sp && module_search_paths_ptr && platform_file)
{
// create a vector of all the file / directory names in platform_file
// e.g. this might be /System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation
//
// We'll need to look in the module_search_paths_ptr directories for
// both "UIFoundation" and "UIFoundation.framework" -- most likely the
// latter will be the one we find there.
FileSpec platform_pull_apart (platform_file);
std::vector<std::string> path_parts;
ConstString unix_root_dir("/");
while (true)
{
ConstString part = platform_pull_apart.GetLastPathComponent();
platform_pull_apart.RemoveLastPathComponent();
if (part.IsEmpty() || part == unix_root_dir)
break;
path_parts.push_back (part.AsCString());
}
const size_t path_parts_size = path_parts.size();
size_t num_module_search_paths = module_search_paths_ptr->GetSize();
for (size_t i = 0; i < num_module_search_paths; ++i)
{
// Create a new FileSpec with this module_search_paths_ptr
// plus just the filename ("UIFoundation"), then the parent
// dir plus filename ("UIFoundation.framework/UIFoundation")
// etc - up to four names (to handle "Foo.framework/Contents/MacOS/Foo")
for (size_t j = 0; j < 4 && j < path_parts_size - 1; ++j)
{
FileSpec path_to_try (module_search_paths_ptr->GetFileSpecAtIndex (i));
// Add the components backwards. For .../PrivateFrameworks/UIFoundation.framework/UIFoundation
// path_parts is
// [0] UIFoundation
// [1] UIFoundation.framework
// [2] PrivateFrameworks
//
// and if 'j' is 2, we want to append path_parts[1] and then path_parts[0], aka
// 'UIFoundation.framework/UIFoundation', to the module_search_paths_ptr path.
for (int k = j; k >= 0; --k)
{
path_to_try.AppendPathComponent (path_parts[k]);
}
if (path_to_try.Exists())
{
ModuleSpec new_module_spec (module_spec);
new_module_spec.GetFileSpec() = path_to_try;
Error new_error (Platform::GetSharedModule (new_module_spec,
process,
module_sp,
NULL,
old_module_sp_ptr,
did_create_ptr));
if (module_sp)
{
module_sp->SetPlatformFileSpec (path_to_try);
return new_error;
}
}
}
}
}
const bool always_create = false;
error = ModuleList::GetSharedModule (module_spec,
module_sp,

View File

@ -892,6 +892,76 @@ PlatformRemoteAppleWatch::GetSharedModule (const ModuleSpec &module_spec,
if (error.Success())
return error;
// See if the file is present in any of the module_search_paths_ptr directories.
if (!module_sp && module_search_paths_ptr && platform_file)
{
// create a vector of all the file / directory names in platform_file
// e.g. this might be /System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation
//
// We'll need to look in the module_search_paths_ptr directories for
// both "UIFoundation" and "UIFoundation.framework" -- most likely the
// latter will be the one we find there.
FileSpec platform_pull_apart (platform_file);
std::vector<std::string> path_parts;
ConstString unix_root_dir("/");
while (true)
{
ConstString part = platform_pull_apart.GetLastPathComponent();
platform_pull_apart.RemoveLastPathComponent();
if (part.IsEmpty() || part == unix_root_dir)
break;
path_parts.push_back (part.AsCString());
}
const size_t path_parts_size = path_parts.size();
size_t num_module_search_paths = module_search_paths_ptr->GetSize();
for (size_t i = 0; i < num_module_search_paths; ++i)
{
// Create a new FileSpec with this module_search_paths_ptr
// plus just the filename ("UIFoundation"), then the parent
// dir plus filename ("UIFoundation.framework/UIFoundation")
// etc - up to four names (to handle "Foo.framework/Contents/MacOS/Foo")
for (size_t j = 0; j < 4 && j < path_parts_size - 1; ++j)
{
FileSpec path_to_try (module_search_paths_ptr->GetFileSpecAtIndex (i));
// Add the components backwards. For .../PrivateFrameworks/UIFoundation.framework/UIFoundation
// path_parts is
// [0] UIFoundation
// [1] UIFoundation.framework
// [2] PrivateFrameworks
//
// and if 'j' is 2, we want to append path_parts[1] and then path_parts[0], aka
// 'UIFoundation.framework/UIFoundation', to the module_search_paths_ptr path.
for (int k = j; k >= 0; --k)
{
path_to_try.AppendPathComponent (path_parts[k]);
}
if (path_to_try.Exists())
{
ModuleSpec new_module_spec (module_spec);
new_module_spec.GetFileSpec() = path_to_try;
Error new_error (Platform::GetSharedModule (new_module_spec,
process,
module_sp,
NULL,
old_module_sp_ptr,
did_create_ptr));
if (module_sp)
{
module_sp->SetPlatformFileSpec (path_to_try);
return new_error;
}
}
}
}
}
const bool always_create = false;
error = ModuleList::GetSharedModule (module_spec,
module_sp,

View File

@ -905,6 +905,76 @@ PlatformRemoteiOS::GetSharedModule (const ModuleSpec &module_spec,
if (error.Success())
return error;
// See if the file is present in any of the module_search_paths_ptr directories.
if (!module_sp && module_search_paths_ptr && platform_file)
{
// create a vector of all the file / directory names in platform_file
// e.g. this might be /System/Library/PrivateFrameworks/UIFoundation.framework/UIFoundation
//
// We'll need to look in the module_search_paths_ptr directories for
// both "UIFoundation" and "UIFoundation.framework" -- most likely the
// latter will be the one we find there.
FileSpec platform_pull_apart (platform_file);
std::vector<std::string> path_parts;
ConstString unix_root_dir("/");
while (true)
{
ConstString part = platform_pull_apart.GetLastPathComponent();
platform_pull_apart.RemoveLastPathComponent();
if (part.IsEmpty() || part == unix_root_dir)
break;
path_parts.push_back (part.AsCString());
}
const size_t path_parts_size = path_parts.size();
size_t num_module_search_paths = module_search_paths_ptr->GetSize();
for (size_t i = 0; i < num_module_search_paths; ++i)
{
// Create a new FileSpec with this module_search_paths_ptr
// plus just the filename ("UIFoundation"), then the parent
// dir plus filename ("UIFoundation.framework/UIFoundation")
// etc - up to four names (to handle "Foo.framework/Contents/MacOS/Foo")
for (size_t j = 0; j < 4 && j < path_parts_size - 1; ++j)
{
FileSpec path_to_try (module_search_paths_ptr->GetFileSpecAtIndex (i));
// Add the components backwards. For .../PrivateFrameworks/UIFoundation.framework/UIFoundation
// path_parts is
// [0] UIFoundation
// [1] UIFoundation.framework
// [2] PrivateFrameworks
//
// and if 'j' is 2, we want to append path_parts[1] and then path_parts[0], aka
// 'UIFoundation.framework/UIFoundation', to the module_search_paths_ptr path.
for (int k = j; k >= 0; --k)
{
path_to_try.AppendPathComponent (path_parts[k]);
}
if (path_to_try.Exists())
{
ModuleSpec new_module_spec (module_spec);
new_module_spec.GetFileSpec() = path_to_try;
Error new_error (Platform::GetSharedModule (new_module_spec,
process,
module_sp,
NULL,
old_module_sp_ptr,
did_create_ptr));
if (module_sp)
{
module_sp->SetPlatformFileSpec (path_to_try);
return new_error;
}
}
}
}
}
const bool always_create = false;
error = ModuleList::GetSharedModule (module_spec,
module_sp,