diff --git a/acinclude.m4 b/acinclude.m4 index f62d977f..4c6b2e26 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -335,17 +335,8 @@ AH_BOTTOM([#if C_ATTRIBUTE_FASTCALL #define DB_FASTCALL #endif]) - AH_BOTTOM([#if C_HAS_ATTRIBUTE #define GCC_ATTRIBUTE(x) __attribute__ ((x)) #else #define GCC_ATTRIBUTE(x) /* attribute not supported */ #endif]) - -AH_BOTTOM([#if C_HAS_BUILTIN_EXPECT -#define GCC_UNLIKELY(x) __builtin_expect((x),0) -#define GCC_LIKELY(x) __builtin_expect((x),1) -#else -#define GCC_UNLIKELY(x) (x) -#define GCC_LIKELY(x) (x) -#endif]) diff --git a/include/compiler.h b/include/compiler.h new file mode 100644 index 00000000..641ee5eb --- /dev/null +++ b/include/compiler.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2019 The DOSBox Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef DOSBOX_COMPILER_H +#define DOSBOX_COMPILER_H + +// This header wraps compiler-specific features, so they won't need to +// be hacked into the buildsystem. + +// GCC_LIKELY macro is incorrectly named, because other compilers support +// this feature as well (e.g. Clang, Intel); leave it be for now, at +// least until full support for C++20 [[likely]] attribute will start arriving +// in new compilers. +// +// Note: '!!' trick is used, to convert non-boolean values to 1 or 0 +// to prevent accidental incorrect usage (e.g. when user wraps macro +// around a pointer or an integer, expecting usual C semantics). + +#if C_HAS_BUILTIN_EXPECT +#define GCC_LIKELY(x) __builtin_expect(!!(x), 1) +#define GCC_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define GCC_LIKELY +#define GCC_UNLIKELY +#endif + +#endif /* DOSBOX_COMPILER_H */ diff --git a/include/dosbox.h b/include/dosbox.h index 6d6f6d74..2816f250 100644 --- a/include/dosbox.h +++ b/include/dosbox.h @@ -21,6 +21,7 @@ #define DOSBOX_DOSBOX_H #include "config.h" +#include "compiler.h" #include "types.h" GCC_ATTRIBUTE(noreturn) void E_Exit(const char * message,...) GCC_ATTRIBUTE( __format__(__printf__, 1, 2)); diff --git a/src/platform/visualc/config.h b/src/platform/visualc/config.h index 9a8f7a02..e1ae2283 100644 --- a/src/platform/visualc/config.h +++ b/src/platform/visualc/config.h @@ -64,8 +64,6 @@ #define C_DIRECTSERIAL 1 #define GCC_ATTRIBUTE(x) /* attribute not supported */ -#define GCC_UNLIKELY(x) (x) -#define GCC_LIKELY(x) (x) #define INLINE __forceinline #define DB_FASTCALL __fastcall