config.gcc (*-*-vxworks*): Add TARGET_VXWORKS7=1 to tm_defines for all vxworks7 targets.
authorJerome Lambourg <lambourg@adacore.com>
Mon, 26 Jun 2017 17:04:44 +0000 (17:04 +0000)
committerOlivier Hainque <hainque@gcc.gnu.org>
Mon, 26 Jun 2017 17:04:44 +0000 (17:04 +0000)
2017-06-26  Jerome Lambourg  <lambourg@adacore.com>
            Olivier Hainque  <hainque@adacore.com>

* config.gcc (*-*-vxworks*): Add TARGET_VXWORKS7=1 to tm_defines
for all vxworks7 targets.
* config/vxworks.h (TARGET_VXWORKS7): If not defined, define to 0.
(VXWORKS_ADDITIONAL_CPP_SPEC): Alternative definition for VXWORKS7.
(VXWORKS_LIBS_RTP, VXWORKS_LIBS_RTP_DIR): New macros, allowing
variations for VX6/VX7 and 32/64bits later on in ...
(VXWORKS_LIB_SPEC): Leverage new macros.
(VXWORKS_OS_CPP_BUILTINS): Define _VSB_CONFIG_FILE for VXWORKS7,
as well as _ALLOW_KEYWORD_MACROS when "inline" is not a keyword.

Co-Authored-By: Olivier Hainque <hainque@adacore.com>
From-SVN: r249659

gcc/ChangeLog
gcc/config.gcc
gcc/config/vxworks.h

index 688df0d8c74a7d739a956cfee4e8ddbdfc5c9580..7c19bf042c0f6306420a40ae788b7f724a42dfbb 100644 (file)
@@ -1,5 +1,18 @@
 gcc/ChangeLog:
 
+2017-06-26  Jerome Lambourg  <lambourg@adacore.com>
+            Olivier Hainque  <hainque@adacore.com>
+
+       * config.gcc (*-*-vxworks*): Add TARGET_VXWORKS7=1 to tm_defines
+       for all vxworks7 targets.
+       * config/vxworks.h (TARGET_VXWORKS7): If not defined, define to 0.
+       (VXWORKS_ADDITIONAL_CPP_SPEC): Alternative definition for VXWORKS7.
+       (VXWORKS_LIBS_RTP, VXWORKS_LIBS_RTP_DIR): New macros, allowing
+       variations for VX6/VX7 and 32/64bits later on in ...
+       (VXWORKS_LIB_SPEC): Leverage new macros.
+       (VXWORKS_OS_CPP_BUILTINS): Define _VSB_CONFIG_FILE for VXWORKS7,
+       as well as _ALLOW_KEYWORD_MACROS when "inline" is not a keyword.
+
 2017-06-26  Jerome Lambourg  <lambourg@adacore.com>
 
        * config/vxworks.h (VXWORKS_OS_CPP_BUILTINS): builtin_define
index d5609c024fdf2d7077563041e3cd203bc6441095..291200984d90ab97e4a3d872c481e1e11e58971a 100644 (file)
@@ -926,6 +926,11 @@ case ${target} in
     "" | yes | vxworks) thread_file='vxworks' ;;
     *) echo 'Unknown thread configuration for VxWorks'; exit 1 ;;
   esac
+  case $target in
+    *-*-vxworks7*)
+      tm_defines="$tm_defines TARGET_VXWORKS7=1"
+      ;;
+  esac
   ;;
 *-*-elf|arc*-*-elf*)
   # Assume that newlib is being used and so __cxa_atexit is provided.
index d16c84d4259aa36f05df1348334ae2b166cdce4a..11d811c411322e6a619593cd158cc4db36fffc7f 100644 (file)
@@ -23,6 +23,11 @@ along with GCC; see the file COPYING3.  If not see
 #undef TARGET_VXWORKS
 #define TARGET_VXWORKS 1
 
