]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/config/rs6000/vxworks.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / rs6000 / vxworks.h
index bbe39d2f80fe53ab8567b9229c535cc341fd2a06..4f6d116929b67a2ec10ca3f51bcf8c096c0e4209 100644 (file)
@@ -1,6 +1,5 @@
 /* Definitions of target machine for GNU compiler.  Vxworks PowerPC version.
-   Copyright (C) 1996, 2000, 2002, 2003, 2004, 2005, 2007, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 1996-2022 Free Software Foundation, Inc.
    Contributed by CodeSourcery, LLC.
 
 This file is part of GCC.
@@ -19,13 +18,21 @@ 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/>.  */
 
-/* Note to future editors: VxWorks is mostly an EABI target.  We do
-   not use rs6000/eabi.h because we would have to override most of
-   it anyway.  However, if you change that file, consider making
-   analogous changes here too.  */
+/* The port comes in two very different flavors at this stage:
 
-#undef TARGET_VERSION
-#define TARGET_VERSION fprintf (stderr, " (PowerPC VxWorks)");
+   - For 653 (AE) and regular versions prior to VxWorks 7, the port
+     comes with its own set of definitions, matching a system compiler
+     configured this way as well as the corresponding run-time
+     environment.  This is essentially an eabi system, so changes to
+     eabi.h should usually be reflected here.
+
+   - Starting with VxWorks 7 (post SR600), the system environment
+     was made extremely similar to GNU/Linux and this toolchain is
+     built on top of the corresponding header files.  */
+
+/*-------------------------------------------------------------*/
+/* Common definitions first.                                   */
+/*-------------------------------------------------------------*/
 
 /* CPP predefined macros.  */
 
@@ -33,88 +40,159 @@ along with GCC; see the file COPYING3.  If not see
 #define TARGET_OS_CPP_BUILTINS()               \
   do                                           \
     {                                          \
-      builtin_define ("__ppc");                        \
-      builtin_define ("__PPC__");              \
-      builtin_define ("__EABI__");             \
       builtin_define ("__ELF__");              \
+      if (!TARGET_VXWORKS7)                    \
+       builtin_define ("__EABI__");            \
+                                               \
+      /* CPU macros, based on what the system compilers do.  */        \
+      if (!TARGET_VXWORKS7)                    \
+       {                                       \
+         builtin_define ("__ppc");             \
+         /* Namespace violation below, but the system headers \
+            really depend heavily on this.  */ \
+         builtin_define ("CPU_FAMILY=PPC");    \
+                                               \
+         /* __PPC__ isn't actually emitted by the system compiler \
+            prior to vx7 but has been advertised by us for ages.  */   \
+         builtin_define ("__PPC__");           \
+       }                                       \
+      else                                     \
+       {                                       \
+         builtin_define ("__PPC__");           \
+         builtin_define ("__powerpc__");       \
+         if (TARGET_64BIT)                     \
+           {                                   \
+             builtin_define ("__PPC64__");     \
+             builtin_define ("__powerpc64__"); \
+           }                                   \
+         else                                  \
+           {                                   \
+             builtin_define ("__PPC");         \
+             builtin_define ("__powerpc");     \
+           }                                   \
+                                               \
+         /* __ppc isn't emitted by the system compiler \
+            any more but a few system headers still depend \
+            on it, as well as on __ppc__.  */  \
+         builtin_define ("__ppc");             \
+         builtin_define ("__ppc__");           \
+       }                                       \
+                                               \
+      /* Asserts for #cpu and #machine.  */    \
+      if (TARGET_64BIT)                                \
+       {                                       \
+         builtin_assert ("cpu=powerpc64");     \
+         builtin_assert ("machine=powerpc64"); \
+       }                                       \
+      else                                     \
+       {                                       \
+         builtin_assert ("cpu=powerpc");       \
+         builtin_assert ("machine=powerpc");   \
+       }                                       \
+                                               \
+      /* PowerPC VxWorks specificities.  */    \
       if (!TARGET_SOFT_FLOAT)                  \
-       builtin_define ("__hardfp");            \
+       {                                       \
+         builtin_define ("__hardfp");          \
+         builtin_define ("_WRS_HARDWARE_FP");  \
+       }                                       \
                                                \
-      /* C89 namespace violation! */           \
-      builtin_define ("CPU_FAMILY=PPC");       \
-                                               \
+      /* Common VxWorks and port items.  */    \
       VXWORKS_OS_CPP_BUILTINS ();              \
+      TARGET_OS_SYSV_CPP_BUILTINS ();          \
     }          \
   while (0)
 
