From 78dca8153f802f271b4f2aeca33d967a075e485e Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 16 Nov 2011 17:01:02 -0500 Subject: Add a dmnsn_unreachable() macro. Also rename inline.h to compiler.h. --- libdimension/dimension/compiler.h | 52 +++++++++++++++++++++++++++++++++++++++ libdimension/dimension/error.h | 20 ++++++++++++--- libdimension/dimension/inline.h | 49 ------------------------------------ 3 files changed, 69 insertions(+), 52 deletions(-) create mode 100644 libdimension/dimension/compiler.h delete mode 100644 libdimension/dimension/inline.h (limited to 'libdimension/dimension') diff --git a/libdimension/dimension/compiler.h b/libdimension/dimension/compiler.h new file mode 100644 index 0000000..5ce8ce8 --- /dev/null +++ b/libdimension/dimension/compiler.h @@ -0,0 +1,52 @@ +/************************************************************************* + * Copyright (C) 2009-2010 Tavian Barnes * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Library 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * . * + *************************************************************************/ + +/** + * @file + * Compiler abstractions. + */ + +/** + * @def DMNSN_INLINE + * A portable inline specifier. Expands to the correct method of declaring + * inline functions for the version of C you are using. + */ +#ifndef DMNSN_INLINE + #ifdef __cplusplus + /* C++ inline semantics */ + #define DMNSN_INLINE inline + #elif __STDC_VERSION__ >= 199901L + /* C99 inline semantics */ + #define DMNSN_INLINE inline + #elif defined(__GNUC__) + /* GCC inline semantics */ + #define DMNSN_INLINE __extension__ extern __inline__ + #else + /* Unknown C - mark functions static and hope the compiler is smart enough + to inline them */ + #define DMNSN_INLINE static + #endif +#endif + +#ifdef __GNUC__ + #define DMNSN_UNREACHABLE() __builtin_unreachable(); +#else + #define DMNSN_UNREACHABLE() +#endif diff --git a/libdimension/dimension/error.h b/libdimension/dimension/error.h index ae8ba01..894899a 100644 --- a/libdimension/dimension/error.h +++ b/libdimension/dimension/error.h @@ -39,8 +39,11 @@ * Report an error. * @param[in] str A string to print explaining the error. */ -#define dmnsn_error(str) \ - dmnsn_report_error(true, DMNSN_FUNC, __FILE__, __LINE__, str) +#define dmnsn_error(str) \ + do { \ + dmnsn_report_error(true, DMNSN_FUNC, __FILE__, __LINE__, str); \ + DMNSN_UNREACHABLE(); \ + } while (0) /** * @def dmnsn_assert @@ -54,11 +57,22 @@ #define dmnsn_assert(expr, str) \ do { \ if (!(expr)) { \ - dmnsn_error((str)); \ + dmnsn_error((str)); \ } \ } while (0) #endif +/** + * @def dmnsn_unreachable + * Express that a line of code is unreachable. + * @param[in] str A string to print if the line is reached. + */ +#ifdef NDEBUG + #define dmnsn_unreachable(str) DMNSN_UNREACHABLE() +#else + #define dmnsn_unreachable(str) dmnsn_error((str)) +#endif + /** * @internal * Called by dmnsn_warning() and dmnsn_error(); don't call directly. diff --git a/libdimension/dimension/inline.h b/libdimension/dimension/inline.h deleted file mode 100644 index e17c60e..0000000 --- a/libdimension/dimension/inline.h +++ /dev/null @@ -1,49 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009-2010 Tavian Barnes * - * * - * This file is part of The Dimension Library. * - * * - * The Dimension Library is free software; you can redistribute it and/ * - * or modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 3 of the * - * License, or (at your option) any later version. * - * * - * The Dimension Library 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 * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this program. If not, see * - * . * - *************************************************************************/ - -/** - * @file - * Inline function support. Handle inlines nicely without cheating and making - * them static. The DMNSN_INLINE macro is set appropriately for the version of - * C you're using, and non-inline versions are emitted in exactly one - * translation unit when necessary. - */ - -/** - * @def DMNSN_INLINE - * A portable inline specifier. Expands to the correct method of declaring - * inline functions for the version of C you are using. - */ -#ifndef DMNSN_INLINE - #ifdef __cplusplus - /* C++ inline semantics */ - #define DMNSN_INLINE inline - #elif __STDC_VERSION__ >= 199901L - /* C99 inline semantics */ - #define DMNSN_INLINE inline - #elif defined(__GNUC__) - /* GCC inline semantics */ - #define DMNSN_INLINE __extension__ extern __inline__ - #else - /* Unknown C - mark functions static and hope the compiler is smart enough - to inline them */ - #define DMNSN_INLINE static - #endif -#endif -- cgit v1.2.3