Platform.cpp revision 146d9522c95c0c8c5409539813b55e08b99196ee
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
92146d9522c95c0c8c5409539813b55e08b99196eeEnrico GranataFileSpec
93146d9522c95c0c8c5409539813b55e08b99196eeEnrico GranataPlatform::LocateExecutableScriptingResource (const ModuleSpec &module_spec)
94146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{
95146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    return FileSpec();
96146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata}
97146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError
99444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatform::GetSharedModule (const ModuleSpec &module_spec,
10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP &module_sp,
1019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                           const FileSpecList *module_search_paths_ptr,
10224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP *old_module_sp_ptr,
10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           bool *did_create_ptr)
10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Don't do any path remapping for the default implementation
10624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // of the platform GetSharedModule function, just call through
10724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // to our static ModuleList function. Platform subclasses that
10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // implement remote debugging, might have a developer kits
10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // installed that have cached versions of the files for the
11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // remote target, or might implement a download and cache
11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // locally implementation.
11224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const bool always_create = false;
113444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    return ModuleList::GetSharedModule (module_spec,
11424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        module_sp,
1159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                        module_search_paths_ptr,
11624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        old_module_sp_ptr,
11724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        did_create_ptr,
11824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        always_create);
11924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
12024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
122b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error)
123e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
124e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformCreateInstance create_callback = NULL;
125e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    lldb::PlatformSP platform_sp;
126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (platform_name && platform_name[0])
127e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
128e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (platform_name);
129e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (create_callback)
130b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            platform_sp.reset(create_callback(true, NULL));
131e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
132b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name);
133e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
134e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorString ("invalid platform name");
136e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
137e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
138e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
139b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
140b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformSP
141b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error)
142b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{
143b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    lldb::PlatformSP platform_sp;
144b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (arch.IsValid())
145b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    {
146b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        uint32_t idx;
147b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        PlatformCreateInstance create_callback;
148b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx)
149b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        {
150b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton            if (create_callback)
151b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton                platform_sp.reset(create_callback(false, &arch));
152b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, platform_arch_ptr))
153b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                return platform_sp;
154b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        }
155b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    }
156b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    else
157b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        error.SetErrorString ("invalid platform name");
158b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    if (platform_arch_ptr)
159b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        platform_arch_ptr->Clear();
160b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    platform_sp.reset();
161b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return platform_sp;
162b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton}
163b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
164e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t
165e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms ()
166e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
167e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Mutex::Locker locker (GetConnectedPlatformListMutex ());
168e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return GetConnectedPlatformList().size();
169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
170e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
171e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
172e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx)
173e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
174e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformSP platform_sp;
175e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
176e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        Mutex::Locker locker (GetConnectedPlatformListMutex ());
177e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (idx < GetConnectedPlatformList().size())
178e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            platform_sp = GetConnectedPlatformList ()[idx];
179e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
180e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
181e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
182e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
183e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
184e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor
185e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
186b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) :
187b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_is_host (is_host),
188b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_os_version_set_while_connected (false),
189b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_system_arch_set_while_connected (false),
190604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton    m_sdk_sysroot (),
191604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton    m_sdk_build (),
192b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_remote_url (),
19358e26e0935138225477fd61283215ceff2068899Greg Clayton    m_name (),
194b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_major_os_version (UINT32_MAX),
195b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_minor_os_version (UINT32_MAX),
19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_update_os_version (UINT32_MAX),
19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_system_arch(),
19824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map_mutex (Mutex::eMutexTypeNormal),
19924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map_mutex (Mutex::eMutexTypeNormal),
20024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map(),
20124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map(),
20224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_uid_name_len (0),
20324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_gid_name_len (0)
204e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
205b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
206b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
207b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::Platform()", this);
208e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
209e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
210e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
211e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor.
212e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
213e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be
214e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance.
215e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
216e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform()
217e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
218b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
219b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
220b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::~Platform()", this);
221e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
222e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
22358e26e0935138225477fd61283215ceff2068899Greg Claytonvoid
22458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm)
22558e26e0935138225477fd61283215ceff2068899Greg Clayton{
22658e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t major = UINT32_MAX;
22758e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t minor = UINT32_MAX;
22858e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t update = UINT32_MAX;
22958e26e0935138225477fd61283215ceff2068899Greg Clayton    std::string s;
23024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    strm.Printf ("  Platform: %s\n", GetShortPluginName());
23158e26e0935138225477fd61283215ceff2068899Greg Clayton
23258e26e0935138225477fd61283215ceff2068899Greg Clayton    ArchSpec arch (GetSystemArchitecture());
23358e26e0935138225477fd61283215ceff2068899Greg Clayton    if (arch.IsValid())
23458e26e0935138225477fd61283215ceff2068899Greg Clayton    {
23558e26e0935138225477fd61283215ceff2068899Greg Clayton        if (!arch.GetTriple().str().empty())
23624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Triple: %s\n", arch.GetTriple().str().c_str());
23758e26e0935138225477fd61283215ceff2068899Greg Clayton    }
23858e26e0935138225477fd61283215ceff2068899Greg Clayton
23958e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSVersion(major, minor, update))
24058e26e0935138225477fd61283215ceff2068899Greg Clayton    {
24124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("OS Version: %u", major);
24258e26e0935138225477fd61283215ceff2068899Greg Clayton        if (minor != UINT32_MAX)
24358e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", minor);
24458e26e0935138225477fd61283215ceff2068899Greg Clayton        if (update != UINT32_MAX)
24558e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", update);
24658e26e0935138225477fd61283215ceff2068899Greg Clayton
24758e26e0935138225477fd61283215ceff2068899Greg Clayton        if (GetOSBuildString (s))
24858e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(" (%s)", s.c_str());
24958e26e0935138225477fd61283215ceff2068899Greg Clayton
25058e26e0935138225477fd61283215ceff2068899Greg Clayton        strm.EOL();
25158e26e0935138225477fd61283215ceff2068899Greg Clayton    }
25258e26e0935138225477fd61283215ceff2068899Greg Clayton
25358e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSKernelDescription (s))
25424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Kernel: %s\n", s.c_str());
25558e26e0935138225477fd61283215ceff2068899Greg Clayton
25658e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
25758e26e0935138225477fd61283215ceff2068899Greg Clayton    {
25824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("  Hostname: %s\n", GetHostname());
25958e26e0935138225477fd61283215ceff2068899Greg Clayton    }
26058e26e0935138225477fd61283215ceff2068899Greg Clayton    else
26158e26e0935138225477fd61283215ceff2068899Greg Clayton    {
26224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const bool is_connected = IsConnected();
26324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (is_connected)
26424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            strm.Printf("  Hostname: %s\n", GetHostname());
26524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no");
26658e26e0935138225477fd61283215ceff2068899Greg Clayton    }
26758e26e0935138225477fd61283215ceff2068899Greg Clayton}
26858e26e0935138225477fd61283215ceff2068899Greg Clayton
269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
270b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
271b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major,
272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &minor,
273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &update)
274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    bool success = m_major_os_version != UINT32_MAX;
276b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
277b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!success)
279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            success = Host::GetOSVersion (m_major_os_version,
282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_minor_os_version,
283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_update_os_version);
284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // OS version if we are connected, and we don't want to do it
291b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
292b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
293b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
294b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
29558e26e0935138225477fd61283215ceff2068899Greg Clayton        bool fetch = false;
296b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (success)
297b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
298b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
299b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
300b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
301b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
302b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_os_version_set_while_connected)
30358e26e0935138225477fd61283215ceff2068899Greg Clayton                fetch = true;
304b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
305b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
30858e26e0935138225477fd61283215ceff2068899Greg Clayton            fetch = is_connected;
309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
31158e26e0935138225477fd61283215ceff2068899Greg Clayton        if (fetch)
312b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
31358e26e0935138225477fd61283215ceff2068899Greg Clayton            success = GetRemoteOSVersion ();
314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
317b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
318b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (success)
319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
320b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        major = m_major_os_version;
321b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        minor = m_minor_os_version;
322b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        update = m_update_os_version;
323b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
324b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return success;
325b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
32658e26e0935138225477fd61283215ceff2068899Greg Clayton
32758e26e0935138225477fd61283215ceff2068899Greg Claytonbool
32858e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s)
32958e26e0935138225477fd61283215ceff2068899Greg Clayton{
33058e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
33158e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSBuildString (s);
33258e26e0935138225477fd61283215ceff2068899Greg Clayton    else
33358e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSBuildString (s);
33458e26e0935138225477fd61283215ceff2068899Greg Clayton}
33558e26e0935138225477fd61283215ceff2068899Greg Clayton
33658e26e0935138225477fd61283215ceff2068899Greg Claytonbool
33758e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s)
33858e26e0935138225477fd61283215ceff2068899Greg Clayton{
33958e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
34058e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSKernelDescription (s);
34158e26e0935138225477fd61283215ceff2068899Greg Clayton    else
34258e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSKernelDescription (s);
34358e26e0935138225477fd61283215ceff2068899Greg Clayton}
34458e26e0935138225477fd61283215ceff2068899Greg Clayton
34558e26e0935138225477fd61283215ceff2068899Greg Claytonconst char *
346b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName ()
347b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
348b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const char *name = GetHostname();
349b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (name == NULL || name[0] == '\0')
350b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        name = GetShortPluginName();
351b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return name;
352b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
353b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
354b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char *
35558e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname ()
35658e26e0935138225477fd61283215ceff2068899Greg Clayton{
3575e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton    if (IsHost())
3585e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        return "localhost";
35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
36024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_name.empty())
36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return NULL;
36224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return m_name.c_str();
36358e26e0935138225477fd61283215ceff2068899Greg Clayton}
36458e26e0935138225477fd61283215ceff2068899Greg Clayton
36524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char *
36624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetUserName (uint32_t uid)
36724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
36824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const char *user_name = GetCachedUserName(uid);
36924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (user_name)
37024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return user_name;
37124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
37224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
37324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        std::string name;
37424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (Host::GetUserName(uid, name))
37524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return SetCachedUserName (uid, name.c_str(), name.size());
37624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
37724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return NULL;
37824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
37958e26e0935138225477fd61283215ceff2068899Greg Clayton
38024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char *
38124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetGroupName (uint32_t gid)
38224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
38324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const char *group_name = GetCachedGroupName(gid);
38424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (group_name)
38524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return group_name;
38624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
38724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
38824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        std::string name;
38924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (Host::GetGroupName(gid, name))
39024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return SetCachedGroupName (gid, name.c_str(), name.size());
39124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
39224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return NULL;
39324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
39458e26e0935138225477fd61283215ceff2068899Greg Clayton
395b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
396b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::SetOSVersion (uint32_t major,
397b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t minor,
398b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t update)
399b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
400b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
401b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
402b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We don't need anyone setting the OS version for the host platform,
403b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we should be able to figure it out by calling Host::GetOSVersion(...).
404b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return false;
405b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
406b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
407b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
408b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform, allow setting the target OS version if
409b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we aren't connected, since if we are connected, we should be able to
410b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // request the remote OS version from the connected platform.
411b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (IsConnected())
412b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return false;
413b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
414b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
415b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We aren't connected and we might want to set the OS version
416b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // ahead of time before we connect so we can peruse files and
417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // use a local SDK or PDK cache of support files to disassemble
418b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // or do other things.
419b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_major_os_version = major;
420b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_minor_os_version = minor;
421b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_update_os_version = update;
422b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return true;
423b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
424b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
425b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return false;
426b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
427b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
428b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
430e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::ResolveExecutable (const FileSpec &exe_file,
431e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                             const ArchSpec &exe_arch,
4329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                             lldb::ModuleSP &exe_module_sp,
4339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                             const FileSpecList *module_search_paths_ptr)
434e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
435e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
436e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    if (exe_file.Exists())
437e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
438444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        ModuleSpec module_spec (exe_file, exe_arch);
439444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (module_spec.GetArchitecture().IsValid())
440e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
441444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            error = ModuleList::GetSharedModule (module_spec,
442e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 exe_module_sp,
4439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                 module_search_paths_ptr,
444e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL,
445e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL);
446e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
447e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
448e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
449e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // No valid architecture was specified, ask the platform for
450e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // the architectures that we should be using (in the correct order)
451e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // and see if we can find a match that way
452444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx)
453e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
454444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                error = ModuleList::GetSharedModule (module_spec,
455e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     exe_module_sp,
4569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                     module_search_paths_ptr,
457e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL,
458e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL);
459e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                // Did we find an executable using one of the
460e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (error.Success() && exe_module_sp)
461e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    break;
462e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
463e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
464e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
465e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
466e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
467e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        error.SetErrorStringWithFormat ("'%s%s%s' does not exist",
468e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetDirectory().AsCString(""),
469e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetDirectory() ? "/" : "",
470e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetFilename().AsCString(""));
471e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
472e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
473e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
474e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
47595b765e8000b44644d021e95bc58eac95028573bGreg ClaytonError
47695b765e8000b44644d021e95bc58eac95028573bGreg ClaytonPlatform::ResolveSymbolFile (Target &target,
47795b765e8000b44644d021e95bc58eac95028573bGreg Clayton                             const ModuleSpec &sym_spec,
47895b765e8000b44644d021e95bc58eac95028573bGreg Clayton                             FileSpec &sym_file)
47995b765e8000b44644d021e95bc58eac95028573bGreg Clayton{
48095b765e8000b44644d021e95bc58eac95028573bGreg Clayton    Error error;
48195b765e8000b44644d021e95bc58eac95028573bGreg Clayton    if (sym_spec.GetSymbolFileSpec().Exists())
48295b765e8000b44644d021e95bc58eac95028573bGreg Clayton        sym_file = sym_spec.GetSymbolFileSpec();
48395b765e8000b44644d021e95bc58eac95028573bGreg Clayton    else
48495b765e8000b44644d021e95bc58eac95028573bGreg Clayton        error.SetErrorString("unable to resolve symbol file");
48595b765e8000b44644d021e95bc58eac95028573bGreg Clayton    return error;
48695b765e8000b44644d021e95bc58eac95028573bGreg Clayton
48795b765e8000b44644d021e95bc58eac95028573bGreg Clayton}
48895b765e8000b44644d021e95bc58eac95028573bGreg Clayton
48995b765e8000b44644d021e95bc58eac95028573bGreg Clayton
49095b765e8000b44644d021e95bc58eac95028573bGreg Clayton
491f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Claytonbool
492f2bf870da5819415d52bc7da98c151cedf1e6dffGreg ClaytonPlatform::ResolveRemotePath (const FileSpec &platform_path,
493f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton                             FileSpec &resolved_platform_path)
494f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton{
495f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton    resolved_platform_path = platform_path;
496f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton    return resolved_platform_path.ResolvePath();
497f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton}
498f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton
499b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
500b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec &
501b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture()
502b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
503b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
504b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
505b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!m_system_arch.IsValid())
506b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
507b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
508b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch = Host::GetArchitecture();
509b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
510b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
511b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
512b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
513b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
514b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
515b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // system architecture if we are connected, and we don't want to do it
516b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
517b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
518b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
519b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
520b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool fetch = false;
521b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (m_system_arch.IsValid())
522b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
523b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
524b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
525b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
526b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
527b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_system_arch_set_while_connected)
528b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                fetch = true;
529b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
530b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
531b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
532b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
533b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            fetch = is_connected;
534b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
535b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
536b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (fetch)
537b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
53858e26e0935138225477fd61283215ceff2068899Greg Clayton            m_system_arch = GetRemoteSystemArchitecture ();
539b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
540b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
541b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
542b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return m_system_arch;
543b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
544b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
545b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
546e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
547cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args)
548e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
549e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
550cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
551cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName());
552cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
553cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetShortPluginName());
554e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
555e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
556e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
557e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
558cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote ()
559e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
560e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
561cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
562cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName());
563cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
564cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetShortPluginName());
565e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
566e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
56724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
56824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool
569b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
57024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
57124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Take care of the host case so that each subclass can just
572b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
57324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
57424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return Host::GetProcessInfo (pid, process_info);
57524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return false;
57624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
57724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t
579b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info,
580b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                         ProcessInstanceInfoList &process_infos)
58124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
582b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
583b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
58424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    uint32_t match_count = 0;
58524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
58624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        match_count = Host::FindProcesses (match_info, process_infos);
58724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return match_count;
58824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
589b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
590b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
591b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError
592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info)
593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Error error;
595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
596b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (IsHost())
598dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    {
599dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY"))
600dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
601dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
602dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell))
603dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
604dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            const bool is_localhost = true;
60597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug);
60697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            const bool first_arg_is_full_shell_command = false;
60797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            if (!launch_info.ConvertArgumentsForLaunchingInShell (error,
60897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  is_localhost,
60997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  will_debug,
61097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  first_arg_is_full_shell_command))
611dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                return error;
612dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
613dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error = Host::LaunchProcess (launch_info);
615dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    }
616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error.SetErrorString ("base lldb_private::Platform class can't launch remote processes");
618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return error;
619b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP
622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info,
623b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Debugger &debugger,
624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Target *target,       // Can be NULL, if NULL create a new target, else use existing one
625b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Listener &listener,
626b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Error &error)
627b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
628b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    ProcessSP process_sp;
629b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Make sure we stop at the entry point
630b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    launch_info.GetFlags ().Set (eLaunchFlagDebug);
631b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    // We always launch the process we are going to debug in a separate process
632b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    // group, since then we can handle ^C interrupts ourselves w/o having to worry
633b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    // about the target getting them as well.
634b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham    launch_info.SetLaunchInSeparateProcessGroup(true);
635b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham
636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    error = LaunchProcess (launch_info);
637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (error.Success())
638b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
639527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID)
640b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
641527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            ProcessAttachInfo attach_info (launch_info);
642527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            process_sp = Attach (attach_info, debugger, target, listener, error);
643ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            if (process_sp)
644ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            {
645ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // Since we attached to the process, it will think it needs to detach
646ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // if the process object just goes away without an explicit call to
647ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // Process::Kill() or Process::Detach(), so let it know to kill the
648ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // process if this happens.
649ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                process_sp->SetShouldDetach (false);
650464c6161464694412b7472129e789248f1cf21b9Greg Clayton
651464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // If we didn't have any file actions, the pseudo terminal might
652464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // have been used where the slave side was given as the file to
653464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // open for stdin/out/err after we have already opened the master
654464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // so we can read/write stdin/out/err.
655464c6161464694412b7472129e789248f1cf21b9Greg Clayton                int pty_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor();
656464c6161464694412b7472129e789248f1cf21b9Greg Clayton                if (pty_fd != lldb_utility::PseudoTerminal::invalid_fd)
657464c6161464694412b7472129e789248f1cf21b9Greg Clayton                {
658464c6161464694412b7472129e789248f1cf21b9Greg Clayton                    process_sp->SetSTDIOFileDescriptor(pty_fd);
659464c6161464694412b7472129e789248f1cf21b9Greg Clayton                }
660ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            }
661b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
662b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
663b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return process_sp;
664b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
665b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
666b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
667b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonlldb::PlatformSP
668b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::GetPlatformForArchitecture (const ArchSpec &arch, ArchSpec *platform_arch_ptr)
669b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{
670b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    lldb::PlatformSP platform_sp;
671b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    Error error;
672b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (arch.IsValid())
673b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        platform_sp = Platform::Create (arch, platform_arch_ptr, error);
674b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return platform_sp;
675b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton}
676b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
677b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
678b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------
679b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// Lets a platform answer if it is compatible with a given
680b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// architecture and the target triple contained within.
681b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------
682b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonbool
683b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::IsCompatibleArchitecture (const ArchSpec &arch, ArchSpec *compatible_arch_ptr)
684b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{
685b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    // If the architecture is invalid, we must answer true...
686b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    if (arch.IsValid())
687b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    {
688b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        ArchSpec platform_arch;
689b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx)
690b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        {
691b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            if (arch == platform_arch)
692b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            {
693b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                if (compatible_arch_ptr)
694b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    *compatible_arch_ptr = platform_arch;
695b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                return true;
696b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            }
697b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        }
698b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    }
699b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    if (compatible_arch_ptr)
700b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        compatible_arch_ptr->Clear();
701b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return false;
702b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
703b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton}
704b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
705bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Claytonlldb::BreakpointSP
706bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatform::SetThreadCreationBreakpoint (lldb_private::Target &target)
707bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{
708bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton    return lldb::BreakpointSP();
709bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton}
710b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
71173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t
71273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatform::GetEnvironment (StringList &environment)
71373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
71473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    environment.Clear();
71573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return false;
71673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
71773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
718