From: Jerome Lambourg Date: Mon, 26 Jun 2017 17:04:44 +0000 (+0000) Subject: config.gcc (*-*-vxworks*): Add TARGET_VXWORKS7=1 to tm_defines for all vxworks7 targets. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b269e8998d5cc47d010d915aba548fa0ae2d8bf8;p=gcc.git config.gcc (*-*-vxworks*): Add TARGET_VXWORKS7=1 to tm_defines for all vxworks7 targets. 2017-06-26 Jerome Lambourg Olivier Hainque * 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 From-SVN: r249659 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 688df0d8c74..7c19bf042c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,18 @@ gcc/ChangeLog: +2017-06-26 Jerome Lambourg + Olivier Hainque + + * 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 * config/vxworks.h (VXWORKS_OS_CPP_BUILTINS): builtin_define 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="); \ + \ + /* _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)