toolchain: xcc: use Clang if exists

The XCC toolchain may come with Clang front-end depending on
how it's built. Currently, the only SoC/board using XCC is
the intel_s1000_crb and its XCC toolchain comes with Clang
3.9.0 which has a lot better support for C99 and C++11 than
the portion based on GCC 4.2 (which does not even support
C++11). So this change attempts to use the Clang portion
instead of GCC if the Clang executable exists.

Signed-off-by: Daniel Leung <daniel.leung@intel.com>
This commit is contained in:
Daniel Leung 2019-12-16 17:26:54 -08:00 committed by Johan Hedberg
parent e6cf37a857
commit e73231f7f0
4 changed files with 35 additions and 8 deletions

View file

@ -73,6 +73,11 @@ include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_optimizations.cmake)
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_cpp.cmake)
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_asm.cmake)
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_baremetal.cmake)
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_warnings.cmake)
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_imacros.cmake)
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_base.cmake)
if(CC STREQUAL "clang")
include(${ZEPHYR_BASE}/cmake/compiler/clang/target_warnings.cmake)
else()
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_warnings.cmake)
endif()

View file

@ -23,15 +23,20 @@ set(SYSROOT_DIR ${TOOLCHAIN_HOME}/${SYSROOT_TARGET})
# xt-xcc does not support -Og, so make it -O0
set(OPTIMIZE_FOR_DEBUG_FLAG "-O0")
set(CC xcc)
set(C++ xc++)
if(EXISTS ${CROSS_COMPILE}clang)
set(CC clang)
set(C++ clang++)
else()
set(CC xcc)
set(C++ xc++)
list(APPEND TOOLCHAIN_C_FLAGS
-imacros${ZEPHYR_BASE}/include/toolchain/xcc_missing_defs.h
)
endif()
set(NOSYSDEF_CFLAG "")
list(APPEND TOOLCHAIN_C_FLAGS -fms-extensions)
list(APPEND TOOLCHAIN_C_FLAGS
-imacros${ZEPHYR_BASE}/include/toolchain/xcc_missing_defs.h
)
set(TOOLCHAIN_HAS_NEWLIB OFF CACHE BOOL "True if toolchain supports newlib")

View file

@ -11,10 +11,18 @@
* there. However, __BYTE_ORDER__ is actually being defined later in
* this file. So define __BYTE_ORDER__ to skip the check in gcc.h
* and undefine after including gcc.h.
*
* Clang has it defined so there is no need to work around.
*/
#ifndef __clang__
#define __BYTE_ORDER__
#endif
#include <toolchain/gcc.h>
#ifndef __clang__
#undef __BYTE_ORDER__
#endif
#include <stdbool.h>
@ -22,8 +30,12 @@
#define UINT32_C(x) x ## U
#endif
/* XCC doesn't support __COUNTER__ but this should be good enough */
#ifndef __COUNTER__
/* XCC (GCC-based compiler) doesn't support __COUNTER__
* but this should be good enough
*/
#define __COUNTER__ __LINE__
#endif
#undef __in_section_unique
#define __in_section_unique(seg) \

View file

@ -2,5 +2,10 @@
zephyr_library_sources_ifdef(CONFIG_CPLUSPLUS cpp_fixes.c)
zephyr_library_sources_ifdef(CONFIG_NEWLIB_LIBC newlib_fixes.c)
if(NOT (CC STREQUAL "clang"))
# These two are due to IS_ENABLED() not being parsed correctly
# in old GCC 4.2 based XCC. Clang is not affected.
zephyr_library_sources_ifdef(CONFIG_LOG_MINIMAL log_minimal_fixes.c)
zephyr_library_sources_ifdef(CONFIG_TEST ztest_fixes.c)
endif()