1 /* 2 * Copyright (c) 2006-2024, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2024-01-18 Shell Separate the compiler porting from rtdef.h 9 */ 10 #ifndef __RT_COMPILER_H__ 11 #define __RT_COMPILER_H__ 12 13 #include <rtconfig.h> 14 15 #if defined(__ARMCC_VERSION) /* ARM Compiler */ 16 #define rt_section(x) __attribute__((section(x))) 17 #define rt_used __attribute__((used)) 18 #define rt_align(n) __attribute__((aligned(n))) 19 #if __ARMCC_VERSION >= 6010050 20 #define rt_packed(declare) declare __attribute__((packed)) 21 #else 22 #define rt_packed(declare) __packed declare 23 #endif 24 #define rt_weak __attribute__((weak)) 25 #define rt_typeof __typeof 26 #define rt_noreturn 27 #define rt_inline static __inline 28 #define rt_always_inline rt_inline 29 #elif defined (__IAR_SYSTEMS_ICC__) /* for IAR Compiler */ 30 #define rt_section(x) @ x 31 #define rt_used __root 32 #define PRAGMA(x) _Pragma(#x) 33 #define rt_align(n) PRAGMA(data_alignment=n) 34 #define rt_packed(declare) declare 35 #define rt_weak __weak 36 #define rt_typeof __typeof 37 #define rt_noreturn 38 #define rt_inline static inline 39 #define rt_always_inline rt_inline 40 #elif defined (__GNUC__) /* GNU GCC Compiler */ 41 #define __RT_STRINGIFY(x...) #x 42 #define RT_STRINGIFY(x...) __RT_STRINGIFY(x) 43 #define rt_section(x) __attribute__((section(x))) 44 #define rt_used __attribute__((used)) 45 #define rt_align(n) __attribute__((aligned(n))) 46 #define rt_packed(declare) declare __attribute__((packed)) 47 #define rt_weak __attribute__((weak)) 48 #define rt_typeof __typeof__ 49 #define rt_noreturn __attribute__ ((noreturn)) 50 #define rt_inline static __inline 51 #define rt_always_inline static inline __attribute__((always_inline)) 52 #elif defined (__ADSPBLACKFIN__) /* for VisualDSP++ Compiler */ 53 #define rt_section(x) __attribute__((section(x))) 54 #define rt_used __attribute__((used)) 55 #define rt_align(n) __attribute__((aligned(n))) 56 #define rt_packed(declare) declare 57 #define rt_weak __attribute__((weak)) 58 #define rt_typeof typeof 59 #define rt_noreturn 60 #define rt_inline static inline 61 #define rt_always_inline rt_inline 62 #elif defined (_MSC_VER) /* for Visual Studio Compiler */ 63 #define rt_section(x) 64 #define rt_used 65 #define rt_align(n) __declspec(align(n)) 66 #define rt_packed(declare) __pragma(pack(push, 1)) declare __pragma(pack(pop)) 67 #define rt_weak 68 #define rt_typeof typeof 69 #define rt_noreturn 70 #define rt_inline static __inline 71 #define rt_always_inline rt_inline 72 #elif defined (__TI_COMPILER_VERSION__) /* for TI CCS Compiler */ 73 /** 74 * The way that TI compiler set section is different from other(at least 75 * GCC and MDK) compilers. See ARM Optimizing C/C++ Compiler 5.9.3 for more 76 * details. 77 */ 78 #define rt_section(x) __attribute__((section(x))) 79 #ifdef __TI_EABI__ 80 #define rt_used __attribute__((retain)) __attribute__((used)) 81 #else 82 #define rt_used __attribute__((used)) 83 #endif 84 #define PRAGMA(x) _Pragma(#x) 85 #define rt_align(n) __attribute__((aligned(n))) 86 #define rt_packed(declare) declare __attribute__((packed)) 87 #ifdef __TI_EABI__ 88 #define rt_weak __attribute__((weak)) 89 #else 90 #define rt_weak 91 #endif 92 #define rt_typeof typeof 93 #define rt_noreturn 94 #define rt_inline static inline 95 #define rt_always_inline rt_inline 96 #elif defined (__TASKING__) /* for TASKING Compiler */ 97 #define rt_section(x) __attribute__((section(x))) 98 #define rt_used __attribute__((used, protect)) 99 #define PRAGMA(x) _Pragma(#x) 100 #define rt_align(n) __attribute__((__align(n))) 101 #define rt_packed(declare) declare __packed__ 102 #define rt_weak __attribute__((weak)) 103 #define rt_typeof typeof 104 #define rt_noreturn 105 #define rt_inline static inline 106 #define rt_always_inline rt_inline 107 #else /* Unkown Compiler */ 108 #error not supported tool chain 109 #endif /* __ARMCC_VERSION */ 110 111 #endif /* __RT_COMPILER_H__ */ 112