1 /* 2 * Copyright (c) 2017 Intel Corporation 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef ZEPHYR_INCLUDE_TOOLCHAIN_XCC_H_ 8 #define ZEPHYR_INCLUDE_TOOLCHAIN_XCC_H_ 9 10 /* toolchain/gcc.h errors out if __BYTE_ORDER__ cannot be determined 11 * there. However, __BYTE_ORDER__ is actually being defined later in 12 * this file. So define __BYTE_ORDER__ to skip the check in gcc.h 13 * and undefine after including gcc.h. 14 * 15 * Clang has it defined so there is no need to work around. 16 */ 17 #ifndef __clang__ 18 #define __BYTE_ORDER__ 19 #endif 20 21 #include <toolchain/gcc.h> 22 23 #ifndef __clang__ 24 #undef __BYTE_ORDER__ 25 #endif 26 27 #include <stdbool.h> 28 29 #ifndef __INT8_C 30 #define __INT8_C(x) x 31 #endif 32 33 #ifndef INT8_C 34 #define INT8_C(x) __INT8_C(x) 35 #endif 36 37 #ifndef __UINT8_C 38 #define __UINT8_C(x) x ## U 39 #endif 40 41 #ifndef UINT8_C 42 #define UINT8_C(x) __UINT8_C(x) 43 #endif 44 45 #ifndef __INT16_C 46 #define __INT16_C(x) x 47 #endif 48 49 #ifndef INT16_C 50 #define INT16_C(x) __INT16_C(x) 51 #endif 52 53 #ifndef __UINT16_C 54 #define __UINT16_C(x) x ## U 55 #endif 56 57 #ifndef UINT16_C 58 #define UINT16_C(x) __UINT16_C(x) 59 #endif 60 61 #ifndef __INT32_C 62 #define __INT32_C(x) x 63 #endif 64 65 #ifndef INT32_C 66 #define INT32_C(x) __INT32_C(x) 67 #endif 68 69 #ifndef __UINT32_C 70 #define __UINT32_C(x) x ## U 71 #endif 72 73 #ifndef UINT32_C 74 #define UINT32_C(x) __UINT32_C(x) 75 #endif 76 77 #ifndef __INT64_C 78 #define __INT64_C(x) x 79 #endif 80 81 #ifndef INT64_C 82 #define INT64_C(x) __INT64_C(x) 83 #endif 84 85 #ifndef __UINT64_C 86 #define __UINT64_C(x) x ## ULL 87 #endif 88 89 #ifndef UINT64_C 90 #define UINT64_C(x) __UINT64_C(x) 91 #endif 92 93 #ifndef __INTMAX_C 94 #define __INTMAX_C(x) x 95 #endif 96 97 #ifndef INTMAX_C 98 #define INTMAX_C(x) __INTMAX_C(x) 99 #endif 100 101 #ifndef __UINTMAX_C 102 #define __UINTMAX_C(x) x ## ULL 103 #endif 104 105 #ifndef UINTMAX_C 106 #define UINTMAX_C(x) __UINTMAX_C(x) 107 #endif 108 109 #ifndef __COUNTER__ 110 /* XCC (GCC-based compiler) doesn't support __COUNTER__ 111 * but this should be good enough 112 */ 113 #define __COUNTER__ __LINE__ 114 #endif 115 116 #undef __in_section_unique 117 #define __in_section_unique(seg) \ 118 __attribute__((section("." STRINGIFY(seg) "." STRINGIFY(__COUNTER__)))) 119 120 #undef __in_section_unique_named 121 #define __in_section_unique_named(seg, name) \ 122 __attribute__((section("." STRINGIFY(seg) \ 123 "." STRINGIFY(__COUNTER__) \ 124 "." STRINGIFY(name)))) 125 126 #ifndef __GCC_LINKER_CMD__ 127 #include <xtensa/config/core.h> 128 129 /* 130 * XCC does not define the following macros with the expected names, but the 131 * HAL defines similar ones. Thus we include it and define the missing macros 132 * ourselves. 133 */ 134 #if XCHAL_MEMORY_ORDER == XTHAL_BIGENDIAN 135 #define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__ 136 #elif XCHAL_MEMORY_ORDER == XTHAL_LITTLEENDIAN 137 #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ 138 #else 139 #error "Cannot determine __BYTE_ORDER__" 140 #endif 141 142 #endif /* __GCC_LINKER_CMD__ */ 143 144 #define __builtin_unreachable() do { __ASSERT(false, "Unreachable code"); } \ 145 while (true) 146 147 #ifdef __deprecated 148 /* 149 * XCC does not support using deprecated attribute in enum, 150 * so just nullify it here to avoid compilation errors. 151 */ 152 #undef __deprecated 153 #define __deprecated 154 #endif 155 156 #endif 157