1/* Common VxWorks target definitions for GNU compiler.
2   Copyright (C) 1999-2020 Free Software Foundation, Inc.
3   Contributed by Wind River Systems.
4   Rewritten by CodeSourcery, LLC.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3.  If not see
20<http://www.gnu.org/licenses/>.  */
21
22/* Assert that we are targeting VxWorks.  */
23#undef TARGET_VXWORKS
24#define TARGET_VXWORKS 1
25
26/* In kernel mode, VxWorks provides all the libraries itself, as well as
27   the functionality of startup files, etc.  In RTP mode, it behaves more
28   like a traditional Unix, with more external files.  Most of our specs
29   must be aware of the difference.  */
30
31/* We look for the VxWorks header files using the environment
32   variables that are set in VxWorks to indicate the location of the
33   system header files.  We use -idirafter so that the GCC's own
34   header-file directories (containing <stddef.h>, etc.) come before
35   the VxWorks system header directories.  */
36
37/* Since we provide a default -isystem, expand -isystem on the command
38   line early.  */
39#if TARGET_VXWORKS7
40
41#undef VXWORKS_ADDITIONAL_CPP_SPEC
42#define VXWORKS_ADDITIONAL_CPP_SPEC                     \
43 "%{!nostdinc:                                          \
44    %{isystem*}                                         \
45    %{mrtp: -idirafter %:getenv(VSB_DIR /h)             \
46            -idirafter %:getenv(VSB_DIR /share/h)       \
47            -idirafter %:getenv(VSB_DIR /usr/h/public)  \
48            -idirafter %:getenv(VSB_DIR /usr/h)         \
49      ;:    -idirafter %:getenv(VSB_DIR /h)             \
50            -idirafter %:getenv(VSB_DIR /share/h)       \
51            -idirafter %:getenv(VSB_DIR /krnl/h/system) \
52            -idirafter %:getenv(VSB_DIR /krnl/h/public)}}"
53
54#else /* TARGET_VXWORKS7 */
55
56#undef VXWORKS_ADDITIONAL_CPP_SPEC
57#define VXWORKS_ADDITIONAL_CPP_SPEC		\
58 "%{!nostdinc:					\
59    %{isystem*}					\
60    %{mrtp: -idirafter %:getenv(WIND_USR /h)	\
61	    -idirafter %:getenv(WIND_USR /h/wrn/coreip) \
62      ;:    -idirafter %:getenv(WIND_BASE /target/h) \
63	    -idirafter %:getenv(WIND_BASE /target/h/wrn/coreip) \
64}}"
65
66#endif
67
68/* For VxWorks static rtps, the system provides libc_internal.a, a superset of
69   libgcc.a that we need to use e.g. to satisfy references to __init and
70   __fini.  We still want our libgcc to prevail for symbols it would provide
71   (e.g. register save entry points), so re-place it here between libraries
72   that might reference it and libc_internal.
73
74   In addition, some versions of VxWorks rely on explicit extra libraries for
75   system calls and the set of base network libraries of common use varies
76   across architectures.  The default settings defined here might be redefined
77   by target specific port configuration files.  */
78
79#define VXWORKS_SYSCALL_LIBS_RTP
80
81#if TARGET_VXWORKS7
82#define VXWORKS_NET_LIBS_RTP "-lnet"
83#else
84#define VXWORKS_NET_LIBS_RTP "-lnet -ldsi"
85#endif
86
87#define VXWORKS_BASE_LIBS_RTP "-lc -lgcc -lc_internal"
88
89#define VXWORKS_EXTRA_LIBS_RTP
90
91#define VXWORKS_LIBS_RTP \
92  VXWORKS_SYSCALL_LIBS_RTP " " VXWORKS_NET_LIBS_RTP " " \
93  VXWORKS_BASE_LIBS_RTP " " VXWORKS_EXTRA_LIBS_RTP
94
95/* TLS configuration.  VxWorks 7 now always has proper TLS support.
96   Earlier versions did not, not even for RTPS.  */
97#define VXWORKS_HAVE_TLS TARGET_VXWORKS7
98
99/* On Vx6 and previous, the libraries to pick up depends on the architecture,
100   so cannot be defined for all archs at once.  On Vx7, a VSB is always needed
101   and its structure is fixed and does not depend on the arch.  We can thus
102   tell gcc where to look for when linking with RTP libraries.  Use
103   STARTFILE_PREFIX_SPEC for this, instead of explicit -L options in LIB_SPEC,
104   so they survive -nodefaultlibs.  */
105
106/* On Vx7 RTP, we need to drag the __tls__ symbol to trigger initialization of
107   tlsLib, responsible for TLS support by the OS.  */
108
109#if TARGET_VXWORKS7
110#undef  STARTFILE_PREFIX_SPEC
111#define STARTFILE_PREFIX_SPEC "%:getenv(VSB_DIR /usr/lib/common)"
112#define TLS_SYM "-u __tls__"
113#else
114#define TLS_SYM ""
115#endif
116
117#undef VXWORKS_LIB_SPEC
118#define	VXWORKS_LIB_SPEC						\
119"%{mrtp:%{shared:-u " USER_LABEL_PREFIX "__init -u " USER_LABEL_PREFIX "__fini} \
120	%{!shared:%{non-static:-u " USER_LABEL_PREFIX "_STI__6__rtld -ldl} \
121		  " TLS_SYM " \
122		  --start-group " VXWORKS_LIBS_RTP " --end-group}}"
123
124/* The no-op spec for "-shared" below is present because otherwise GCC
125   will treat it as an unrecognized option.  */
126#undef VXWORKS_LINK_SPEC
127#define VXWORKS_LINK_SPEC				\
128"%{!mrtp:-r}						\
129 %{!shared:						\
130   %{mrtp:-q %{h*}					\
131          %{R*} %{!T*: %(link_start) }			\
132          %(link_target) %(link_os)}}			\
133 %{v:-v}						\
134 %{shared:-shared}					\
135 %{Bstatic:-Bstatic}					\
136 %{Bdynamic:-Bdynamic}					\
137 %{!Xbind-lazy:-z now}					\
138 %{Xbind-now:%{Xbind-lazy:				\
139   %e-Xbind-now and -Xbind-lazy are incompatible}}	\
140 %{mrtp:%{!shared:%{!non-static:-static}		\
141 		  %{non-static:--force-dynamic --export-dynamic}}}"
142
143#undef VXWORKS_LIBGCC_SPEC
144#define VXWORKS_LIBGCC_SPEC "-lgcc"
145
146/* Setup the crtstuff begin/end we might need for dwarf EH registration.  */
147
148#if !defined(CONFIG_SJLJ_EXCEPTIONS) && DWARF2_UNWIND_INFO
149#define VX_CRTBEGIN_SPEC \
150 "%{!mrtp:vx_crtbegin-kernel.o%s} %{mrtp:vx_crtbegin-rtp.o%s}"
151#define VX_CRTEND_SPEC "-l:vx_crtend.o"
152#else
153#define VX_CRTBEGIN_SPEC ""
154#define VX_CRTEND_SPEC ""
155#endif
156
157#undef VXWORKS_STARTFILE_SPEC
158#define VXWORKS_STARTFILE_SPEC \
159  VX_CRTBEGIN_SPEC " %{mrtp:%{!shared:-l:crt0.o}}"
160
161#undef VXWORKS_ENDFILE_SPEC
162#define VXWORKS_ENDFILE_SPEC VX_CRTEND_SPEC
163
164#undef  VXWORKS_CC1_SPEC
165#if TARGET_VXWORKS7
166#define VXWORKS_CC1_SPEC \
167  "%(cc1_cpu) %{!mrtp:%{!ftls-model=*:-ftls-model=local-exec}}"
168#else
169#define VXWORKS_CC1_SPEC ""
170#endif
171
172/* Do VxWorks-specific parts of TARGET_OPTION_OVERRIDE.  */
173#undef VXWORKS_OVERRIDE_OPTIONS
174#define VXWORKS_OVERRIDE_OPTIONS vxworks_override_options ()
175extern void vxworks_override_options (void);
176
177/* Whether the VxWorks variant and mode supports constructors/destructors
178   placed in .ctors/.dtors section or if we should generate proxy functions
179   for them, with special names which munch knows how to collect.  On most
180   versions of VxWorks, only the RTP loader supports .ctors/.dtors sections,
181   not the kernel module loader.  */
182#define TARGET_VXWORKS_HAVE_CTORS_DTORS TARGET_VXWORKS_RTP
183
184/* Support for prioritized ctors/dtors is in sync with the support for sections
185   on the VxWorks front, and is assumed to be provided by whatever linker level
186   glue is required if we were configured with --enable-initfini-array.  */
187#define SUPPORTS_INIT_PRIORITY \
188  (TARGET_VXWORKS_HAVE_CTORS_DTORS || HAVE_INITFINI_ARRAY_SUPPORT)
189
190#if !HAVE_INITFINI_ARRAY_SUPPORT
191/* VxWorks requires special handling of constructors and destructors.
192   All VxWorks configurations must use these functions.  */
193#undef TARGET_ASM_CONSTRUCTOR
194#define TARGET_ASM_CONSTRUCTOR vxworks_asm_out_constructor
195#undef TARGET_ASM_DESTRUCTOR
196#define TARGET_ASM_DESTRUCTOR vxworks_asm_out_destructor
197extern void vxworks_asm_out_constructor (rtx symbol, int priority);
198extern void vxworks_asm_out_destructor (rtx symbol, int priority);
199#endif
200
201/* Override the vxworks-dummy.h definitions.  TARGET_VXWORKS_RTP
202   is defined by vxworks.opt.  */
203#undef VXWORKS_GOTT_BASE
204#define VXWORKS_GOTT_BASE "__GOTT_BASE__"
205#undef VXWORKS_GOTT_INDEX
206#define VXWORKS_GOTT_INDEX "__GOTT_INDEX__"
207
208#undef PTRDIFF_TYPE
209#define PTRDIFF_TYPE (TARGET_VXWORKS64 ? "long int" : "int")
210
211#undef SIZE_TYPE
212#define SIZE_TYPE (TARGET_VXWORKS64 ? "long unsigned int" : "unsigned int")
213
214/* Assumptions on the target libc.  VxWorks 7, post SR600, provides a C11
215   runtime without sincos support.  */
216#undef TARGET_LIBC_HAS_FUNCTION
217#define TARGET_LIBC_HAS_FUNCTION \
218  (TARGET_VXWORKS7 ? default_libc_has_function : no_c99_libc_has_function)
219
220/* Both kernels and RTPs have the facilities required by this macro.  */
221#define TARGET_POSIX_IO
222
223/* A VxWorks implementation of TARGET_OS_CPP_BUILTINS.  */
224
225/* The VxWorks personality we rely on, controlling which sections of system
226   headers files we trigger.  This might be redefined on targets where the
227   base VxWorks environment doesn't come with a GNU toolchain.  */
228
229#define VXWORKS_PERSONALITY "gnu"
230
231#define VXWORKS_OS_CPP_BUILTINS()					\
232  do									\
233    {									\
234      builtin_define ("__vxworks");					\
235      builtin_define ("__VXWORKS__");					\
236      builtin_assert ("system=unix");					\
237      if (TARGET_VXWORKS_RTP)						\
238	builtin_define ("__RTP__");					\
239      else								\
240	builtin_define ("_WRS_KERNEL");					\
241      builtin_define ("TOOL_FAMILY=" VXWORKS_PERSONALITY);		\
242      builtin_define ("TOOL=" VXWORKS_PERSONALITY);			\
243      if (TARGET_VXWORKS7)						\
244        {								\
245           builtin_define ("_VSB_CONFIG_FILE=<config/vsbConfig.h>");	\
246           								\
247	   /* _ALLOW_KEYWORD_MACROS is needed on VxWorks 7 to		\
248	      prevent compilation failures triggered by our		\
249	      definition of "inline" in ansidecl when "inline"		\
250	      is not a keyword.  */					\
251	   if (!flag_isoc99 && !c_dialect_cxx())			\
252             builtin_define ("_ALLOW_KEYWORD_MACROS");			\
253        }								\
254    }									\
255  while (0)
256
257#define VXWORKS_KIND VXWORKS_KIND_NORMAL
258
259/* The diab linker does not handle .gnu_attribute sections.  */
260#undef HAVE_AS_GNU_ATTRIBUTE
261
262/* We provide our own version of __clear_cache in libgcc, using a separate C
263   file to facilitate #inclusion of VxWorks header files.  */
264#undef CLEAR_INSN_CACHE
265#define CLEAR_INSN_CACHE 1
266
267/* Default dwarf control values, for non-gdb debuggers that come with
268   VxWorks.  */
269
270#undef VXWORKS_DWARF_VERSION_DEFAULT
271#define VXWORKS_DWARF_VERSION_DEFAULT (TARGET_VXWORKS7 ? 4 : 2)
272
273#undef DWARF_GNAT_ENCODINGS_DEFAULT
274#define DWARF_GNAT_ENCODINGS_DEFAULT \
275  (TARGET_VXWORKS7 ? DWARF_GNAT_ENCODINGS_MINIMAL : DWARF_GNAT_ENCODINGS_ALL)
276