Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
mbed_toolchain.h
00001 00002 /** \addtogroup platform */ 00003 /** @{*/ 00004 /* mbed Microcontroller Library 00005 * Copyright (c) 2006-2013 ARM Limited 00006 * 00007 * Licensed under the Apache License, Version 2.0 (the "License"); 00008 * you may not use this file except in compliance with the License. 00009 * You may obtain a copy of the License at 00010 * 00011 * http://www.apache.org/licenses/LICENSE-2.0 00012 * 00013 * Unless required by applicable law or agreed to in writing, software 00014 * distributed under the License is distributed on an "AS IS" BASIS, 00015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00016 * See the License for the specific language governing permissions and 00017 * limitations under the License. 00018 */ 00019 #ifndef MBED_TOOLCHAIN_H 00020 #define MBED_TOOLCHAIN_H 00021 00022 #include "mbed_preprocessor.h" 00023 00024 00025 // Warning for unsupported compilers 00026 #if !defined(__GNUC__) /* GCC */ \ 00027 && !defined(__CC_ARM) /* ARMCC */ \ 00028 && !defined(__clang__) /* LLVM/Clang */ \ 00029 && !defined(__ICCARM__) /* IAR */ 00030 #warning "This compiler is not yet supported." 00031 #endif 00032 00033 00034 // Attributes 00035 00036 /** MBED_PACKED 00037 * Pack a structure, preventing any padding from being added between fields. 00038 * 00039 * @code 00040 * #include "mbed_toolchain.h" 00041 * 00042 * MBED_PACKED(struct) foo { 00043 * char x; 00044 * int y; 00045 * }; 00046 * @endcode 00047 */ 00048 #ifndef MBED_PACKED 00049 #if defined(__ICCARM__) 00050 #define MBED_PACKED(struct) __packed struct 00051 #else 00052 #define MBED_PACKED(struct) struct __attribute__((packed)) 00053 #endif 00054 #endif 00055 00056 /** MBED_ALIGN(N) 00057 * Declare a variable to be aligned on an N-byte boundary. 00058 * 00059 * @note 00060 * IAR does not support alignment greater than word size on the stack 00061 * 00062 * @code 00063 * #include "mbed_toolchain.h" 00064 * 00065 * MBED_ALIGN(16) char a; 00066 * @endcode 00067 */ 00068 #ifndef MBED_ALIGN 00069 #if defined(__ICCARM__) 00070 #define MBED_ALIGN(N) _Pragma(MBED_STRINGIFY(data_alignment=N)) 00071 #else 00072 #define MBED_ALIGN(N) __attribute__((aligned(N))) 00073 #endif 00074 #endif 00075 00076 /** MBED_UNUSED 00077 * Declare a function argument to be unused, suppressing compiler warnings 00078 * 00079 * @code 00080 * #include "mbed_toolchain.h" 00081 * 00082 * void foo(MBED_UNUSED int arg) { 00083 * 00084 * } 00085 * @endcode 00086 */ 00087 #ifndef MBED_UNUSED 00088 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM) 00089 #define MBED_UNUSED __attribute__((__unused__)) 00090 #else 00091 #define MBED_UNUSED 00092 #endif 00093 #endif 00094 00095 /** MBED_WEAK 00096 * Mark a function as being weak. 00097 * 00098 * @note 00099 * Functions should only be marked as weak in the source file. The header file 00100 * should contain a regular function declaration to insure the function is emitted. 00101 * A function marked weak will not be emitted if an alternative non-weak 00102 * implementation is defined. 00103 * 00104 * @note 00105 * Weak functions are not friendly to making code re-usable, as they can only 00106 * be overridden once (and if they are multiply overridden the linker will emit 00107 * no warning). You should not normally use weak symbols as part of the API to 00108 * re-usable modules. 00109 * 00110 * @code 00111 * #include "mbed_toolchain.h" 00112 * 00113 * MBED_WEAK void foo() { 00114 * // a weak implementation of foo that can be overriden by a definition 00115 * // without __weak 00116 * } 00117 * @endcode 00118 */ 00119 #ifndef MBED_WEAK 00120 #if defined(__ICCARM__) 00121 #define MBED_WEAK __weak 00122 #else 00123 #define MBED_WEAK __attribute__((weak)) 00124 #endif 00125 #endif 00126 00127 /** MBED_PURE 00128 * Hint to the compiler that a function depends only on parameters 00129 * 00130 * @code 00131 * #include "mbed_toolchain.h" 00132 * 00133 * MBED_PURE int foo(int arg){ 00134 * // no access to global variables 00135 * } 00136 * @endcode 00137 */ 00138 #ifndef MBED_PURE 00139 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM) 00140 #define MBED_PURE __attribute__((const)) 00141 #else 00142 #define MBED_PURE 00143 #endif 00144 #endif 00145 00146 /** MBED_NOINLINE 00147 * Declare a function that must not be inlined. 00148 * 00149 * @code 00150 * #include "mbed_toolchain.h" 00151 * 00152 * MBED_NOINLINE void foo() { 00153 * 00154 * } 00155 * @endcode 00156 */ 00157 #ifndef MBED_NOINLINE 00158 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM) 00159 #define MBED_NOINLINE __attribute__((noinline)) 00160 #elif defined(__ICCARM__) 00161 #define MBED_NOINLINE _Pragma("inline=never") 00162 #else 00163 #define MBED_NOINLINE 00164 #endif 00165 #endif 00166 00167 /** MBED_FORCEINLINE 00168 * Declare a function that must always be inlined. Failure to inline 00169 * such a function will result in an error. 00170 * 00171 * @code 00172 * #include "mbed_toolchain.h" 00173 * 00174 * MBED_FORCEINLINE void foo() { 00175 * 00176 * } 00177 * @endcode 00178 */ 00179 #ifndef MBED_FORCEINLINE 00180 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM) 00181 #define MBED_FORCEINLINE static inline __attribute__((always_inline)) 00182 #elif defined(__ICCARM__) 00183 #define MBED_FORCEINLINE _Pragma("inline=forced") static 00184 #else 00185 #define MBED_FORCEINLINE static inline 00186 #endif 00187 #endif 00188 00189 /** MBED_NORETURN 00190 * Declare a function that will never return. 00191 * 00192 * @code 00193 * #include "mbed_toolchain.h" 00194 * 00195 * MBED_NORETURN void foo() { 00196 * // must never return 00197 * while (1) {} 00198 * } 00199 * @endcode 00200 */ 00201 #ifndef MBED_NORETURN 00202 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM) 00203 #define MBED_NORETURN __attribute__((noreturn)) 00204 #elif defined(__ICCARM__) 00205 #define MBED_NORETURN __noreturn 00206 #else 00207 #define MBED_NORETURN 00208 #endif 00209 #endif 00210 00211 /** MBED_UNREACHABLE 00212 * An unreachable statement. If the statement is reached, 00213 * behaviour is undefined. Useful in situations where the compiler 00214 * cannot deduce the unreachability of code. 00215 * 00216 * @code 00217 * #include "mbed_toolchain.h" 00218 * 00219 * void foo(int arg) { 00220 * switch (arg) { 00221 * case 1: return 1; 00222 * case 2: return 2; 00223 * ... 00224 * } 00225 * MBED_UNREACHABLE; 00226 * } 00227 * @endcode 00228 */ 00229 #ifndef MBED_UNREACHABLE 00230 #if (defined(__GNUC__) || defined(__clang__)) && !defined(__CC_ARM) 00231 #define MBED_UNREACHABLE __builtin_unreachable() 00232 #else 00233 #define MBED_UNREACHABLE while (1) 00234 #endif 00235 #endif 00236 00237 /** MBED_DEPRECATED("message string") 00238 * Mark a function declaration as deprecated, if it used then a warning will be 00239 * issued by the compiler possibly including the provided message. Note that not 00240 * all compilers are able to display the message. 00241 * 00242 * @code 00243 * #include "mbed_toolchain.h" 00244 * 00245 * MBED_DEPRECATED("don't foo any more, bar instead") 00246 * void foo(int arg); 00247 * @endcode 00248 */ 00249 #ifndef MBED_DEPRECATED 00250 #if defined(__CC_ARM) 00251 #define MBED_DEPRECATED(M) __attribute__((deprecated)) 00252 #elif defined(__GNUC__) || defined(__clang__) 00253 #define MBED_DEPRECATED(M) __attribute__((deprecated(M))) 00254 #else 00255 #define MBED_DEPRECATED(M) 00256 #endif 00257 #endif 00258 00259 /** MBED_DEPRECATED_SINCE("version", "message string") 00260 * Mark a function declaration as deprecated, noting that the declaration was 00261 * deprecated on the specified version. If the function is used then a warning 00262 * will be issued by the compiler possibly including the provided message. 00263 * Note that not all compilers are able to display this message. 00264 * 00265 * @code 00266 * #include "mbed_toolchain.h" 00267 * 00268 * MBED_DEPRECATED_SINCE("mbed-os-5.1", "don't foo any more, bar instead") 00269 * void foo(int arg); 00270 * @endcode 00271 */ 00272 #define MBED_DEPRECATED_SINCE(D, M) MBED_DEPRECATED(M " [since " D "]") 00273 00274 /** MBED_CALLER_ADDR() 00275 * Returns the caller of the current function. 00276 * 00277 * @note 00278 * This macro is only implemented for GCC and ARMCC. 00279 * 00280 * @code 00281 * #include "mbed_toolchain.h" 00282 * 00283 * printf("This function was called from %p", MBED_CALLER_ADDR()); 00284 * @endcode 00285 * 00286 * @return Address of the calling function 00287 */ 00288 #ifndef MBED_CALLER_ADDR 00289 #if (defined(__GNUC__) || defined(__clang__)) && !defined(__CC_ARM) 00290 #define MBED_CALLER_ADDR() __builtin_extract_return_addr(__builtin_return_address(0)) 00291 #elif defined(__CC_ARM) 00292 #define MBED_CALLER_ADDR() __builtin_return_address(0) 00293 #else 00294 #define MBED_CALLER_ADDR() (NULL) 00295 #endif 00296 #endif 00297 00298 #ifndef MBED_SECTION 00299 #if (defined(__GNUC__) || defined(__clang__)) || defined(__CC_ARM) 00300 #define MBED_SECTION(name) __attribute__ ((section (name))) 00301 #elif defined(__ICCARM__) 00302 #define MBED_SECTION(name) _Pragma(MBED_STRINGIFY(location=name)) 00303 #else 00304 #error "Missing MBED_SECTION directive" 00305 #endif 00306 #endif 00307 00308 #ifndef MBED_PRINTF 00309 #if defined(__GNUC__) || defined(__CC_ARM) 00310 #define MBED_PRINTF(format_idx, first_param_idx) __attribute__ ((__format__(__printf__, format_idx, first_param_idx))) 00311 #else 00312 #define MBED_PRINTF(format_idx, first_param_idx) 00313 #endif 00314 #endif 00315 00316 #ifndef MBED_PRINTF_METHOD 00317 #if defined(__GNUC__) || defined(__CC_ARM) 00318 #define MBED_PRINTF_METHOD(format_idx, first_param_idx) __attribute__ ((__format__(__printf__, format_idx+1, first_param_idx+1))) 00319 #else 00320 #define MBED_PRINTF_METHOD(format_idx, first_param_idx) 00321 #endif 00322 #endif 00323 00324 #ifndef MBED_SCANF 00325 #if defined(__GNUC__) || defined(__CC_ARM) 00326 #define MBED_SCANF(format_idx, first_param_idx) __attribute__ ((__format__(__scanf__, format_idx, first_param_idx))) 00327 #else 00328 #define MBED_SCANF(format_idx, first_param_idx) 00329 #endif 00330 #endif 00331 00332 #ifndef MBED_SCANF_METHOD 00333 #if defined(__GNUC__) || defined(__CC_ARM) 00334 #define MBED_SCANF_METHOD(format_idx, first_param_idx) __attribute__ ((__format__(__scanf__, format_idx+1, first_param_idx+1))) 00335 #else 00336 #define MBED_SCANF_METHOD(format_idx, first_param_idx) 00337 #endif 00338 #endif 00339 00340 // FILEHANDLE declaration 00341 #if defined(TOOLCHAIN_ARM) 00342 #include <rt_sys.h> 00343 #endif 00344 00345 #ifndef FILEHANDLE 00346 typedef int FILEHANDLE; 00347 #endif 00348 00349 // Backwards compatibility 00350 #ifndef WEAK 00351 #define WEAK MBED_WEAK 00352 #endif 00353 00354 #ifndef PACKED 00355 #define PACKED MBED_PACKED() 00356 #endif 00357 00358 #ifndef EXTERN 00359 #define EXTERN extern 00360 #endif 00361 00362 #endif 00363 00364 /** @}*/
Generated on Tue Jul 12 2022 12:11:34 by
1.7.2
