1 //===-- PlatformMacOSX.cpp --------------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "PlatformMacOSX.h"
11
12 // C Includes
13 #include <sys/sysctl.h>
14
15 // C++ Includes
16 // Other libraries and framework includes
17 // Project includes
18 #include "lldb/Core/Error.h"
19 #include "lldb/Breakpoint/BreakpointLocation.h"
20 #include "lldb/Core/Module.h"
21 #include "lldb/Core/ModuleList.h"
22 #include "lldb/Core/PluginManager.h"
23 #include "lldb/Core/StreamString.h"
24 #include "lldb/Host/FileSpec.h"
25 #include "lldb/Host/Host.h"
26 #include "lldb/Target/Process.h"
27 #include "lldb/Target/Target.h"
28
29 using namespace lldb;
30 using namespace lldb_private;
31
32 static uint32_t g_initialize_count = 0;
33
34 void
Initialize()35 PlatformMacOSX::Initialize ()
36 {
37 if (g_initialize_count++ == 0)
38 {
39 #if defined (__APPLE__)
40 PlatformSP default_platform_sp (new PlatformMacOSX(true));
41 default_platform_sp->SetSystemArchitecture (Host::GetArchitecture());
42 Platform::SetDefaultPlatform (default_platform_sp);
43 #endif
44 PluginManager::RegisterPlugin (PlatformMacOSX::GetPluginNameStatic(false),
45 PlatformMacOSX::GetDescriptionStatic(false),
46 PlatformMacOSX::CreateInstance);
47 }
48
49 }
50
51 void
Terminate()52 PlatformMacOSX::Terminate ()
53 {
54 if (g_initialize_count > 0)
55 {
56 if (--g_initialize_count == 0)
57 {
58 PluginManager::UnregisterPlugin (PlatformMacOSX::CreateInstance);
59 }
60 }
61 }
62
63 Platform*
CreateInstance(bool force,const ArchSpec * arch)64 PlatformMacOSX::CreateInstance (bool force, const ArchSpec *arch)
65 {
66 // The only time we create an instance is when we are creating a remote
67 // macosx platform
68 const bool is_host = false;
69
70 bool create = force;
71 if (create == false && arch && arch->IsValid())
72 {
73 const llvm::Triple &triple = arch->GetTriple();
74 switch (triple.getVendor())
75 {
76 case llvm::Triple::Apple:
77 create = true;
78 break;
79
80 #if defined(__APPLE__)
81 // Only accept "unknown" for vendor if the host is Apple and
82 // it "unknown" wasn't specified (it was just returned becasue it
83 // was NOT specified)
84 case llvm::Triple::UnknownArch:
85 create = !arch->TripleVendorWasSpecified();
86 break;
87 #endif
88 default:
89 break;
90 }
91
92 if (create)
93 {
94 switch (triple.getOS())
95 {
96 case llvm::Triple::Darwin: // Deprecated, but still support Darwin for historical reasons
97 case llvm::Triple::MacOSX:
98 break;
99 #if defined(__APPLE__)
100 // Only accept "vendor" for vendor if the host is Apple and
101 // it "unknown" wasn't specified (it was just returned becasue it
102 // was NOT specified)
103 case llvm::Triple::UnknownOS:
104 create = !arch->TripleOSWasSpecified();
105 break;
106 #endif
107 default:
108 create = false;
109 break;
110 }
111 }
112 }
113 if (create)
114 return new PlatformMacOSX (is_host);
115 return NULL;
116 }
117
118 lldb_private::ConstString
GetPluginNameStatic(bool is_host)119 PlatformMacOSX::GetPluginNameStatic (bool is_host)
120 {
121 if (is_host)
122 {
123 static ConstString g_host_name(Platform::GetHostPlatformName ());
124 return g_host_name;
125 }
126 else
127 {
128 static ConstString g_remote_name("remote-macosx");
129 return g_remote_name;
130 }
131 }
132
133 const char *
GetDescriptionStatic(bool is_host)134 PlatformMacOSX::GetDescriptionStatic (bool is_host)
135 {
136 if (is_host)
137 return "Local Mac OS X user platform plug-in.";
138 else
139 return "Remote Mac OS X user platform plug-in.";
140 }
141
142 //------------------------------------------------------------------
143 /// Default Constructor
144 //------------------------------------------------------------------
PlatformMacOSX(bool is_host)145 PlatformMacOSX::PlatformMacOSX (bool is_host) :
146 PlatformDarwin (is_host)
147 {
148 }
149
150 //------------------------------------------------------------------
151 /// Destructor.
152 ///
153 /// The destructor is virtual since this class is designed to be
154 /// inherited from by the plug-in instance.
155 //------------------------------------------------------------------
~PlatformMacOSX()156 PlatformMacOSX::~PlatformMacOSX()
157 {
158 }
159
160 Error
GetFile(const FileSpec & platform_file,const UUID * uuid_ptr,FileSpec & local_file)161 PlatformMacOSX::GetFile (const FileSpec &platform_file,
162 const UUID *uuid_ptr,
163 FileSpec &local_file)
164 {
165 if (IsRemote())
166 {
167 if (m_remote_platform_sp)
168 return m_remote_platform_sp->GetFile (platform_file, uuid_ptr, local_file);
169 }
170
171 // Default to the local case
172 local_file = platform_file;
173 return Error();
174 }
175
176 bool
GetSupportedArchitectureAtIndex(uint32_t idx,ArchSpec & arch)177 PlatformMacOSX::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch)
178 {
179 #if defined (__arm__)
180 return ARMGetSupportedArchitectureAtIndex (idx, arch);
181 #else
182 return x86GetSupportedArchitectureAtIndex (idx, arch);
183 #endif
184 }
185
186