xref: /nrf52832-nimble/nordic/nrfx/mdk/compiler_abstraction.h (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
1*150812a8SEvalZero /*
2*150812a8SEvalZero 
3*150812a8SEvalZero Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved.
4*150812a8SEvalZero 
5*150812a8SEvalZero Redistribution and use in source and binary forms, with or without
6*150812a8SEvalZero modification, are permitted provided that the following conditions are met:
7*150812a8SEvalZero 
8*150812a8SEvalZero 1. Redistributions of source code must retain the above copyright notice, this
9*150812a8SEvalZero    list of conditions and the following disclaimer.
10*150812a8SEvalZero 
11*150812a8SEvalZero 2. Redistributions in binary form must reproduce the above copyright
12*150812a8SEvalZero    notice, this list of conditions and the following disclaimer in the
13*150812a8SEvalZero    documentation and/or other materials provided with the distribution.
14*150812a8SEvalZero 
15*150812a8SEvalZero 3. Neither the name of Nordic Semiconductor ASA nor the names of its
16*150812a8SEvalZero    contributors may be used to endorse or promote products derived from this
17*150812a8SEvalZero    software without specific prior written permission.
18*150812a8SEvalZero 
19*150812a8SEvalZero THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*150812a8SEvalZero AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*150812a8SEvalZero IMPLIED WARRANTIES OF MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE
22*150812a8SEvalZero ARE DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
23*150812a8SEvalZero LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*150812a8SEvalZero CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*150812a8SEvalZero SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*150812a8SEvalZero INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*150812a8SEvalZero CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*150812a8SEvalZero ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*150812a8SEvalZero POSSIBILITY OF SUCH DAMAGE.
30*150812a8SEvalZero 
31*150812a8SEvalZero */
32*150812a8SEvalZero 
33*150812a8SEvalZero #ifndef _COMPILER_ABSTRACTION_H
34*150812a8SEvalZero #define _COMPILER_ABSTRACTION_H
35*150812a8SEvalZero 
36*150812a8SEvalZero /*lint ++flb "Enter library region" */
37*150812a8SEvalZero 
38*150812a8SEvalZero #if defined ( __CC_ARM )
39*150812a8SEvalZero 
40*150812a8SEvalZero     #ifndef __ASM
41*150812a8SEvalZero         #define __ASM               __asm
42*150812a8SEvalZero     #endif
43*150812a8SEvalZero 
44*150812a8SEvalZero     #ifndef __INLINE
45*150812a8SEvalZero         #define __INLINE            __inline
46*150812a8SEvalZero     #endif
47*150812a8SEvalZero 
48*150812a8SEvalZero     #ifndef __WEAK
49*150812a8SEvalZero         #define __WEAK              __weak
50*150812a8SEvalZero     #endif
51*150812a8SEvalZero 
52*150812a8SEvalZero     #ifndef __ALIGN
53*150812a8SEvalZero         #define __ALIGN(n)          __align(n)
54*150812a8SEvalZero     #endif
55*150812a8SEvalZero 
56*150812a8SEvalZero     #ifndef __PACKED
57*150812a8SEvalZero         #define __PACKED            __packed
58*150812a8SEvalZero     #endif
59*150812a8SEvalZero 
60*150812a8SEvalZero     #define GET_SP()                __current_sp()
61*150812a8SEvalZero 
62*150812a8SEvalZero #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
63*150812a8SEvalZero 
64*150812a8SEvalZero     #ifndef __ASM
65*150812a8SEvalZero         #define __ASM               __asm
66*150812a8SEvalZero     #endif
67*150812a8SEvalZero 
68*150812a8SEvalZero     #ifndef __INLINE
69*150812a8SEvalZero         #define __INLINE            __inline
70*150812a8SEvalZero     #endif
71*150812a8SEvalZero 
72*150812a8SEvalZero     #ifndef __WEAK
73*150812a8SEvalZero         #define __WEAK              __attribute__((weak))
74*150812a8SEvalZero     #endif
75*150812a8SEvalZero 
76*150812a8SEvalZero     #ifndef __ALIGN
77*150812a8SEvalZero         #define __ALIGN(n)          __attribute__((aligned(n)))
78*150812a8SEvalZero     #endif
79*150812a8SEvalZero 
80*150812a8SEvalZero     #ifndef __PACKED
81*150812a8SEvalZero         #define __PACKED            __attribute__((packed, aligned(1)))
82*150812a8SEvalZero     #endif
83*150812a8SEvalZero 
84*150812a8SEvalZero     #define GET_SP()                __current_sp()
85*150812a8SEvalZero 
86*150812a8SEvalZero #elif defined ( __ICCARM__ )
87*150812a8SEvalZero 
88*150812a8SEvalZero     #ifndef __ASM
89*150812a8SEvalZero         #define __ASM               __asm
90*150812a8SEvalZero     #endif
91*150812a8SEvalZero 
92*150812a8SEvalZero     #ifndef __INLINE
93*150812a8SEvalZero         #define __INLINE            inline
94*150812a8SEvalZero     #endif
95*150812a8SEvalZero 
96*150812a8SEvalZero     #ifndef __WEAK
97*150812a8SEvalZero         #define __WEAK              __weak
98*150812a8SEvalZero     #endif
99*150812a8SEvalZero 
100*150812a8SEvalZero     #ifndef __ALIGN
101*150812a8SEvalZero         #define STRING_PRAGMA(x) _Pragma(#x)
102*150812a8SEvalZero         #define __ALIGN(n) STRING_PRAGMA(data_alignment = n)
103*150812a8SEvalZero     #endif
104*150812a8SEvalZero 
105*150812a8SEvalZero     #ifndef __PACKED
106*150812a8SEvalZero         #define __PACKED            __packed
107*150812a8SEvalZero     #endif
108*150812a8SEvalZero 
109*150812a8SEvalZero     #define GET_SP()                __get_SP()
110*150812a8SEvalZero 
111*150812a8SEvalZero #elif defined   ( __GNUC__ )
112*150812a8SEvalZero 
113*150812a8SEvalZero     #ifndef __ASM
114*150812a8SEvalZero         #define __ASM               __asm
115*150812a8SEvalZero     #endif
116*150812a8SEvalZero 
117*150812a8SEvalZero     #ifndef __INLINE
118*150812a8SEvalZero         #define __INLINE            inline
119*150812a8SEvalZero     #endif
120*150812a8SEvalZero 
121*150812a8SEvalZero     #ifndef __WEAK
122*150812a8SEvalZero         #define __WEAK              __attribute__((weak))
123*150812a8SEvalZero     #endif
124*150812a8SEvalZero 
125*150812a8SEvalZero     #ifndef __ALIGN
126*150812a8SEvalZero         #define __ALIGN(n)          __attribute__((aligned(n)))
127*150812a8SEvalZero     #endif
128*150812a8SEvalZero 
129*150812a8SEvalZero     #ifndef __PACKED
130*150812a8SEvalZero         #define __PACKED           __attribute__((packed))
131*150812a8SEvalZero     #endif
132*150812a8SEvalZero 
133*150812a8SEvalZero     #define GET_SP()                gcc_current_sp()
134*150812a8SEvalZero 
gcc_current_sp(void)135*150812a8SEvalZero     static inline unsigned int gcc_current_sp(void)
136*150812a8SEvalZero     {
137*150812a8SEvalZero         register unsigned sp __ASM("sp");
138*150812a8SEvalZero         return sp;
139*150812a8SEvalZero     }
140*150812a8SEvalZero 
141*150812a8SEvalZero #elif defined   ( __TASKING__ )
142*150812a8SEvalZero 
143*150812a8SEvalZero     #ifndef __ASM
144*150812a8SEvalZero         #define __ASM               __asm
145*150812a8SEvalZero     #endif
146*150812a8SEvalZero 
147*150812a8SEvalZero     #ifndef __INLINE
148*150812a8SEvalZero         #define __INLINE            inline
149*150812a8SEvalZero     #endif
150*150812a8SEvalZero 
151*150812a8SEvalZero     #ifndef __WEAK
152*150812a8SEvalZero         #define __WEAK              __attribute__((weak))
153*150812a8SEvalZero     #endif
154*150812a8SEvalZero 
155*150812a8SEvalZero     #ifndef __ALIGN
156*150812a8SEvalZero         #define __ALIGN(n)          __align(n)
157*150812a8SEvalZero     #endif
158*150812a8SEvalZero 
159*150812a8SEvalZero     /* Not defined for TASKING. */
160*150812a8SEvalZero     #ifndef __PACKED
161*150812a8SEvalZero         #define __PACKED
162*150812a8SEvalZero     #endif
163*150812a8SEvalZero 
164*150812a8SEvalZero     #define GET_SP()                __get_MSP()
165*150812a8SEvalZero 
166*150812a8SEvalZero #endif
167*150812a8SEvalZero 
168*150812a8SEvalZero /*lint --flb "Leave library region" */
169*150812a8SEvalZero 
170*150812a8SEvalZero #endif
171