1// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP___CONFIGURATION_PLATFORM_H
11#define _LIBCPP___CONFIGURATION_PLATFORM_H
12
13#include <__config_site>
14
15#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
16# pragma GCC system_header
17#endif
18
19#if defined(__ELF__)
20# define _LIBCPP_OBJECT_FORMAT_ELF 1
21#elif defined(__MACH__)
22# define _LIBCPP_OBJECT_FORMAT_MACHO 1
23#elif defined(_WIN32)
24# define _LIBCPP_OBJECT_FORMAT_COFF 1
25#elif defined(__wasm__)
26# define _LIBCPP_OBJECT_FORMAT_WASM 1
27#elif defined(_AIX)
28# define _LIBCPP_OBJECT_FORMAT_XCOFF 1
29#else
30// ... add new file formats here ...
31#endif
32
33#if defined(__MVS__)
34# include <features.h> // for __NATIVE_ASCII_F
35#endif
36
37// Need to detect which libc we're using if we're on Linux.
38#if (defined(__linux__) || defined(__AMDGPU__) || defined(__NVPTX__)) && __has_include(<features.h>)
39# include <features.h>
40# if defined(__GLIBC_PREREQ)
41# define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b)
42# else
43# define _LIBCPP_GLIBC_PREREQ(a, b) 0
44# endif // defined(__GLIBC_PREREQ)
45#else
46# define _LIBCPP_GLIBC_PREREQ(a, b) 0
47#endif
48
49#ifndef __BYTE_ORDER__
50# error \
51 "Your compiler doesn't seem to define __BYTE_ORDER__, which is required by libc++ to know the endianness of your target platform"
52#endif
53
54#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
55# define _LIBCPP_LITTLE_ENDIAN
56#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
57# define _LIBCPP_BIG_ENDIAN
58#endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
59
60#endif // _LIBCPP___CONFIGURATION_PLATFORM_H
61