1e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===-- Platform.cpp --------------------------------------------*- C++ -*-===//
2e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
3e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//                     The LLVM Compiler Infrastructure
4e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
5e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// This file is distributed under the University of Illinois Open Source
6e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// License. See LICENSE.TXT for details.
7e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
8e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===----------------------------------------------------------------------===//
9e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
10e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Platform.h"
11e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
12e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C Includes
13e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C++ Includes
14e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Other libraries and framework includes
15e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Project includes
16bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton#include "lldb/Breakpoint/BreakpointIDList.h"
17e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Error.h"
18b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Core/Log.h"
1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
20e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/PluginManager.h"
21e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/FileSpec.h"
22b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/Host.h"
23b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Target/Process.h"
24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Target.h"
25e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
26e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb;
27e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb_private;
28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Use a singleton function for g_local_platform_sp to avoid init
30e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// constructors since LLDB is often part of a shared library
31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic PlatformSP&
32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetDefaultPlatformSP ()
33e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    static PlatformSP g_default_platform_sp;
35e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return g_default_platform_sp;
36e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
37e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
38e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic Mutex &
39e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetConnectedPlatformListMutex ()
40e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
41e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    static Mutex g_remote_connected_platforms_mutex (Mutex::eMutexTypeRecursive);
42e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return g_remote_connected_platforms_mutex;
43e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
44e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic std::vector<PlatformSP> &
45e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetConnectedPlatformList ()
46e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
47e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    static std::vector<PlatformSP> g_remote_connected_platforms;
48e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return g_remote_connected_platforms;
49e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
50e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
515e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton
525e342f50b42b265d8568e1c926328858e74b2c0aGreg Claytonconst char *
535e342f50b42b265d8568e1c926328858e74b2c0aGreg ClaytonPlatform::GetHostPlatformName ()
545e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton{
555e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton    return "host";
565e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton}
575e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton
58e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
59e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Get the native host platform plug-in.
60e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
61e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// There should only be one of these for each host that LLDB runs
62e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// upon that should be statically compiled in and registered using
63e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// preprocessor macros or other similar build mechanisms.
64e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
65e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// This platform will be used as the default platform when launching
66e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// or attaching to processes unless another platform is specified.
67e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
68e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
69e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetDefaultPlatform ()
70e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
71e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return GetDefaultPlatformSP ();
72e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
73e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
74e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid
75e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::SetDefaultPlatform (const lldb::PlatformSP &platform_sp)
76e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
77e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // The native platform should use its static void Platform::Initialize()
78e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // function to register itself as the native platform.
79e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    GetDefaultPlatformSP () = platform_sp;
80e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
81e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
82e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
83cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::GetFile (const FileSpec &platform_file,
84cb8977d726be451df9978a74088435667fa37da2Greg Clayton                   const UUID *uuid_ptr,
85cb8977d726be451df9978a74088435667fa37da2Greg Clayton                   FileSpec &local_file)
86e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
87e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // Default to the local case
88e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    local_file = platform_file;
89e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return Error();
90e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
91e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
92d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg ClaytonFileSpecList
93d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg ClaytonPlatform::LocateExecutableScriptingResources (Target *target, Module &module)
94146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{
95d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton    return FileSpecList();
96146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata}
97146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
98e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason MolendaPlatform*
990e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatform::FindPlugin (Process *process, const ConstString &plugin_name)
100e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda{
101e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    PlatformCreateInstance create_callback = NULL;
102e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    if (plugin_name)
103e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    {
104e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        create_callback  = PluginManager::GetPlatformCreateCallbackForPluginName (plugin_name);
105e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        if (create_callback)
106e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        {
107e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            ArchSpec arch;
108e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            if (process)
109e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            {
110e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                arch = process->GetTarget().GetArchitecture();
111e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            }
112102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton            std::unique_ptr<Platform> instance_ap(create_callback(process, &arch));
113e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            if (instance_ap.get())
114e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                return instance_ap.release();
115e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        }
116e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    }
117e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    else
118e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    {
119e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        for (uint32_t idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex(idx)) != NULL; ++idx)
120e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        {
121884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec            std::unique_ptr<Platform> instance_ap(create_callback(process, nullptr));
122e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda            if (instance_ap.get())
123e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda                return instance_ap.release();
124e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda        }
125e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    }
126e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda    return NULL;
127e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda}
128e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda
12924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError
130444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatform::GetSharedModule (const ModuleSpec &module_spec,
13124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP &module_sp,
1329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                           const FileSpecList *module_search_paths_ptr,
13324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP *old_module_sp_ptr,
13424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           bool *did_create_ptr)
13524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
13624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Don't do any path remapping for the default implementation
13724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // of the platform GetSharedModule function, just call through
13824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // to our static ModuleList function. Platform subclasses that
13924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // implement remote debugging, might have a developer kits
14024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // installed that have cached versions of the files for the
14124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // remote target, or might implement a download and cache
14224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // locally implementation.
14324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const bool always_create = false;
144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    return ModuleList::GetSharedModule (module_spec,
14524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        module_sp,
1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                        module_search_paths_ptr,
14724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        old_module_sp_ptr,
14824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        did_create_ptr,
14924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        always_create);
15024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
15124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
152e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
153b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error)
154e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
155e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformCreateInstance create_callback = NULL;
156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    lldb::PlatformSP platform_sp;
157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (platform_name && platform_name[0])
158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
1590e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        ConstString const_platform_name (platform_name);
1600e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (const_platform_name);
161e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (create_callback)
162b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            platform_sp.reset(create_callback(true, NULL));
163e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
164b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name);
165e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
166e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
167b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorString ("invalid platform name");
168e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
170e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
171b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
172b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformSP
173b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error)
174b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{
175b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    lldb::PlatformSP platform_sp;
176b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (arch.IsValid())
177b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    {
178b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        uint32_t idx;
179b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        PlatformCreateInstance create_callback;
180aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        // First try exact arch matches across all platform plug-ins
181aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        bool exact = true;
182b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx)
183b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        {
184b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            if (create_callback)
185aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            {
186aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                platform_sp.reset(create_callback(false, &arch));
187aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, exact, platform_arch_ptr))
188aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                    return platform_sp;
189aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            }
190aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        }
191aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        // Next try compatible arch matches across all platform plug-ins
192aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        exact = false;
193aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx)
194aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        {
195aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            if (create_callback)
196aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            {
197b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton                platform_sp.reset(create_callback(false, &arch));
198aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, exact, platform_arch_ptr))
199aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                    return platform_sp;
200aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            }
201b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        }
202b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    }
203b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    else
204b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        error.SetErrorString ("invalid platform name");
205b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    if (platform_arch_ptr)
206b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        platform_arch_ptr->Clear();
207b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    platform_sp.reset();
208b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return platform_sp;
209b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton}
210b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
211e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t
212e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms ()
213e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
214e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Mutex::Locker locker (GetConnectedPlatformListMutex ());
215e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return GetConnectedPlatformList().size();
216e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
217e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
218e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
219e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx)
220e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
221e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformSP platform_sp;
222e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
223e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        Mutex::Locker locker (GetConnectedPlatformListMutex ());
224e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (idx < GetConnectedPlatformList().size())
225e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            platform_sp = GetConnectedPlatformList ()[idx];
226e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
227e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
228e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
229e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
230e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
231e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor
232e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
233b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) :
234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_is_host (is_host),
235b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_os_version_set_while_connected (false),
236b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_system_arch_set_while_connected (false),
237604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton    m_sdk_sysroot (),
238604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton    m_sdk_build (),
239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_remote_url (),
24058e26e0935138225477fd61283215ceff2068899Greg Clayton    m_name (),
241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_major_os_version (UINT32_MAX),
242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_minor_os_version (UINT32_MAX),
24324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_update_os_version (UINT32_MAX),
24424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_system_arch(),
24524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map_mutex (Mutex::eMutexTypeNormal),
24624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map_mutex (Mutex::eMutexTypeNormal),
24724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map(),
24824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map(),
24924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_uid_name_len (0),
25024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_gid_name_len (0)
251e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
252952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
253b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
254b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::Platform()", this);
255e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
256e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
257e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
258e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor.
259e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
260e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be
261e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance.
262e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
263e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform()
264e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
265952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
266b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
267b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::~Platform()", this);
268e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
269e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
27058e26e0935138225477fd61283215ceff2068899Greg Claytonvoid
27158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm)
27258e26e0935138225477fd61283215ceff2068899Greg Clayton{
27358e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t major = UINT32_MAX;
27458e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t minor = UINT32_MAX;
27558e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t update = UINT32_MAX;
27658e26e0935138225477fd61283215ceff2068899Greg Clayton    std::string s;
2770e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    strm.Printf ("  Platform: %s\n", GetPluginName().GetCString());
27858e26e0935138225477fd61283215ceff2068899Greg Clayton
27958e26e0935138225477fd61283215ceff2068899Greg Clayton    ArchSpec arch (GetSystemArchitecture());
28058e26e0935138225477fd61283215ceff2068899Greg Clayton    if (arch.IsValid())
28158e26e0935138225477fd61283215ceff2068899Greg Clayton    {
28258e26e0935138225477fd61283215ceff2068899Greg Clayton        if (!arch.GetTriple().str().empty())
28324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Triple: %s\n", arch.GetTriple().str().c_str());
28458e26e0935138225477fd61283215ceff2068899Greg Clayton    }
28558e26e0935138225477fd61283215ceff2068899Greg Clayton
28658e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSVersion(major, minor, update))
28758e26e0935138225477fd61283215ceff2068899Greg Clayton    {
28824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("OS Version: %u", major);
28958e26e0935138225477fd61283215ceff2068899Greg Clayton        if (minor != UINT32_MAX)
29058e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", minor);
29158e26e0935138225477fd61283215ceff2068899Greg Clayton        if (update != UINT32_MAX)
29258e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", update);
29358e26e0935138225477fd61283215ceff2068899Greg Clayton
29458e26e0935138225477fd61283215ceff2068899Greg Clayton        if (GetOSBuildString (s))
29558e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(" (%s)", s.c_str());
29658e26e0935138225477fd61283215ceff2068899Greg Clayton
29758e26e0935138225477fd61283215ceff2068899Greg Clayton        strm.EOL();
29858e26e0935138225477fd61283215ceff2068899Greg Clayton    }
29958e26e0935138225477fd61283215ceff2068899Greg Clayton
30058e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSKernelDescription (s))
30124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Kernel: %s\n", s.c_str());
30258e26e0935138225477fd61283215ceff2068899Greg Clayton
30358e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
30458e26e0935138225477fd61283215ceff2068899Greg Clayton    {
30524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("  Hostname: %s\n", GetHostname());
30658e26e0935138225477fd61283215ceff2068899Greg Clayton    }
30758e26e0935138225477fd61283215ceff2068899Greg Clayton    else
30858e26e0935138225477fd61283215ceff2068899Greg Clayton    {
30924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const bool is_connected = IsConnected();
31024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (is_connected)
31124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            strm.Printf("  Hostname: %s\n", GetHostname());
31224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no");
31358e26e0935138225477fd61283215ceff2068899Greg Clayton    }
31458e26e0935138225477fd61283215ceff2068899Greg Clayton}
31558e26e0935138225477fd61283215ceff2068899Greg Clayton
316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
317b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
318b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major,
319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &minor,
320b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &update)
321b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
322b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    bool success = m_major_os_version != UINT32_MAX;
323b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
324b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
325b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!success)
326b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
327b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
328b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            success = Host::GetOSVersion (m_major_os_version,
329b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_minor_os_version,
330b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_update_os_version);
331b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
332b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
333b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
334b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
335b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
336b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
337b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // OS version if we are connected, and we don't want to do it
338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
339b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
340b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
341b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
34258e26e0935138225477fd61283215ceff2068899Greg Clayton        bool fetch = false;
343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (success)
344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
345b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
346b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
347b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
348b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
349b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_os_version_set_while_connected)
35058e26e0935138225477fd61283215ceff2068899Greg Clayton                fetch = true;
351b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
352b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
353b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
354b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
35558e26e0935138225477fd61283215ceff2068899Greg Clayton            fetch = is_connected;
356b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
357b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
35858e26e0935138225477fd61283215ceff2068899Greg Clayton        if (fetch)
359b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
36058e26e0935138225477fd61283215ceff2068899Greg Clayton            success = GetRemoteOSVersion ();
361b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
362b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
363b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
364b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
365b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (success)
366b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
367b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        major = m_major_os_version;
368b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        minor = m_minor_os_version;
369b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        update = m_update_os_version;
370b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
371b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return success;
372b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
37358e26e0935138225477fd61283215ceff2068899Greg Clayton
37458e26e0935138225477fd61283215ceff2068899Greg Claytonbool
37558e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s)
37658e26e0935138225477fd61283215ceff2068899Greg Clayton{
37758e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
37858e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSBuildString (s);
37958e26e0935138225477fd61283215ceff2068899Greg Clayton    else
38058e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSBuildString (s);
38158e26e0935138225477fd61283215ceff2068899Greg Clayton}
38258e26e0935138225477fd61283215ceff2068899Greg Clayton
38358e26e0935138225477fd61283215ceff2068899Greg Claytonbool
38458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s)
38558e26e0935138225477fd61283215ceff2068899Greg Clayton{
38658e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
38758e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSKernelDescription (s);
38858e26e0935138225477fd61283215ceff2068899Greg Clayton    else
38958e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSKernelDescription (s);
39058e26e0935138225477fd61283215ceff2068899Greg Clayton}
39158e26e0935138225477fd61283215ceff2068899Greg Clayton
3920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString
393b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName ()
394b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
395b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const char *name = GetHostname();
396b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (name == NULL || name[0] == '\0')
3970e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return GetPluginName();
3980e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return ConstString (name);
399b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
400b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
401b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char *
40258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname ()
40358e26e0935138225477fd61283215ceff2068899Greg Clayton{
4045e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton    if (IsHost())
4055e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        return "localhost";
40624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
40724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_name.empty())
40824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return NULL;
40924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return m_name.c_str();
41058e26e0935138225477fd61283215ceff2068899Greg Clayton}
41158e26e0935138225477fd61283215ceff2068899Greg Clayton
41224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char *
41324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetUserName (uint32_t uid)
41424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
41524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const char *user_name = GetCachedUserName(uid);
41624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (user_name)
41724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return user_name;
41824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
41924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
42024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        std::string name;
42124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (Host::GetUserName(uid, name))
42224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return SetCachedUserName (uid, name.c_str(), name.size());
42324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
42424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return NULL;
42524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
42658e26e0935138225477fd61283215ceff2068899Greg Clayton
42724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char *
42824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetGroupName (uint32_t gid)
42924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
43024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const char *group_name = GetCachedGroupName(gid);
43124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (group_name)
43224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return group_name;
43324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
43424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
43524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        std::string name;
43624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (Host::GetGroupName(gid, name))
43724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return SetCachedGroupName (gid, name.c_str(), name.size());
43824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
43924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return NULL;
44024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
44158e26e0935138225477fd61283215ceff2068899Greg Clayton
442b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
443b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::SetOSVersion (uint32_t major,
444b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t minor,
445b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t update)
446b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
447b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
448b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
449b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We don't need anyone setting the OS version for the host platform,
450b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we should be able to figure it out by calling Host::GetOSVersion(...).
451b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return false;
452b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
453b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
454b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
455b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform, allow setting the target OS version if
456b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we aren't connected, since if we are connected, we should be able to
457b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // request the remote OS version from the connected platform.
458b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (IsConnected())
459b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return false;
460b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
461b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
462b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We aren't connected and we might want to set the OS version
463b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // ahead of time before we connect so we can peruse files and
464b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // use a local SDK or PDK cache of support files to disassemble
465b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // or do other things.
466b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_major_os_version = major;
467b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_minor_os_version = minor;
468b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_update_os_version = update;
469b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return true;
470b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
471b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
472b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return false;
473b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
474b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
475b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
476e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
477e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::ResolveExecutable (const FileSpec &exe_file,
478e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                             const ArchSpec &exe_arch,
4799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                             lldb::ModuleSP &exe_module_sp,
4809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                             const FileSpecList *module_search_paths_ptr)
481e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
482e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
483e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    if (exe_file.Exists())
484e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
485444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        ModuleSpec module_spec (exe_file, exe_arch);
486444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (module_spec.GetArchitecture().IsValid())
487e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
488444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            error = ModuleList::GetSharedModule (module_spec,
489e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 exe_module_sp,
4909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                 module_search_paths_ptr,
491e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL,
492e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL);
493e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
494e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
495e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
496e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // No valid architecture was specified, ask the platform for
497e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // the architectures that we should be using (in the correct order)
498e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // and see if we can find a match that way
499444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx)
500e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
501444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                error = ModuleList::GetSharedModule (module_spec,
502e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     exe_module_sp,
5039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                     module_search_paths_ptr,
504e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL,
505e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL);
506e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                // Did we find an executable using one of the
507e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (error.Success() && exe_module_sp)
508e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    break;
509e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
510e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
511e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
512e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
513e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
51497a19b21dacd9063bb5475812df7781777262198Greg Clayton        error.SetErrorStringWithFormat ("'%s' does not exist",
51597a19b21dacd9063bb5475812df7781777262198Greg Clayton                                        exe_file.GetPath().c_str());
516e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
517e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
518e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
519e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
52095b765e8000b44644d021e95bc58eac95028573bGreg ClaytonError
52195b765e8000b44644d021e95bc58eac95028573bGreg ClaytonPlatform::ResolveSymbolFile (Target &target,
52295b765e8000b44644d021e95bc58eac95028573bGreg Clayton                             const ModuleSpec &sym_spec,
52395b765e8000b44644d021e95bc58eac95028573bGreg Clayton                             FileSpec &sym_file)
52495b765e8000b44644d021e95bc58eac95028573bGreg Clayton{
52595b765e8000b44644d021e95bc58eac95028573bGreg Clayton    Error error;
52695b765e8000b44644d021e95bc58eac95028573bGreg Clayton    if (sym_spec.GetSymbolFileSpec().Exists())
52795b765e8000b44644d021e95bc58eac95028573bGreg Clayton        sym_file = sym_spec.GetSymbolFileSpec();
52895b765e8000b44644d021e95bc58eac95028573bGreg Clayton    else
52995b765e8000b44644d021e95bc58eac95028573bGreg Clayton        error.SetErrorString("unable to resolve symbol file");
53095b765e8000b44644d021e95bc58eac95028573bGreg Clayton    return error;
53195b765e8000b44644d021e95bc58eac95028573bGreg Clayton
53295b765e8000b44644d021e95bc58eac95028573bGreg Clayton}
53395b765e8000b44644d021e95bc58eac95028573bGreg Clayton
53495b765e8000b44644d021e95bc58eac95028573bGreg Clayton
53595b765e8000b44644d021e95bc58eac95028573bGreg Clayton
536f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Claytonbool
537f2bf870da5819415d52bc7da98c151cedf1e6dffGreg ClaytonPlatform::ResolveRemotePath (const FileSpec &platform_path,
538f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton                             FileSpec &resolved_platform_path)
539f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton{
540f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton    resolved_platform_path = platform_path;
541f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton    return resolved_platform_path.ResolvePath();
542f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton}
543f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton
544b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
545b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec &
546b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture()
547b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
548b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
549b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
550b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!m_system_arch.IsValid())
551b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
552b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
553b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch = Host::GetArchitecture();
554b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
555b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
556b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
557b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
558b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
559b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
560b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // system architecture if we are connected, and we don't want to do it
561b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
562b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
563b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
564b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
565b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool fetch = false;
566b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (m_system_arch.IsValid())
567b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
568b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
569b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
570b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
571b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
572b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_system_arch_set_while_connected)
573b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                fetch = true;
574b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
575b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
576b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
577b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
578b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            fetch = is_connected;
579b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
580b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
581b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (fetch)
582b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
58358e26e0935138225477fd61283215ceff2068899Greg Clayton            m_system_arch = GetRemoteSystemArchitecture ();
584b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
585b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
586b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
587b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return m_system_arch;
588b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
589b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
590b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
591e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
592cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args)
593e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
594e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
595cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
5960e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetPluginName().GetCString());
597cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
5980e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetPluginName().GetCString());
599e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
600e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
601e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
602e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
603cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote ()
604e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
605e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
606cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
6070e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetPluginName().GetCString());
608cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
6090e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetPluginName().GetCString());
610e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
611e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
61224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
61324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool
614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
61524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
61624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Take care of the host case so that each subclass can just
617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
61824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
61924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return Host::GetProcessInfo (pid, process_info);
62024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return false;
62124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
62224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
62324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t
624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info,
625b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                         ProcessInstanceInfoList &process_infos)
62624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
627b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
628b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
62924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    uint32_t match_count = 0;
63024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
63124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        match_count = Host::FindProcesses (match_info, process_infos);
63224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return match_count;
63324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
635b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError
637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info)
638b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Error error;
640b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
641b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
642b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (IsHost())
643dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    {
644dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY"))
645dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
646dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
647dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell))
648dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
649dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            const bool is_localhost = true;
65097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug);
65197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            const bool first_arg_is_full_shell_command = false;
65297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            if (!launch_info.ConvertArgumentsForLaunchingInShell (error,
65397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  is_localhost,
65497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  will_debug,
65597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  first_arg_is_full_shell_command))
656dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                return error;
657dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
658dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
659b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error = Host::LaunchProcess (launch_info);
660dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    }
661b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
662b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error.SetErrorString ("base lldb_private::Platform class can't launch remote processes");
663b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return error;
664b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
665b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
666b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP
667b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info,
668b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Debugger &debugger,
669b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Target *target,       // Can be NULL, if NULL create a new target, else use existing one
670b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Listener &listener,
671b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Error &error)
672b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
673b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    ProcessSP process_sp;
674b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Make sure we stop at the entry point
675b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    launch_info.GetFlags ().Set (eLaunchFlagDebug);
676b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    // We always launch the process we are going to debug in a separate process
677b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    // group, since then we can handle ^C interrupts ourselves w/o having to worry
678b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    // about the target getting them as well.
679b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    launch_info.SetLaunchInSeparateProcessGroup(true);
680b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham
681b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    error = LaunchProcess (launch_info);
682b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (error.Success())
683b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
684527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID)
685b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
686527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            ProcessAttachInfo attach_info (launch_info);
687527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            process_sp = Attach (attach_info, debugger, target, listener, error);
688ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            if (process_sp)
689ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            {
690ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // Since we attached to the process, it will think it needs to detach
691ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // if the process object just goes away without an explicit call to
692ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // Process::Kill() or Process::Detach(), so let it know to kill the
693ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // process if this happens.
694ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                process_sp->SetShouldDetach (false);
695464c6161464694412b7472129e789248f1cf21b9Greg Clayton
696464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // If we didn't have any file actions, the pseudo terminal might
697464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // have been used where the slave side was given as the file to
698464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // open for stdin/out/err after we have already opened the master
699464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // so we can read/write stdin/out/err.
700464c6161464694412b7472129e789248f1cf21b9Greg Clayton                int pty_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor();
701464c6161464694412b7472129e789248f1cf21b9Greg Clayton                if (pty_fd != lldb_utility::PseudoTerminal::invalid_fd)
702464c6161464694412b7472129e789248f1cf21b9Greg Clayton                {
703464c6161464694412b7472129e789248f1cf21b9Greg Clayton                    process_sp->SetSTDIOFileDescriptor(pty_fd);
704464c6161464694412b7472129e789248f1cf21b9Greg Clayton                }
705ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            }
706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
707b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
708b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return process_sp;
709b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
710b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
711b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
712b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonlldb::PlatformSP
713b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::GetPlatformForArchitecture (const ArchSpec &arch, ArchSpec *platform_arch_ptr)
714b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{
715b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    lldb::PlatformSP platform_sp;
716b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    Error error;
717b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (arch.IsValid())
718b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        platform_sp = Platform::Create (arch, platform_arch_ptr, error);
719b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return platform_sp;
720b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton}
721b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
722b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
723b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------
724b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// Lets a platform answer if it is compatible with a given
725b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// architecture and the target triple contained within.
726b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------
727b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonbool
728aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg ClaytonPlatform::IsCompatibleArchitecture (const ArchSpec &arch, bool exact_arch_match, ArchSpec *compatible_arch_ptr)
729b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{
730b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    // If the architecture is invalid, we must answer true...
731b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    if (arch.IsValid())
732b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    {
733b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        ArchSpec platform_arch;
734aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        // Try for an exact architecture match first.
735aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        if (exact_arch_match)
736b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        {
737aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx)
738b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            {
739aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                if (arch.IsExactMatch(platform_arch))
740aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                {
741aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                    if (compatible_arch_ptr)
742aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                        *compatible_arch_ptr = platform_arch;
743aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                    return true;
744aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                }
745aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            }
746aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        }
747aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        else
748aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        {
749aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx)
750aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton            {
751aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                if (arch.IsCompatibleMatch(platform_arch))
752aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                {
753aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                    if (compatible_arch_ptr)
754aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                        *compatible_arch_ptr = platform_arch;
755aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                    return true;
756aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                }
757b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            }
758b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        }
759b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    }
760b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    if (compatible_arch_ptr)
761b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        compatible_arch_ptr->Clear();
762b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return false;
763b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
764b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton}
765b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
766aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton
767bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Claytonlldb::BreakpointSP
768bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatform::SetThreadCreationBreakpoint (lldb_private::Target &target)
769bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{
770bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton    return lldb::BreakpointSP();
771bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton}
772b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
77373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t
77473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatform::GetEnvironment (StringList &environment)
77573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
77673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    environment.Clear();
77773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return false;
77873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
77973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
780