Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
common.h
Go to the documentation of this file.
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_
16/* Abstract use of extern keyword for compatibility between C and C++ */
17#ifdef __cplusplus
18#define EXTERN_C extern "C"
19#else
20#define EXTERN_C extern
21#endif
22
23/* Use TASK_ENTRY_CPP to tag task entry points defined in C++ files. */
24
25#ifdef __cplusplus
26#define TASK_ENTRY_CPP extern "C"
27#endif
28
29/*
30 * Generate a reference to an external symbol.
31 * The reference indicates to the linker that the symbol is required
32 * by the module containing the reference and should be included
33 * in the image if the module is in the image.
34 *
35 * The assembler directive ".set" is used to define a local symbol.
36 * No memory is allocated, and the local symbol does not appear in
37 * the symbol table.
38 */
39
40#ifdef _ASMLANGUAGE
41 #define REQUIRES(sym) .set sym ## _Requires, sym
42#else
43 #define REQUIRES(sym) __asm__ (".set " # sym "_Requires, " # sym "\n\t");
44#endif
45
46#ifdef _ASMLANGUAGE
47 #define SECTION .section
48#endif
49
50/*
51 * If the project is being built for speed (i.e. not for minimum size) then
52 * align functions and branches in executable sections to improve performance.
53 */
54
55#ifdef _ASMLANGUAGE
56
57 #if defined(CONFIG_X86)
58
59 #ifdef PERF_OPT
60 #define PERFOPT_ALIGN .balign 16
61 #else
62 #define PERFOPT_ALIGN .balign 1
63 #endif
64
65 #elif defined(CONFIG_ARM) || defined(CONFIG_ARM64)
66
67 #define PERFOPT_ALIGN .balign 4
68
69 #elif defined(CONFIG_ARC)
70
71 /* .align assembler directive is supposed by all ARC toolchains and it is
72 * implemented in a same way across ARC toolchains.
73 */
74 #define PERFOPT_ALIGN .align 4
75
76 #elif defined(CONFIG_NIOS2) || defined(CONFIG_RISCV) || \
77 defined(CONFIG_XTENSA)
78 #define PERFOPT_ALIGN .balign 4
79
80 #elif defined(CONFIG_ARCH_POSIX)
81
82 #elif defined(CONFIG_SPARC)
83
84 #define PERFOPT_ALIGN .align 4
85
86 #else
87
88 #error Architecture unsupported
89
90 #endif
91
92 #define GC_SECTION(sym) SECTION .text.##sym, "ax"
93
94#endif /* _ASMLANGUAGE */
95
96/* force inlining a function */
97
98#if !defined(_ASMLANGUAGE)
99 #ifdef CONFIG_COVERAGE
100 /*
101 * The always_inline attribute forces a function to be inlined,
102 * even ignoring -fno-inline. So for code coverage, do not
103 * force inlining of these functions to keep their bodies around
104 * so their number of executions can be counted.
105 *
106 * Note that "inline" is kept here for kobject_hash.c and
107 * priv_stacks_hash.c. These are built without compiler flags
108 * used for coverage. ALWAYS_INLINE cannot be empty as compiler
109 * would complain about unused functions. Attaching unused
110 * attribute would result in their text sections balloon more than
111 * 10 times in size, as those functions are kept in text section.
112 * So just keep "inline" here.
113 */
114 #define ALWAYS_INLINE inline
115 #else
116 #define ALWAYS_INLINE inline __attribute__((always_inline))
117 #endif
118#endif
119
120#define Z_STRINGIFY(x) #x
121#define STRINGIFY(s) Z_STRINGIFY(s)
122
123/* concatenate the values of the arguments into one */
124#define _DO_CONCAT(x, y) x ## y
125#define _CONCAT(x, y) _DO_CONCAT(x, y)
126
127/* Additionally used as a sentinel by gen_syscalls.py to identify what
128 * functions are system calls
129 *
130 * Note POSIX unit tests don't still generate the system call stubs, so
131 * until https://github.com/zephyrproject-rtos/zephyr/issues/5006 is
132 * fixed via possibly #4174, we introduce this hack -- which will
133 * disallow us to test system calls in POSIX unit testing (currently
134 * not used).
135 */
136#ifndef ZTEST_UNITTEST
137#define __syscall static inline
138#else
139#define __syscall
140#endif /* ZTEST_UNITTEST */
141
142/* Definitions for struct declaration tags. These are sentinel values used by
143 * parse_syscalls.py to gather a list of names of struct declarations that
144 * have these tags applied for them.
145 */
146
147/* Indicates this is a driver subsystem */
148#define __subsystem
149
150/* Indicates this is a network socket object */
151#define __net_socket
152
153#ifndef BUILD_ASSERT
154/* Compile-time assertion that makes the build to fail.
155 * Common implementation swallows the message.
156 */
157#define BUILD_ASSERT(EXPR, MSG...) \
158 enum _CONCAT(__build_assert_enum, __COUNTER__) { \
159 _CONCAT(__build_assert, __COUNTER__) = 1 / !!(EXPR) \
160 }
161#endif
162
163/*
164 * This is meant to be used in conjunction with __in_section() and similar
165 * where scattered structure instances are concatenated together by the linker
166 * and walked by the code at run time just like a contiguous array of such
167 * structures.
168 *
169 * Assemblers and linkers may insert alignment padding by default whose
170 * size is larger than the natural alignment for those structures when
171 * gathering various section segments together, messing up the array walk.
172 * To prevent this, we need to provide an explicit alignment not to rely
173 * on the default that might just work by luck.
174 *
175 * Alignment statements in linker scripts are not sufficient as
176 * the assembler may add padding by itself to each segment when switching
177 * between sections within the same file even if it merges many such segments
178 * into a single section in the end.
179 */
180#define Z_DECL_ALIGN(type) __aligned(__alignof(type)) type
181
199#define STRUCT_SECTION_ITERABLE(struct_type, name) \
200 Z_DECL_ALIGN(struct struct_type) name \
201 __in_section(_##struct_type, static, name) __used
202
203#define Z_STRUCT_SECTION_ITERABLE(struct_type, name) \
204 __DEPRECATED_MACRO \
205 STRUCT_SECTION_ITERABLE(struct_type, name)
206
215#define STRUCT_SECTION_ITERABLE_ALTERNATE(out_type, struct_type, name) \
216 Z_DECL_ALIGN(struct struct_type) name \
217 __in_section(_##out_type, static, name) __used
218
219#define Z_STRUCT_SECTION_ITERABLE_ALTERNATE(out_type, struct_type, name) \
220 __DEPRECATED_MACRO \
221 STRUCT_SECTION_ITERABLE_ALTERNATE(out_type, struct_type, name)
222
233#define STRUCT_SECTION_FOREACH(struct_type, iterator) \
234 extern struct struct_type _CONCAT(_##struct_type, _list_start)[]; \
235 extern struct struct_type _CONCAT(_##struct_type, _list_end)[]; \
236 for (struct struct_type *iterator = \
237 _CONCAT(_##struct_type, _list_start); \
238 ({ __ASSERT(iterator <= _CONCAT(_##struct_type, _list_end), \
239 "unexpected list end location"); \
240 iterator < _CONCAT(_##struct_type, _list_end); }); \
241 iterator++)
242
243#define Z_STRUCT_SECTION_FOREACH(struct_type, iterator) \
244 __DEPRECATED_MACRO \
245 STRUCT_SECTION_FOREACH(struct_type, iterator)
246 /* end of struct_section_apis */
250
251#define LOG2CEIL(x) \
252 ((((x) <= 4) ? 2 : (((x) <= 8) ? 3 : (((x) <= 16) ? \
253 4 : (((x) <= 32) ? 5 : (((x) <= 64) ? 6 : (((x) <= 128) ? \
254 7 : (((x) <= 256) ? 8 : (((x) <= 512) ? 9 : (((x) <= 1024) ? \
255 10 : (((x) <= 2048) ? 11 : (((x) <= 4096) ? 12 : (((x) <= 8192) ? \
256 13 : (((x) <= 16384) ? 14 : (((x) <= 32768) ? 15:(((x) <= 65536) ? \
257 16 : (((x) <= 131072) ? 17 : (((x) <= 262144) ? 18:(((x) <= 524288) ? \
258 19 : (((x) <= 1048576) ? 20 : (((x) <= 2097152) ? \
259 21 : (((x) <= 4194304) ? 22 : (((x) <= 8388608) ? \
260 23 : (((x) <= 16777216) ? 24 : (((x) <= 33554432) ? \
261 25 : (((x) <= 67108864) ? 26 : (((x) <= 134217728) ? \
262 27 : (((x) <= 268435456) ? 28 : (((x) <= 536870912) ? \
263 29 : (((x) <= 1073741824) ? 30 : (((x) <= 2147483648) ? \
264 31 : 32)))))))))))))))))))))))))))))))
265
266#endif /* ZEPHYR_INCLUDE_TOOLCHAIN_COMMON_H_ */