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/Makefile.am | 4 +-- libdimension/compiler-internal.h | 51 ++++++++++++++++++++++++++++++++++++++ libdimension/compiler.h | 51 -------------------------------------- libdimension/dimension-internal.h | 2 +- libdimension/dimension.h | 2 +- libdimension/dimension/compiler.h | 52 +++++++++++++++++++++++++++++++++++++++ libdimension/dimension/error.h | 20 ++++++++++++--- libdimension/dimension/inline.h | 49 ------------------------------------ libdimension/prtree.c | 3 +-- 9 files changed, 125 insertions(+), 109 deletions(-) create mode 100644 libdimension/compiler-internal.h delete mode 100644 libdimension/compiler.h create mode 100644 libdimension/dimension/compiler.h delete mode 100644 libdimension/dimension/inline.h (limited to 'libdimension') diff --git a/libdimension/Makefile.am b/libdimension/Makefile.am index 35f56f7..c75241e 100644 --- a/libdimension/Makefile.am +++ b/libdimension/Makefile.am @@ -32,6 +32,7 @@ nobase_include_HEADERS = dimension.h \ dimension/cameras.h \ dimension/canvas.h \ dimension/color.h \ + dimension/compiler.h \ dimension/csg.h \ dimension/dictionary.h \ dimension/error.h \ @@ -40,7 +41,6 @@ nobase_include_HEADERS = dimension.h \ dimension/future.h \ dimension/geometry.h \ dimension/gl.h \ - dimension/inline.h \ dimension/interior.h \ dimension/light.h \ dimension/lights.h \ @@ -69,7 +69,7 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \ canvas_pigment.c \ checker.c \ color.c \ - compiler.h \ + compiler-internal.h \ cone.c \ cube.c \ csg.c \ diff --git a/libdimension/compiler-internal.h b/libdimension/compiler-internal.h new file mode 100644 index 0000000..e59ece2 --- /dev/null +++ b/libdimension/compiler-internal.h @@ -0,0 +1,51 @@ +/************************************************************************* + * Copyright (C) 2010-2011 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 + * Internally-used compiler abstractions. + */ + +#include + +#ifdef DMNSN_PROFILE + #define dmnsn_likely(test) \ + dmnsn_expect(!!(test), true, DMNSN_FUNC, __FILE__, __LINE__) + #define dmnsn_unlikely(test) \ + dmnsn_expect(!!(test), false, DMNSN_FUNC, __FILE__, __LINE__) +#elif defined(__GNUC__) + #define dmnsn_likely(test) __builtin_expect(!!(test), true) + #define dmnsn_unlikely(test) __builtin_expect(!!(test), false) +#else + #define dmnsn_likely(test) (!!(test)) + #define dmnsn_unlikely(test) (!!(test)) +#endif + +#ifdef __GNUC__ + #define DMNSN_HOT __attribute__((hot)) + #define DMNSN_INTERNAL __attribute__((visibility("hidden"))) + #define DMNSN_DESTRUCTOR __attribute__((destructor(102))) + #define DMNSN_LATE_DESTRUCTOR __attribute__((destructor(101))) +#else + #define DMNSN_HOT + #define DMNSN_INTERNAL + #define DMNSN_DESTRUCTOR + #define DMNSN_LATE_DESTRUCTOR +#endif diff --git a/libdimension/compiler.h b/libdimension/compiler.h deleted file mode 100644 index d6435d0..0000000 --- a/libdimension/compiler.h +++ /dev/null @@ -1,51 +0,0 @@ -/************************************************************************* - * Copyright (C) 2010-2011 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. - */ - -#include - -#ifdef DMNSN_PROFILE - #define dmnsn_likely(test) \ - dmnsn_expect(!!(test), true, DMNSN_FUNC, __FILE__, __LINE__) - #define dmnsn_unlikely(test) \ - dmnsn_expect(!!(test), false, DMNSN_FUNC, __FILE__, __LINE__) -#elif defined(__GNUC__) - #define dmnsn_likely(test) __builtin_expect(!!(test), true) - #define dmnsn_unlikely(test) __builtin_expect(!!(test), false) -#else - #define dmnsn_likely(test) (!!(test)) - #define dmnsn_unlikely(test) (!!(test)) -#endif - -#ifdef __GNUC__ - #define DMNSN_HOT __attribute__((hot)) - #define DMNSN_INTERNAL __attribute__((visibility("hidden"))) - #define DMNSN_DESTRUCTOR __attribute__((destructor(102))) - #define DMNSN_LATE_DESTRUCTOR __attribute__((destructor(101))) -#else - #define DMNSN_HOT - #define DMNSN_INTERNAL - #define DMNSN_DESTRUCTOR - #define DMNSN_LATE_DESTRUCTOR -#endif diff --git a/libdimension/dimension-internal.h b/libdimension/dimension-internal.h index 15a7e4c..eae585d 100644 --- a/libdimension/dimension-internal.h +++ b/libdimension/dimension-internal.h @@ -30,7 +30,7 @@ #define _GNU_SOURCE #include "dimension.h" #include "refcount-internal.h" -#include "compiler.h" +#include "compiler-internal.h" #include "profile.h" #include "platform.h" #include "future-impl.h" diff --git a/libdimension/dimension.h b/libdimension/dimension.h index 59b73bd..375c2ec 100644 --- a/libdimension/dimension.h +++ b/libdimension/dimension.h @@ -74,7 +74,7 @@ typedef void dmnsn_callback_fn(void *ptr); typedef void dmnsn_free_fn(void *ptr); /* Include all the libdimension headers */ -#include +#include #include #include #include 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 diff --git a/libdimension/prtree.c b/libdimension/prtree.c index c59bcc4..33cb9a2 100644 --- a/libdimension/prtree.c +++ b/libdimension/prtree.c @@ -121,8 +121,7 @@ dmnsn_get_coordinate(const dmnsn_prnode * const *node, int comparator) return -(*node)->bounding_box.max.z; default: - dmnsn_assert(false, "Invalid comparator."); - return 0.0; /* Shut up compiler */ + dmnsn_unreachable("Invalid comparator."); } } -- cgit v1.2.3