+/* If TARGET_VXWORKS7 is undefined, then we're not targeting it.  */
+#ifndef TARGET_VXWORKS7
+#define TARGET_VXWORKS7 0
+#endif
+
 /* In kernel mode, VxWorks provides all the libraries itself, as well as
    the functionality of startup files, etc.  In RTP mode, it behaves more
    like a traditional Unix, with more external files.  Most of our specs
@@ -36,6 +41,23 @@ along with GCC; see the file COPYING3.  If not see
 
 /* Since we provide a default -isystem, expand -isystem on the command
    line early.  */
+#if TARGET_VXWORKS7
+
+#undef VXWORKS_ADDITIONAL_CPP_SPEC
+#define VXWORKS_ADDITIONAL_CPP_SPEC                     \
+ "%{!nostdinc:                                          \
+    %{isystem*}                                         \
+    %{mrtp: -idirafter %:getenv(VSB_DIR /h)             \
+            -idirafter %:getenv(VSB_DIR /share/h)       \
+            -idirafter %:getenv(VSB_DIR /usr/h/public)  \
+            -idirafter %:getenv(VSB_DIR /usr/h)         \
+      ;:    -idirafter %:getenv(VSB_DIR /h)             \
+            -idirafter %:getenv(VSB_DIR /share/h)       \
+            -idirafter %:getenv(VSB_DIR /krnl/h/system) \
+            -idirafter %:getenv(VSB_DIR /krnl/h/public)}}"
+
+#else /* TARGET_VXWORKS7 */
+
 #undef VXWORKS_ADDITIONAL_CPP_SPEC
 #define VXWORKS_ADDITIONAL_CPP_SPEC            \
  "%{!nostdinc:                                 \
@@ -43,14 +65,30 @@ along with GCC; see the file COPYING3.  If not see
     %{mrtp: %:getenv(WIND_USR /h)              \
       ;:    %:getenv(WIND_BASE /target/h)}}"
 
+#endif
+
 /* The references to __init and __fini will be satisfied by
    libc_internal.a.  */
+
+#define VXWORKS_LIBS_RTP "-lc -lgcc -lc_internal -lnet -ldsi"
+
+/* On Vx6 and previous, the libraries to pick up depends on the architecture,
+   so cannot be defined for all archs at once.  On Vx7, a VSB is always needed
+   and its structure is fixed and does not depend on the arch.  We can thus
+   tell gcc where to look for when linking with RTP libraries.  */
+
+#if TARGET_VXWORKS7
+#define VXWORKS_LIBS_DIR_RTP "-L%:getenv(VSB_DIR /usr/lib/common)"
+#else
+#define VXWORKS_LIBS_DIR_RTP ""
+#endif
+
 #undef VXWORKS_LIB_SPEC
 #define        VXWORKS_LIB_SPEC                                                \
 "%{mrtp:%{shared:-u " USER_LABEL_PREFIX "__init -u " USER_LABEL_PREFIX "__fini} \
        %{!shared:%{non-static:-u " USER_LABEL_PREFIX "_STI__6__rtld -ldl} \
-                 --start-group -lc -lgcc -lc_internal -lnet -ldsi      \
-                 --end-group}}"
+                 --start-group " VXWORKS_LIBS_RTP " --end-group} \
+        " VXWORKS_LIBS_DIR_RTP "}"
 
 /* The no-op spec for "-shared" below is present because otherwise GCC
    will treat it as an unrecognized option.  */
@@ -133,6 +171,17 @@ extern void vxworks_asm_out_destructor (rtx symbol, int priority);
        builtin_define ("_WRS_KERNEL");                                 \
       builtin_define ("_VX_TOOL_FAMILY=gnu");                          \
       builtin_define ("_VX_TOOL=gnu");                                 \
+      if (TARGET_VXWORKS7)                                             \
+        {                                                              \
+           builtin_define ("_VSB_CONFIG_FILE=<config/vsbConfig.h>");   \
+                                                                       \
+          /* _ALLOW_KEYWORD_MACROS is needed on VxWorks 7 to           \
+             prevent compilation failures triggered by our             \
+             definition of "inline" in ansidecl when "inline"          \
+             is not a keyword.  */                                     \
+          if (!flag_isoc99 && !c_dialect_cxx())                        \
+             builtin_define ("_ALLOW_KEYWORD_MACROS");                 \
+        }                                                              \
     }                                                                  \
   while (0)