310 lines
12 KiB
C
310 lines
12 KiB
C
/* 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-nolto-rel}"
|