1 /*
2  * Copyright (c) 2021 Intel Corporation.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_TOOLCHAIN_LLVM_H_
8 #define ZEPHYR_INCLUDE_TOOLCHAIN_LLVM_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 #define __no_optimization __attribute__((optnone))
15 
16 #if __clang_major__ >= 10
17 #define __fallthrough __attribute__((fallthrough))
18 #endif
19 
20 #define TOOLCHAIN_CLANG_VERSION \
21 	((__clang_major__ * 10000) + (__clang_minor__ * 100) + \
22 	  __clang_patchlevel__)
23 
24 #define TOOLCHAIN_HAS_PRAGMA_DIAG 1
25 
26 #if TOOLCHAIN_CLANG_VERSION >= 30800
27 #define TOOLCHAIN_HAS_C_GENERIC 1
28 #define TOOLCHAIN_HAS_C_AUTO_TYPE 1
29 #endif
30 
31 #include <zephyr/toolchain/gcc.h>
32 
33 /*
34  * Provide these definitions only when minimal libc is used.
35  * Avoid collision with defines from include/zephyr/toolchain/zephyr_stdint.h
36  */
37 #ifdef CONFIG_MINIMAL_LIBC
38 
39 #define __int_c(v, suffix) v ## suffix
40 #define int_c(v, suffix) __int_c(v, suffix)
41 #define uint_c(v, suffix) __int_c(v ## U, suffix)
42 
43 #ifndef CONFIG_ENFORCE_ZEPHYR_STDINT
44 
45 #ifdef __INT64_TYPE__
46 #undef __int_least64_c_suffix__
47 #undef __int_least32_c_suffix__
48 #undef __int_least16_c_suffix__
49 #undef __int_least8_c_suffix__
50 #ifdef __INT64_C_SUFFIX__
51 #define __int_least64_c_suffix__ __INT64_C_SUFFIX__
52 #define __int_least32_c_suffix__ __INT64_C_SUFFIX__
53 #define __int_least16_c_suffix__ __INT64_C_SUFFIX__
54 #define __int_least8_c_suffix__ __INT64_C_SUFFIX__
55 #endif /* __INT64_C_SUFFIX__ */
56 #endif /* __INT64_TYPE__ */
57 
58 #ifdef __INT_LEAST64_TYPE__
59 #ifdef __int_least64_c_suffix__
60 #define __INT64_C(x)	int_c(x, __int_least64_c_suffix__)
61 #define __UINT64_C(x)	uint_c(x, __int_least64_c_suffix__)
62 #else
63 #define __INT64_C(x)	x
64 #define __UINT64_C(x)	x ## U
65 #endif /* __int_least64_c_suffix__ */
66 #endif /* __INT_LEAST64_TYPE__ */
67 
68 #ifdef __INT32_TYPE__
69 #undef __int_least32_c_suffix__
70 #undef __int_least16_c_suffix__
71 #undef __int_least8_c_suffix__
72 #ifdef __INT32_C_SUFFIX__
73 #define __int_least32_c_suffix__ __INT32_C_SUFFIX__
74 #define __int_least16_c_suffix__ __INT32_C_SUFFIX__
75 #define __int_least8_c_suffix__ __INT32_C_SUFFIX__
76 #endif /* __INT32_C_SUFFIX__ */
77 #endif /* __INT32_TYPE__ */
78 
79 #ifdef __INT_LEAST32_TYPE__
80 #ifdef __int_least32_c_suffix__
81 #define __INT32_C(x)	int_c(x, __int_least32_c_suffix__)
82 #define __UINT32_C(x)	uint_c(x, __int_least32_c_suffix__)
83 #else
84 #define __INT32_C(x)	x
85 #define __UINT32_C(x)	x ## U
86 #endif /* __int_least32_c_suffix__ */
87 #endif /* __INT_LEAST32_TYPE__ */
88 
89 #endif /* !CONFIG_ENFORCE_ZEPHYR_STDINT */
90 
91 #ifdef __INT16_TYPE__
92 #undef __int_least16_c_suffix__
93 #undef __int_least8_c_suffix__
94 #ifdef __INT16_C_SUFFIX__
95 #define __int_least16_c_suffix__ __INT16_C_SUFFIX__
96 #define __int_least8_c_suffix__ __INT16_C_SUFFIX__
97 #endif /* __INT16_C_SUFFIX__ */
98 #endif /* __INT16_TYPE__ */
99 
100 #ifdef __INT_LEAST16_TYPE__
101 #ifdef __int_least16_c_suffix__
102 #define __INT16_C(x)	int_c(x, __int_least16_c_suffix__)
103 #define __UINT16_C(x)	uint_c(x, __int_least16_c_suffix__)
104 #else
105 #define __INT16_C(x)	x
106 #define __UINT16_C(x)	x ## U
107 #endif /* __int_least16_c_suffix__ */
108 #endif /* __INT_LEAST16_TYPE__ */
109 
110 #ifdef __INT8_TYPE__
111 #undef __int_least8_c_suffix__
112 #ifdef __INT8_C_SUFFIX__
113 #define __int_least8_c_suffix__ __INT8_C_SUFFIX__
114 #endif /* __INT8_C_SUFFIX__ */
115 #endif /* __INT8_TYPE__ */
116 
117 #ifdef __INT_LEAST8_TYPE__
118 #ifdef __int_least8_c_suffix__
119 #define __INT8_C(x)	int_c(x, __int_least8_c_suffix__)
120 #define __UINT8_C(x)	uint_c(x, __int_least8_c_suffix__)
121 #else
122 #define __INT8_C(x)	x
123 #define __UINT8_C(x)	x ## U
124 #endif /* __int_least8_c_suffix__ */
125 #endif /* __INT_LEAST8_TYPE__ */
126 
127 #define __INTMAX_C(x)	int_c(x, __INTMAX_C_SUFFIX__)
128 #define __UINTMAX_C(x)	int_c(x, __UINTMAX_C_SUFFIX__)
129 
130 #endif /* CONFIG_MINIMAL_LIBC */
131 
132 #endif /* ZEPHYR_INCLUDE_TOOLCHAIN_LLVM_H_ */
133