summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config.gcc5
-rw-r--r--gcc/config/vxworks.h53
3 files changed, 69 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 688df0d8c74..7c19bf042c0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,19 @@
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
_VX_TOOL_FAMILY and _VX_TOOL to gnu.
diff --git a/gcc/config.gcc b/gcc/config.gcc
index d5609c024fd..291200984d9 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -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.
diff --git a/gcc/config/vxworks.h b/gcc/config/vxworks.h
index d16c84d4259..11d811c4113 100644
--- a/gcc/config/vxworks.h
+++ b/gcc/config/vxworks.h
@@ -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)