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