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" 1413b18261SZachary Turner #include "lldb/Host/HostInfo.h" 1513b18261SZachary Turner #include "lldb/Host/HostInfoBase.h" 1613b18261SZachary Turner 1713b18261SZachary Turner #include "llvm/ADT/Triple.h" 1813b18261SZachary 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 25*75172a95SZachary Turner uint32_t HostInfoBase::m_number_cpus = 0; 26*75172a95SZachary Turner std::string HostInfoBase::m_vendor_string; 27*75172a95SZachary Turner std::string HostInfoBase::m_os_string; 28*75172a95SZachary Turner std::string HostInfoBase::m_host_triple; 29*75172a95SZachary Turner ArchSpec HostInfoBase::m_host_arch_32; 30*75172a95SZachary 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 { 38*75172a95SZachary Turner m_number_cpus = std::thread::hardware_concurrency(); 3997a14e60SZachary Turner is_initialized = true; 4097a14e60SZachary Turner } 4197a14e60SZachary Turner 42*75172a95SZachary 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 { 5113b18261SZachary Turner const ArchSpec &host_arch = HostInfo::GetArchitecture(); 5297a14e60SZachary Turner const llvm::StringRef &str_ref = host_arch.GetTriple().getVendorName(); 53*75172a95SZachary Turner m_vendor_string.assign(str_ref.begin(), str_ref.end()); 5497a14e60SZachary Turner is_initialized = true; 5597a14e60SZachary Turner } 56*75172a95SZachary 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 { 6513b18261SZachary Turner const ArchSpec &host_arch = HostInfo::GetArchitecture(); 6697a14e60SZachary Turner const llvm::StringRef &str_ref = host_arch.GetTriple().getOSName(); 67*75172a95SZachary Turner m_os_string.assign(str_ref.begin(), str_ref.end()); 6897a14e60SZachary Turner is_initialized = true; 6997a14e60SZachary Turner } 70*75172a95SZachary 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 { 7913b18261SZachary Turner const ArchSpec &host_arch = HostInfo::GetArchitecture(); 80*75172a95SZachary Turner m_host_triple = host_arch.GetTriple().getTriple(); 8197a14e60SZachary Turner is_initialized = true; 8297a14e60SZachary Turner } 83*75172a95SZachary Turner return m_host_triple; 8497a14e60SZachary Turner } 8513b18261SZachary Turner 8613b18261SZachary Turner const ArchSpec & 8713b18261SZachary Turner HostInfoBase::GetArchitecture(ArchitectureKind arch_kind) 8813b18261SZachary Turner { 8913b18261SZachary Turner static bool is_initialized = false; 9013b18261SZachary Turner if (!is_initialized) 9113b18261SZachary Turner { 92*75172a95SZachary Turner HostInfo::ComputeHostArchitectureSupport(m_host_arch_32, m_host_arch_64); 9313b18261SZachary Turner is_initialized = true; 9413b18261SZachary Turner } 9513b18261SZachary Turner 9613b18261SZachary Turner // If an explicit 32 or 64-bit architecture was requested, return that. 9713b18261SZachary Turner if (arch_kind == eArchKind32) 98*75172a95SZachary Turner return m_host_arch_32; 9913b18261SZachary Turner if (arch_kind == eArchKind64) 100*75172a95SZachary Turner return m_host_arch_64; 10113b18261SZachary Turner 10213b18261SZachary Turner // Otherwise prefer the 64-bit architecture if it is valid. 103*75172a95SZachary Turner return (m_host_arch_64.IsValid()) ? m_host_arch_64 : m_host_arch_32; 10413b18261SZachary Turner } 10513b18261SZachary Turner 10613b18261SZachary Turner void 10713b18261SZachary Turner HostInfoBase::ComputeHostArchitectureSupport(ArchSpec &arch_32, ArchSpec &arch_64) 10813b18261SZachary Turner { 10913b18261SZachary Turner llvm::Triple triple(llvm::sys::getDefaultTargetTriple()); 11013b18261SZachary Turner 11113b18261SZachary Turner arch_32.Clear(); 11213b18261SZachary Turner arch_64.Clear(); 11313b18261SZachary Turner 11413b18261SZachary Turner switch (triple.getArch()) 11513b18261SZachary Turner { 11613b18261SZachary Turner default: 11713b18261SZachary Turner arch_32.SetTriple(triple); 11813b18261SZachary Turner break; 11913b18261SZachary Turner 12013b18261SZachary Turner case llvm::Triple::x86_64: 12113b18261SZachary Turner arch_64.SetTriple(triple); 12213b18261SZachary Turner arch_32.SetTriple(triple.get32BitArchVariant()); 12313b18261SZachary Turner break; 12413b18261SZachary Turner 12513b18261SZachary Turner case llvm::Triple::mips64: 12613b18261SZachary Turner case llvm::Triple::sparcv9: 12713b18261SZachary Turner case llvm::Triple::ppc64: 12813b18261SZachary Turner arch_64.SetTriple(triple); 12913b18261SZachary Turner break; 13013b18261SZachary Turner } 13113b18261SZachary Turner } 132