/* Copyright JS Foundation and other contributors, http://js.foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef JERRYSCRIPT_COMPILER_H #define JERRYSCRIPT_COMPILER_H #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** \addtogroup jerry-compiler Jerry compiler compatibility components * @{ */ #ifdef __GNUC__ /* * Compiler-specific macros relevant for GCC. */ #define JERRY_ATTR_ALIGNED(ALIGNMENT) __attribute__((aligned(ALIGNMENT))) #define JERRY_ATTR_ALWAYS_INLINE __attribute__((always_inline)) #define JERRY_ATTR_CONST __attribute__((const)) #define JERRY_ATTR_DEPRECATED __attribute__((deprecated)) #define JERRY_ATTR_FORMAT(...) __attribute__((format(__VA_ARGS__))) #define JERRY_ATTR_HOT __attribute__((hot)) #define JERRY_ATTR_NOINLINE __attribute__((noinline)) #define JERRY_ATTR_NORETURN __attribute__((noreturn)) #define JERRY_ATTR_PURE __attribute__((pure)) #define JERRY_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #define JERRY_LIKELY(x) __builtin_expect(!!(x), 1) #define JERRY_UNLIKELY(x) __builtin_expect(!!(x), 0) #endif /* __GNUC__ */ #ifdef _MSC_VER /* * Compiler-specific macros relevant for Microsoft Visual C/C++ Compiler. */ #define JERRY_ATTR_DEPRECATED __declspec(deprecated) #define JERRY_ATTR_NOINLINE __declspec(noinline) #define JERRY_ATTR_NORETURN __declspec(noreturn) /* * Microsoft Visual C/C++ Compiler doesn't support for VLA, using _alloca * instead. */ void * __cdecl _alloca (size_t _Size); #define JERRY_VLA(type, name, size) type *name = (type *) (_alloca (sizeof (type) * size)) #endif /* _MSC_VER */ /* * Default empty definitions for all compiler-specific macros. Define any of * these in a guarded block above (e.g., as for GCC) to fine tune compilation * for your own compiler. */ /** * Function attribute to align function to given number of bytes. */ #ifndef JERRY_ATTR_ALIGNED #define JERRY_ATTR_ALIGNED(ALIGNMENT) #endif /* !JERRY_ATTR_ALIGNED */ /** * Function attribute to inline function to all call sites. */ #ifndef JERRY_ATTR_ALWAYS_INLINE #define JERRY_ATTR_ALWAYS_INLINE #endif /* !JERRY_ATTR_ALWAYS_INLINE */ /** * Function attribute to declare that function has no effect except the return * value and it only depends on parameters. */ #ifndef JERRY_ATTR_CONST #define JERRY_ATTR_CONST #endif /* !JERRY_ATTR_CONST */ /** * Function attribute to trigger warning if deprecated function is called. */ #ifndef JERRY_ATTR_DEPRECATED #define JERRY_ATTR_DEPRECATED #endif /* !JERRY_ATTR_DEPRECATED */ /** * Function attribute to declare that function is variadic and takes a format * string and some arguments as parameters. */ #ifndef JERRY_ATTR_FORMAT #define JERRY_ATTR_FORMAT(...) #endif /* !JERRY_ATTR_FORMAT */ /** * Function attribute to predict that function is a hot spot, and therefore * should be optimized aggressively. */ #ifndef JERRY_ATTR_HOT #define JERRY_ATTR_HOT #endif /* !JERRY_ATTR_HOT */ /** * Function attribute not to inline function ever. */ #ifndef JERRY_ATTR_NOINLINE #define JERRY_ATTR_NOINLINE #endif /* !JERRY_ATTR_NOINLINE */ /** * Function attribute to declare that function never returns. */ #ifndef JERRY_ATTR_NORETURN #define JERRY_ATTR_NORETURN #endif /* !JERRY_ATTR_NORETURN */ /** * Function attribute to declare that function has no effect except the return * value and it only depends on parameters and global variables. */ #ifndef JERRY_ATTR_PURE #define JERRY_ATTR_PURE #endif /* !JERRY_ATTR_PURE */ /** * Function attribute to place function in given section. */ #ifndef JERRY_ATTR_SECTION #define JERRY_ATTR_SECTION(SECTION) #endif /* !JERRY_ATTR_SECTION */ /** * Function attribute to trigger warning if function's caller doesn't use (e.g., * check) the return value. */ #ifndef JERRY_ATTR_WARN_UNUSED_RESULT #define JERRY_ATTR_WARN_UNUSED_RESULT #endif /* !JERRY_ATTR_WARN_UNUSED_RESULT */ /** * Helper to predict that a condition is likely. */ #ifndef JERRY_LIKELY #define JERRY_LIKELY(x) (x) #endif /* !JERRY_LIKELY */ /** * Helper to predict that a condition is unlikely. */ #ifndef JERRY_UNLIKELY #define JERRY_UNLIKELY(x) (x) #endif /* !JERRY_UNLIKELY */ /** * Helper to declare (or mimic) a C99 variable-length array. */ #ifndef JERRY_VLA #define JERRY_VLA(type, name, size) type name[size] #endif /* !JERRY_VLA */ /** * @} */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* !JERRYSCRIPT_COMPILER_H */