diff mbox series

Introduce an internal API for VxWorks version checks

Message ID C4804928-B1E4-42E4-86CB-546413DC65EE@adacore.com
State New
Headers show
Series Introduce an internal API for VxWorks version checks | expand

Commit Message

Olivier Hainque Dec. 13, 2019, 4:25 p.m. UTC
This changes introduces an internal API for VxWorks version checks
within runtime files, a prerequisite to a few fixes coming up for libstdc++
builds on more recent versions of the OS.

Tested in accordance with the description in
https://gcc.gnu.org/ml/gcc-patches/2019-12/msg00911.html

Committing to mainline.

Olivier

2019-12-13  Olivier Hainque  <hainque@adacore.com>

	gcc/
	* config/vxworks/_vxworks-versions.h: New file.
	* config.gcc (*-*-vxworks*): Add it to extra_headers.
    
	libgcc/
	* config/gthr-vxworks.h: Use _vxworks-versions.h.
 	* config/gthr-vxworks-tls.c: Likewise.
gcc/config.gcc                         |  7 ++++
 gcc/config/vxworks/_vxworks-versions.h | 54 ++++++++++++++++++++++++++
 libgcc/config/gthr-vxworks-tls.c       | 10 +++--
 libgcc/config/gthr-vxworks.h           | 12 ++----
 4 files changed, 70 insertions(+), 13 deletions(-)
 create mode 100644 gcc/config/vxworks/_vxworks-versions.h
diff mbox series

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index cf73a853e11..b09a3656be8 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -961,6 +961,13 @@  case ${target} in
   target_has_targetcm="yes"
   use_gcc_stdint=provide
   tm_file="${tm_file} vxworks-stdint.h"
+
+  # This private header exposes a consistent interface for checks on
+  # the VxWorks version our runtime header files need to perform, based on
+  # what the system headers adverstise:
+
+  extra_headers="${extra_headers} ../vxworks/_vxworks-versions.h"
+
   case ${enable_threads} in
     no) ;;
     "" | yes | vxworks) thread_file='vxworks' ;;
diff --git a/gcc/config/vxworks/_vxworks-versions.h b/gcc/config/vxworks/_vxworks-versions.h
new file mode 100644
index 00000000000..728e7262a72
--- /dev/null
+++ b/gcc/config/vxworks/_vxworks-versions.h
@@ -0,0 +1,54 @@ 
+/* This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC 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 General Public License
+for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef _VXWORKS_VERSIONS_H
+#define _VXWORKS_VERSIONS_H  1
+
+/* All we need is access to the bare _WRS_VXWORKS_MAJOR/MINOR macros
+   exposed by version.h.  Cheat a bit to make sure we don't drag additional
+   header files, which can easily cause #include ordering nightmares.  */
+
+#pragma push_macro("_WRS_KERNEL")
+#undef _WRS_KERNEL
+#include <version.h>
+#pragma pop_macro("_WRS_KERNEL")
+
+#if !defined(_WRS_VXWORKS_MAJOR)
+#error "VxWorks version macros needed but not defined"
+#endif
+
+#define _VXWORKS_MAJOR_GT(MAJOR) (_WRS_VXWORKS_MAJOR > (MAJOR))
+#define _VXWORKS_MAJOR_GE(MAJOR) (_WRS_VXWORKS_MAJOR >= (MAJOR))
+#define _VXWORKS_MAJOR_LT(MAJOR) (_WRS_VXWORKS_MAJOR < (MAJOR))
+#define _VXWORKS_MAJOR_LE(MAJOR) (_WRS_VXWORKS_MAJOR <= (MAJOR))
+#define _VXWORKS_MAJOR_EQ(MAJOR) (_WRS_VXWORKS_MAJOR == (MAJOR))
+
+#define _VXWORKS_MINOR_GT(MINOR) (_WRS_VXWORKS_MINOR > (MINOR))
+#define _VXWORKS_MINOR_GE(MINOR) (_WRS_VXWORKS_MINOR >= (MINOR))
+#define _VXWORKS_MINOR_LT(MINOR) (_WRS_VXWORKS_MINOR < (MINOR))
+#define _VXWORKS_MINOR_LE(MINOR) (_WRS_VXWORKS_MINOR <= (MINOR))
+#define _VXWORKS_MINOR_EQ(MINOR) (_WRS_VXWORKS_MINOR == (MINOR))
+
+#define _VXWORKS_PRE(MAJOR,MINOR) \
+  (_VXWORKS_MAJOR_LT(MAJOR) \
+   || (_VXWORKS_MAJOR_EQ(MAJOR) && _VXWORKS_MINOR_LT(MINOR)))
+
+#endif
diff --git a/libgcc/config/gthr-vxworks-tls.c b/libgcc/config/gthr-vxworks-tls.c
index 96b6bfbdbe6..63715e65eb8 100644
--- a/libgcc/config/gthr-vxworks-tls.c
+++ b/libgcc/config/gthr-vxworks-tls.c
@@ -45,6 +45,8 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include <errno.h>
 #endif
 
