source: rtems/cpukit/score/include/rtems/score/basedefs.h @ d885b2b2

4.115
Last change on this file since d885b2b2 was 80ad7090, checked in by Pavel Pisa <pisa@…>, on 09/08/14 at 12:13:31

score: More strict RTEMS_DEQUALIFY implementation.

This implementation is able to catch cast to type
which differs not only in qualifiers. The error
diagnostic message when used in function is self
descriptive. Macro is compatible with used in initializers
but there message about not constant initial value
signals types incompatibility.

The actual implementation does not distinguish between
volatile and const removal.

  • Property mode set to 100644
File size: 8.9 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup Score
5 *
6 * @brief Basic Definitions
7 */
8
9/*
10 *  COPYRIGHT (c) 1989-2007.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  Copyright (c) 2010 embedded brains GmbH.
14 *
15 *  The license and distribution terms for this file may be
16 *  found in the file LICENSE in this distribution or at
17 *  http://www.rtems.org/license/LICENSE.
18 */
19
20#ifndef _RTEMS_BASEDEFS_H
21#define _RTEMS_BASEDEFS_H
22
23/**
24 *  @defgroup ScoreBaseDefs Basic Definitions
25 *
26 *  @ingroup Score
27 */
28/**@{*/
29
30#include <rtems/score/cpuopts.h>
31
32#ifndef ASM
33  #include <stddef.h>
34  #include <stdbool.h>
35  #include <stdint.h>
36
37  /*
38   * FIXME: This include should not be present.  In older RTEMS versions
39   * <rtems.h> provided <limits.h> indirectly.  This include is here to not
40   * break application source files that relied on this accidentally.
41   */
42  #include <limits.h>
43
44  /*
45   * FIXME: This include should not be present.  In older RTEMS versions
46   * <rtems.h> provided <string.h> indirectly.  This include is here to not
47   * break application source files that relied on this accidentally.
48   */
49  #include <string.h>
50#endif
51
52#ifndef TRUE
53  /**
54   *  This ensures that RTEMS has TRUE defined in all situations.
55   */
56  #define TRUE 1
57#endif
58
59#ifndef FALSE
60  /**
61   *  This ensures that RTEMS has FALSE defined in all situations.
62   */
63  #define FALSE 0
64#endif
65
66#if TRUE == FALSE
67  #error "TRUE equals FALSE"
68#endif
69
70/**
71 *  The following ensures that all data is declared in the space
72 *  of the initialization routine for either the Initialization Manager
73 *  or the initialization file for the appropriate API.  It is
74 *  referenced as "external" in every other file.
75 */
76#ifdef SCORE_INIT
77  #undef  SCORE_EXTERN
78  #define SCORE_EXTERN
79#else
80  #undef  SCORE_EXTERN
81  #define SCORE_EXTERN  extern
82#endif
83
84/**
85 *  The following ensures that all data is declared in the space
86 *  of the initialization routine for either the Initialization Manager
87 *  or the initialization file for the appropriate API.  It is
88 *  referenced as "external" in every other file.
89 */
90#ifdef SAPI_INIT
91  #undef  SAPI_EXTERN
92  #define SAPI_EXTERN
93#else
94  #undef  SAPI_EXTERN
95  #define SAPI_EXTERN  extern
96#endif
97
98/**
99 *  The following ensures that all data is declared in the space
100 *  of the initialization routine for either the Initialization Manager
101 *  or the initialization file for the appropriate API.  It is
102 *  referenced as "external" in every other file.
103 */
104#ifdef RTEMS_API_INIT
105  #undef  RTEMS_EXTERN
106  #define RTEMS_EXTERN
107#else
108  #undef  RTEMS_EXTERN
109  #define RTEMS_EXTERN  extern
110#endif
111
112/**
113 *  The following ensures that all data is declared in the space
114 *  of the initialization routine for either the Initialization Manager
115 *  or the initialization file for the appropriate API.  It is
116 *  referenced as "external" in every other file.
117 */
118#ifdef POSIX_API_INIT
119  #undef  POSIX_EXTERN
120  #define POSIX_EXTERN
121#else
122  #undef  POSIX_EXTERN
123  #define POSIX_EXTERN  extern
124#endif
125
126/**
127 *  The following (in conjunction with compiler arguments) are used
128 *  to choose between the use of static inline functions and macro
129 *  functions.   The static inline implementation allows better
130 *  type checking with no cost in code size or execution speed.
131 */
132#ifdef __GNUC__
133  #define RTEMS_INLINE_ROUTINE static __inline__
134#else
135  #define RTEMS_INLINE_ROUTINE static inline
136#endif
137
138/**
139 *  The following macro is a compiler specific way to ensure that memory
140 *  writes are not reordered around certian points.  This specifically can
141 *  impact interrupt disable and thread dispatching critical sections.
142 */
143#ifdef __GNUC__
144  #define RTEMS_COMPILER_MEMORY_BARRIER() __asm__ volatile("" ::: "memory")
145#else
146  #define RTEMS_COMPILER_MEMORY_BARRIER()
147#endif
148
149/**
150 *  The following macro is a compiler specific way to indicate that
151 *  the method will NOT return to the caller.  This can assist the
152 *  compiler in code generation and avoid unreachable paths.  This
153 *  can impact the code generated following calls to
154 *  rtems_fatal_error_occurred and _Terminate.
155 */
156#if defined(RTEMS_SCHEDSIM)
157  #define RTEMS_COMPILER_NO_RETURN_ATTRIBUTE
158#elif defined(__GNUC__)
159  #define RTEMS_COMPILER_NO_RETURN_ATTRIBUTE \
160      __attribute__ ((noreturn))
161#else
162  #define RTEMS_COMPILER_NO_RETURN_ATTRIBUTE
163#endif
164
165/**
166 *  The following defines a compiler specific attribute which informs
167 *  the compiler that the method has no effect except the return value
168 *  and that the return value depends only on parameters and/or global
169 *  variables.
170 */
171#ifdef __GNUC__
172  #define RTEMS_COMPILER_PURE_ATTRIBUTE \
173     __attribute__ ((pure))
174#else
175  #define RTEMS_COMPILER_PURE_ATTRIBUTE
176#endif
177
178/**
179 *  Instructs the compiler to issue a warning whenever a variable or function
180 *  with this attribute will be used.
181 */
182#ifdef __GNUC__
183  #define RTEMS_COMPILER_DEPRECATED_ATTRIBUTE \
184     __attribute__ ((deprecated))
185#else
186  #define RTEMS_COMPILER_DEPRECATED_ATTRIBUTE
187#endif
188
189/**
190 *  Instructs the compiler that a specific variable is deliberately unused.
191 *  This can occur when reading volatile device memory or skipping arguments
192 *  in a variable argument method.
193 */
194#if defined(__GNUC__)
195  #define RTEMS_COMPILER_UNUSED_ATTRIBUTE __attribute__((unused))
196#else
197  #define RTEMS_COMPILER_UNUSED_ATTRIBUTE
198#endif
199
200#if __cplusplus >= 201103L
201  #define RTEMS_STATIC_ASSERT(cond, msg) \
202    static_assert(cond, # msg)
203#elif __STDC_VERSION__ >= 201112L
204  #define RTEMS_STATIC_ASSERT(cond, msg) \
205    _Static_assert(cond, # msg)
206#else
207  #define RTEMS_STATIC_ASSERT(cond, msg) \
208    typedef int rtems_static_assert_ ## msg [(cond) ? 1 : -1]
209#endif
210
211#define RTEMS_ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
212
213/*
214 * Zero-length arrays are valid in C99 as flexible array members.  C++11
215 * doesn't allow flexible array members.  Use the GNU extension which is also
216 * supported by other compilers.
217 */
218#define RTEMS_ZERO_LENGTH_ARRAY 0
219
220/**
221 * @brief Returns a pointer to the container of a specified member pointer.
222 *
223 * @param[in] _m The pointer to a member of the container.
224 * @param[in] _type The type of the container.
225 * @param[in] _member_name The designator name of the container member.
226 */
227#define RTEMS_CONTAINER_OF( _m, _type, _member_name ) \
228  ( (_type *) ( (uintptr_t) ( _m ) - offsetof( _type, _member_name ) ) )
229
230#ifdef __cplusplus
231#define RTEMS_DEQUALIFY_DEPTHX( _ptr_level, _type, _var ) \
232            (const_cast<_type>( _var ))
233#else /* Standard C code */
234
235/* The reference type idea based on libHX by Jan Engelhardt */
236#define RTEMS_TYPEOF_REFX(_ptr_level, _ptr_type) \
237  typeof(_ptr_level(union { int z; typeof(_ptr_type) x; }){0}.x)
238
239#if defined(__GNUC__) && !defined(ASM)
240#if  ((__GNUC__ * 1000 + __GNUC_MINOR__) >= 4004)
241extern void* RTEMS_DEQUALIFY_types_not_compatible(void)
242  __attribute__((error ("RTEMS_DEQUALIFY types differ not only by volatile and const")));
243#else
244extern void RTEMS_DEQUALIFY_types_not_compatible(void);
245#endif
246#define RTEMS_DEQUALIFY_DEPTHX( _ptr_level, _type, _var ) ( \
247    __builtin_choose_expr( __builtin_types_compatible_p ( \
248        RTEMS_TYPEOF_REFX( _ptr_level, _var ), \
249        RTEMS_TYPEOF_REFX( _ptr_level, _type ) \
250      ) || __builtin_types_compatible_p ( _type, void * ), \
251    (_type)(_var), \
252    RTEMS_DEQUALIFY_types_not_compatible() \
253  ) \
254)
255#endif /*__GNUC__*/
256#endif /*__cplusplus*/
257
258#ifndef RTEMS_DECONST
259#ifdef RTEMS_DEQUALIFY_DEPTHX
260#define RTEMS_DECONST( _type, _var ) \
261  RTEMS_DEQUALIFY_DEPTHX( *, _type, _var )
262#else /*RTEMS_DEQUALIFY_DEPTHX*/
263/**
264 * @brief Removes the const qualifier from a type of a variable.
265 *
266 * @param[in] _type The target type for the variable.
267 * @param[in] _var The variable.
268 */
269#define RTEMS_DECONST( _type, _var ) \
270  ((_type)(uintptr_t)(const void *) ( _var ))
271
272#endif /*RTEMS_DEQUALIFY_DEPTHX*/
273#endif /*RTEMS_DECONST*/
274
275#ifndef RTEMS_DEVOLATILE
276#ifdef RTEMS_DEQUALIFY_DEPTHX
277#define RTEMS_DEVOLATILE( _type, _var ) \
278  RTEMS_DEQUALIFY_DEPTHX( *, _type, _var )
279#else /*RTEMS_DEQUALIFY_DEPTHX*/
280/**
281 * @brief Removes the volatile qualifier from a type of a variable.
282 *
283 * @param[in] _type The target type for the variable.
284 * @param[in] _var The variable.
285 */
286#define RTEMS_DEVOLATILE( _type, _var ) \
287  ((_type)(uintptr_t)(volatile void *) ( _var ))
288
289#endif /*RTEMS_DEQUALIFY_DEPTHX*/
290#endif /*RTEMS_DEVOLATILE*/
291
292#ifndef RTEMS_DEQUALIFY
293#ifdef RTEMS_DEQUALIFY_DEPTHX
294#define RTEMS_DEQUALIFY( _type, _var ) \
295  RTEMS_DEQUALIFY_DEPTHX( *, _type, _var )
296#else /*RTEMS_DEQUALIFY_DEPTHX*/
297/**
298 * @brief Removes the all qualifiers from a type of a variable.
299 *
300 * @param[in] _type The target type for the variable.
301 * @param[in] _var The variable.
302 */
303#define RTEMS_DEQUALIFY( _type, _var ) \
304  ((_type)(uintptr_t)(const volatile void *) ( _var ))
305
306#endif /*RTEMS_DEQUALIFY_DEPTHX*/
307#endif /*RTEMS_DEQUALIFY*/
308
309#ifndef ASM
310  #ifdef RTEMS_DEPRECATED_TYPES
311    typedef bool boolean;
312    typedef float single_precision;
313    typedef double double_precision;
314  #endif
315
316  /**
317   * XXX: Eventually proc_ptr needs to disappear!!!
318   */
319  typedef void * proc_ptr;
320#endif
321
322/**@}*/
323
324#endif /* _RTEMS_BASEDEFS_H */
Note: See TracBrowser for help on using the repository browser.