-/* Only big endian PPC is supported by VxWorks.  */
-#undef BYTES_BIG_ENDIAN
-#define BYTES_BIG_ENDIAN 1
 
-/* We have to kill off the entire specs set created by rs6000/sysv4.h
-   and substitute our own set.  The top level vxworks.h has done some
-   of this for us.  */
+#define VX_CPUDEF(CPUID) \
+  ":-D" VX_CPU_PREFIX "CPU=" VX_CPU_PREFIX #CPUID
 
-#undef SUBTARGET_EXTRA_SPECS
-#undef CPP_SPEC
-#undef CC1_SPEC
-#undef ASM_SPEC
+#define VX_MCPU(CPU,CPUID) \
+  "mcpu=" #CPU VX_CPUDEF(CPUID)
 
-#define SUBTARGET_EXTRA_SPECS /* none needed */
+#undef CPP_SPEC
+#define CPP_SPEC                       \
+  "%{!D" VX_CPU_PREFIX "CPU=*:%{"      \
+  VX_MCPU(403, PPC403)   ";"           \
+  VX_MCPU(405, PPC405)   ";"           \
+  VX_MCPU(440, PPC440)   ";"           \
+  VX_MCPU(464, PPC464)   ";"           \
+  VX_MCPU(476, PPC476)   ";"           \
+  VX_MCPU(603, PPC603)   ";"           \
+  VX_MCPU(604, PPC604)   ";"           \
+  VX_MCPU(860, PPC860)   ";"           \
+  VX_MCPU(e6500, PPCE6500)  ";"                \
+  VX_MCPU(8540, PPC85XX) ";"           \
+  VX_MCPU(8548, PPC85XX) ";"           \
+  VX_CPUDEF(PPC604)                    \
+  "}}"                                 \
+  VXWORKS_ADDITIONAL_CPP_SPEC
 
 /* FIXME: The only reason we allow no -mcpu switch at all is because
-   config-ml.in insists on a "." multilib. */
-#define CPP_SPEC \
-"%{!DCPU=*:              \
-   %{mcpu=403 : -DCPU=PPC403  ; \
-     mcpu=405 : -DCPU=PPC405  ; \
-     mcpu=440 : -DCPU=PPC440  ; \
-     mcpu=464 : -DCPU=PPC464  ; \
-     mcpu=476 : -DCPU=PPC476  ; \
-     mcpu=603 : -DCPU=PPC603  ; \
-     mcpu=604 : -DCPU=PPC604  ; \
-     mcpu=860 : -DCPU=PPC860  ; \
-     mcpu=8540: -DCPU=PPC85XX ; \
-              : -DCPU=PPC604  }}" \
-VXWORKS_ADDITIONAL_CPP_SPEC
-
-#define CC1_SPEC                                               \
-"%{G*} %{mno-sdata:-msdata=none} %{msdata:-msdata=default}     \
- %{mlittle|mlittle-endian:-mstrict-align}                      \
- %{profile: -p}                \
- %{fvec:-maltivec} %{fvec-eabi:-maltivec -mabi=altivec}"
-
-#define ASM_SPEC \
-"%(asm_cpu) \
- %{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}} \
- %{v:-v} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} \
- %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} -mbig"
+   config-ml.in insists on a "." multilib.  */
 
 #undef  LIB_SPEC
 #define LIB_SPEC VXWORKS_LIB_SPEC
