1cb8977d726be451df9978a74088435667fa37da2Greg Clayton//===-- PlatformMacOSX.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 "PlatformMacOSX.h"
11e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
12e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C Includes
13b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include <sys/sysctl.h>
14b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
15e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C++ Includes
16e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Other libraries and framework includes
17e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Project includes
18e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Error.h"
19b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Breakpoint/BreakpointLocation.h"
20e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Module.h"
21e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/ModuleList.h"
2258e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Core/PluginManager.h"
23e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/StreamString.h"
24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/FileSpec.h"
25e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/Host.h"
26e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Process.h"
27b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Target.h"
28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb;
30e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb_private;
31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
3258e26e0935138225477fd61283215ceff2068899Greg Claytonstatic uint32_t g_initialize_count = 0;
3358e26e0935138225477fd61283215ceff2068899Greg Clayton
34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid
35e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformMacOSX::Initialize ()
36e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
3758e26e0935138225477fd61283215ceff2068899Greg Clayton    if (g_initialize_count++ == 0)
3858e26e0935138225477fd61283215ceff2068899Greg Clayton    {
39e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#if defined (__APPLE__)
4058e26e0935138225477fd61283215ceff2068899Greg Clayton        PlatformSP default_platform_sp (new PlatformMacOSX(true));
4158e26e0935138225477fd61283215ceff2068899Greg Clayton        default_platform_sp->SetSystemArchitecture (Host::GetArchitecture());
4258e26e0935138225477fd61283215ceff2068899Greg Clayton        Platform::SetDefaultPlatform (default_platform_sp);
4358e26e0935138225477fd61283215ceff2068899Greg Clayton#endif
440e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        PluginManager::RegisterPlugin (PlatformMacOSX::GetPluginNameStatic(false),
4558e26e0935138225477fd61283215ceff2068899Greg Clayton                                       PlatformMacOSX::GetDescriptionStatic(false),
4658e26e0935138225477fd61283215ceff2068899Greg Clayton                                       PlatformMacOSX::CreateInstance);
4758e26e0935138225477fd61283215ceff2068899Greg Clayton    }
4858e26e0935138225477fd61283215ceff2068899Greg Clayton
49e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
50e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
51e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid
52e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformMacOSX::Terminate ()
53e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
5458e26e0935138225477fd61283215ceff2068899Greg Clayton    if (g_initialize_count > 0)
55e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
5658e26e0935138225477fd61283215ceff2068899Greg Clayton        if (--g_initialize_count == 0)
57e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
5858e26e0935138225477fd61283215ceff2068899Greg Clayton            PluginManager::UnregisterPlugin (PlatformMacOSX::CreateInstance);
59e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
60e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
61e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
62e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
6358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform*
64b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformMacOSX::CreateInstance (bool force, const ArchSpec *arch)
65e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
6658e26e0935138225477fd61283215ceff2068899Greg Clayton    // The only time we create an instance is when we are creating a remote
6758e26e0935138225477fd61283215ceff2068899Greg Clayton    // macosx platform
6858e26e0935138225477fd61283215ceff2068899Greg Clayton    const bool is_host = false;
69b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
70b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    bool create = force;
71b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (create == false && arch && arch->IsValid())
72b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    {
73b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        const llvm::Triple &triple = arch->GetTriple();
74b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        switch (triple.getVendor())
75b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        {
76b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            case llvm::Triple::Apple:
77b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                create = true;
78b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                break;
79b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
806c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__APPLE__)
816c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton            // Only accept "unknown" for vendor if the host is Apple and
826c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton            // it "unknown" wasn't specified (it was just returned becasue it
836c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton            // was NOT specified)
84b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            case llvm::Triple::UnknownArch:
85b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                create = !arch->TripleVendorWasSpecified();
86b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                break;
876c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif
88b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            default:
89b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                break;
90b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        }
91b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton
92b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        if (create)
93b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        {
94b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            switch (triple.getOS())
95b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            {
96b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::Darwin:  // Deprecated, but still support Darwin for historical reasons
97b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::MacOSX:
98b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
996c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__APPLE__)
1006c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton                // Only accept "vendor" for vendor if the host is Apple and
1016c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton                // it "unknown" wasn't specified (it was just returned becasue it
1026c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton                // was NOT specified)
103b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::UnknownOS:
104b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = !arch->TripleOSWasSpecified();
105b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
1066c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif
107b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                default:
108b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = false;
109b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
110b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            }
111b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        }
112b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    }
113b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    if (create)
114b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        return new PlatformMacOSX (is_host);
115b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton    return NULL;
116e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
117e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
1180e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
1190e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatformMacOSX::GetPluginNameStatic (bool is_host)
12058e26e0935138225477fd61283215ceff2068899Greg Clayton{
12158e26e0935138225477fd61283215ceff2068899Greg Clayton    if (is_host)
1220e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    {
1230e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        static ConstString g_host_name(Platform::GetHostPlatformName ());
1240e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return g_host_name;
1250e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    }
12658e26e0935138225477fd61283215ceff2068899Greg Clayton    else
1270e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    {
1280e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        static ConstString g_remote_name("remote-macosx");
1290e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return g_remote_name;
1300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    }
131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
132b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
13358e26e0935138225477fd61283215ceff2068899Greg Claytonconst char *
13458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformMacOSX::GetDescriptionStatic (bool is_host)
13558e26e0935138225477fd61283215ceff2068899Greg Clayton{
13658e26e0935138225477fd61283215ceff2068899Greg Clayton    if (is_host)
13758e26e0935138225477fd61283215ceff2068899Greg Clayton        return "Local Mac OS X user platform plug-in.";
13858e26e0935138225477fd61283215ceff2068899Greg Clayton    else
13958e26e0935138225477fd61283215ceff2068899Greg Clayton        return "Remote Mac OS X user platform plug-in.";
14058e26e0935138225477fd61283215ceff2068899Greg Clayton}
141b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
142e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
143e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor
144e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
14558e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformMacOSX::PlatformMacOSX (bool is_host) :
14658e26e0935138225477fd61283215ceff2068899Greg Clayton    PlatformDarwin (is_host)
147e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
148e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
149e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
150e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
151e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor.
152e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
153e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be
154e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance.
155e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformMacOSX::~PlatformMacOSX()
157e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
16058e26e0935138225477fd61283215ceff2068899Greg ClaytonError
16158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformMacOSX::GetFile (const FileSpec &platform_file,
16258e26e0935138225477fd61283215ceff2068899Greg Clayton                         const UUID *uuid_ptr,
16358e26e0935138225477fd61283215ceff2068899Greg Clayton                         FileSpec &local_file)
16458e26e0935138225477fd61283215ceff2068899Greg Clayton{
16558e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsRemote())
16658e26e0935138225477fd61283215ceff2068899Greg Clayton    {
16758e26e0935138225477fd61283215ceff2068899Greg Clayton        if (m_remote_platform_sp)
16858e26e0935138225477fd61283215ceff2068899Greg Clayton            return m_remote_platform_sp->GetFile (platform_file, uuid_ptr, local_file);
16958e26e0935138225477fd61283215ceff2068899Greg Clayton    }
17058e26e0935138225477fd61283215ceff2068899Greg Clayton
17158e26e0935138225477fd61283215ceff2068899Greg Clayton    // Default to the local case
17258e26e0935138225477fd61283215ceff2068899Greg Clayton    local_file = platform_file;
17358e26e0935138225477fd61283215ceff2068899Greg Clayton    return Error();
17458e26e0935138225477fd61283215ceff2068899Greg Clayton}
17558e26e0935138225477fd61283215ceff2068899Greg Clayton
176e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonbool
177e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformMacOSX::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
178e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
1799d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda#if defined (__arm__)
1809d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda    return ARMGetSupportedArchitectureAtIndex (idx, arch);
181f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton#else
182f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton    return x86GetSupportedArchitectureAtIndex (idx, arch);
1839d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda#endif
184e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
185b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
186