From e320ec6d5cd44e03cb2e2faa1d7625e84f76d668 Mon Sep 17 00:00:00 2001 From: "Field G. Van Zee" Date: Fri, 20 Aug 2021 17:15:20 -0500 Subject: [PATCH] Moved lang defs from _macro_def.h to _lang_defs.h. Details: - Moved miscellaneous language-related definitions, including defs related to the handling of the 'restrict' keyword, from the top half of bli_macro_defs.h into a new file, bli_lang_defs.h, which is now #included immediately after "bli_system.h" in blis.h. This change is an attempt to fix a report of recent breakage of C++ compilers due to the recent introduction of 'restrict' in bli_type_defs.h (which previously was being included *before* bli_macro_defs.h and its restrict handling therein. Thanks to Ivan Korostelev for reporting this issue in #527. - CREDITS file update. --- CREDITS | 1 + frame/include/bli_lang_defs.h | 111 +++++++++++++++++++++++++++++++++ frame/include/bli_macro_defs.h | 71 --------------------- frame/include/blis.h | 5 +- 4 files changed, 115 insertions(+), 73 deletions(-) create mode 100644 frame/include/bli_lang_defs.h diff --git a/CREDITS b/CREDITS index b77e08098..827d63e68 100644 --- a/CREDITS +++ b/CREDITS @@ -49,6 +49,7 @@ but many others have contributed code and feedback, including Tony Kelman @tkelman Lee Killough @leekillough (Cray) Mike Kistler @mkistler (IBM, Austin Research Laboratory) + Ivan Korostelev @ivan23kor (University of Alberta) Kyungmin Lee @kyungminlee (Ohio State University) Michael Lehn @michael-lehn Shmuel Levine @ShmuelLevine diff --git a/frame/include/bli_lang_defs.h b/frame/include/bli_lang_defs.h new file mode 100644 index 000000000..8cf3f9986 --- /dev/null +++ b/frame/include/bli_lang_defs.h @@ -0,0 +1,111 @@ +/* + + BLIS + An object-based framework for developing high-performance BLAS-like + libraries. + + Copyright (C) 2014, The University of Texas at Austin + Copyright (C) 2018 - 2019, Advanced Micro Devices, Inc. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name(s) of the copyright holder(s) nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef BLIS_LANG_DEFS_H +#define BLIS_LANG_DEFS_H + + +// -- Undefine restrict for C++ and C89/90 -- + +#ifdef __cplusplus + // Language is C++; define restrict as nothing. + #ifndef restrict + #define restrict + #endif +#elif __STDC_VERSION__ >= 199901L + // Language is C99 (or later); do nothing since restrict is recognized. +#else + // Language is pre-C99; define restrict as nothing. + #ifndef restrict + #define restrict + #endif +#endif + + +// -- Define typeof() operator if using non-GNU compiler -- + +#ifndef __GNUC__ + #define typeof __typeof__ +#else + #ifndef typeof + #define typeof __typeof__ + #endif +#endif + + +// -- BLIS Thread Local Storage Keyword -- + +// __thread for TLS is supported by GCC, CLANG, ICC, and IBMC. +// There is a small risk here as __GNUC__ can also be defined by some other +// compiler (other than ICC and CLANG which we know define it) that +// doesn't support __thread, as __GNUC__ is not quite unique to GCC. +// But the possibility of someone using such non-main-stream compiler +// for building BLIS is low. +#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__IBMC__) + #define BLIS_THREAD_LOCAL __thread +#else + #define BLIS_THREAD_LOCAL +#endif + + +// -- BLIS constructor/destructor function attribute -- + +// __attribute__((constructor/destructor)) is supported by GCC only. +// There is a small risk here as __GNUC__ can also be defined by some other +// compiler (other than ICC and CLANG which we know define it) that +// doesn't support this, as __GNUC__ is not quite unique to GCC. +// But the possibility of someone using such non-main-stream compiler +// for building BLIS is low. + +#if defined(__ICC) || defined(__INTEL_COMPILER) + // ICC defines __GNUC__ but doesn't support this + #define BLIS_ATTRIB_CTOR + #define BLIS_ATTRIB_DTOR +#elif defined(__clang__) + // CLANG supports __attribute__, but its documentation doesn't + // mention support for constructor/destructor. Compiling with + // clang and testing shows that it does support. + #define BLIS_ATTRIB_CTOR __attribute__((constructor)) + #define BLIS_ATTRIB_DTOR __attribute__((destructor)) +#elif defined(__GNUC__) + #define BLIS_ATTRIB_CTOR __attribute__((constructor)) + #define BLIS_ATTRIB_DTOR __attribute__((destructor)) +#else + #define BLIS_ATTRIB_CTOR + #define BLIS_ATTRIB_DTOR +#endif + + +#endif diff --git a/frame/include/bli_macro_defs.h b/frame/include/bli_macro_defs.h index 907a5a26c..03451d440 100644 --- a/frame/include/bli_macro_defs.h +++ b/frame/include/bli_macro_defs.h @@ -37,77 +37,6 @@ #define BLIS_MACRO_DEFS_H -// -- Undefine restrict for C++ and C89/90 -- - -#ifdef __cplusplus - // Language is C++; define restrict as nothing. - #ifndef restrict - #define restrict - #endif -#elif __STDC_VERSION__ >= 199901L - // Language is C99 (or later); do nothing since restrict is recognized. -#else - // Language is pre-C99; define restrict as nothing. - #ifndef restrict - #define restrict - #endif -#endif - - -// -- Define typeof() operator if using non-GNU compiler -- - -#ifndef __GNUC__ - #define typeof __typeof__ -#else - #ifndef typeof - #define typeof __typeof__ - #endif -#endif - - -// -- BLIS Thread Local Storage Keyword -- - -// __thread for TLS is supported by GCC, CLANG, ICC, and IBMC. -// There is a small risk here as __GNUC__ can also be defined by some other -// compiler (other than ICC and CLANG which we know define it) that -// doesn't support __thread, as __GNUC__ is not quite unique to GCC. -// But the possibility of someone using such non-main-stream compiler -// for building BLIS is low. -#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__IBMC__) - #define BLIS_THREAD_LOCAL __thread -#else - #define BLIS_THREAD_LOCAL -#endif - - -// -- BLIS constructor/destructor function attribute -- - -// __attribute__((constructor/destructor)) is supported by GCC only. -// There is a small risk here as __GNUC__ can also be defined by some other -// compiler (other than ICC and CLANG which we know define it) that -// doesn't support this, as __GNUC__ is not quite unique to GCC. -// But the possibility of someone using such non-main-stream compiler -// for building BLIS is low. - -#if defined(__ICC) || defined(__INTEL_COMPILER) - // ICC defines __GNUC__ but doesn't support this - #define BLIS_ATTRIB_CTOR - #define BLIS_ATTRIB_DTOR -#elif defined(__clang__) - // CLANG supports __attribute__, but its documentation doesn't - // mention support for constructor/destructor. Compiling with - // clang and testing shows that it does support. - #define BLIS_ATTRIB_CTOR __attribute__((constructor)) - #define BLIS_ATTRIB_DTOR __attribute__((destructor)) -#elif defined(__GNUC__) - #define BLIS_ATTRIB_CTOR __attribute__((constructor)) - #define BLIS_ATTRIB_DTOR __attribute__((destructor)) -#else - #define BLIS_ATTRIB_CTOR - #define BLIS_ATTRIB_DTOR -#endif - - // -- Concatenation macros -- #define BLIS_FUNC_PREFIX_STR "bli" diff --git a/frame/include/blis.h b/frame/include/blis.h index 61b7a0f82..a42c7cce8 100644 --- a/frame/include/blis.h +++ b/frame/include/blis.h @@ -48,10 +48,11 @@ extern "C" { // NOTE: PLEASE DON'T CHANGE THE ORDER IN WHICH HEADERS ARE INCLUDED UNLESS // YOU ARE SURE THAT IT DOESN'T BREAK INTER-HEADER MACRO DEPENDENCIES. -// -- System headers -- -// NOTE: This header must be included before bli_config_macro_defs.h. +// -- System and language-related headers -- +// NOTE: bli_system.h header must be included before bli_config_macro_defs.h. #include "bli_system.h" +#include "bli_lang_defs.h" // -- configure definitions --