blob: 6d2587d022e33f532da22f6fffef1e52316759ba [file] [log] [blame]
Daniel Dunbar4467b652009-10-27 17:48:46 +00001/* ===-- endianness.h - configuration header for compiler-rt ---------------===
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +00002 *
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 *
Daniel Dunbar4467b652009-10-27 17:48:46 +000010 * This file is a configuration header for compiler-rt.
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000011 * This file is not part of the interface of this library.
12 *
13 * ===----------------------------------------------------------------------===
14 */
15
16#ifndef ENDIANNESS_H
17#define ENDIANNESS_H
18
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000019/*
20 * Known limitations:
21 * Middle endian systems are not handled currently.
22 */
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000023
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000024#if defined(__SVR4) && defined(__sun)
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000025#include <sys/byteorder.h>
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000026
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000027#if _BYTE_ORDER == _BIG_ENDIAN
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000028#define _YUGA_LITTLE_ENDIAN 0
29#define _YUGA_BIG_ENDIAN 1
30#elif _BYTE_ORDER == _LITTLE_ENDIAN
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000031#define _YUGA_LITTLE_ENDIAN 1
32#define _YUGA_BIG_ENDIAN 0
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000033#endif /* _BYTE_ORDER */
34
35#endif /* Solaris and AuroraUX. */
36
37/* .. */
38
Edward O'Callaghanc8a260c2009-11-01 18:25:55 +000039#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000040#include <sys/endian.h>
41
42#if _BYTE_ORDER == _BIG_ENDIAN
43#define _YUGA_LITTLE_ENDIAN 0
44#define _YUGA_BIG_ENDIAN 1
45#elif _BYTE_ORDER == _LITTLE_ENDIAN
46#define _YUGA_LITTLE_ENDIAN 1
47#define _YUGA_BIG_ENDIAN 0
48#endif /* _BYTE_ORDER */
49
50#endif /* *BSD */
51
52/* .. */
53
54/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the compiler (at least with GCC) */
Edward O'Callaghane8178e22009-08-18 11:54:44 +000055#if defined(__APPLE__) && defined(__MACH__) || defined(__ellcc__ )
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000056
57#ifdef __BIG_ENDIAN__
58#if __BIG_ENDIAN__
59#define _YUGA_LITTLE_ENDIAN 0
60#define _YUGA_BIG_ENDIAN 1
61#endif
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000062#endif /* __BIG_ENDIAN__ */
63
64#ifdef __LITTLE_ENDIAN__
65#if __LITTLE_ENDIAN__
66#define _YUGA_LITTLE_ENDIAN 1
67#define _YUGA_BIG_ENDIAN 0
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000068#endif
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000069#endif /* __LITTLE_ENDIAN__ */
70
71#endif /* Mac OSX */
72
73/* .. */
74
Nuno Lopes166b7832009-08-09 18:59:21 +000075#if defined(__linux__)
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000076#include <endian.h>
77
78#if __BYTE_ORDER == __BIG_ENDIAN
79#define _YUGA_LITTLE_ENDIAN 0
80#define _YUGA_BIG_ENDIAN 1
81#elif __BYTE_ORDER == __LITTLE_ENDIAN
82#define _YUGA_LITTLE_ENDIAN 1
83#define _YUGA_BIG_ENDIAN 0
84#endif /* __BYTE_ORDER */
85
86#endif /* GNU/Linux */
87
88/* . */
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000089
90#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN)
Edward O'Callaghanbb119a42009-08-08 02:31:50 +000091#error Unable to determine endian
92#endif /* Check we found an endianness correctly. */
Edward O'Callaghan1fcb40b2009-08-05 19:06:50 +000093
94#endif /* ENDIANNESS_H */