PlatformRemoteiOS.cpp revision 4a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7
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
31fea31993c6d78e0fd1629c899f47f16e44736011Greg ClaytonPlatformRemoteiOS::SDKDirectoryInfo::SDKDirectoryInfo (const lldb_private::FileSpec &sdk_dir) :
32fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    directory(sdk_dir),
33fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    build(),
34fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    version_major(0),
35fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    version_minor(0),
36fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    version_update(0),
37fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    user_cached(false)
38b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{
39fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    const char *dirname_cstr = sdk_dir.GetFilename().GetCString();
40b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    const char *pos = Args::StringToVersion (dirname_cstr,
41b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                             version_major,
42b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                             version_minor,
43b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                             version_update);
44b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
45b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    if (pos && pos[0] == ' ' && pos[1] == '(')
46b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    {
47b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        const char *build_start = pos + 2;
48b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        const char *end_paren = strchr (build_start, ')');
49b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        if (end_paren && build_start < end_paren)
50b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            build.SetCStringWithLength(build_start, end_paren - build_start);
51b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    }
52b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton}
53b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
5458e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
5558e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Variables
5658e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
5758e26e0935138225477fd61283215ceff2068899Greg Claytonstatic uint32_t g_initialize_count = 0;
5858e26e0935138225477fd61283215ceff2068899Greg Clayton
5958e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
6058e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Functions
6158e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
62b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid
63b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::Initialize ()
64b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
6558e26e0935138225477fd61283215ceff2068899Greg Clayton    if (g_initialize_count++ == 0)
66b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
67cb8977d726be451df9978a74088435667fa37da2Greg Clayton        PluginManager::RegisterPlugin (PlatformRemoteiOS::GetShortPluginNameStatic(),
68cb8977d726be451df9978a74088435667fa37da2Greg Clayton                                       PlatformRemoteiOS::GetDescriptionStatic(),
69cb8977d726be451df9978a74088435667fa37da2Greg Clayton                                       PlatformRemoteiOS::CreateInstance);
70cb8977d726be451df9978a74088435667fa37da2Greg Clayton    }
71cb8977d726be451df9978a74088435667fa37da2Greg Clayton}
72cb8977d726be451df9978a74088435667fa37da2Greg Clayton
73cb8977d726be451df9978a74088435667fa37da2Greg Claytonvoid
74cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatformRemoteiOS::Terminate ()
75cb8977d726be451df9978a74088435667fa37da2Greg Clayton{
7658e26e0935138225477fd61283215ceff2068899Greg Clayton    if (g_initialize_count > 0)
77cb8977d726be451df9978a74088435667fa37da2Greg Clayton    {
7858e26e0935138225477fd61283215ceff2068899Greg Clayton        if (--g_initialize_count == 0)
7958e26e0935138225477fd61283215ceff2068899Greg Clayton        {
8058e26e0935138225477fd61283215ceff2068899Greg Clayton            PluginManager::UnregisterPlugin (PlatformRemoteiOS::CreateInstance);
8158e26e0935138225477fd61283215ceff2068899Greg Clayton        }
82b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
83b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
84b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
85b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform*
86b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformRemoteiOS::CreateInstance (bool force, const ArchSpec *arch)
87b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
88b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    bool create = force;
89b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (create == false && arch && arch->IsValid())
90b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    {
91b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        switch (arch->GetMachine())
92b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        {
93b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        case llvm::Triple::arm:
94b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        case llvm::Triple::thumb:
95b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            {
96b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton                const llvm::Triple &triple = arch->GetTriple();
97b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                llvm::Triple::VendorType vendor = triple.getVendor();
98b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                switch (vendor)
99b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                {
100b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    case llvm::Triple::Apple:
101b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        create = true;
1024a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton                        break;
103b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
104b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    case llvm::Triple::UnknownArch:
105b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        create = !arch->TripleVendorWasSpecified();
106b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        break;
107b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
108b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    default:
109b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        break;
110b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                }
111b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
112b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                if (create)
113b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                {
114b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    switch (triple.getOS())
115b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    {
116b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        case llvm::Triple::Darwin:  // Deprecated, but still support Darwin for historical reasons
117b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        case llvm::Triple::IOS:     // This is the right triple value for iOS debugging
118b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                            break;
119b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
120b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        case llvm::Triple::UnknownOS:
121b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                            create = !arch->TripleOSWasSpecified();
122b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                            break;
123b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
124b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                        default:
125b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                            create = false;
126b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                            break;
127b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    }
128b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                }
129b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            }
130b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            break;
131b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        default:
132b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            break;
133b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        }
134b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    }
135b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
136b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (create)
137b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        return new PlatformRemoteiOS ();
138b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return NULL;
139b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
140b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
141b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
142b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
143b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetPluginNameStatic ()
144b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
145b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return "PlatformRemoteiOS";
146b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
147b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
148b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
149b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetShortPluginNameStatic()
150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
151b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return "remote-ios";
152b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
153b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
154b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char *
155b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetDescriptionStatic()
156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return "Remote iOS platform plug-in.";
158b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
159b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
16158e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
16258e26e0935138225477fd61283215ceff2068899Greg Clayton/// Default Constructor
16358e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
16458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::PlatformRemoteiOS () :
16558e26e0935138225477fd61283215ceff2068899Greg Clayton    PlatformDarwin (false),    // This is a remote platform
16674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    m_sdk_directory_infos(),
16774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    m_device_support_directory(),
16874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    m_device_support_directory_for_os_version (),
16974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    m_build_update(),
17074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    m_last_module_sdk_idx(UINT32_MAX)
17158e26e0935138225477fd61283215ceff2068899Greg Clayton{
17258e26e0935138225477fd61283215ceff2068899Greg Clayton}
17358e26e0935138225477fd61283215ceff2068899Greg Clayton
17458e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
17558e26e0935138225477fd61283215ceff2068899Greg Clayton/// Destructor.
17658e26e0935138225477fd61283215ceff2068899Greg Clayton///
17758e26e0935138225477fd61283215ceff2068899Greg Clayton/// The destructor is virtual since this class is designed to be
17858e26e0935138225477fd61283215ceff2068899Greg Clayton/// inherited from by the plug-in instance.
17958e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------
18058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::~PlatformRemoteiOS()
18158e26e0935138225477fd61283215ceff2068899Greg Clayton{
18258e26e0935138225477fd61283215ceff2068899Greg Clayton}
18358e26e0935138225477fd61283215ceff2068899Greg Clayton
18458e26e0935138225477fd61283215ceff2068899Greg Clayton
185b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid
186b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetStatus (Stream &strm)
187b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
18858e26e0935138225477fd61283215ceff2068899Greg Clayton    Platform::GetStatus (strm);
189b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    const char *sdk_directory = GetDeviceSupportDirectoryForOSVersion();
190b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (sdk_directory)
191abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        strm.Printf ("  SDK Path: \"%s\"\n", sdk_directory);
192b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
193abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        strm.PutCString ("  SDK Path: error: unable to locate SDK\n");
194fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton
19574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    const uint32_t num_sdk_infos = m_sdk_directory_infos.size();
19674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    for (uint32_t i=0; i<num_sdk_infos; ++i)
19774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    {
19874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i];
19974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        strm.Printf (" SDK Roots: [%2u] \"%s/%s\"\n",
20074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                     i,
20174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                     sdk_dir_info.directory.GetDirectory().GetCString(),
20274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                     sdk_dir_info.directory.GetFilename().GetCString());
20374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    }
204b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
205b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
206b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
207b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError
208b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::ResolveExecutable (const FileSpec &exe_file,
209b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                      const ArchSpec &exe_arch,
2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                      lldb::ModuleSP &exe_module_sp,
2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                      const FileSpecList *module_search_paths_ptr)
212b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
213b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Error error;
214b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // Nothing special to do here, just use the actual file and architecture
215b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
216b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    FileSpec resolved_exe_file (exe_file);
217b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
218b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // If we have "ls" as the exe_file, resolve the executable loation based on
219b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // the current path variables
220b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: resolve bare executables in the Platform SDK
221b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//    if (!resolved_exe_file.Exists())
222b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//        resolved_exe_file.ResolveExecutableLocation ();
223b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
224b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // Resolve any executable within a bundle on MacOSX
225b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: verify that this handles shallow bundles, if not then implement one ourselves
226b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Host::ResolveExecutableInBundle (resolved_exe_file);
227b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
228b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (resolved_exe_file.Exists())
229b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
230b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (exe_arch.IsValid())
231b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
232444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            ModuleSpec module_spec (resolved_exe_file, exe_arch);
233444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            error = ModuleList::GetSharedModule (module_spec,
234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 exe_module_sp,
2359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                 NULL,
236b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 NULL,
237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                                 NULL);
238b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
2391a8e65493b8049bc5877bcedfeb2e9731f7f2d8eHan Ming Ong            if (exe_module_sp && exe_module_sp->GetObjectFile())
24024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                return error;
24124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            exe_module_sp.reset();
242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
24324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // No valid architecture was specified or the exact ARM slice wasn't
24424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // found so ask the platform for the architectures that we should be
24524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // using (in the correct order) and see if we can find a match that way
24624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        StreamString arch_names;
24724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ArchSpec platform_arch;
24824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx)
249b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
250444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            ModuleSpec module_spec (resolved_exe_file, platform_arch);
251444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            error = ModuleList::GetSharedModule (module_spec,
25224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 exe_module_sp,
2539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                 NULL,
25424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 NULL,
25524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                 NULL);
25624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            // Did we find an executable using one of the
25724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (error.Success())
258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
25924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                if (exe_module_sp && exe_module_sp->GetObjectFile())
26024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    break;
26124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                else
26224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    error.SetErrorToGenericError();
263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
26524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (idx > 0)
26624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                arch_names.PutCString (", ");
26724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            arch_names.PutCString (platform_arch.GetArchitectureName());
26824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
26924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
27024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (error.Fail() || !exe_module_sp)
27124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
27224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain any '%s' platform architectures: %s",
27324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            exe_file.GetDirectory().AsCString(""),
27424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            exe_file.GetDirectory() ? "/" : "",
27524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            exe_file.GetFilename().AsCString(""),
27624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            GetShortPluginName(),
27724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                            arch_names.GetString().c_str());
278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorStringWithFormat ("'%s%s%s' does not exist",
283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        exe_file.GetDirectory().AsCString(""),
284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        exe_file.GetDirectory() ? "/" : "",
285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        exe_file.GetFilename().AsCString(""));
286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return error;
289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
291b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonFileSpec::EnumerateDirectoryResult
292b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetContainedFilesIntoVectorOfStringsCallback (void *baton,
293b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                                                 FileSpec::FileType file_type,
294b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                                                 const FileSpec &file_spec)
295b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
296fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    ((PlatformRemoteiOS::SDKDirectoryInfoCollection *)baton)->push_back(PlatformRemoteiOS::SDKDirectoryInfo(file_spec));
297b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    return FileSpec::eEnumerateDirectoryResultNext;
298b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton}
299604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
300b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonbool
301b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::UpdateSDKDirectoryInfosInNeeded()
302b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{
303b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    if (m_sdk_directory_infos.empty())
304b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
305b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        const char *device_support_dir = GetDeviceSupportDirectory();
306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (device_support_dir)
307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
308b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            const bool find_directories = true;
309b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            const bool find_files = false;
310b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            const bool find_other = false;
311b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            FileSpec::EnumerateDirectory (m_device_support_directory.c_str(),
312b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                          find_directories,
313b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                          find_files,
314b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                          find_other,
315b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                          GetContainedFilesIntoVectorOfStringsCallback,
316b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                                          &m_sdk_directory_infos);
317fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton
318fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            const uint32_t num_installed = m_sdk_directory_infos.size();
319fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            FileSpec local_sdk_cache("~/Library/Developer/Xcode/iOS DeviceSupport", true);
320fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            if (local_sdk_cache.Exists())
321fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            {
322fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                char path[PATH_MAX];
323fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                if (local_sdk_cache.GetPath(path, sizeof(path)))
324fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                {
325fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    FileSpec::EnumerateDirectory (path,
326fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                                                  find_directories,
327fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                                                  find_files,
328fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                                                  find_other,
329fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                                                  GetContainedFilesIntoVectorOfStringsCallback,
330fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                                                  &m_sdk_directory_infos);
331fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    const uint32_t num_sdk_infos = m_sdk_directory_infos.size();
332fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    // First try for an exact match of major, minor and update
333fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    for (uint32_t i=num_installed; i<num_sdk_infos; ++i)
334fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    {
335fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        m_sdk_directory_infos[i].user_cached = true;
336fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    }
337fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                }
338fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            }
339b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        }
340b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    }
341b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    return !m_sdk_directory_infos.empty();
342b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton}
343b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
344b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst PlatformRemoteiOS::SDKDirectoryInfo *
345b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetSDKDirectoryForCurrentOSVersion ()
346b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{
347fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    uint32_t i;
348fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton    if (UpdateSDKDirectoryInfosInNeeded())
349b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    {
350fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        const uint32_t num_sdk_infos = m_sdk_directory_infos.size();
351fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton
352fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        // Check to see if the user specified a build string. If they did, then
353fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        // be sure to match it.
354fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        std::vector<bool> check_sdk_info(num_sdk_infos, true);
355fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        ConstString build(m_sdk_build);
356fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        if (build)
357b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        {
358b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            for (i=0; i<num_sdk_infos; ++i)
359fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                check_sdk_info[i] = m_sdk_directory_infos[i].build == build;
360fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        }
361fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton
362fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        // If we are connected we can find the version of the OS the platform
363fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        // us running on and select the right SDK
364fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        uint32_t major, minor, update;
365fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        if (GetOSVersion(major, minor, update))
366fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        {
367fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            if (UpdateSDKDirectoryInfosInNeeded())
368b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
369fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                // First try for an exact match of major, minor and update
370fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                for (i=0; i<num_sdk_infos; ++i)
371b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
372fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    if (check_sdk_info[i])
373fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    {
374fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        if (m_sdk_directory_infos[i].version_major == major &&
375fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                            m_sdk_directory_infos[i].version_minor == minor &&
376fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                            m_sdk_directory_infos[i].version_update == update)
377fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        {
378fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                            return &m_sdk_directory_infos[i];
379fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        }
380fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    }
381b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
382fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                // First try for an exact match of major and minor
383fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                for (i=0; i<num_sdk_infos; ++i)
384b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
385fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    if (check_sdk_info[i])
386fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    {
387fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        if (m_sdk_directory_infos[i].version_major == major &&
388fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                            m_sdk_directory_infos[i].version_minor == minor)
389fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        {
390fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                            return &m_sdk_directory_infos[i];
391fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        }
392fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    }
393b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
394fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                // Lastly try to match of major version only..
395fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                for (i=0; i<num_sdk_infos; ++i)
396b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
397fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    if (check_sdk_info[i])
398fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    {
399fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        if (m_sdk_directory_infos[i].version_major == major)
400fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        {
401fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                            return &m_sdk_directory_infos[i];
402fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                        }
403fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    }
404b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                }
405b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            }
406b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        }
407fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        else if (build)
408fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        {
409fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            // No version, just a build number, search for the first one that matches
410fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            for (i=0; i<num_sdk_infos; ++i)
411fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                if (check_sdk_info[i])
412fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                    return &m_sdk_directory_infos[i];
413fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton        }
414b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    }
415b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    return NULL;
416b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton}
417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
418b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst PlatformRemoteiOS::SDKDirectoryInfo *
419b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetSDKDirectoryForLatestOSVersion ()
420b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{
421b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    const PlatformRemoteiOS::SDKDirectoryInfo *result = NULL;
422b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    if (UpdateSDKDirectoryInfosInNeeded())
423b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    {
424b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        const uint32_t num_sdk_infos = m_sdk_directory_infos.size();
425b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        // First try for an exact match of major, minor and update
426b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        for (uint32_t i=0; i<num_sdk_infos; ++i)
427b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        {
428b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i];
429b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            if (sdk_dir_info.version_major != UINT32_MAX)
430b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            {
431b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                if (result == NULL || sdk_dir_info.version_major > result->version_major)
432b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                {
433b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                    result = &sdk_dir_info;
434b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                }
435b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                else if (sdk_dir_info.version_major == result->version_major)
436b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                {
437b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                    if (sdk_dir_info.version_minor > result->version_minor)
438b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                    {
439b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                        result = &sdk_dir_info;
440b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                    }
441b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                    else if (sdk_dir_info.version_minor == result->version_minor)
442b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                    {
443b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                        if (sdk_dir_info.version_update > result->version_update)
444b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        {
445b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton                            result = &sdk_dir_info;
446b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        }
447b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
448b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
449b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
450b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
451b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    }
452b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    return result;
453b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton}
454b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
455b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
456b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
457b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst char *
458b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetDeviceSupportDirectory()
459b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{
460b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    if (m_device_support_directory.empty())
461b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    {
462b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        const char *device_support_dir = GetDeveloperDirectory();
463b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        if (device_support_dir)
464b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        {
465b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            m_device_support_directory.assign (device_support_dir);
466b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            m_device_support_directory.append ("/Platforms/iPhoneOS.platform/DeviceSupport");
467b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        }
468b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        else
469b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        {
470b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            // Assign a single NULL character so we know we tried to find the device
471b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            // support directory and we don't keep trying to find it over and over.
472b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            m_device_support_directory.assign (1, '\0');
473b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        }
474b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    }
475b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    // We should have put a single NULL character into m_device_support_directory
476b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    // or it should have a valid path if the code gets here
477b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    assert (m_device_support_directory.empty() == false);
478b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    if (m_device_support_directory[0])
479b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        return m_device_support_directory.c_str();
480b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    return NULL;
481b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton}
482b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
483b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
484b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst char *
485b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion()
486b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{
487b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    if (m_sdk_sysroot)
488b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        return m_sdk_sysroot.GetCString();
489b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton
490b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    if (m_device_support_directory_for_os_version.empty())
491b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton    {
492b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        const PlatformRemoteiOS::SDKDirectoryInfo *sdk_dir_info = GetSDKDirectoryForCurrentOSVersion ();
493b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        if (sdk_dir_info == NULL)
494b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            sdk_dir_info = GetSDKDirectoryForLatestOSVersion ();
495b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        if (sdk_dir_info)
496b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        {
497fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            char path[PATH_MAX];
498fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            if (sdk_dir_info->directory.GetPath(path, sizeof(path)))
499fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            {
500fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                m_device_support_directory_for_os_version = path;
501fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton                return m_device_support_directory_for_os_version.c_str();
502fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton            }
503b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        }
504b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        else
505b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        {
506b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            // Assign a single NULL character so we know we tried to find the device
507b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            // support directory and we don't keep trying to find it over and over.
508b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton            m_device_support_directory_for_os_version.assign (1, '\0');
509b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton        }
510b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
511b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // We should have put a single NULL character into m_device_support_directory_for_os_version
512b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // or it should have a valid path if the code gets here
513b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    assert (m_device_support_directory_for_os_version.empty() == false);
514b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (m_device_support_directory_for_os_version[0])
515b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return m_device_support_directory_for_os_version.c_str();
516b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return NULL;
517b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
518b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
51974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Claytonuint32_t
52074821595bdf8b75ceea1949b5a9370a71fd96e61Greg ClaytonPlatformRemoteiOS::FindFileInAllSDKs (const char *platform_file_path,
52174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                      FileSpecList &file_list)
52274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton{
52374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    if (platform_file_path && platform_file_path[0] && UpdateSDKDirectoryInfosInNeeded())
52474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    {
52574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        const uint32_t num_sdk_infos = m_sdk_directory_infos.size();
52674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        lldb_private::FileSpec local_file;
52774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        // First try for an exact match of major, minor and update
52874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx)
52974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        {
53074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            if (GetFileInSDK (platform_file_path,
53174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                              sdk_idx,
53274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                              local_file))
53374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            {
53474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                file_list.Append(local_file);
53574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            }
53674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        }
53774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    }
53874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    return file_list.GetSize();
53974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton}
54074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
54174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Claytonbool
54274821595bdf8b75ceea1949b5a9370a71fd96e61Greg ClaytonPlatformRemoteiOS::GetFileInSDK (const char *platform_file_path,
54374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                 uint32_t sdk_idx,
54474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                 lldb_private::FileSpec &local_file)
54574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton{
54674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    if (sdk_idx < m_sdk_directory_infos.size())
54774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    {
54874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        char sdkroot_path[PATH_MAX];
54974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[sdk_idx];
55074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        if (sdk_dir_info.directory.GetPath(sdkroot_path, sizeof(sdkroot_path)))
55174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        {
55274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            const bool symbols_dirs_only = true;
55374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
55474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            return GetFileInSDKRoot (platform_file_path,
55574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                     sdkroot_path,
55674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                     symbols_dirs_only,
55774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                     local_file);
55874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        }
55974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    }
56074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    return false;
56174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton}
56274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
56374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
56474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Claytonbool
56574821595bdf8b75ceea1949b5a9370a71fd96e61Greg ClaytonPlatformRemoteiOS::GetFileInSDKRoot (const char *platform_file_path,
56674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                     const char *sdkroot_path,
56774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                     bool symbols_dirs_only,
56874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                     lldb_private::FileSpec &local_file)
56974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton{
57074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    if (sdkroot_path && sdkroot_path[0] && platform_file_path && platform_file_path[0])
57174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    {
57274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        char resolved_path[PATH_MAX];
57374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
57474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        if (!symbols_dirs_only)
57574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        {
57674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            ::snprintf (resolved_path,
57774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        sizeof(resolved_path),
57874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        "%s/%s",
57974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        sdkroot_path,
58074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        platform_file_path);
58174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
58274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            local_file.SetFile(resolved_path, true);
58374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            if (local_file.Exists())
58474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                return true;
58574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        }
58674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
58774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        ::snprintf (resolved_path,
58874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    sizeof(resolved_path),
58974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    "%s/Symbols.Internal/%s",
59074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    sdkroot_path,
59174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    platform_file_path);
59274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
59374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        local_file.SetFile(resolved_path, true);
59474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        if (local_file.Exists())
59574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            return true;
59674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        ::snprintf (resolved_path,
59774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    sizeof(resolved_path),
59874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    "%s/Symbols/%s",
59974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    sdkroot_path,
60074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    platform_file_path);
60174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
60274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        local_file.SetFile(resolved_path, true);
60374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        if (local_file.Exists())
60474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            return true;
60574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    }
60674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    return false;
60774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton}
60874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
60974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
610b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError
6110f485ead5447872a2a9f35c5670fc67cc58e1549Johnny ChenPlatformRemoteiOS::GetSymbolFile (const FileSpec &platform_file,
6120f485ead5447872a2a9f35c5670fc67cc58e1549Johnny Chen                                  const UUID *uuid_ptr,
6130f485ead5447872a2a9f35c5670fc67cc58e1549Johnny Chen                                  FileSpec &local_file)
614b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
615b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Error error;
616b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    char platform_file_path[PATH_MAX];
617b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path)))
618b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
619b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        char resolved_path[PATH_MAX];
620b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
621b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const char * os_version_dir = GetDeviceSupportDirectoryForOSVersion();
622b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (os_version_dir)
623b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
624b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            ::snprintf (resolved_path,
625b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        sizeof(resolved_path),
626604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        "%s/%s",
627604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        os_version_dir,
628604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        platform_file_path);
629604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
630604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            local_file.SetFile(resolved_path, true);
631604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            if (local_file.Exists())
632604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                return error;
633604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
634604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            ::snprintf (resolved_path,
635604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton                        sizeof(resolved_path),
636b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        "%s/Symbols.Internal/%s",
637b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        os_version_dir,
638b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        platform_file_path);
639b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
640b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            local_file.SetFile(resolved_path, true);
641b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (local_file.Exists())
642b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                return error;
643b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            ::snprintf (resolved_path,
644b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        sizeof(resolved_path),
645b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        "%s/Symbols/%s",
646b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        os_version_dir,
647b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        platform_file_path);
648b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
649b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            local_file.SetFile(resolved_path, true);
650b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (local_file.Exists())
651b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                return error;
652b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
653b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
654b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        local_file = platform_file;
655b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (local_file.Exists())
656b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return error;
657b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
658b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorStringWithFormat ("unable to locate a platform file for '%s' in platform '%s'",
659b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        platform_file_path,
660b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                        GetPluginName());
661b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
662b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
663b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
664b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorString ("invalid platform file argument");
665b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
666b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return error;
667b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
668b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
66924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError
670444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatformRemoteiOS::GetSharedModule (const ModuleSpec &module_spec,
67124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    ModuleSP &module_sp,
6729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                    const FileSpecList *module_search_paths_ptr,
67324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    ModuleSP *old_module_sp_ptr,
67424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                    bool *did_create_ptr)
67524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
67624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // For iOS, the SDK files are all cached locally on the host
67724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // system. So first we ask for the file in the cached SDK,
67824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // then we attempt to get a shared module for the right architecture
67924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // with the right UUID.
680444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const FileSpec &platform_file = module_spec.GetFileSpec();
681444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
68224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    FileSpec local_file;
68374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    const UUID *module_uuid_ptr = module_spec.GetUUIDPtr();
6840f485ead5447872a2a9f35c5670fc67cc58e1549Johnny Chen    Error error (GetSymbolFile (platform_file, module_uuid_ptr, local_file));
68524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (error.Success())
68624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
68774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        error = ResolveExecutable (local_file, module_spec.GetArchitecture(), module_sp, NULL);
68874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr)))
68974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        {
69074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            //printf ("found in user specified SDK\n");
69174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            error.Clear();
69274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            return error;
69374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        }
6948c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton
69574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        char platform_file_path[PATH_MAX];
69674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path)))
69774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        {
69874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            FileSpec local_file;
69974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            const uint32_t num_sdk_infos = m_sdk_directory_infos.size();
70074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            // Try the last SDK index if it is set as most files from an SDK
70174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            // will tend to be valid in that same SDK.
70274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            if (m_last_module_sdk_idx < num_sdk_infos)
70374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            {
70474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                if (GetFileInSDK (platform_file_path, m_last_module_sdk_idx, local_file))
70574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                {
70674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    //printf ("sdk[%u] last: '%s/%s'\n", m_last_module_sdk_idx, local_file.GetDirectory().GetCString(), local_file.GetFilename().GetCString());
70774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    module_sp.reset();
70874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    error = ResolveExecutable (local_file,
70974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                               module_spec.GetArchitecture(),
71074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                               module_sp,
71174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                               NULL);
712233935b0d93a8a516864cd07c508b731ccef4fcdJim Ingham                    if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr)))
71374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    {
71474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        //printf ("sdk[%u] last found\n", m_last_module_sdk_idx);
71574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        error.Clear();
71674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        return error;
71774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    }
71874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                }
71974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            }
72074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
72174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            // First try for an exact match of major, minor and update
72274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx)
72374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            {
72474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                if (m_last_module_sdk_idx == sdk_idx)
72574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                {
72674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    // Skip the last module SDK index if we already searched
72774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    // it above
72874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    continue;
72974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                }
73074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                if (GetFileInSDK (platform_file_path, sdk_idx, local_file))
73174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                {
73274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    //printf ("sdk[%u]: '%s/%s'\n", sdk_idx, local_file.GetDirectory().GetCString(), local_file.GetFilename().GetCString());
73374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
73474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    error = ResolveExecutable (local_file,
73574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                               module_spec.GetArchitecture(),
73674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                               module_sp,
73774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                               NULL);
738233935b0d93a8a516864cd07c508b731ccef4fcdJim Ingham                    if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr)))
73974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    {
74074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        // Remember the index of the last SDK that we found a file
74174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        // in in case the wrong SDK was selected.
74274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        m_last_module_sdk_idx = sdk_idx;
74374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        //printf ("sdk[%u]: found (setting last to %u)\n", sdk_idx, m_last_module_sdk_idx);
74474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        error.Clear();
74574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                        return error;
74674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                    }
74774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                }
74874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton            }
74974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        }
75074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        // Not the module we are looking for... Nothing to see here...
75174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton        module_sp.reset();
75224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
75374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
75474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    const bool always_create = false;
75574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton    error = ModuleList::GetSharedModule (module_spec,
75674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                         module_sp,
75774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                         module_search_paths_ptr,
75874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                         old_module_sp_ptr,
75974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                         did_create_ptr,
76074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton                                         always_create);
76174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton
76224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (module_sp)
76324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        module_sp->SetPlatformFileSpec(platform_file);
76424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
76524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return error;
76624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
76724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
76824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
769b1888f24fa181489840b9acf193e224d125d0776Greg Claytonuint32_t
770b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::FindProcesses (const ProcessInstanceInfoMatch &match_info,
771b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                  ProcessInstanceInfoList &process_infos)
772b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
773b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: if connected, send a packet to get the remote process infos by name
774b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    process_infos.Clear();
775b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return 0;
776b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
777b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
778b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
779b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
780b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
781b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    // TODO: if connected, send a packet to get the remote process info
782b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    process_info.Clear();
783b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return false;
784b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
785b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
786b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
787b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
788b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
7899d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda    return ARMGetSupportedArchitectureAtIndex (idx, arch);
790b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
791