-#undef  LINK_SPEC
-#define LINK_SPEC VXWORKS_LINK_SPEC
+
 #undef  STARTFILE_SPEC
 #define STARTFILE_SPEC VXWORKS_STARTFILE_SPEC
+
 #undef  ENDFILE_SPEC
 #define ENDFILE_SPEC VXWORKS_ENDFILE_SPEC
 
 /* There is no default multilib.  */
 #undef MULTILIB_DEFAULTS
 
-#undef TARGET_DEFAULT
-#define TARGET_DEFAULT \
-  (MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_EABI | MASK_STRICT_ALIGN)
-
-#undef PROCESSOR_DEFAULT
-#define PROCESSOR_DEFAULT PROCESSOR_PPC604
+/* No _mcount profiling on VxWorks.  */
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE,LABELNO) VXWORKS_FUNCTION_PROFILER(FILE,LABELNO)
 
 /* Nor sdata, for kernel mode.  We use this in
    SUBSUBTARGET_INITIALIZE_OPTIONS, after rs6000_rtp has been initialized.  */
 #undef SDATA_DEFAULT_SIZE
 #define SDATA_DEFAULT_SIZE (TARGET_VXWORKS_RTP ? 8 : 0)
 
-/* Enforce 16bytes alignment for the stack pointer, to permit general
+#undef SUB3TARGET_OVERRIDE_OPTIONS
+#define SUB3TARGET_OVERRIDE_OPTIONS           \
+  do {                                          \
+  if (!OPTION_SET_P (g_switch_value))     \
+    g_switch_value = SDATA_DEFAULT_SIZE;        \
+  VXWORKS_OVERRIDE_OPTIONS;                     \
+  } while (0)
+
+/* The stack pointer need not be moved while checking the stack.  */
+#undef STACK_CHECK_MOVING_SP
+
+/* Define this to be nonzero if static stack checking is supported.  */
+#define STACK_CHECK_STATIC_BUILTIN 1
+
+/* Room needed to allow exception propagation, from what experiments
+   and low level observations taught us ...  */
+#define STACK_CHECK_PROTECT (TARGET_64BIT ? 16 * 1024 : 12 * 1024)
+
+/* Leverage linker relaxation for RTPs.  This helps 32bit programs
+   referring to kernel services too far away for short calls, is more
+   precise than -mlongcall and can be overriden with -Wl,--no-relax.  */
+#define VXWORKS_RELAX_LINK_SPEC "%{mrtp:--relax}"
+
+/*-------------------------------------------------------------*/
+/* Pre-VxWorks7 configuration.                                 */
+/*-------------------------------------------------------------*/
+
+#if !TARGET_VXWORKS7
+
+#undef RS6000_STARTING_FRAME_OFFSET
+#define RS6000_STARTING_FRAME_OFFSET                                   \
+  (cfun->calls_alloca                                                  \
+   ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16)    \
+   : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA))
+
+#undef STACK_DYNAMIC_OFFSET
+#define STACK_DYNAMIC_OFFSET(FUNDECL)                                  \
+   RS6000_ALIGN (crtl->outgoing_args_size.to_constant ()               \
+                + STACK_POINTER_OFFSET, 16)
+
+/* Enforce 16-byte alignment for the stack pointer, to permit general
    compliance with e.g. Altivec instructions requirements.  Make sure
    this isn't overruled by the EABI constraints.  */
 
@@ -126,24 +204,70 @@ VXWORKS_ADDITIONAL_CPP_SPEC
 
 #undef  ABI_STACK_BOUNDARY
 
