xref: /llvm-project/libcxx/include/__configuration/platform.h (revision 5f2389d49fef36ed2e97dcc6b54036542c160a36)
123e1ed65SLouis Dionne // -*- C++ -*-
223e1ed65SLouis Dionne //===----------------------------------------------------------------------===//
323e1ed65SLouis Dionne //
423e1ed65SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
523e1ed65SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
623e1ed65SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
723e1ed65SLouis Dionne //
823e1ed65SLouis Dionne //===----------------------------------------------------------------------===//
923e1ed65SLouis Dionne 
1023e1ed65SLouis Dionne #ifndef _LIBCPP___CONFIGURATION_PLATFORM_H
1123e1ed65SLouis Dionne #define _LIBCPP___CONFIGURATION_PLATFORM_H
1223e1ed65SLouis Dionne 
1323e1ed65SLouis Dionne #include <__config_site>
1423e1ed65SLouis Dionne 
1523e1ed65SLouis Dionne #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
1623e1ed65SLouis Dionne #  pragma GCC system_header
1723e1ed65SLouis Dionne #endif
1823e1ed65SLouis Dionne 
1923e1ed65SLouis Dionne #if defined(__ELF__)
2023e1ed65SLouis Dionne #  define _LIBCPP_OBJECT_FORMAT_ELF 1
2123e1ed65SLouis Dionne #elif defined(__MACH__)
2223e1ed65SLouis Dionne #  define _LIBCPP_OBJECT_FORMAT_MACHO 1
2323e1ed65SLouis Dionne #elif defined(_WIN32)
2423e1ed65SLouis Dionne #  define _LIBCPP_OBJECT_FORMAT_COFF 1
2523e1ed65SLouis Dionne #elif defined(__wasm__)
2623e1ed65SLouis Dionne #  define _LIBCPP_OBJECT_FORMAT_WASM 1
2723e1ed65SLouis Dionne #elif defined(_AIX)
2823e1ed65SLouis Dionne #  define _LIBCPP_OBJECT_FORMAT_XCOFF 1
2923e1ed65SLouis Dionne #else
3023e1ed65SLouis Dionne // ... add new file formats here ...
3123e1ed65SLouis Dionne #endif
3223e1ed65SLouis Dionne 
33*5f2389d4SJoseph Huber // To detect which libc we're using
34*5f2389d4SJoseph Huber #if __has_include(<features.h>)
3523e1ed65SLouis Dionne #  include <features.h>
36*5f2389d4SJoseph Huber #endif
37*5f2389d4SJoseph Huber 
38*5f2389d4SJoseph Huber #if defined(__linux__)
3923e1ed65SLouis Dionne #  if defined(__GLIBC_PREREQ)
4023e1ed65SLouis Dionne #    define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b)
4123e1ed65SLouis Dionne #  else
4223e1ed65SLouis Dionne #    define _LIBCPP_GLIBC_PREREQ(a, b) 0
4323e1ed65SLouis Dionne #  endif // defined(__GLIBC_PREREQ)
44*5f2389d4SJoseph Huber #endif
4523e1ed65SLouis Dionne 
4623e1ed65SLouis Dionne #ifndef __BYTE_ORDER__
4723e1ed65SLouis Dionne #  error                                                                                                               \
4823e1ed65SLouis Dionne       "Your compiler doesn't seem to define __BYTE_ORDER__, which is required by libc++ to know the endianness of your target platform"
4923e1ed65SLouis Dionne #endif
5023e1ed65SLouis Dionne 
5123e1ed65SLouis Dionne #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
5223e1ed65SLouis Dionne #  define _LIBCPP_LITTLE_ENDIAN
5323e1ed65SLouis Dionne #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
5423e1ed65SLouis Dionne #  define _LIBCPP_BIG_ENDIAN
5523e1ed65SLouis Dionne #endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
5623e1ed65SLouis Dionne 
5723e1ed65SLouis Dionne #endif // _LIBCPP___CONFIGURATION_PLATFORM_H
58