From 390a22f864537eb09efb8341c4f5917e6418a9c8 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 8 Sep 2016 18:38:53 +0100 Subject: [PATCH 1/4] Enable FINAL, (un)linkely, __attribute__ for clang. --- src/stdafx.h | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/stdafx.h b/src/stdafx.h index 631f64cca7..e19d015ed9 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -143,7 +143,7 @@ #endif /* PSP */ /* Stuff for GCC */ -#if defined(__GNUC__) +#if defined(__GNUC__) || defined(__clang__) #define NORETURN __attribute__ ((noreturn)) #define CDECL #define __int64 long long @@ -151,12 +151,8 @@ /* Warn about functions using 'printf' format syntax. First argument determines which parameter * is the format string, second argument is start of values passed to printf. */ #define WARN_FORMAT(string, args) __attribute__ ((format (printf, string, args))) - #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) - #define FINAL final - #else - #define FINAL - #endif -#endif /* __GNUC__ */ + #define FINAL final +#endif /* __GNUC__ || __clang__ */ #if defined(__WATCOMC__) #define NORETURN @@ -431,13 +427,13 @@ assert_compile(SIZE_MAX >= UINT32_MAX); #define CloseConnection OTTD_CloseConnection #endif /* __APPLE__ */ -#ifdef __GNUC__ +#if defined(__GNUC__) || defined(__clang__) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else #define likely(x) (x) #define unlikely(x) (x) -#endif +#endif /* __GNUC__ || __clang__ */ void NORETURN CDECL usererror(const char *str, ...) WARN_FORMAT(1, 2); void NORETURN CDECL error(const char *str, ...) WARN_FORMAT(1, 2); From 8a2f9311a9d1e5652475568b75f9a91082c127bd Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 8 Sep 2016 19:31:40 +0100 Subject: [PATCH 2/4] Include -01 in CFLAGS_BUILD when using clang. --- config.lib | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config.lib b/config.lib index 961e5eae8c..ae9b5be2c1 100644 --- a/config.lib +++ b/config.lib @@ -1524,8 +1524,11 @@ make_cflags_and_ldflags() { cc_build_is_gcc=`basename "$cc_build" | grep "gcc" 2>/dev/null` if [ -n "$cc_build_is_gcc" ]; then - # Just add -O1 to the tools needed for building. + # Add -O1 and fortify source to the tools needed for building, on gcc CFLAGS_BUILD="$CFLAGS_BUILD -D_FORTIFY_SOURCE=2 -O1" + elif [ -n "`basename "$cc_build" | grep "clang" 2>/dev/null`" ]; then + # Add -O1 to the tools needed for building, on clang + CFLAGS_BUILD="$CFLAGS_BUILD -O1" fi fi From c59509c2aa819942cd81e136903788166961574f Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 8 Sep 2016 19:38:13 +0100 Subject: [PATCH 3/4] Use -gline-tables-only instead of -g1 on clang. --- config.lib | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config.lib b/config.lib index 0e2770d2e4..026f093f7e 100644 --- a/config.lib +++ b/config.lib @@ -1719,7 +1719,11 @@ EOL if [ -n "$LIBBFD_LIBS" -o -n "$HAVE_GDB_DBG" ]; then if [ $enable_debug -lt 1 ] && [ "$with_bfd_extra_debug" = "1" ]; then - CFLAGS="$CFLAGS -g1" + if [ -n "`basename "$cc_host" | grep "clang" 2>/dev/null`" ]; then + CFLAGS="$CFLAGS -gline-tables-only" + else + CFLAGS="$CFLAGS -g1" + fi fi fi From c2825c12ea95f2ddde32dfee11029ecd97111bb1 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 8 Sep 2016 19:40:15 +0100 Subject: [PATCH 4/4] Add clang version support to crashlog output. --- src/crashlog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index c1f42171b5..1c82b88a04 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -82,6 +82,8 @@ char *CrashLog::LogCompiler(char *buffer, const char *last) const buffer += seprintf(buffer, last, " Compiler: " #if defined(_MSC_VER) "MSVC %d", _MSC_VER +#elif defined(__clang__) + "clang %s", __clang_version__ #elif defined(__ICC) && defined(__GNUC__) "ICC %d (GCC %d.%d.%d mode)", __ICC, __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ #elif defined(__ICC)