1
0
Fork 0

Move 'likely' macros to the compiler support header

This makes it easier to move away from autoconfig in the future.

Also, use '!!' C trick to prevent accidental incorrect usage of
these macros.
This commit is contained in:
Patryk Obara 2019-12-29 09:59:56 +01:00 committed by Patryk Obara
parent cac7ba136c
commit ff2968df3f
4 changed files with 43 additions and 11 deletions

View file

@ -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])

42
include/compiler.h Normal file
View file

@ -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 */

View file

@ -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));

View file

@ -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