+#include <_vxworks-versions.h>
+
 /* Thread-local storage.
 
    A gthread TLS key is simply an offset in an array, the address of which
@@ -91,10 +93,10 @@  static int self_owner;
    it is only removed when unloading this module.  */
 static volatile int delete_hook_installed;
 
-/* TLS data access internal API.  A straight __thread variable on VxWorks 7,
-   a pointer returned by kernel provided routines otherwise.  */
+/* TLS data access internal API.  A straight __thread variable starting with
+   VxWorks 7, a pointer returned by kernel provided routines otherwise.  */
 
-#ifdef __VXWORKS7__
+#if _VXWORKS_MAJOR_GE(7)
 
 static __thread struct tls_data *__gthread_tls_data;
 
@@ -118,7 +120,7 @@  extern void __gthread_leave_tls_dtor_context (void);
 #define VX_ENTER_TLS_DTOR() __gthread_enter_tls_dtor_context ()
 #define VX_LEAVE_TLS_DTOR() __gthread_leave_tls_dtor_context ()
 
-#endif /* __VXWORKS7__ */
+#endif
 
 /* This is a global structure which records all of the active keys.
 
diff --git a/libgcc/config/gthr-vxworks.h b/libgcc/config/gthr-vxworks.h
index 2d2860a36dd..2d033ab7678 100644
--- a/libgcc/config/gthr-vxworks.h
+++ b/libgcc/config/gthr-vxworks.h
@@ -35,13 +35,7 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #else
 
 #include <vxWorks.h>
-#include <version.h>
-
-/* Conditional compilation directives are easier to read when they fit on a
-   single line, which is helped by macros with shorter names.  */
-#define _VXW_MAJOR _WRS_VXWORKS_MAJOR
-#define _VXW_MINOR _WRS_VXWORKS_MINOR
-#define _VXW_PRE_69 (_VXW_MAJOR  < 6 || (_VXW_MAJOR == 6 && _VXW_MINOR < 9))
+#include <_vxworks-versions.h>
 
 /* Some VxWorks headers profusely use typedefs of a pointer to a function with
    undefined number of arguments.  */
@@ -62,7 +56,7 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 /* RTP, pre 6.9.  */
 
-#if defined(__RTP__) && _VXW_PRE_69
+#if defined(__RTP__) && _VXWORKS_PRE(6,9)
 
 #define __TAS(x) vxCas ((x), 0, 1)
 typedef volatile unsigned char __vx_tas_t;
@@ -71,7 +65,7 @@  typedef volatile unsigned char __vx_tas_t;
 
 /* RTP, 6.9 and beyond.  */
 
-#if defined(__RTP__) && !_VXW_PRE_69
+#if defined(__RTP__) && !_VXWORKS_PRE(6,9)
 
 #define __TAS(x) vxAtomicCas ((x), 0, 1)
 typedef atomic_t __vx_tas_t;