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