PlatformRemoteiOS.cpp revision 9ce953807eb814a93b449dc243de4f7bf32c3115
1cb8977d726be451df9978a74088435667fa37da2Greg Clayton//===-- PlatformRemoteiOS.cpp -----------------------------------*- C++ -*-===//
2b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//
3b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//                     The LLVM Compiler Infrastructure
4b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//
5b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// This file is distributed under the University of Illinois Open Source
6b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// License. See LICENSE.TXT for details.
7b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//
8b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//===----------------------------------------------------------------------===//
9b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
10b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "PlatformRemoteiOS.h"
11b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
12b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// C Includes
13b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// C++ Includes
14b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// Other libraries and framework includes
15b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// Project includes
16b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Breakpoint/BreakpointLocation.h"
17b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/ArchSpec.h"
18b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/Error.h"
19b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/Module.h"
20b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/ModuleList.h"
21b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/PluginManager.h"
22b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/StreamString.h"
23b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/FileSpec.h"
24b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/Host.h"
25b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Process.h"
26b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Target.h"
27b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
28b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb;
29b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb_private;
30cb8977d726be451df9978a74088435667fa37da2Greg Clayton
3158e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
3258e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Variables
3358e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
3458e26e0935138225477fd61283215ceff2068899Greg Claytonstatic uint32_t g_initialize_count = 0;
3558e26e0935138225477fd61283215ceff2068899Greg Clayton
3658e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
3758e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Functions
3858e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
39b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid
40b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::Initialize ()
41b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
4258e26e0935138225477fd61283215ceff2068899Greg Clayton    if (g_initialize_count++ == 0)
43b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
44cb8977d726be451df9978a74088435667fa37da2Greg Clayton        PluginManager::RegisterPlugin (PlatformRemoteiOS::GetShortPluginNameStatic(),
45cb8977d726be451df9978a74088435667fa37da2Greg Clayton                                       PlatformRemoteiOS::GetDescriptionStatic(),
46cb8977d726be451df9978a74088435667fa37da2Greg Clayton                                       PlatformRemoteiOS::CreateInstance);
47cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
48cb8977d726be451df9978a74088435667fa37da2Greg Clayton}
49cb8977d726be451df9978a74088435667fa37da2Greg Clayton
50cb8977d726be451df9978a74088435667fa37da2Greg Claytonvoid
51cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatformRemoteiOS::Terminate ()
52cb8977d726be451df9978a74088435667fa37da2Greg Clayton{
5358e26e0935138225477fd61283215ceff2068899Greg Clayton    if (g_initialize_count > 0)
54cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
5558e26e0935138225477fd61283215ceff2068899Greg Clayton        if (--g_initialize_count == 0)
5658e26e0935138225477fd61283215ceff2068899Greg Clayton        {
5758e26e0935138225477fd61283215ceff2068899Greg Clayton            PluginManager::UnregisterPlugin (PlatformRemoteiOS::CreateInstance);
5858e26e0935138225477fd61283215ceff2068899Greg Clayton        }
59b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
60b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
61b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
62b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform*
63b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::CreateInstance ()
64b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
65b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return new PlatformRemoteiOS ();
66b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
67b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
68b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
69b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
70b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetPluginNameStatic ()
71b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
72b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return "PlatformRemoteiOS";
73b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
74b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
75b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
76b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetShortPluginNameStatic()
77b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
78b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return "remote-ios";
79b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
80b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
81b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
82b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetDescriptionStatic()
83b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
84b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return "Remote iOS platform plug-in.";
85b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
86b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
87b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
8858e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
8958e26e0935138225477fd61283215ceff2068899Greg Clayton/// Default Constructor
9058e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
9158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::PlatformRemoteiOS () :
9258e26e0935138225477fd61283215ceff2068899Greg Clayton    PlatformDarwin (false),    // This is a remote platform
9358e26e0935138225477fd61283215ceff2068899Greg Clayton    m_device_support_directory (),
9458e26e0935138225477fd61283215ceff2068899Greg Clayton    m_device_support_directory_for_os_version ()
9558e26e0935138225477fd61283215ceff2068899Greg Clayton{
9658e26e0935138225477fd61283215ceff2068899Greg Clayton}
9758e26e0935138225477fd61283215ceff2068899Greg Clayton
9858e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
9958e26e0935138225477fd61283215ceff2068899Greg Clayton/// Destructor.
10058e26e0935138225477fd61283215ceff2068899Greg Clayton///
10158e26e0935138225477fd61283215ceff2068899Greg Clayton/// The destructor is virtual since this class is designed to be
10258e26e0935138225477fd61283215ceff2068899Greg Clayton/// inherited from by the plug-in instance.
10358e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
10458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::~PlatformRemoteiOS()
10558e26e0935138225477fd61283215ceff2068899Greg Clayton{
10658e26e0935138225477fd61283215ceff2068899Greg Clayton}
10758e26e0935138225477fd61283215ceff2068899Greg Clayton
10858e26e0935138225477fd61283215ceff2068899Greg Clayton
109b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid
110b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetStatus (Stream &strm)
111b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
11258e26e0935138225477fd61283215ceff2068899Greg Clayton    Platform::GetStatus (strm);
113b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    const char *sdk_directory = GetDeviceSupportDirectoryForOSVersion();
114b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (sdk_directory)
115abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        strm.Printf ("  SDK Path: \"%s\"\n", sdk_directory);
116b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
117abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        strm.PutCString ("  SDK Path: error: unable to locate SDK\n");
118b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
119b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
120b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
121b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError
122b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::ResolveExecutable (const FileSpec &exe_file,
123b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                      const ArchSpec &exe_arch,
1249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                      lldb::ModuleSP &exe_module_sp,
1259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                      const FileSpecList *module_search_paths_ptr)
126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Error error;
128b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // Nothing special to do here, just use the actual file and architecture
129b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
130b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    FileSpec resolved_exe_file (exe_file);
131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
132b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // If we have "ls" as the exe_file, resolve the executable loation based on
133b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // the current path variables
134b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: resolve bare executables in the Platform SDK
135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//    if (!resolved_exe_file.Exists())
136b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//        resolved_exe_file.ResolveExecutableLocation ();
137b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
138b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // Resolve any executable within a bundle on MacOSX
139b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: verify that this handles shallow bundles, if not then implement one ourselves
140b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Host::ResolveExecutableInBundle (resolved_exe_file);
141b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
142b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (resolved_exe_file.Exists())
143b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
144b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (exe_arch.IsValid())
145b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
146b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            error = ModuleList::GetSharedModule (resolved_exe_file,
147b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 exe_arch,
148b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 NULL,
149b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 NULL,
150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 0,
151b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 exe_module_sp,
1529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                 NULL,
153b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 NULL,
154b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 NULL);
155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
15624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (exe_module_sp->GetObjectFile())
15724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                return error;
15824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            exe_module_sp.reset();
159b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
16024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // No valid architecture was specified or the exact ARM slice wasn't
16124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // found so ask the platform for the architectures that we should be
16224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // using (in the correct order) and see if we can find a match that way
16324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        StreamString arch_names;
16424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ArchSpec platform_arch;
16524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx)
166b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
16724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            error = ModuleList::GetSharedModule (resolved_exe_file,
16824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 platform_arch,
16924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 NULL,
17024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 NULL,
17124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 0,
17224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 exe_module_sp,
1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                 NULL,
17424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 NULL,
17524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 NULL);
17624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            // Did we find an executable using one of the
17724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (error.Success())
178b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
17924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                if (exe_module_sp && exe_module_sp->GetObjectFile())
18024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
18124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                else
18224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    error.SetErrorToGenericError();
183b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
184b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
18524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (idx > 0)
18624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                arch_names.PutCString (", ");
18724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            arch_names.PutCString (platform_arch.GetArchitectureName());
18824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
18924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
19024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (error.Fail() || !exe_module_sp)
19124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
19224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain any '%s' platform architectures: %s",
19324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            exe_file.GetDirectory().AsCString(""),
19424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            exe_file.GetDirectory() ? "/" : "",
19524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            exe_file.GetFilename().AsCString(""),
19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            GetShortPluginName(),
19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            arch_names.GetString().c_str());
198b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
199b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
200b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
201b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
202b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorStringWithFormat ("'%s%s%s' does not exist",
203b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        exe_file.GetDirectory().AsCString(""),
204b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        exe_file.GetDirectory() ? "/" : "",
205b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        exe_file.GetFilename().AsCString(""));
206b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
207b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
208b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return error;
209b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
210b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
211b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
212b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetDeviceSupportDirectory()
213b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
214b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (m_device_support_directory.empty())
215b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
216b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool developer_dir_path_valid = false;
217b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        char developer_dir_path[PATH_MAX];
218b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        FileSpec temp_file_spec;
219b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (Host::GetLLDBPath (ePathTypeLLDBShlibDir, temp_file_spec))
220b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
221b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (temp_file_spec.GetPath (developer_dir_path, sizeof(developer_dir_path)))
222b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
223b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                char *lib_priv_frameworks = strstr (developer_dir_path, "/Library/PrivateFrameworks/LLDB.framework");
224b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (lib_priv_frameworks)
225b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
226b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    *lib_priv_frameworks = '\0';
227b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    developer_dir_path_valid = true;
228b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
229b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
230b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
231b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
232b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!developer_dir_path_valid)
233b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            std::string xcode_dir_path;
235b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            const char *xcode_select_prefix_dir = getenv ("XCODE_SELECT_PREFIX_DIR");
236b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (xcode_select_prefix_dir)
237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                xcode_dir_path.append (xcode_select_prefix_dir);
238b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            xcode_dir_path.append ("/usr/share/xcode-select/xcode_dir_path");
239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            temp_file_spec.SetFile(xcode_dir_path.c_str(), false);
2404b23ab33d221eaadf40f65a5b5fe3ca4475ff761Greg Clayton            size_t bytes_read = temp_file_spec.ReadFileContents(0, developer_dir_path, sizeof(developer_dir_path), NULL);
241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (bytes_read > 0)
242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
243b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                developer_dir_path[bytes_read] = '\0';
244b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                while (developer_dir_path[bytes_read-1] == '\r' ||
245b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                       developer_dir_path[bytes_read-1] == '\n')
246b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    developer_dir_path[--bytes_read] = '\0';
247b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                developer_dir_path_valid = true;
248b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
249b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
250b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
251b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (developer_dir_path_valid)
252b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
253b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            temp_file_spec.SetFile (developer_dir_path, false);
254b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (temp_file_spec.Exists())
255b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
256b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_device_support_directory.assign (developer_dir_path);
257b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                return m_device_support_directory.c_str();
258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
259b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
260b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Assign a single NULL character so we know we tried to find the device
261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // support directory and we don't keep trying to find it over and over.
262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        m_device_support_directory.assign (1, '\0');
263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // We should have put a single NULL character into m_device_support_directory
266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // or it should have a valid path if the code gets here
267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    assert (m_device_support_directory.empty() == false);
268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (m_device_support_directory[0])
269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return m_device_support_directory.c_str();
270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return NULL;
271b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
273b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
274b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion()
275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
276604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton    if (m_sdk_sysroot)
277604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        return m_sdk_sysroot.GetCString();
278604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (m_device_support_directory_for_os_version.empty())
280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const char *device_support_dir = GetDeviceSupportDirectory();
282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool resolve_path = true;
283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (device_support_dir)
284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_device_support_directory_for_os_version.assign (device_support_dir);
286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_device_support_directory_for_os_version.append ("/Platforms/iPhoneOS.platform/DeviceSupport");
287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            uint32_t major = 0;
289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            uint32_t minor = 0;
290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            uint32_t update = 0;
291b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            FileSpec file_spec;
292b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            char resolved_path[PATH_MAX];
293b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (GetOSVersion(major, minor, update))
294b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
295b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (major != UINT32_MAX && minor != UINT32_MAX && update != UINT32_MAX)
296b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
297b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    ::snprintf (resolved_path,
298b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                sizeof(resolved_path),
299b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                "%s/%i.%i.%i",
300b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                m_device_support_directory_for_os_version.c_str(),
301b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                major,
302b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                minor,
303b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                update);
304b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
305b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    file_spec.SetFile(resolved_path, resolve_path);
306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path)))
307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
308b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        m_device_support_directory_for_os_version.assign (resolved_path);
309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return m_device_support_directory_for_os_version.c_str();
310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
311b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
312b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
313b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (major != UINT32_MAX && minor != UINT32_MAX)
314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    ::snprintf (resolved_path,
316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                sizeof(resolved_path),
317b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                "%s/%i.%i",
318b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                m_device_support_directory_for_os_version.c_str(),
319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                major,
3204fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton                                minor);
321b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
322b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    file_spec.SetFile(resolved_path, resolve_path);
323b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path)))
324b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
325b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        m_device_support_directory_for_os_version.assign (resolved_path);
326b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return m_device_support_directory_for_os_version.c_str();
327b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
328b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
329b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
330b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            else
331b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
332b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                // Use the default as we have no OS version selected
333b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_device_support_directory_for_os_version.append ("/Latest");
334b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                file_spec.SetFile(m_device_support_directory_for_os_version.c_str(), resolve_path);
335b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
336b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path)))
337b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    if (m_major_os_version == UINT32_MAX)
339b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
340b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        const char *resolved_latest_dirname = file_spec.GetFilename().GetCString();
341b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        const char *pos = Args::StringToVersion (resolved_latest_dirname,
342b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                                 m_major_os_version,
343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                                 m_minor_os_version,
344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                                 m_update_os_version);
345b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
346b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        if (m_build_update.empty() && pos[0] == ' ' && pos[1] == '(')
347b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        {
348b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            const char *end_paren = strchr (pos + 2, ')');
349b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            m_build_update.assign (pos + 2, end_paren);
350b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        }
351b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
352b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    m_device_support_directory_for_os_version.assign (resolved_path);
353b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    return m_device_support_directory_for_os_version.c_str();
354b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
355b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
356b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
357b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Assign a single NULL character so we know we tried to find the device
358b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // support directory and we don't keep trying to find it over and over.
359b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        m_device_support_directory_for_os_version.assign (1, '\0');
360b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
361b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // We should have put a single NULL character into m_device_support_directory_for_os_version
362b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // or it should have a valid path if the code gets here
363b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    assert (m_device_support_directory_for_os_version.empty() == false);
364b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (m_device_support_directory_for_os_version[0])
365b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return m_device_support_directory_for_os_version.c_str();
366b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return NULL;
367b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
368b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
369b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError
370b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetFile (const FileSpec &platform_file,
371cb8977d726be451df9978a74088435667fa37da2Greg Clayton                            const UUID *uuid_ptr,
372b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                            FileSpec &local_file)
373b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
374b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Error error;
375b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    char platform_file_path[PATH_MAX];
376b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path)))
377b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
378b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        char resolved_path[PATH_MAX];
379b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
380b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const char * os_version_dir = GetDeviceSupportDirectoryForOSVersion();
381b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (os_version_dir)
382b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
383b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            ::snprintf (resolved_path,
384b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        sizeof(resolved_path),
385604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        "%s/%s",
386604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        os_version_dir,
387604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        platform_file_path);
388604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
389604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            local_file.SetFile(resolved_path, true);
390604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            if (local_file.Exists())
391604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                return error;
392604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
393604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            ::snprintf (resolved_path,
394604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        sizeof(resolved_path),
395b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        "%s/Symbols.Internal/%s",
396b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        os_version_dir,
397b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        platform_file_path);
398b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
399b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            local_file.SetFile(resolved_path, true);
400b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (local_file.Exists())
401b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                return error;
402b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            ::snprintf (resolved_path,
403b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        sizeof(resolved_path),
404b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        "%s/Symbols/%s",
405b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        os_version_dir,
406b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        platform_file_path);
407b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
408b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            local_file.SetFile(resolved_path, true);
409b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (local_file.Exists())
410b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                return error;
411b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
412b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
413b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        local_file = platform_file;
414b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (local_file.Exists())
415b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return error;
416b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorStringWithFormat ("unable to locate a platform file for '%s' in platform '%s'",
418b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        platform_file_path,
419b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        GetPluginName());
420b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
421b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
422b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
423b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorString ("invalid platform file argument");
424b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
425b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return error;
426b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
427b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
42824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError
42924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformRemoteiOS::GetSharedModule (const FileSpec &platform_file,
43024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    const ArchSpec &arch,
43124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    const UUID *uuid_ptr,
43224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    const ConstString *object_name_ptr,
43324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    off_t object_offset,
43424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    ModuleSP &module_sp,
4359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                    const FileSpecList *module_search_paths_ptr,
43624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    ModuleSP *old_module_sp_ptr,
43724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    bool *did_create_ptr)
43824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
43924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // For iOS, the SDK files are all cached locally on the host
44024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // system. So first we ask for the file in the cached SDK,
44124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // then we attempt to get a shared module for the right architecture
44224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // with the right UUID.
44324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    Error error;
44424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    FileSpec local_file;
44524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    error = GetFile (platform_file, uuid_ptr, local_file);
44624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (error.Success())
44724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
4489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        error = ResolveExecutable (local_file, arch, module_sp, module_search_paths_ptr);
4498c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton    }
4508c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton    else
4518c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton    {
45224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const bool always_create = false;
4538c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        error = ModuleList::GetSharedModule (platform_file,
45424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             arch,
45524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             uuid_ptr,
45624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             object_name_ptr,
45724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             object_offset,
45824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             module_sp,
4599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                             module_search_paths_ptr,
46024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             old_module_sp_ptr,
46124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             did_create_ptr,
46224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                             always_create);
4638c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton
46424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
46524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (module_sp)
46624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        module_sp->SetPlatformFileSpec(platform_file);
46724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
46824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return error;
46924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
47024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
47124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
472b1888f24fa181489840b9acf193e224d125d0776Greg Claytonuint32_t
473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::FindProcesses (const ProcessInstanceInfoMatch &match_info,
474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                  ProcessInstanceInfoList &process_infos)
475b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
476b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: if connected, send a packet to get the remote process infos by name
477b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    process_infos.Clear();
478b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return 0;
479b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
480b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
481b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
483b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
484b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: if connected, send a packet to get the remote process info
485b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    process_info.Clear();
486b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return false;
487b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
488b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
489b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
490b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
491b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
4929d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda    return ARMGetSupportedArchitectureAtIndex (idx, arch);
493b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
494