Zephyr API 3.6.99
Loading...
Searching...
No Matches
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_
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
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
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_ */