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