1 /*
2  * Copyright (c) 2010-2014 Wind River Systems, Inc.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_TOOLCHAIN_COMMON_H_
8 #define ZEPHYR_INCLUDE_TOOLCHAIN_COMMON_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  * @file
16  * @brief Common toolchain abstraction
17  *
18  * Macros to abstract compiler capabilities (common to all toolchains).
19  */
20 
21 /* Abstract use of extern keyword for compatibility between C and C++ */
22 #ifdef __cplusplus
23 #define EXTERN_C extern "C"
24 #else
25 #define EXTERN_C extern
26 #endif
27 
28 /* Use TASK_ENTRY_CPP to tag task entry points defined in C++ files. */
29 
30 #ifdef __cplusplus
31 #define TASK_ENTRY_CPP  extern "C"
32 #endif
33 
34 #ifndef ZRESTRICT
35 #ifndef __cplusplus
36 #define ZRESTRICT restrict
37 #else
38 #define ZRESTRICT
39 #endif
40 #endif
41 
42 /*
43  * Generate a reference to an external symbol.
44  * The reference indicates to the linker that the symbol is required
45  * by the module containing the reference and should be included
46  * in the image if the module is in the image.
47  *
48  * The assembler directive ".set" is used to define a local symbol.
49  * No memory is allocated, and the local symbol does not appear in
50  * the symbol table.
51  */
52 
53 #ifdef _ASMLANGUAGE
54   #define REQUIRES(sym) .set sym ## _Requires, sym
55 #else
56   #define REQUIRES(sym) __asm__ (".set " # sym "_Requires, " # sym "\n\t");
57 #endif
58 
59 #ifdef _ASMLANGUAGE
60   #define SECTION .section
61 #endif
62 
63 /*
64  * If the project is being built for speed (i.e. not for minimum size) then
65  * align functions and branches in executable sections to improve performance.
66  */
67 
68 #ifdef _ASMLANGUAGE
69 
70   #if defined(CONFIG_X86)
71 
72     #ifdef PERF_OPT
73       #define PERFOPT_ALIGN .balign 16
74     #else
75       #define PERFOPT_ALIGN .balign  1
76     #endif
77 
78   #elif defined(CONFIG_ARM) || defined(CONFIG_ARM64)
79 
80     #define PERFOPT_ALIGN .balign  4
81 
82   #elif defined(CONFIG_ARC)
83 
84     /* .align assembler directive is supposed by all ARC toolchains and it is
85      * implemented in a same way across ARC toolchains.
86      */
87     #define PERFOPT_ALIGN .align  4
88 
89   #elif defined(CONFIG_NIOS2) || defined(CONFIG_RISCV) || \
90 	  defined(CONFIG_XTENSA) || defined(CONFIG_MIPS)
91     #define PERFOPT_ALIGN .balign 4
92 
93   #elif defined(CONFIG_ARCH_POSIX)
94 
95   #elif defined(CONFIG_SPARC)
96 
97     #define PERFOPT_ALIGN .align  4
98 
99   #else
100 
101     #error Architecture unsupported
102 
103   #endif
104 
105   #define GC_SECTION(sym) SECTION .text.##sym, "ax"
106 
107 #endif /* _ASMLANGUAGE */
108 
109 /* force inlining a function */
110 
111 #if !defined(_ASMLANGUAGE)
112   #ifdef CONFIG_COVERAGE
113     /*
114      * The always_inline attribute forces a function to be inlined,
115      * even ignoring -fno-inline. So for code coverage, do not
116      * force inlining of these functions to keep their bodies around
117      * so their number of executions can be counted.
118      *
119      * Note that "inline" is kept here for kobject_hash.c and
120      * priv_stacks_hash.c. These are built without compiler flags
121      * used for coverage. ALWAYS_INLINE cannot be empty as compiler
122      * would complain about unused functions. Attaching unused
123      * attribute would result in their text sections balloon more than
124      * 10 times in size, as those functions are kept in text section.
125      * So just keep "inline" here.
126      */
127     #define ALWAYS_INLINE inline
128   #else
129     #define ALWAYS_INLINE inline __attribute__((always_inline))
130   #endif
131 #endif
132 
133 #define Z_STRINGIFY(x) #x
134 #define STRINGIFY(s) Z_STRINGIFY(s)
135 
136 /* concatenate the values of the arguments into one */
137 #define _DO_CONCAT(x, y) x ## y
138 #define _CONCAT(x, y) _DO_CONCAT(x, y)
139 
140 /* Additionally used as a sentinel by gen_syscalls.py to identify what
141  * functions are system calls
142  *
143  * Note POSIX unit tests don't still generate the system call stubs, so
144  * until https://github.com/zephyrproject-rtos/zephyr/issues/5006 is
145  * fixed via possibly #4174, we introduce this hack -- which will
146  * disallow us to test system calls in POSIX unit testing (currently
147  * not used).
148  */
149 #ifndef ZTEST_UNITTEST
150 #define __syscall static inline
151 #define __syscall_always_inline static inline __attribute__((always_inline))
152 #else
153 #define __syscall
154 #define __syscall_always_inline
155 #endif /* ZTEST_UNITTEST */
156 
157 /* Definitions for struct declaration tags. These are sentinel values used by
158  * parse_syscalls.py to gather a list of names of struct declarations that
159  * have these tags applied for them.
160  */
161 
162 /* Indicates this is a driver subsystem */
163 #define __subsystem
164 
165 /* Indicates this is a network socket object */
166 #define __net_socket
167 
168 #ifndef BUILD_ASSERT
169 /* Compile-time assertion that makes the build to fail.
170  * Common implementation swallows the message.
171  */
172 #define BUILD_ASSERT(EXPR, MSG...) \
173 	enum _CONCAT(__build_assert_enum, __COUNTER__) { \
174 		_CONCAT(__build_assert, __COUNTER__) = 1 / !!(EXPR) \
175 	}
176 #endif
177 
178 /*
179  * This is meant to be used in conjunction with __in_section() and similar
180  * where scattered structure instances are concatenated together by the linker
181  * and walked by the code at run time just like a contiguous array of such
182  * structures.
183  *
184  * Assemblers and linkers may insert alignment padding by default whose
185  * size is larger than the natural alignment for those structures when
186  * gathering various section segments together, messing up the array walk.
187  * To prevent this, we need to provide an explicit alignment not to rely
188  * on the default that might just work by luck.
189  *
190  * Alignment statements in  linker scripts are not sufficient as
191  * the assembler may add padding by itself to each segment when switching
192  * between sections within the same file even if it merges many such segments
193  * into a single section in the end.
194  */
195 #define Z_DECL_ALIGN(type) __aligned(__alignof(type)) type
196 
197 /* Check if a pointer is aligned for against a specific byte boundary  */
198 #define IS_PTR_ALIGNED_BYTES(ptr, bytes) ((((uintptr_t)ptr) % bytes) == 0)
199 
200 /* Check if a pointer is aligned enough for a particular data type. */
201 #define IS_PTR_ALIGNED(ptr, type) IS_PTR_ALIGNED_BYTES(ptr, __alignof(type))
202 
203 /** @brief Tag a symbol (e.g. function) to be kept in the binary even though it is not used.
204  *
205  * It prevents symbol from being removed by the linker garbage collector. It
206  * is achieved by adding a pointer to that symbol to the kept memory section.
207  *
208  * @param symbol Symbol to keep.
209  */
210 #define LINKER_KEEP(symbol) \
211 	static const void * const symbol##_ptr  __used \
212 	__attribute__((__section__(".symbol_to_keep"))) = (void *)&symbol
213 
214 #endif /* ZEPHYR_INCLUDE_TOOLCHAIN_COMMON_H_ */
215