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