Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 1 | //===- llvm/Support/Host.h - Host machine characteristics --------*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // Methods for querying the nature of the host machine. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #ifndef LLVM_SUPPORT_HOST_H |
| 15 | #define LLVM_SUPPORT_HOST_H |
| 16 | |
| 17 | #include "llvm/ADT/StringMap.h" |
| 18 | |
| 19 | #if defined(__linux__) || defined(__GNU__) || defined(__HAIKU__) |
| 20 | #include <endian.h> |
| 21 | #elif defined(_AIX) |
| 22 | #include <sys/machine.h> |
| 23 | #elif defined(__sun) |
| 24 | /* Solaris provides _BIG_ENDIAN/_LITTLE_ENDIAN selector in sys/types.h */ |
| 25 | #include <sys/types.h> |
| 26 | #define BIG_ENDIAN 4321 |
| 27 | #define LITTLE_ENDIAN 1234 |
| 28 | #if defined(_BIG_ENDIAN) |
| 29 | #define BYTE_ORDER BIG_ENDIAN |
| 30 | #else |
| 31 | #define BYTE_ORDER LITTLE_ENDIAN |
| 32 | #endif |
| 33 | #else |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame] | 34 | #if !defined(BYTE_ORDER) && !defined(_WIN32) |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 35 | #include <machine/endian.h> |
| 36 | #endif |
| 37 | #endif |
| 38 | |
| 39 | #include <string> |
| 40 | |
| 41 | namespace llvm { |
| 42 | namespace sys { |
| 43 | |
| 44 | #if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN |
| 45 | constexpr bool IsBigEndianHost = true; |
| 46 | #else |
| 47 | constexpr bool IsBigEndianHost = false; |
| 48 | #endif |
| 49 | |
| 50 | static const bool IsLittleEndianHost = !IsBigEndianHost; |
| 51 | |
| 52 | /// getDefaultTargetTriple() - Return the default target triple the compiler |
| 53 | /// has been configured to produce code for. |
| 54 | /// |
| 55 | /// The target triple is a string in the format of: |
| 56 | /// CPU_TYPE-VENDOR-OPERATING_SYSTEM |
| 57 | /// or |
| 58 | /// CPU_TYPE-VENDOR-KERNEL-OPERATING_SYSTEM |
| 59 | std::string getDefaultTargetTriple(); |
| 60 | |
| 61 | /// getProcessTriple() - Return an appropriate target triple for generating |
| 62 | /// code to be loaded into the current process, e.g. when using the JIT. |
| 63 | std::string getProcessTriple(); |
| 64 | |
| 65 | /// getHostCPUName - Get the LLVM name for the host CPU. The particular format |
| 66 | /// of the name is target dependent, and suitable for passing as -mcpu to the |
| 67 | /// target which matches the host. |
| 68 | /// |
| 69 | /// \return - The host CPU name, or empty if the CPU could not be determined. |
| 70 | StringRef getHostCPUName(); |
| 71 | |
| 72 | /// getHostCPUFeatures - Get the LLVM names for the host CPU features. |
| 73 | /// The particular format of the names are target dependent, and suitable for |
| 74 | /// passing as -mattr to the target which matches the host. |
| 75 | /// |
| 76 | /// \param Features - A string mapping feature names to either |
| 77 | /// true (if enabled) or false (if disabled). This routine makes no guarantees |
| 78 | /// about exactly which features may appear in this map, except that they are |
| 79 | /// all valid LLVM feature names. |
| 80 | /// |
| 81 | /// \return - True on success. |
| 82 | bool getHostCPUFeatures(StringMap<bool> &Features); |
| 83 | |
| 84 | /// Get the number of physical cores (as opposed to logical cores returned |
| 85 | /// from thread::hardware_concurrency(), which includes hyperthreads). |
| 86 | /// Returns -1 if unknown for the current host system. |
| 87 | int getHostNumPhysicalCores(); |
| 88 | |
| 89 | namespace detail { |
| 90 | /// Helper functions to extract HostCPUName from /proc/cpuinfo on linux. |
| 91 | StringRef getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent); |
| 92 | StringRef getHostCPUNameForARM(StringRef ProcCpuinfoContent); |
| 93 | StringRef getHostCPUNameForS390x(StringRef ProcCpuinfoContent); |
| 94 | StringRef getHostCPUNameForBPF(); |
| 95 | } |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | #endif |