+2019-12-30 Jerome Lambourg <lambourg@adacore.com>
+ Olivier Hainque <hainque@adacore.com>
+
+ * config/os/vxworks/os_defines.h
+ (NOMINMAX): Always redefine to 1.
+ (_NO_CPP_INLINES): Likewise.
+ (_GLIBCXX_USE_WEAK_REF): Define to 1 for RTP on
+ VxWorks >= 7, to 0 otherwise.
+ (_GLIBCXX_HAVE_TLS): Define to 1.
+ For VxWorks >= 7:
+ (_GLIBCXX_USE_C99_MATH): Define to 1.
+ (_GLIBCXX_USE_C99_MATH_FP_MACROS_DYNAMIC): Define to 0.
+ (_HAS_TR1_DECLARATIONS): Redefine to 0.
+ For VxWorks < 7, RTP:
+ (_GLIBCXX_INCLUDE_NEXT_C_HEADERS): Define to 1.
+ (_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC): Redefine to 1.
+ (__CORRECT_ISO_CPP11_MATH_H_PROTO_FP): Define.
+ For VxWorks < 7, kernel: #include <vxWorks.h>
+
2019-12-25 Alexandre Oliva <oliva@adacore.com>
* crossconfig.m4 (GLIBCXX_CROSSCONFIG) [*-vxworks*]: Define
// System-specific #define, typedefs, corrections, etc, go here. This
// file will come before all others.
-//Keep vxWorks from defining min()/max() as macros
-#ifdef NOMINMAX
-#undef NOMINMAX
+// The system environment we can rely on varies across VxWorks
+// versions.
+#include <_vxworks-versions.h>
+
+// Weak refs are supported starting with VxWorks 7, in RTP mode only
+
+#if _VXWORKS_MAJOR_GE(7) && defined(__RTP__)
+#define _GLIBCXX_USE_WEAK_REF 1
+#else
+#define _GLIBCXX_USE_WEAK_REF 0
#endif
+
+// We support TLS on VxWorks (either directly or with emutls)
+#define _GLIBCXX_HAVE_TLS 1
+
+// VxWorks7 comes with a DinkumWare library and the system headers which we
+// are going to include for libstdc++ have a few related intrinsic
+// assumptions. We control our own configuration here to best integrate with
+// this environment: use C99 math headers, do not use the FP macros for
+// dynamic cast by default (overriden for RTPs below) and arrange to disable
+// the system TR1 declarations as we'll provide ours.
+
+#if _VXWORKS_MAJOR_GE(7)
+
+#define _GLIBCXX_USE_C99_MATH 1
+#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 0
+
+#undef _HAS_TR1_DECLARATIONS
+#define _HAS_TR1_DECLARATIONS 0
+
+#else // VXWORKS_MAJOR < 7
+
+// For RTPs, use the VxWorks headers as a basis, from which we can use
+// C99 dynamic FP macros and expect (after fixincludes) accurate c++11
+// prototypes for FP.
+
+#ifdef __RTP__
+
+#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS 1
+
+#undef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
+#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC 1
+
+#define __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
+
+#else // !__RTP__
+
+// libstdc++ will include system headers and vxWorks.h ought to have
+// been included ahead for VxWorks kernel modules prior to VxWorks 7
+#include <vxWorks.h>
+
+#endif // __RTP__
+
+#endif // _VXWORKS_MAJOR >= 7
+
+// The min/max "functions" may be refered to with a namespace prefix.
+// Prevent possible redefinitions as macros from VxWorks headers.
+#undef NOMINMAX
#define NOMINMAX 1
-#endif
+// Do not include the inline definitions from VxWorks headers, as we'll
+// want to use the ones from libstdc++ instead.
+#undef _NO_CPP_INLINES
+#define _NO_CPP_INLINES 1
+
+#endif // _GLIBCXX_OS_DEFINES