Zephyr API Documentation
4.0.0
A Scalable Open Source RTOS
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_ */
zephyr
toolchain
common.h
Generated on Sat Nov 16 2024 04:55:04 for Zephyr API Documentation by
1.12.0