llvm.org GIT mirror llvm / testing include / llvm / Support / Host.h
testing

Tree @testing (Download .tar.gz)

Host.h @testing

53ca1f3
67f1c49
 
 
7ed47a1
 
67f1c49
 
 
 
 
 
 
674be02
 
67f1c49
1c8183d
f1d06b8
21a01d1
59e23fa
21a01d1
df36f1c
 
fb1808c
 
 
 
 
 
 
 
 
 
21a01d1
01ef4f6
21a01d1
 
 
 
bb14672
 
67f1c49
 
 
c9363ef
058101e
21a01d1
058101e
21a01d1
 
 
67f1c49
1d4bf66
 
be46c79
 
 
 
 
0173864
bb14672
fbb662f
 
 
 
067d024
 
 
 
 
9191be9
1c8183d
 
 
 
 
 
 
 
 
 
 
 
26cb3d9
 
 
 
 
f1d06b8
5f4e285
 
 
 
 
d7276a4
f1d06b8
cd52a7a
 
67f1c49
 
//===- llvm/Support/Host.h - Host machine characteristics --------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Methods for querying the nature of the host machine.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_SUPPORT_HOST_H
#define LLVM_SUPPORT_HOST_H

#include "llvm/ADT/StringMap.h"
#include "llvm/Support/MemoryBuffer.h"

#if defined(__linux__) || defined(__GNU__) || defined(__HAIKU__)
#include <endian.h>
#elif defined(_AIX)
#include <sys/machine.h>
#elif defined(__sun)
/* Solaris provides _BIG_ENDIAN/_LITTLE_ENDIAN selector in sys/types.h */
#include <sys/types.h>
#define BIG_ENDIAN 4321
#define LITTLE_ENDIAN 1234
#if defined(_BIG_ENDIAN)
#define BYTE_ORDER BIG_ENDIAN
#else
#define BYTE_ORDER LITTLE_ENDIAN
#endif
#else
#if !defined(BYTE_ORDER) && !defined(LLVM_ON_WIN32)
#include <machine/endian.h>
#endif
#endif

#include <string>

namespace llvm {
namespace sys {

#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN
constexpr bool IsBigEndianHost = true;
#else
constexpr bool IsBigEndianHost = false;
#endif

  static const bool IsLittleEndianHost = !IsBigEndianHost;

  /// getDefaultTargetTriple() - Return the default target triple the compiler
  /// has been configured to produce code for.
  ///
  /// The target triple is a string in the format of:
  ///   CPU_TYPE-VENDOR-OPERATING_SYSTEM
  /// or
  ///   CPU_TYPE-VENDOR-KERNEL-OPERATING_SYSTEM
  std::string getDefaultTargetTriple();

  /// getProcessTriple() - Return an appropriate target triple for generating
  /// code to be loaded into the current process, e.g. when using the JIT.
  std::string getProcessTriple();

  /// getHostCPUName - Get the LLVM name for the host CPU. The particular format
  /// of the name is target dependent, and suitable for passing as -mcpu to the
  /// target which matches the host.
  ///
  /// \return - The host CPU name, or empty if the CPU could not be determined.
  StringRef getHostCPUName();

  /// getHostCPUFeatures - Get the LLVM names for the host CPU features.
  /// The particular format of the names are target dependent, and suitable for
  /// passing as -mattr to the target which matches the host.
  ///
  /// \param Features - A string mapping feature names to either
  /// true (if enabled) or false (if disabled). This routine makes no guarantees
  /// about exactly which features may appear in this map, except that they are
  /// all valid LLVM feature names.
  ///
  /// \return - True on success.
  bool getHostCPUFeatures(StringMap<bool> &Features);

  /// Get the number of physical cores (as opposed to logical cores returned
  /// from thread::hardware_concurrency(), which includes hyperthreads).
  /// Returns -1 if unknown for the current host system.
  int getHostNumPhysicalCores();

  namespace detail {
  /// Helper functions to extract HostCPUName from /proc/cpuinfo on linux.
  StringRef getHostCPUNameForPowerPC(const StringRef &ProcCpuinfoContent);
  StringRef getHostCPUNameForARM(const StringRef &ProcCpuinfoContent);
  StringRef getHostCPUNameForS390x(const StringRef &ProcCpuinfoContent);
  StringRef getHostCPUNameForBPF();
  }
}
}

#endif