1e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===-- PlatformLinux.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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "PlatformLinux.h"
13e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
14e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C Includes
153600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include <stdio.h>
163600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include <sys/utsname.h>
173600d497832c398ffafcba1935389125e15683a3Stephen Wilson
18e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C++ Includes
19e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Other libraries and framework includes
20e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Project includes
21e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Error.h"
2248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton#include "lldb/Core/Debugger.h"
23e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Module.h"
24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/ModuleList.h"
2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
263600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include "lldb/Core/PluginManager.h"
27e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/StreamString.h"
28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/FileSpec.h"
29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/Host.h"
303600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include "lldb/Target/Target.h"
31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Process.h"
32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
33e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb;
34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb_private;
353600d497832c398ffafcba1935389125e15683a3Stephen Wilson
3648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Claytonstatic uint32_t g_initialize_count = 0;
3748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
383600d497832c398ffafcba1935389125e15683a3Stephen WilsonPlatform *
39b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformLinux::CreateInstance (bool force, const ArchSpec *arch)
403600d497832c398ffafcba1935389125e15683a3Stephen Wilson{
41b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    bool create = force;
42b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (create == false && arch && arch->IsValid())
43b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    {
44b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        const llvm::Triple &triple = arch->GetTriple();
45b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        switch (triple.getVendor())
46b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        {
47b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            case llvm::Triple::PC:
48b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                create = true;
49b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                break;
50b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
516c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__linux__)
526c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton            // Only accept "unknown" for the vendor if the host is linux and
536c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton            // it "unknown" wasn't specified (it was just returned becasue it
546c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton            // was NOT specified_
55b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            case llvm::Triple::UnknownArch:
56b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                create = !arch->TripleVendorWasSpecified();
57b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                break;
586c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif
59b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            default:
60b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                break;
61b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        }
62b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
63b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        if (create)
64b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        {
65b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            switch (triple.getOS())
66b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            {
67b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::Linux:
68b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
69b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
706c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__linux__)
716c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton                // Only accept "unknown" for the OS if the host is linux and
726c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton                // it "unknown" wasn't specified (it was just returned becasue it
736c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton                // was NOT specified)
74b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::UnknownOS:
75b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = !arch->TripleOSWasSpecified();
76b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
776c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif
78b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                default:
79b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = false;
80b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
81b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            }
82b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        }
83b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    }
84b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (create)
85b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        return new PlatformLinux(true);
86b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return NULL;
873600d497832c398ffafcba1935389125e15683a3Stephen Wilson}
883600d497832c398ffafcba1935389125e15683a3Stephen Wilson
893600d497832c398ffafcba1935389125e15683a3Stephen Wilson
900e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
910e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatformLinux::GetPluginNameStatic (bool is_host)
9248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton{
9348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (is_host)
940e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    {
950e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        static ConstString g_host_name(Platform::GetHostPlatformName ());
960e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return g_host_name;
970e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    }
9848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    else
990e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    {
1000e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        static ConstString g_remote_name("remote-linux");
1010e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return g_remote_name;
1020e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    }
10348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton}
10448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
10548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Claytonconst char *
10648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonPlatformLinux::GetPluginDescriptionStatic (bool is_host)
1073600d497832c398ffafcba1935389125e15683a3Stephen Wilson{
10848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (is_host)
10948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        return "Local Linux user platform plug-in.";
11048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    else
11148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        return "Remote Linux user platform plug-in.";
1123600d497832c398ffafcba1935389125e15683a3Stephen Wilson}
1133600d497832c398ffafcba1935389125e15683a3Stephen Wilson
1140e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
1150e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatformLinux::GetPluginName()
1160e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton{
1170e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return GetPluginNameStatic(IsHost());
1180e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton}
1190e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid
121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::Initialize ()
122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
12348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (g_initialize_count++ == 0)
1243600d497832c398ffafcba1935389125e15683a3Stephen Wilson    {
12548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton#if defined(__linux__)
12648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        PlatformSP default_platform_sp (new PlatformLinux(true));
12748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        default_platform_sp->SetSystemArchitecture (Host::GetArchitecture());
1283600d497832c398ffafcba1935389125e15683a3Stephen Wilson        Platform::SetDefaultPlatform (default_platform_sp);
12948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton#endif
1300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        PluginManager::RegisterPlugin(PlatformLinux::GetPluginNameStatic(false),
13148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                                      PlatformLinux::GetPluginDescriptionStatic(false),
13248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                                      PlatformLinux::CreateInstance);
1333600d497832c398ffafcba1935389125e15683a3Stephen Wilson    }
134e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
135e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
136e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid
137e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::Terminate ()
138e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
13948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (g_initialize_count > 0)
14048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
14148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (--g_initialize_count == 0)
14248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
14348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            PluginManager::UnregisterPlugin (PlatformLinux::CreateInstance);
14448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
14548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
146e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
147e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
148e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
149e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::ResolveExecutable (const FileSpec &exe_file,
150e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                  const ArchSpec &exe_arch,
151a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton                                  lldb::ModuleSP &exe_module_sp,
152a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton                                  const FileSpecList *module_search_paths_ptr)
153e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
154e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
155e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // Nothing special to do here, just use the actual file and architecture
156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
15748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    char exe_path[PATH_MAX];
158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    FileSpec resolved_exe_file (exe_file);
159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
16048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (IsHost())
16148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
16248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        // If we have "ls" as the exe_file, resolve the executable location based on
16348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        // the current path variables
16448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (!resolved_exe_file.Exists())
16548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
16648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            exe_file.GetPath(exe_path, sizeof(exe_path));
16748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            resolved_exe_file.SetFile(exe_path, true);
16848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
17048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (!resolved_exe_file.Exists())
17148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            resolved_exe_file.ResolveExecutableLocation ();
172e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
17348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (resolved_exe_file.Exists())
17448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            error.Clear();
17548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        else
17648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
17748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            exe_file.GetPath(exe_path, sizeof(exe_path));
17848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            error.SetErrorStringWithFormat("unable to find executable for '%s'", exe_path);
17948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
18048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
18148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    else
18248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
18348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (m_remote_platform_sp)
18448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
18548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            error = m_remote_platform_sp->ResolveExecutable (exe_file,
18648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                                                             exe_arch,
187e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton                                                             exe_module_sp,
188e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton                                                             NULL);
18948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
19048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        else
19148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
19248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            // We may connect to a process and use the provided executable (Don't use local $PATH).
19348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
19448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            if (resolved_exe_file.Exists())
19548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                error.Clear();
19648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            else
19748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                error.SetErrorStringWithFormat("the platform is not currently connected, and '%s' doesn't exist in the system root.", exe_path);
19848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
19948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
20048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
20148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (error.Success())
202e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
203a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton        ModuleSpec module_spec (resolved_exe_file, exe_arch);
204e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (exe_arch.IsValid())
205e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
206a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton            error = ModuleList::GetSharedModule (module_spec,
207e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 exe_module_sp,
208e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL,
209e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton                                                 NULL,
210e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL);
211535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain            if (error.Fail())
212535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain            {
213535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                // If we failed, it may be because the vendor and os aren't known. If that is the
214535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                // case, try setting them to the host architecture and give it another try.
215535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                llvm::Triple &module_triple = module_spec.GetArchitecture().GetTriple();
216535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                bool is_vendor_specified = (module_triple.getVendor() != llvm::Triple::UnknownVendor);
217535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                bool is_os_specified = (module_triple.getOS() != llvm::Triple::UnknownOS);
218535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                if (!is_vendor_specified || !is_os_specified)
219535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                {
220535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                    const llvm::Triple &host_triple = Host::GetArchitecture (Host::eSystemDefaultArchitecture).GetTriple();
221535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain
222535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                    if (!is_vendor_specified)
223535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                        module_triple.setVendorName (host_triple.getVendorName());
224535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                    if (!is_os_specified)
225535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                        module_triple.setOSName (host_triple.getOSName());
226535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain
227535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                    error = ModuleList::GetSharedModule (module_spec,
228535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                                                         exe_module_sp,
229535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                                                         NULL,
230535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                                                         NULL,
231535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                                                         NULL);
232535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain                }
233535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain            }
234e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
235df7f13b67edcb3111b66315b0fb73342a89626a4Sean Callanan            // TODO find out why exe_module_sp might be NULL
236df7f13b67edcb3111b66315b0fb73342a89626a4Sean Callanan            if (!exe_module_sp || exe_module_sp->GetObjectFile() == NULL)
237e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
238e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                exe_module_sp.reset();
23997a19b21dacd9063bb5475812df7781777262198Greg Clayton                error.SetErrorStringWithFormat ("'%s' doesn't contain the architecture %s",
24097a19b21dacd9063bb5475812df7781777262198Greg Clayton                                                exe_file.GetPath().c_str(),
241e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                exe_arch.GetArchitectureName());
242e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
243e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
244e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
245e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
246e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // No valid architecture was specified, ask the platform for
247e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // the architectures that we should be using (in the correct order)
248e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // and see if we can find a match that way
249e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            StreamString arch_names;
250a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton            for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx)
251e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
252a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton                error = ModuleList::GetSharedModule (module_spec,
253e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     exe_module_sp,
254e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL,
255e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton                                                     NULL,
256e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL);
257e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                // Did we find an executable using one of the
258e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (error.Success())
259e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                {
260e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    if (exe_module_sp && exe_module_sp->GetObjectFile())
261e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                        break;
262e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    else
263e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                        error.SetErrorToGenericError();
264e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                }
265e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
266e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (idx > 0)
267e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    arch_names.PutCString (", ");
268a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton                arch_names.PutCString (module_spec.GetArchitecture().GetArchitectureName());
269e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
270e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
271e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            if (error.Fail() || !exe_module_sp)
272e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
27397a19b21dacd9063bb5475812df7781777262198Greg Clayton                error.SetErrorStringWithFormat ("'%s' doesn't contain any '%s' platform architectures: %s",
27497a19b21dacd9063bb5475812df7781777262198Greg Clayton                                                exe_file.GetPath().c_str(),
2750e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                                GetPluginName().GetCString(),
276e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                arch_names.GetString().c_str());
277e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
278e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
279e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
280e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
281e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
282e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
283e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
284e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
285f4aad907d1d186d6410575bb5d99fb76910c1fe9Stephen WilsonPlatformLinux::GetFile (const FileSpec &platform_file,
28648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                        const UUID *uuid_ptr, FileSpec &local_file)
287e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
28848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (IsRemote())
28948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
29048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (m_remote_platform_sp)
29148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            return m_remote_platform_sp->GetFile (platform_file, uuid_ptr, local_file);
29248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
29348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
294e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // Default to the local case
295e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    local_file = platform_file;
296e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return Error();
297e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
298e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
299e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
300e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
301e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor
302e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
30348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonPlatformLinux::PlatformLinux (bool is_host) :
30448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    Platform(is_host),  // This is the local host platform
30548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    m_remote_platform_sp ()
306e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
307e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
308e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
309e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
310e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor.
311e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
312e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be
313e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance.
314e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
315e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::~PlatformLinux()
316e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
317e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
318e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
319e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonbool
3200b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny ChenPlatformLinux::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
321e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
32248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    bool success = false;
32348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (IsHost())
32448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
32548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        success = Platform::GetProcessInfo (pid, process_info);
32648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
32748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    else
32848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
32948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (m_remote_platform_sp)
33048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            success = m_remote_platform_sp->GetProcessInfo (pid, process_info);
33148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
33248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    return success;
333e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
334e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
335e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonbool
336e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
337e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
338e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    if (idx == 0)
339e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
340e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture);
341e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        return arch.IsValid();
342e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
3431a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton    else if (idx == 1)
3441a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton    {
3451a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton        // If the default host architecture is 64-bit, look for a 32-bit variant
3461a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton        ArchSpec hostArch
3471a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton                      = Host::GetArchitecture(Host::eSystemDefaultArchitecture);
3481a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton        if (hostArch.IsValid() && hostArch.GetTriple().isArch64Bit())
3491a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton        {
3501a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton            arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture32);
3511a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton            return arch.IsValid();
3521a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton        }
3531a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton    }
354e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return false;
355e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
3563600d497832c398ffafcba1935389125e15683a3Stephen Wilson
3573600d497832c398ffafcba1935389125e15683a3Stephen Wilsonvoid
3583600d497832c398ffafcba1935389125e15683a3Stephen WilsonPlatformLinux::GetStatus (Stream &strm)
3593600d497832c398ffafcba1935389125e15683a3Stephen Wilson{
3603600d497832c398ffafcba1935389125e15683a3Stephen Wilson    struct utsname un;
3613600d497832c398ffafcba1935389125e15683a3Stephen Wilson
36288b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea    Platform::GetStatus(strm);
36388b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea
36488b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea    if (uname(&un))
3653600d497832c398ffafcba1935389125e15683a3Stephen Wilson        return;
3663600d497832c398ffafcba1935389125e15683a3Stephen Wilson
36788b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea    strm.Printf ("    Kernel: %s\n", un.sysname);
36888b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea    strm.Printf ("   Release: %s\n", un.release);
36988b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea    strm.Printf ("   Version: %s\n", un.version);
3703600d497832c398ffafcba1935389125e15683a3Stephen Wilson}
3713600d497832c398ffafcba1935389125e15683a3Stephen Wilson
3723600d497832c398ffafcba1935389125e15683a3Stephen Wilsonsize_t
3733600d497832c398ffafcba1935389125e15683a3Stephen WilsonPlatformLinux::GetSoftwareBreakpointTrapOpcode (Target &target,
3743600d497832c398ffafcba1935389125e15683a3Stephen Wilson                                                BreakpointSite *bp_site)
3753600d497832c398ffafcba1935389125e15683a3Stephen Wilson{
3763600d497832c398ffafcba1935389125e15683a3Stephen Wilson    ArchSpec arch = target.GetArchitecture();
37748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    const uint8_t *trap_opcode = NULL;
37848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    size_t trap_opcode_size = 0;
3793600d497832c398ffafcba1935389125e15683a3Stephen Wilson
3803600d497832c398ffafcba1935389125e15683a3Stephen Wilson    switch (arch.GetCore())
3813600d497832c398ffafcba1935389125e15683a3Stephen Wilson    {
3823600d497832c398ffafcba1935389125e15683a3Stephen Wilson    default:
3833600d497832c398ffafcba1935389125e15683a3Stephen Wilson        assert(false && "CPU type not supported!");
3843600d497832c398ffafcba1935389125e15683a3Stephen Wilson        break;
3853600d497832c398ffafcba1935389125e15683a3Stephen Wilson
3863600d497832c398ffafcba1935389125e15683a3Stephen Wilson    case ArchSpec::eCore_x86_32_i386:
3873600d497832c398ffafcba1935389125e15683a3Stephen Wilson    case ArchSpec::eCore_x86_64_x86_64:
38848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
38948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC };
39048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            trap_opcode = g_i386_breakpoint_opcode;
39148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            trap_opcode_size = sizeof(g_i386_breakpoint_opcode);
39248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
3933600d497832c398ffafcba1935389125e15683a3Stephen Wilson        break;
3943600d497832c398ffafcba1935389125e15683a3Stephen Wilson    }
3953600d497832c398ffafcba1935389125e15683a3Stephen Wilson
39648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size))
39748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        return trap_opcode_size;
39848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    return 0;
39948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton}
40048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
40148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonError
40248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonPlatformLinux::LaunchProcess (ProcessLaunchInfo &launch_info)
40348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton{
40448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    Error error;
40548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
40648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (IsHost())
40748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
40848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell))
40948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
41048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            const bool is_localhost = true;
41197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug);
41297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            const bool first_arg_is_full_shell_command = false;
41397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton            if (!launch_info.ConvertArgumentsForLaunchingInShell (error,
41497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  is_localhost,
41597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  will_debug,
41697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton                                                                  first_arg_is_full_shell_command))
41748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                return error;
41848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
41948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        error = Platform::LaunchProcess (launch_info);
42048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
42148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    else
42248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
42348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        error.SetErrorString ("the platform is not currently connected");
42448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
42548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    return error;
4263600d497832c398ffafcba1935389125e15683a3Stephen Wilson}
4270b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen
4280b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chenlldb::ProcessSP
4290a66c059da5a4d91aa81c2bbe5512a96e0817c34Peter CollingbournePlatformLinux::Attach(ProcessAttachInfo &attach_info,
4300b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen                      Debugger &debugger,
4310b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen                      Target *target,
4320b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen                      Listener &listener,
4330b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen                      Error &error)
4340b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen{
43548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    lldb::ProcessSP process_sp;
43648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    if (IsHost())
43748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
43848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (target == NULL)
43948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
44048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            TargetSP new_target_sp;
44148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            ArchSpec emptyArchSpec;
44248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
44348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            error = debugger.GetTargetList().CreateTarget (debugger,
444ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton                                                           NULL,
44548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                                                           emptyArchSpec,
44648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                                                           false,
44748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                                                           m_remote_platform_sp,
44848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                                                           new_target_sp);
44948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            target = new_target_sp.get();
45048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
45148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        else
45248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            error.Clear();
45348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
45448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (target && error.Success())
45548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        {
45648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            debugger.GetTargetList().SetSelectedTarget(target);
45748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
458e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton            process_sp = target->CreateProcess (listener,
459e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton                                                attach_info.GetProcessPluginName(),
460e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton                                                NULL);
46148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton
46248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            if (process_sp)
46348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton                error = process_sp->Attach (attach_info);
46448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        }
46548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
46648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    else
46748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    {
46848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        if (m_remote_platform_sp)
46948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            process_sp = m_remote_platform_sp->Attach (attach_info, debugger, target, listener, error);
47048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton        else
47148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton            error.SetErrorString ("the platform is not currently connected");
47248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    }
47348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton    return process_sp;
4740b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen}
475