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