summaryrefslogtreecommitdiffstats
path: root/src/armadillo/include/armadillo_bits/compiler_setup.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/armadillo/include/armadillo_bits/compiler_setup.hpp')
-rw-r--r--src/armadillo/include/armadillo_bits/compiler_setup.hpp511
1 files changed, 511 insertions, 0 deletions
diff --git a/src/armadillo/include/armadillo_bits/compiler_setup.hpp b/src/armadillo/include/armadillo_bits/compiler_setup.hpp
new file mode 100644
index 0000000..775b82a
--- /dev/null
+++ b/src/armadillo/include/armadillo_bits/compiler_setup.hpp
@@ -0,0 +1,511 @@
+// SPDX-License-Identifier: Apache-2.0
+//
+// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
+// Copyright 2008-2016 National ICT Australia (NICTA)
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// ------------------------------------------------------------------------
+
+
+
+#undef arma_hot
+#undef arma_cold
+#undef arma_aligned
+#undef arma_align_mem
+#undef arma_warn_unused
+#undef arma_deprecated
+#undef arma_frown
+#undef arma_malloc
+#undef arma_inline
+#undef arma_noinline
+#undef arma_ignore
+
+#define arma_hot
+#define arma_cold
+#define arma_aligned
+#define arma_align_mem
+#define arma_warn_unused
+#define arma_deprecated
+#define arma_frown(msg)
+#define arma_malloc
+#define arma_inline inline
+#define arma_noinline
+#define arma_ignore(variable) ((void)(variable))
+
+#undef arma_fortran_sans_prefix_B
+#undef arma_fortran_with_prefix_B
+
+#if defined(ARMA_BLAS_UNDERSCORE)
+ #define arma_fortran_sans_prefix_B(function) function##_
+
+ #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS)
+ #define arma_fortran_with_prefix_B(function) wrapper2_##function##_
+ #else
+ #define arma_fortran_with_prefix_B(function) wrapper_##function##_
+ #endif
+#else
+ #define arma_fortran_sans_prefix_B(function) function
+
+ #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS)
+ #define arma_fortran_with_prefix_B(function) wrapper2_##function
+ #else
+ #define arma_fortran_with_prefix_B(function) wrapper_##function
+ #endif
+#endif
+
+#undef arma_fortran
+#undef arma_wrapper
+
+#if defined(ARMA_USE_WRAPPER)
+ #define arma_fortran(function) arma_fortran_with_prefix_B(function)
+ #define arma_wrapper(function) wrapper_##function
+#else
+ #define arma_fortran(function) arma_fortran_sans_prefix_B(function)
+ #define arma_wrapper(function) function
+#endif
+
+#undef arma_fortran_sans_prefix
+#undef arma_fortran_with_prefix
+
+#define arma_fortran_sans_prefix(function) arma_fortran_sans_prefix_B(function)
+#define arma_fortran_with_prefix(function) arma_fortran_with_prefix_B(function)
+
+#undef ARMA_INCFILE_WRAP
+#define ARMA_INCFILE_WRAP(x) <x>
+
+
+#if !defined(ARMA_32BIT_WORD)
+ #undef ARMA_64BIT_WORD
+ #define ARMA_64BIT_WORD
+#endif
+
+#if defined(ARMA_64BIT_WORD) && defined(SIZE_MAX)
+ #if (SIZE_MAX < 0xFFFFFFFFFFFFFFFFull)
+ // #pragma message ("WARNING: disabled use of 64 bit integers, as std::size_t is smaller than 64 bits")
+ #undef ARMA_64BIT_WORD
+ #endif
+#endif
+
+
+// most compilers can't vectorise slightly elaborate loops;
+// for example clang: http://llvm.org/bugs/show_bug.cgi?id=16358
+#undef ARMA_SIMPLE_LOOPS
+#define ARMA_SIMPLE_LOOPS
+
+#undef ARMA_GOOD_COMPILER
+
+// posix_memalign() is part of IEEE standard 1003.1
+// http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_memalign.html
+// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
+// http://sourceforge.net/p/predef/wiki/Standards/
+#if ( defined(_POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO >= 200112L) )
+ #undef ARMA_HAVE_POSIX_MEMALIGN
+ #define ARMA_HAVE_POSIX_MEMALIGN
+#endif
+
+
+#if defined(__APPLE__) || defined(__apple_build_version__)
+ // NOTE: Apple accelerate framework has broken implementations of functions that return a float value,
+ // NOTE: such as sdot(), slange(), clange(), slansy(), clanhe(), slangb()
+ #undef ARMA_BLAS_FLOAT_BUG
+ #define ARMA_BLAS_FLOAT_BUG
+
+ // #undef ARMA_HAVE_POSIX_MEMALIGN
+ // NOTE: posix_memalign() is available since macOS 10.6 (late 2009 onwards)
+#endif
+
+
+#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(_MSC_VER)
+ #undef ARMA_HAVE_POSIX_MEMALIGN
+#endif
+
+
+#undef ARMA_FNSIG
+
+#if defined (__GNUG__)
+ #define ARMA_FNSIG __PRETTY_FUNCTION__
+#elif defined (_MSC_VER)
+ #define ARMA_FNSIG __FUNCSIG__
+#elif defined(__INTEL_COMPILER)
+ #define ARMA_FNSIG __FUNCTION__
+#else
+ #define ARMA_FNSIG __func__
+#endif
+
+
+#if !defined(ARMA_ALLOW_FAKE_GCC)
+ #if (defined(__GNUG__) || defined(__GNUC__)) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__))
+ #undef ARMA_DETECTED_FAKE_GCC
+ #define ARMA_DETECTED_FAKE_GCC
+
+ #pragma message ("WARNING: this compiler is pretending to be GCC but it may not be fully compatible;")
+ #pragma message ("WARNING: to allow this compiler to use GCC features such as data alignment attributes,")
+ #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_GCC before #include <armadillo>")
+ #endif
+#endif
+
+
+#if defined(__GNUG__) && (!defined(__clang__) && !defined(ARMA_DETECTED_FAKE_GCC))
+
+ // #pragma message ("using GCC extensions")
+
+ #undef ARMA_GCC_VERSION
+ #define ARMA_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+
+ #if (ARMA_GCC_VERSION < 40803)
+ #error "*** newer compiler required; need gcc 4.8.3 or newer ***"
+ #endif
+
+ // #if (ARMA_GCC_VERSION < 60100)
+ // #pragma message ("WARNING: support for gcc versions older than 6.1 is deprecated")
+ // #endif
+
+ #define ARMA_GOOD_COMPILER
+
+ #undef arma_hot
+ #undef arma_cold
+ #undef arma_aligned
+ #undef arma_align_mem
+ #undef arma_warn_unused
+ #undef arma_deprecated
+ #undef arma_frown
+ #undef arma_malloc
+ #undef arma_inline
+ #undef arma_noinline
+
+ #define arma_hot __attribute__((__hot__))
+ #define arma_cold __attribute__((__cold__))
+ #define arma_aligned __attribute__((__aligned__))
+ #define arma_align_mem __attribute__((__aligned__(16)))
+ #define arma_warn_unused __attribute__((__warn_unused_result__))
+ #define arma_deprecated __attribute__((__deprecated__))
+ #define arma_frown(msg) __attribute__((__deprecated__(msg)))
+ #define arma_malloc __attribute__((__malloc__))
+ #define arma_inline __attribute__((__always_inline__)) inline
+ #define arma_noinline __attribute__((__noinline__))
+
+ #undef ARMA_HAVE_ALIGNED_ATTRIBUTE
+ #define ARMA_HAVE_ALIGNED_ATTRIBUTE
+
+ #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
+ #define ARMA_HAVE_GCC_ASSUME_ALIGNED
+
+ // gcc's vectoriser can handle elaborate loops
+ #undef ARMA_SIMPLE_LOOPS
+
+ #if defined(__OPTIMIZE_SIZE__)
+ #define ARMA_SIMPLE_LOOPS
+ #endif
+
+#endif
+
+
+// TODO: __INTEL_CLANG_COMPILER indicates the clang based intel compiler, distinct from the classic intel compiler
+#if !defined(ARMA_ALLOW_FAKE_CLANG)
+ #if defined(__clang__) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__))
+ #undef ARMA_DETECTED_FAKE_CLANG
+ #define ARMA_DETECTED_FAKE_CLANG
+
+ #pragma message ("WARNING: this compiler is pretending to be Clang but it may not be fully compatible;")
+ #pragma message ("WARNING: to allow this compiler to use Clang features such as data alignment attributes,")
+ #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_CLANG before #include <armadillo>")
+ #endif
+#endif
+
+
+#if defined(__clang__) && !defined(ARMA_DETECTED_FAKE_CLANG)
+
+ // #pragma message ("using Clang extensions")
+
+ #define ARMA_GOOD_COMPILER
+
+ #if !defined(__has_attribute)
+ #define __has_attribute(x) 0
+ #endif
+
+ #if __has_attribute(__aligned__)
+ #undef arma_aligned
+ #undef arma_align_mem
+
+ #define arma_aligned __attribute__((__aligned__))
+ #define arma_align_mem __attribute__((__aligned__(16)))
+
+ #undef ARMA_HAVE_ALIGNED_ATTRIBUTE
+ #define ARMA_HAVE_ALIGNED_ATTRIBUTE
+ #endif
+
+ #if __has_attribute(__warn_unused_result__)
+ #undef arma_warn_unused
+ #define arma_warn_unused __attribute__((__warn_unused_result__))
+ #endif
+
+ #if __has_attribute(__deprecated__)
+ #undef arma_deprecated
+ #define arma_deprecated __attribute__((__deprecated__))
+ #endif
+
+ #if __has_attribute(__deprecated__)
+ #undef arma_frown
+ #define arma_frown(msg) __attribute__((__deprecated__(msg)))
+ #endif
+
+ #if __has_attribute(__malloc__)
+ #undef arma_malloc
+ #define arma_malloc __attribute__((__malloc__))
+ #endif
+
+ #if __has_attribute(__always_inline__)
+ #undef arma_inline
+ #define arma_inline __attribute__((__always_inline__)) inline
+ #endif
+
+ #if __has_attribute(__noinline__)
+ #undef arma_noinline
+ #define arma_noinline __attribute__((__noinline__))
+ #endif
+
+ #if __has_attribute(__hot__)
+ #undef arma_hot
+ #define arma_hot __attribute__((__hot__))
+ #endif
+
+ #if __has_attribute(__cold__)
+ #undef arma_cold
+ #define arma_cold __attribute__((__cold__))
+ #elif __has_attribute(__minsize__)
+ #undef arma_cold
+ #define arma_cold __attribute__((__minsize__))
+ #endif
+
+ #if defined(__has_builtin) && __has_builtin(__builtin_assume_aligned)
+ #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
+ #define ARMA_HAVE_GCC_ASSUME_ALIGNED
+ #endif
+
+#endif
+
+
+#if defined(__INTEL_COMPILER)
+
+ #if (__INTEL_COMPILER == 9999)
+ #error "*** newer compiler required ***"
+ #endif
+
+ #if (__INTEL_COMPILER < 1500)
+ #error "*** newer compiler required ***"
+ #endif
+
+ #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
+ #undef ARMA_HAVE_ICC_ASSUME_ALIGNED
+ #define ARMA_HAVE_ICC_ASSUME_ALIGNED
+
+#endif
+
+
+#if defined(_MSC_VER)
+
+ #if (_MSC_VER < 1900)
+ #error "*** newer compiler required ***"
+ #endif
+
+ #undef arma_deprecated
+ #define arma_deprecated __declspec(deprecated)
+ // #undef arma_inline
+ // #define arma_inline __forceinline inline
+
+ #pragma warning(push)
+
+ #pragma warning(disable: 4127) // conditional expression is constant
+ #pragma warning(disable: 4180) // qualifier has no meaning
+ #pragma warning(disable: 4244) // possible loss of data when converting types (see also 4305)
+ #pragma warning(disable: 4510) // default constructor could not be generated
+ #pragma warning(disable: 4511) // copy constructor can't be generated
+ #pragma warning(disable: 4512) // assignment operator can't be generated
+ #pragma warning(disable: 4513) // destructor can't be generated
+ #pragma warning(disable: 4514) // unreferenced inline function has been removed
+ #pragma warning(disable: 4519) // default template args are only allowed on a class template (C++11)
+ #pragma warning(disable: 4522) // multiple assignment operators specified
+ #pragma warning(disable: 4623) // default constructor can't be generated
+ #pragma warning(disable: 4624) // destructor can't be generated
+ #pragma warning(disable: 4625) // copy constructor can't be generated
+ #pragma warning(disable: 4626) // assignment operator can't be generated
+ #pragma warning(disable: 4702) // unreachable code
+ #pragma warning(disable: 4710) // function not inlined
+ #pragma warning(disable: 4711) // call was inlined
+ #pragma warning(disable: 4714) // __forceinline can't be inlined
+ #pragma warning(disable: 4800) // value forced to bool
+
+ // NOTE: also possible to disable 4146 (unary minus operator applied to unsigned type, result still unsigned)
+
+ #if defined(ARMA_HAVE_CXX17)
+ #pragma warning(disable: 26812) // unscoped enum
+ #pragma warning(disable: 26819) // unannotated fallthrough
+ #endif
+
+ // #if (_MANAGED == 1) || (_M_CEE == 1)
+ //
+ // // don't do any alignment when compiling in "managed code" mode
+ //
+ // #undef arma_aligned
+ // #define arma_aligned
+ //
+ // #undef arma_align_mem
+ // #define arma_align_mem
+ //
+ // #elif (_MSC_VER >= 1700)
+ //
+ // #undef arma_align_mem
+ // #define arma_align_mem __declspec(align(16))
+ //
+ // #define ARMA_HAVE_ALIGNED_ATTRIBUTE
+ //
+ // // disable warnings: "structure was padded due to __declspec(align(16))"
+ // #pragma warning(disable: 4324)
+ //
+ // #endif
+
+#endif
+
+
+#if defined(__SUNPRO_CC)
+
+ // http://www.oracle.com/technetwork/server-storage/solarisstudio/training/index-jsp-141991.html
+ // http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/cplusplus-faq-355066.html
+
+ #if (__SUNPRO_CC < 0x5140)
+ #error "*** newer compiler required ***"
+ #endif
+
+#endif
+
+
+#if defined(ARMA_HAVE_CXX14)
+ #undef arma_deprecated
+ #define arma_deprecated [[deprecated]]
+
+ #undef arma_frown
+ #define arma_frown(msg) [[deprecated(msg)]]
+#endif
+
+
+#if defined(ARMA_HAVE_CXX17)
+ #undef arma_warn_unused
+ #define arma_warn_unused [[nodiscard]]
+#endif
+
+
+#if !defined(ARMA_DONT_USE_OPENMP)
+ #if (defined(_OPENMP) && (_OPENMP >= 201107))
+ #undef ARMA_USE_OPENMP
+ #define ARMA_USE_OPENMP
+ #endif
+#endif
+
+
+#if ( defined(ARMA_USE_OPENMP) && (!defined(_OPENMP) || (defined(_OPENMP) && (_OPENMP < 201107))) )
+ // OpenMP 3.0 required for parallelisation of loops with unsigned integers
+ // OpenMP 3.1 required for atomic read and atomic write
+ #undef ARMA_USE_OPENMP
+ #undef ARMA_PRINT_OPENMP_WARNING
+ #define ARMA_PRINT_OPENMP_WARNING
+#endif
+
+
+#if defined(ARMA_PRINT_OPENMP_WARNING) && !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
+ #pragma message ("WARNING: use of OpenMP disabled; compiler support for OpenMP 3.1+ not detected")
+
+ #if (defined(_OPENMP) && (_OPENMP < 201107))
+ #pragma message ("NOTE: your compiler has an outdated version of OpenMP")
+ #pragma message ("NOTE: consider upgrading to a better compiler")
+ #endif
+#endif
+
+
+#if defined(ARMA_USE_OPENMP)
+ #if (defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION < 50400))
+ // due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57580
+ #undef ARMA_USE_OPENMP
+ #if !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
+ #pragma message ("WARNING: use of OpenMP disabled due to compiler bug in gcc <= 5.3")
+ #endif
+ #endif
+#endif
+
+
+#if (defined(__FAST_MATH__) || (defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0)) || defined(_M_FP_FAST))
+ #undef ARMA_FAST_MATH
+ #define ARMA_FAST_MATH
+#endif
+
+
+#if defined(ARMA_FAST_MATH) && !defined(ARMA_DONT_PRINT_FAST_MATH_WARNING)
+ #pragma message ("WARNING: compiler is in fast math mode; some functions may be unreliable.")
+ #pragma message ("WARNING: to suppress this warning and related warnings,")
+ #pragma message ("WARNING: #define ARMA_DONT_PRINT_FAST_MATH_WARNING before #include <armadillo>")
+#endif
+
+
+#if ( (defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)) && (!defined(__MINGW32__) && !defined(__MINGW64__)) )
+ #undef ARMA_PRINT_EXCEPTIONS_INTERNAL
+ #define ARMA_PRINT_EXCEPTIONS_INTERNAL
+#endif
+
+
+#if (defined(ARMA_ALIEN_MEM_ALLOC_FUNCTION) && !defined(ARMA_ALIEN_MEM_FREE_FUNCTION)) || (!defined(ARMA_ALIEN_MEM_ALLOC_FUNCTION) && defined(ARMA_ALIEN_MEM_FREE_FUNCTION))
+ #error "*** both ARMA_ALIEN_MEM_ALLOC_FUNCTION and ARMA_ALIEN_MEM_FREE_FUNCTION must be defined ***"
+#endif
+
+
+
+// cleanup
+
+#undef ARMA_DETECTED_FAKE_GCC
+#undef ARMA_DETECTED_FAKE_CLANG
+#undef ARMA_GCC_VERSION
+#undef ARMA_PRINT_OPENMP_WARNING
+
+
+
+// undefine conflicting macros
+
+#if defined(log2)
+ #undef log2
+ #pragma message ("WARNING: undefined conflicting 'log2' macro")
+#endif
+
+#if defined(check)
+ #undef check
+ #pragma message ("WARNING: undefined conflicting 'check' macro")
+#endif
+
+#if defined(min) || defined(max)
+ #undef min
+ #undef max
+ #pragma message ("WARNING: undefined conflicting 'min' and/or 'max' macros")
+#endif
+
+// https://sourceware.org/bugzilla/show_bug.cgi?id=19239
+#undef minor
+#undef major
+
+
+// optionally allow disabling of compile-time deprecation messages (not recommended)
+// NOTE: option 'ARMA_IGNORE_DEPRECATED_MARKER' will be removed
+// NOTE: disabling deprecation messages is counter-productive
+
+#if defined(ARMA_IGNORE_DEPRECATED_MARKER) && (!defined(ARMA_DONT_IGNORE_DEPRECATED_MARKER)) && (!defined(ARMA_EXTRA_DEBUG))
+ #undef arma_deprecated
+ #define arma_deprecated
+
+ #undef arma_frown
+ #define arma_frown(msg)
+#endif