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:
		
							parent
							
								
									48f35e074e
								
							
						
					
					
						commit
						27be91ca16
					
				| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue