zephyr/include/toolchain/xcc.h
Anas Nashif d7fe69a6bc toolchain: xcc: __builtin_unreachable needs to be a loop
Functions are declared as noreturn but they do in fact return (when
control reaches the end of the body, since it doesn't enter an infinite
loop, it doesn't call other "noreturn" functions, etc.)

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2018-11-02 08:37:27 -04:00

51 lines
1.4 KiB
C

/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_TOOLCHAIN_XCC_H_
#define ZEPHYR_INCLUDE_TOOLCHAIN_XCC_H_
#include <toolchain/gcc.h>
/* XCC doesn't support __COUNTER__ but this should be good enough */
#define __COUNTER__ __LINE__
#undef __in_section_unique
#define __in_section_unique(seg) \
__attribute__((section("." STRINGIFY(seg) "." STRINGIFY(__COUNTER__))))
#ifndef __GCC_LINKER_CMD__
#include <xtensa/config/core.h>
/*
* XCC does not define the following macros with the expected names, but the
* HAL defines similar ones. Thus we include it and define the missing macros
* ourselves.
*/
#ifndef __BYTE_ORDER__
#define __BYTE_ORDER__ XCHAL_MEMORY_ORDER
#endif
#ifndef __ORDER_BIG_ENDIAN__
#define __ORDER_BIG_ENDIAN__ XTHAL_BIGENDIAN
#endif
#ifndef __ORDER_LITTLE_ENDIAN__
#define __ORDER_LITTLE_ENDIAN__ XTHAL_LITTLEENDIAN
#endif
#endif /* __GCC_LINKER_CMD__ */
#define __builtin_unreachable() do { __ASSERT(0, "Unreachable code"); } \
while (true)
/* TODO: XCC doesn't define the below macros which are useful for checking
* overflows. This needs to be fixed.
*/
#define __builtin_add_overflow(a, b, output) ({ *output = (a) + (b); 0; })
#define __builtin_mul_overflow(a, b, output) ({ *output = (a) * (b); 0; })
#define __builtin_umul_overflow(a, b, output) ({ *output = (a) * (b); 0; })
#define __builtin_umulll_overflow(a, b, output) ({ *output = (a) * (b); 0; })
#endif