-/* Make -mcpu=8540 imply SPE.  ISEL is automatically enabled, the
-   others must be done by hand.  Handle -mrtp.  Disable -fPIC
-   for -mrtp - the VxWorks PIC model is not compatible with it.  */
-#undef SUBSUBTARGET_OVERRIDE_OPTIONS
-#define SUBSUBTARGET_OVERRIDE_OPTIONS          \
-  do {                                         \
-    if (TARGET_E500)                           \
-      {                                                \
-       rs6000_spe = 1;                         \
-       rs6000_spe_abi = 1;                     \
-       rs6000_float_gprs = 1;                  \
-      }                                                \
-                                               \
-  if (!global_options_set.x_g_switch_value)    \
-    g_switch_value = SDATA_DEFAULT_SIZE;       \
-  VXWORKS_OVERRIDE_OPTIONS;                    \
-  } while (0)
+#undef  STARTFILE_PREFIX_SPEC
+#define STARTFILE_PREFIX_SPEC                                          \
+ "%{mrtp:%{!shared:/lib/usr/lib/ppc/PPC32/common}}"
+
+/* For aggregates passing, use the same, consistent ABI as Linux.  */
+#define AGGREGATE_PADDING_FIXED 0
+#define AGGREGATES_PAD_UPWARD_ALWAYS 0
+
+#undef ASM_SPEC
+#define ASM_SPEC \
+"%(asm_cpu) \
+ %{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}} \
+ %{mrelocatable} %{mrelocatable-lib} %{" FPIC_SPEC ":-K PIC} -mbig"
+
+#undef CC1_SPEC
+#define CC1_SPEC VXWORKS_CC1_SPEC " \
+  %{G*} %{mno-sdata:-msdata=none} %{msdata:-msdata=default}      \
+ %{mlittle|mlittle-endian:-mstrict-align}"
+
+#undef  LINK_SPEC
+#define LINK_SPEC VXWORKS_LINK_SPEC " " VXWORKS_RELAX_LINK_SPEC
+
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT (MASK_EABI | MASK_STRICT_ALIGN)
+
+#undef PROCESSOR_DEFAULT
+#define PROCESSOR_DEFAULT PROCESSOR_PPC604
+
+/* Only big endian PPC is supported by VxWorks.  */
+#undef BYTES_BIG_ENDIAN
+#define BYTES_BIG_ENDIAN 1
+
+#undef WORDS_BIG_ENDIAN
+#define WORDS_BIG_ENDIAN 1
+
+#undef SUBTARGET_EXTRA_SPECS
+#define SUBTARGET_EXTRA_SPECS /* none needed */
+
+#else /* TARGET_VXWORKS7 */
+
+/*-------------------------------------------------------------*/
+/* Post-VxWorks7 (SR600) configuration.                        */
+/*-------------------------------------------------------------*/
+
+/* VxWorks does not use local symbols for the function entry point.  */
+#undef DOT_SYMBOLS
+#define DOT_SYMBOLS 0
+
+/* For link specs, we leverage the linux configuration bits through
+   LINK_OS_EXTRA_SPEC32/64 and need to cancel the default %(link_os)
+   expansion in VXWORKS_LINK_SPEC.  */
+
+#undef VXWORKS_LINK_OS_SPEC
+#define VXWORKS_LINK_OS_SPEC ""
+
+#undef LINK_OS_EXTRA_SPEC32
+#define LINK_OS_EXTRA_SPEC32 VXWORKS_LINK_SPEC " " VXWORKS_RELAX_LINK_SPEC
+
+#undef LINK_OS_EXTRA_SPEC64
+#define LINK_OS_EXTRA_SPEC64 VXWORKS_LINK_SPEC
+
+/* linux64.h enables this, not supported in vxWorks.  */
+#undef TARGET_FLOAT128_ENABLE_TYPE
+#define TARGET_FLOAT128_ENABLE_TYPE 0
+
+#endif /* TARGET_VXWORKS7 */
 
-/* No _mcount profiling on VxWorks.  */
-#undef FUNCTION_PROFILER
-#define FUNCTION_PROFILER(FILE,LABELNO) VXWORKS_FUNCTION_PROFILER(FILE,LABELNO)