197a14e60SZachary Turner //===-- HostInfoBase.cpp ----------------------------------------*- C++ -*-===// 297a14e60SZachary Turner // 397a14e60SZachary Turner // The LLVM Compiler Infrastructure 497a14e60SZachary Turner // 597a14e60SZachary Turner // This file is distributed under the University of Illinois Open Source 697a14e60SZachary Turner // License. See LICENSE.TXT for details. 797a14e60SZachary Turner // 897a14e60SZachary Turner //===----------------------------------------------------------------------===// 997a14e60SZachary Turner 1097a14e60SZachary Turner #include "lldb/Host/Config.h" 1197a14e60SZachary Turner 1297a14e60SZachary Turner #include "lldb/Core/ArchSpec.h" 1397a14e60SZachary Turner #include "lldb/Host/Host.h" 14*13b18261SZachary Turner #include "lldb/Host/HostInfo.h" 15*13b18261SZachary Turner #include "lldb/Host/HostInfoBase.h" 16*13b18261SZachary Turner 17*13b18261SZachary Turner #include "llvm/ADT/Triple.h" 18*13b18261SZachary Turner #include "llvm/Support/Host.h" 1997a14e60SZachary Turner 2097a14e60SZachary Turner #include <thread> 2197a14e60SZachary Turner 2297a14e60SZachary Turner using namespace lldb; 2397a14e60SZachary Turner using namespace lldb_private; 2497a14e60SZachary Turner 2597a14e60SZachary Turner uint32_t HostInfoBase::m_number_cpus = 0; 2697a14e60SZachary Turner std::string HostInfoBase::m_vendor_string; 2797a14e60SZachary Turner std::string HostInfoBase::m_os_string; 2897a14e60SZachary Turner std::string HostInfoBase::m_host_triple; 29*13b18261SZachary Turner ArchSpec HostInfoBase::m_host_arch_32; 30*13b18261SZachary Turner ArchSpec HostInfoBase::m_host_arch_64; 3197a14e60SZachary Turner 3297a14e60SZachary Turner uint32_t 3397a14e60SZachary Turner HostInfoBase::GetNumberCPUS() 3497a14e60SZachary Turner { 3597a14e60SZachary Turner static bool is_initialized = false; 3697a14e60SZachary Turner if (!is_initialized) 3797a14e60SZachary Turner { 3897a14e60SZachary Turner m_number_cpus = std::thread::hardware_concurrency(); 3997a14e60SZachary Turner is_initialized = true; 4097a14e60SZachary Turner } 4197a14e60SZachary Turner 4297a14e60SZachary Turner return m_number_cpus; 4397a14e60SZachary Turner } 4497a14e60SZachary Turner 4597a14e60SZachary Turner llvm::StringRef 4697a14e60SZachary Turner HostInfoBase::GetVendorString() 4797a14e60SZachary Turner { 4897a14e60SZachary Turner static bool is_initialized = false; 4997a14e60SZachary Turner if (!is_initialized) 5097a14e60SZachary Turner { 51*13b18261SZachary Turner const ArchSpec &host_arch = HostInfo::GetArchitecture(); 5297a14e60SZachary Turner const llvm::StringRef &str_ref = host_arch.GetTriple().getVendorName(); 5397a14e60SZachary Turner m_vendor_string.assign(str_ref.begin(), str_ref.end()); 5497a14e60SZachary Turner is_initialized = true; 5597a14e60SZachary Turner } 5697a14e60SZachary Turner return m_vendor_string; 5797a14e60SZachary Turner } 5897a14e60SZachary Turner 5997a14e60SZachary Turner llvm::StringRef 6097a14e60SZachary Turner HostInfoBase::GetOSString() 6197a14e60SZachary Turner { 6297a14e60SZachary Turner static bool is_initialized = false; 6397a14e60SZachary Turner if (!is_initialized) 6497a14e60SZachary Turner { 65*13b18261SZachary Turner const ArchSpec &host_arch = HostInfo::GetArchitecture(); 6697a14e60SZachary Turner const llvm::StringRef &str_ref = host_arch.GetTriple().getOSName(); 6797a14e60SZachary Turner m_os_string.assign(str_ref.begin(), str_ref.end()); 6897a14e60SZachary Turner is_initialized = true; 6997a14e60SZachary Turner } 7097a14e60SZachary Turner return m_os_string; 7197a14e60SZachary Turner } 7297a14e60SZachary Turner 7397a14e60SZachary Turner llvm::StringRef 7497a14e60SZachary Turner HostInfoBase::GetTargetTriple() 7597a14e60SZachary Turner { 7697a14e60SZachary Turner static bool is_initialized = false; 7797a14e60SZachary Turner if (!is_initialized) 7897a14e60SZachary Turner { 79*13b18261SZachary Turner const ArchSpec &host_arch = HostInfo::GetArchitecture(); 8097a14e60SZachary Turner m_host_triple = host_arch.GetTriple().getTriple(); 8197a14e60SZachary Turner is_initialized = true; 8297a14e60SZachary Turner } 8397a14e60SZachary Turner return m_host_triple; 8497a14e60SZachary Turner } 85*13b18261SZachary Turner 86*13b18261SZachary Turner const ArchSpec & 87*13b18261SZachary Turner HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) 88*13b18261SZachary Turner { 89*13b18261SZachary Turner static bool is_initialized = false; 90*13b18261SZachary Turner if (!is_initialized) 91*13b18261SZachary Turner { 92*13b18261SZachary Turner HostInfo::ComputeHostArchitectureSupport(m_host_arch_32, m_host_arch_64); 93*13b18261SZachary Turner is_initialized = true; 94*13b18261SZachary Turner } 95*13b18261SZachary Turner 96*13b18261SZachary Turner // If an explicit 32 or 64-bit architecture was requested, return that. 97*13b18261SZachary Turner if (arch_kind == eArchKind32) 98*13b18261SZachary Turner return m_host_arch_32; 99*13b18261SZachary Turner if (arch_kind == eArchKind64) 100*13b18261SZachary Turner return m_host_arch_64; 101*13b18261SZachary Turner 102*13b18261SZachary Turner // Otherwise prefer the 64-bit architecture if it is valid. 103*13b18261SZachary Turner return (m_host_arch_64.IsValid()) ? m_host_arch_64 : m_host_arch_32; 104*13b18261SZachary Turner } 105*13b18261SZachary Turner 106*13b18261SZachary Turner void 107*13b18261SZachary Turner HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64) 108*13b18261SZachary Turner { 109*13b18261SZachary Turner llvm::Triple triple(llvm::sys::getDefaultTargetTriple()); 110*13b18261SZachary Turner 111*13b18261SZachary Turner arch_32.Clear(); 112*13b18261SZachary Turner arch_64.Clear(); 113*13b18261SZachary Turner 114*13b18261SZachary Turner switch (triple.getArch()) 115*13b18261SZachary Turner { 116*13b18261SZachary Turner default: 117*13b18261SZachary Turner arch_32.SetTriple(triple); 118*13b18261SZachary Turner break; 119*13b18261SZachary Turner 120*13b18261SZachary Turner case llvm::Triple::x86_64: 121*13b18261SZachary Turner arch_64.SetTriple(triple); 122*13b18261SZachary Turner arch_32.SetTriple(triple.get32BitArchVariant()); 123*13b18261SZachary Turner break; 124*13b18261SZachary Turner 125*13b18261SZachary Turner case llvm::Triple::mips64: 126*13b18261SZachary Turner case llvm::Triple::sparcv9: 127*13b18261SZachary Turner case llvm::Triple::ppc64: 128*13b18261SZachary Turner arch_64.SetTriple(triple); 129*13b18261SZachary Turner break; 130*13b18261SZachary Turner } 131*13b18261SZachary Turner } 132