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 #define TOOLCHAIN_WARNING_SIZEOF_ARRAY_DECAY "-Wsizeof-array-decay"
34 
35 #define TOOLCHAIN_DISABLE_CLANG_WARNING(warning) _TOOLCHAIN_DISABLE_WARNING(clang, warning)
36 #define TOOLCHAIN_ENABLE_CLANG_WARNING(warning)  _TOOLCHAIN_ENABLE_WARNING(clang, warning)
37 
38 /*
39  * Provide these definitions only when minimal libc is used.
40  * Avoid collision with defines from include/zephyr/toolchain/zephyr_stdint.h
41  */
42 #ifdef CONFIG_MINIMAL_LIBC
43 
44 #define __int_c(v, suffix) v ## suffix
45 #define int_c(v, suffix) __int_c(v, suffix)
46 #define uint_c(v, suffix) __int_c(v ## U, suffix)
47 
48 #ifndef CONFIG_ENFORCE_ZEPHYR_STDINT
49 
50 #ifdef __INT64_TYPE__
51 #undef __int_least64_c_suffix__
52 #undef __int_least32_c_suffix__
53 #undef __int_least16_c_suffix__
54 #undef __int_least8_c_suffix__
55 #ifdef __INT64_C_SUFFIX__
56 #define __int_least64_c_suffix__ __INT64_C_SUFFIX__
57 #define __int_least32_c_suffix__ __INT64_C_SUFFIX__
58 #define __int_least16_c_suffix__ __INT64_C_SUFFIX__
59 #define __int_least8_c_suffix__ __INT64_C_SUFFIX__
60 #endif /* __INT64_C_SUFFIX__ */
61 #endif /* __INT64_TYPE__ */
62 
63 #ifdef __INT_LEAST64_TYPE__
64 #ifdef __int_least64_c_suffix__
65 #define __INT64_C(x)	int_c(x, __int_least64_c_suffix__)
66 #define __UINT64_C(x)	uint_c(x, __int_least64_c_suffix__)
67 #else
68 #define __INT64_C(x)	x
69 #define __UINT64_C(x)	x ## U
70 #endif /* __int_least64_c_suffix__ */
71 #endif /* __INT_LEAST64_TYPE__ */
72 
73 #ifdef __INT32_TYPE__
74 #undef __int_least32_c_suffix__
75 #undef __int_least16_c_suffix__
76 #undef __int_least8_c_suffix__
77 #ifdef __INT32_C_SUFFIX__
78 #define __int_least32_c_suffix__ __INT32_C_SUFFIX__
79 #define __int_least16_c_suffix__ __INT32_C_SUFFIX__
80 #define __int_least8_c_suffix__ __INT32_C_SUFFIX__
81 #endif /* __INT32_C_SUFFIX__ */
82 #endif /* __INT32_TYPE__ */
83 
84 #ifdef __INT_LEAST32_TYPE__
85 #ifdef __int_least32_c_suffix__
86 #define __INT32_C(x)	int_c(x, __int_least32_c_suffix__)
87 #define __UINT32_C(x)	uint_c(x, __int_least32_c_suffix__)
88 #else
89 #define __INT32_C(x)	x
90 #define __UINT32_C(x)	x ## U
91 #endif /* __int_least32_c_suffix__ */
92 #endif /* __INT_LEAST32_TYPE__ */
93 
94 #endif /* !CONFIG_ENFORCE_ZEPHYR_STDINT */
95 
96 #ifdef __INT16_TYPE__
97 #undef __int_least16_c_suffix__
98 #undef __int_least8_c_suffix__
99 #ifdef __INT16_C_SUFFIX__
100 #define __int_least16_c_suffix__ __INT16_C_SUFFIX__
101 #define __int_least8_c_suffix__ __INT16_C_SUFFIX__
102 #endif /* __INT16_C_SUFFIX__ */
103 #endif /* __INT16_TYPE__ */
104 
105 #ifdef __INT_LEAST16_TYPE__
106 #ifdef __int_least16_c_suffix__
107 #define __INT16_C(x)	int_c(x, __int_least16_c_suffix__)
108 #define __UINT16_C(x)	uint_c(x, __int_least16_c_suffix__)
109 #else
110 #define __INT16_C(x)	x
111 #define __UINT16_C(x)	x ## U
112 #endif /* __int_least16_c_suffix__ */
113 #endif /* __INT_LEAST16_TYPE__ */
114 
115 #ifdef __INT8_TYPE__
116 #undef __int_least8_c_suffix__
117 #ifdef __INT8_C_SUFFIX__
118 #define __int_least8_c_suffix__ __INT8_C_SUFFIX__
119 #endif /* __INT8_C_SUFFIX__ */
120 #endif /* __INT8_TYPE__ */
121 
122 #ifdef __INT_LEAST8_TYPE__
123 #ifdef __int_least8_c_suffix__
124 #define __INT8_C(x)	int_c(x, __int_least8_c_suffix__)
125 #define __UINT8_C(x)	uint_c(x, __int_least8_c_suffix__)
126 #else
127 #define __INT8_C(x)	x
128 #define __UINT8_C(x)	x ## U
129 #endif /* __int_least8_c_suffix__ */
130 #endif /* __INT_LEAST8_TYPE__ */
131 
132 #define __INTMAX_C(x)	int_c(x, __INTMAX_C_SUFFIX__)
133 #define __UINTMAX_C(x)	int_c(x, __UINTMAX_C_SUFFIX__)
134 
135 #endif /* CONFIG_MINIMAL_LIBC */
136 
137 #endif /* ZEPHYR_INCLUDE_TOOLCHAIN_LLVM_H_ */
138