blob: e41f16a51e8c6478fcc85976427bcb90eb0623e6 [file] [log] [blame]
/* Common VxWorks target definitions for GNU compiler.
Copyright (C) 1999-2021 Free Software Foundation, Inc.
Contributed by Wind River Systems.
Rewritten by CodeSourcery, LLC.
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.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
/* Assert that we are targeting VxWorks. */
#undef TARGET_VXWORKS
#define TARGET_VXWORKS 1
/* 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
must be aware of the difference. */
/* We look for the VxWorks header files using the environment
variables that are set in VxWorks to indicate the location of the
system header files. We use -idirafter so that the GCC's own
header-file directories (containing <stddef.h>, etc.) come before
the VxWorks system header directories. */
/* Since we provide a default -isystem, expand -isystem on the command
line early. */
/* Self-tests may be run in contexts where the VxWorks environment isn't
available. Prevent attempts at designating the location of runtime header
files, libraries or startfiles, which would fail on unset environment
variables and aren't needed for such tests. */
#if TARGET_VXWORKS7
#undef VXWORKS_ADDITIONAL_CPP_SPEC
#define VXWORKS_ADDITIONAL_CPP_SPEC \
"%{!nostdinc:%{!fself-test=*: \
%{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:%{!fself-test=*: \
%{isystem*} \
%{mrtp: -idirafter %:getenv(WIND_USR /h) \
-idirafter %:getenv(WIND_USR /h/wrn/coreip) \
;: -idirafter %:getenv(WIND_BASE /target/h) \
-idirafter %:getenv(WIND_BASE /target/h/wrn/coreip) \
}}}"
#endif
/* Our ports rely on gnu-user.h, which #defines _POSIX_SOURCE for
C++ by default. VxWorks doesn't provide 100% of what this implies
(e.g. ::mkstemp), so, arrange to prevent that by falling back to
the default CPP spec for C++ as well. */
#undef CPLUSPLUS_CPP_SPEC
/* For VxWorks static rtps, the system provides libc_internal.a, a superset of
libgcc.a that we need to use e.g. to satisfy references to __init and
__fini. We still want our libgcc to prevail for symbols it would provide
(e.g. register save entry points), so re-place it here between libraries
that might reference it and libc_internal.
In addition, some versions of VxWorks rely on explicit extra libraries for
system calls and the set of base network libraries of common use varies
across architectures. The default settings defined here might be redefined
by target specific port configuration files. */
#define VXWORKS_SYSCALL_LIBS_RTP
#if TARGET_VXWORKS7
#define VXWORKS_NET_LIBS_RTP "-l%:if-exists-then-else(%:getenv(VSB_DIR /usr/h/public/rtnetStackLib.h) rtnet net)"
#else
#define VXWORKS_NET_LIBS_RTP "-lnet -ldsi"
#endif
#define VXWORKS_BASE_LIBS_RTP "-lc -lgcc -lc_internal"
#define VXWORKS_EXTRA_LIBS_RTP
#define VXWORKS_LIBS_RTP \
VXWORKS_SYSCALL_LIBS_RTP " " VXWORKS_NET_LIBS_RTP " " \
VXWORKS_BASE_LIBS_RTP " " VXWORKS_EXTRA_LIBS_RTP
/* TLS configuration. VxWorks 7 now always has proper TLS support.
Earlier versions did not, not even for RTPS. */
#define VXWORKS_HAVE_TLS TARGET_VXWORKS7
/* 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. Use
STARTFILE_PREFIX_SPEC for this, instead of explicit -L options in LIB_SPEC,
so they survive -nodefaultlibs. */
/* On Vx7 RTP, we need to drag the __tls__ symbol to trigger initialization of
tlsLib, responsible for TLS support by the OS. */
#if TARGET_VXWORKS7
#undef STARTFILE_PREFIX_SPEC
#define STARTFILE_PREFIX_SPEC \
"%{!fself-test=*:%:getenv(VSB_DIR /usr/lib/common)}"
#define TLS_SYM "-u __tls__"
#else
#define TLS_SYM ""
#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} \
" TLS_SYM " \
--start-group " VXWORKS_LIBS_RTP " --end-group}}"
/* The no-op spec for "-shared" below is present because otherwise GCC
will treat it as an unrecognized option. */
#undef VXWORKS_LINK_SPEC
#define VXWORKS_LINK_SPEC \
"%{!mrtp:-r} \
%{!shared: \
%{mrtp:-q %{h*} \
%{R*} %{!T*: %(link_start) } \
%(link_target) %(link_os)}} \
%{v:-v} \
%{shared:-shared} \
%{Bstatic:-Bstatic} \
%{Bdynamic:-Bdynamic} \
%{!Xbind-lazy:-z now} \
%{Xbind-now:%{Xbind-lazy: \
%e-Xbind-now and -Xbind-lazy are incompatible}} \
%{mrtp:%{!shared:%{!non-static:-static} \
%{non-static:--force-dynamic --export-dynamic}}}"
#undef VXWORKS_LIBGCC_SPEC
#define VXWORKS_LIBGCC_SPEC "-lgcc"
/* Setup the crtstuff begin/end we might need for dwarf EH registration. */
#if !defined(CONFIG_SJLJ_EXCEPTIONS) && DWARF2_UNWIND_INFO
#define VX_CRTBEGIN_SPEC "vx_crtbegin.o%s"
#define VX_CRTEND_SPEC "-l:vx_crtend.o"
#else
#define VX_CRTBEGIN_SPEC ""
#define VX_CRTEND_SPEC ""
#endif
#undef VXWORKS_STARTFILE_SPEC
#define VXWORKS_STARTFILE_SPEC \
VX_CRTBEGIN_SPEC " %{mrtp:%{!shared:-l:crt0.o}}"
#undef VXWORKS_ENDFILE_SPEC
#define VXWORKS_ENDFILE_SPEC VX_CRTEND_SPEC
#undef VXWORKS_CC1_SPEC
#if TARGET_VXWORKS7
#define VXWORKS_CC1_SPEC \
"%(cc1_cpu) %{!mrtp:%{!ftls-model=*:-ftls-model=local-exec}}"
#else
#define VXWORKS_CC1_SPEC ""
#endif
/* Do VxWorks-specific parts of TARGET_OPTION_OVERRIDE. */
#undef VXWORKS_OVERRIDE_OPTIONS
#define VXWORKS_OVERRIDE_OPTIONS vxworks_override_options ()
extern void vxworks_override_options (void);
/* Whether the VxWorks variant and mode supports constructors/destructors
placed in .ctors/.dtors section or if we should generate proxy functions
for them, with special names which munch knows how to collect. On most
versions of VxWorks, only the RTP loader supports .ctors/.dtors sections,
not the kernel module loader. */
#define TARGET_VXWORKS_HAVE_CTORS_DTORS TARGET_VXWORKS_RTP
/* Support for prioritized ctors/dtors is in sync with the support for sections
on the VxWorks front, and is assumed to be provided by whatever linker level
glue is required if we were configured with --enable-initfini-array. */
#define SUPPORTS_INIT_PRIORITY \
(TARGET_VXWORKS_HAVE_CTORS_DTORS || HAVE_INITFINI_ARRAY_SUPPORT)
#if !HAVE_INITFINI_ARRAY_SUPPORT
/* VxWorks requires special handling of constructors and destructors.
All VxWorks configurations must use these functions. */
#undef TARGET_ASM_CONSTRUCTOR
#define TARGET_ASM_CONSTRUCTOR vxworks_asm_out_constructor
#undef TARGET_ASM_DESTRUCTOR
#define TARGET_ASM_DESTRUCTOR vxworks_asm_out_destructor
extern void vxworks_asm_out_constructor (rtx symbol, int priority);
extern void vxworks_asm_out_destructor (rtx symbol, int priority);
#endif
/* Override the vxworks-dummy.h definitions. TARGET_VXWORKS_RTP
is defined by vxworks.opt. */
#undef VXWORKS_GOTT_BASE
#define VXWORKS_GOTT_BASE "__GOTT_BASE__"
#undef VXWORKS_GOTT_INDEX
#define VXWORKS_GOTT_INDEX "__GOTT_INDEX__"
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE (TARGET_VXWORKS64 ? "long int" : "int")
#undef SIZE_TYPE
#define SIZE_TYPE (TARGET_VXWORKS64 ? "long unsigned int" : "unsigned int")
/* Assumptions on the target libc. VxWorks 7, post SR600, provides a C11
runtime without sincos support. */
#undef TARGET_LIBC_HAS_FUNCTION
#define TARGET_LIBC_HAS_FUNCTION \
(TARGET_VXWORKS7 ? default_libc_has_function : no_c99_libc_has_function)
/* Both kernels and RTPs have the facilities required by this macro. */
#define TARGET_POSIX_IO
/* A VxWorks implementation of TARGET_OS_CPP_BUILTINS. */
/* The VxWorks personality we rely on, controlling which sections of system
headers files we trigger. This might be redefined on targets where the
base VxWorks environment doesn't come with a GNU toolchain. */
#define VXWORKS_PERSONALITY "gnu"
#define VXWORKS_OS_CPP_BUILTINS() \
do \
{ \
builtin_define ("__vxworks"); \
builtin_define ("__VXWORKS__"); \
builtin_assert ("system=unix"); \
if (TARGET_VXWORKS_RTP) \
builtin_define ("__RTP__"); \
else \
builtin_define ("_WRS_KERNEL"); \
builtin_define ("TOOL_FAMILY=" VXWORKS_PERSONALITY); \
builtin_define ("TOOL=" VXWORKS_PERSONALITY); \
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)
/* For specific CPU macro definitions expected by the system headers,
different versions of VxWorks expect different forms of macros,
such as "_VX_CPU=..." on Vx7 and some variants of Vx6, or "CPU=..."
on all Vx6 and earlier. Setup a common prefix macro here, that
arch specific ports can reuse. */
#if TARGET_VXWORKS7
#define VX_CPU_PREFIX "_VX_"
#else
#define VX_CPU_PREFIX ""
#endif
#define VXWORKS_KIND VXWORKS_KIND_NORMAL
/* The diab linker does not handle .gnu_attribute sections. */
#undef HAVE_AS_GNU_ATTRIBUTE
/* We call vxworks's cacheTextUpdate instead of CLEAR_INSN_CACHE if
needed. We don't want to force a call on targets that don't define
cache-clearing insns nor CLEAR_INSN_CACHE. */
#undef TARGET_EMIT_CALL_BUILTIN___CLEAR_CACHE
#define TARGET_EMIT_CALL_BUILTIN___CLEAR_CACHE \
vxworks_emit_call_builtin___clear_cache
extern void vxworks_emit_call_builtin___clear_cache (rtx begin, rtx end);
/* Default dwarf control values, for non-gdb debuggers that come with
VxWorks. */
#undef VXWORKS_DWARF_VERSION_DEFAULT
#define VXWORKS_DWARF_VERSION_DEFAULT (TARGET_VXWORKS7 ? 4 : 2)
#undef DWARF_GNAT_ENCODINGS_DEFAULT
#define DWARF_GNAT_ENCODINGS_DEFAULT \
(TARGET_VXWORKS7 ? DWARF_GNAT_ENCODINGS_MINIMAL : DWARF_GNAT_ENCODINGS_ALL)
/* The default configuration of incremental LTO linking (-flinker-output=rel)
warns if an object file included in the link does not contain LTO bytecode,
because in this case the output will not contain it either, thus preventing
further incremental LTO linking. We do not do repeated incremental linking
so silence the warning (instead of passing -flinker-output=nolto-rel). */
#undef LTO_PLUGIN_SPEC
#define LTO_PLUGIN_SPEC "%{!mrtp:-plugin-opt=-linker-output-auto-notlo-rel}"