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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #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 #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
163