• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright JS Foundation and other contributors, http://js.foundation
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef JERRYSCRIPT_COMPILER_H
17 #define JERRYSCRIPT_COMPILER_H
18 
19 #ifdef __cplusplus
20 extern "C"
21 {
22 #endif /* __cplusplus */
23 
24 /** \addtogroup jerry-compiler Jerry compiler compatibility components
25  * @{
26  */
27 
28 #ifdef __GNUC__
29 
30 /*
31  * Compiler-specific macros relevant for GCC.
32  */
33 #define JERRY_ATTR_ALIGNED(ALIGNMENT) __attribute__((aligned(ALIGNMENT)))
34 #define JERRY_ATTR_ALWAYS_INLINE __attribute__((always_inline))
35 #define JERRY_ATTR_CONST __attribute__((const))
36 #define JERRY_ATTR_DEPRECATED __attribute__((deprecated))
37 #define JERRY_ATTR_FORMAT(...) __attribute__((format(__VA_ARGS__)))
38 #define JERRY_ATTR_HOT __attribute__((hot))
39 #define JERRY_ATTR_NOINLINE __attribute__((noinline))
40 #define JERRY_ATTR_NORETURN __attribute__((noreturn))
41 #define JERRY_ATTR_PURE __attribute__((pure))
42 #define JERRY_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
43 
44 #define JERRY_LIKELY(x) __builtin_expect(!!(x), 1)
45 #define JERRY_UNLIKELY(x) __builtin_expect(!!(x), 0)
46 
47 #endif /* __GNUC__ */
48 
49 #ifdef _MSC_VER
50 
51 /*
52  * Compiler-specific macros relevant for Microsoft Visual C/C++ Compiler.
53  */
54 #define JERRY_ATTR_DEPRECATED __declspec(deprecated)
55 #define JERRY_ATTR_NOINLINE __declspec(noinline)
56 #define JERRY_ATTR_NORETURN __declspec(noreturn)
57 
58 /*
59  * Microsoft Visual C/C++ Compiler doesn't support for VLA, using _alloca
60  * instead.
61  */
62 void * __cdecl _alloca (size_t _Size);
63 #define JERRY_VLA(type, name, size) type *name = (type *) (_alloca (sizeof (type) * size))
64 
65 #endif /* _MSC_VER */
66 
67 /*
68  * Default empty definitions for all compiler-specific macros. Define any of
69  * these in a guarded block above (e.g., as for GCC) to fine tune compilation
70  * for your own compiler. */
71 
72 /**
73  * Function attribute to align function to given number of bytes.
74  */
75 #ifndef JERRY_ATTR_ALIGNED
76 #define JERRY_ATTR_ALIGNED(ALIGNMENT)
77 #endif /* !JERRY_ATTR_ALIGNED */
78 
79 /**
80  * Function attribute to inline function to all call sites.
81  */
82 #ifndef JERRY_ATTR_ALWAYS_INLINE
83 #define JERRY_ATTR_ALWAYS_INLINE
84 #endif /* !JERRY_ATTR_ALWAYS_INLINE */
85 
86 /**
87  * Function attribute to declare that function has no effect except the return
88  * value and it only depends on parameters.
89  */
90 #ifndef JERRY_ATTR_CONST
91 #define JERRY_ATTR_CONST
92 #endif /* !JERRY_ATTR_CONST */
93 
94 /**
95  * Function attribute to trigger warning if deprecated function is called.
96  */
97 #ifndef JERRY_ATTR_DEPRECATED
98 #define JERRY_ATTR_DEPRECATED
99 #endif /* !JERRY_ATTR_DEPRECATED */
100 
101 /**
102  * Function attribute to declare that function is variadic and takes a format
103  * string and some arguments as parameters.
104  */
105 #ifndef JERRY_ATTR_FORMAT
106 #define JERRY_ATTR_FORMAT(...)
107 #endif /* !JERRY_ATTR_FORMAT */
108 
109 /**
110  * Function attribute to predict that function is a hot spot, and therefore
111  * should be optimized aggressively.
112  */
113 #ifndef JERRY_ATTR_HOT
114 #define JERRY_ATTR_HOT
115 #endif /* !JERRY_ATTR_HOT */
116 
117 /**
118  * Function attribute not to inline function ever.
119  */
120 #ifndef JERRY_ATTR_NOINLINE
121 #define JERRY_ATTR_NOINLINE
122 #endif /* !JERRY_ATTR_NOINLINE */
123 
124 /**
125  * Function attribute to declare that function never returns.
126  */
127 #ifndef JERRY_ATTR_NORETURN
128 #define JERRY_ATTR_NORETURN
129 #endif /* !JERRY_ATTR_NORETURN */
130 
131 /**
132  * Function attribute to declare that function has no effect except the return
133  * value and it only depends on parameters and global variables.
134  */
135 #ifndef JERRY_ATTR_PURE
136 #define JERRY_ATTR_PURE
137 #endif /* !JERRY_ATTR_PURE */
138 
139 /**
140  * Function attribute to place function in given section.
141  */
142 #ifndef JERRY_ATTR_SECTION
143 #define JERRY_ATTR_SECTION(SECTION)
144 #endif /* !JERRY_ATTR_SECTION */
145 
146 /**
147  * Function attribute to trigger warning if function's caller doesn't use (e.g.,
148  * check) the return value.
149  */
150 #ifndef JERRY_ATTR_WARN_UNUSED_RESULT
151 #define JERRY_ATTR_WARN_UNUSED_RESULT
152 #endif /* !JERRY_ATTR_WARN_UNUSED_RESULT */
153 
154 /**
155  * Helper to predict that a condition is likely.
156  */
157 #ifndef JERRY_LIKELY
158 #define JERRY_LIKELY(x) (x)
159 #endif /* !JERRY_LIKELY */
160 
161 /**
162  * Helper to predict that a condition is unlikely.
163  */
164 #ifndef JERRY_UNLIKELY
165 #define JERRY_UNLIKELY(x) (x)
166 #endif /* !JERRY_UNLIKELY */
167 
168 /**
169  * Helper to declare (or mimic) a C99 variable-length array.
170  */
171 #ifndef JERRY_VLA
172 #define JERRY_VLA(type, name, size) type name[size]
173 #endif /* !JERRY_VLA */
174 
175 /**
176  * @}
177  */
178 
179 #ifdef __cplusplus
180 }
181 #endif /* __cplusplus */
182 #endif /* !JERRYSCRIPT_COMPILER_H */
183