]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/config/rs6000/darwin.h
Update copyright years.
[thirdparty/gcc.git] / gcc / config / rs6000 / darwin.h
index d5919c4c71dd9aec2ada75a92c5236b8afe389e6..ce27508afcb650cc31372c7a47144330326a3f7b 100644 (file)
@@ -1,5 +1,5 @@
 /* Target definitions for PowerPC running Darwin (Mac OS X).
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2020 Free Software Foundation, Inc.
    Contributed by Apple Computer Inc.
 
    This file is part of GCC.
@@ -43,8 +43,7 @@
 
 /* We're not ever going to do TOCs.  */
 
-#define TARGET_TOC 0
-#define TARGET_NO_TOC 1
+#define TARGET_HAS_TOC 0
 
 /* Override the default rs6000 definition.  */
 #undef  PTRDIFF_TYPE
 #define TARGET_OS_CPP_BUILTINS()                       \
   do                                                   \
     {                                                  \
-      if (!TARGET_64BIT) builtin_define ("__ppc__");   \
-      if (TARGET_64BIT) builtin_define ("__ppc64__");  \
       builtin_define ("__POWERPC__");                  \
+      builtin_define ("__PPC__");                      \
+      if (TARGET_64BIT)                                        \
+       {                                               \
+         builtin_define ("__ppc64__");                 \
+         builtin_define ("__PPC64__");                 \
+         builtin_define ("__powerpc64__");             \
+         builtin_assert ("cpu=powerpc64");             \
+         builtin_assert ("machine=powerpc64");         \
+       }                                               \
+      else                                             \
+       {                                               \
+         builtin_define ("__ppc__");                   \
+         builtin_define_std ("PPC");                   \
+         builtin_assert ("cpu=powerpc");               \
+         builtin_assert ("machine=powerpc");           \
+       }                                               \
       builtin_define ("__NATURAL_ALIGNMENT__");                \
       darwin_cpp_builtins (pfile);                     \
     }                                                  \
   while (0)
 
-/* Generate branch islands stubs if this is true.  */
-extern int darwin_emit_branch_islands;
-
 #define SUBTARGET_OVERRIDE_OPTIONS darwin_rs6000_override_options ()
 
 #define C_COMMON_OVERRIDE_OPTIONS do {                                 \
@@ -84,6 +94,24 @@ extern int darwin_emit_branch_islands;
 
 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
 
+/* Machine dependent libraries.
+   Include libmx when targeting Darwin 7.0 and above, but before libSystem,
+   since the functions are actually in libSystem but for 7.x compatibility
+   we want them to be looked for in libmx first.
+   Include libSystemStubs when compiling against 10.3 - 10.5 SDKs (we assume
+   this is the case when targetting these) - but not for 64-bit long double.
+   Don't do either for m64, the library is either a dummy or non-existent.
+*/
+
+#undef LIB_SPEC
+#define LIB_SPEC \
+"%{!static:                                                            \
+  %{!m64:%{!mlong-double-64:                                           \
+    %{pg:%:version-compare(>< 10.3 10.5 mmacosx-version-min= -lSystemStubs_profile)} \
+    %{!pg:%:version-compare(>< 10.3 10.5 mmacosx-version-min= -lSystemStubs)} \
+     %:version-compare(>< 10.3 10.4 mmacosx-version-min= -lmx)}}       \
+  -lSystem                                                             \
+}"
 
 /* We want -fPIC by default, unless we're using -static to compile for
    the kernel or some such.  The "-faltivec" option should have been
@@ -93,17 +121,15 @@ extern int darwin_emit_branch_islands;
   %(cc1_cpu) \
   %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} \
   %{static: %{Zdynamic: %e conflicting code gen style switches are used}}\
-  %{!mmacosx-version-min=*:-mmacosx-version-min=%(darwin_minversion)} \
   %{!mkernel:%{!static:%{!mdynamic-no-pic:-fPIC}}} \
   %{faltivec:-maltivec -include altivec.h} %{fno-altivec:-mno-altivec} \
   %<faltivec %<fno-altivec " \
   DARWIN_CC1_SPEC
 
-#define DARWIN_ARCH_SPEC "%{m64:ppc64;:ppc}"
+/* Default to PPC for single arch builds.  */
+#define DARWIN_ARCH_SPEC "ppc"
 
 #define DARWIN_SUBARCH_SPEC "                  \
- %{m64: ppc64}                                 \
- %{!m64:                                       \
  %{mcpu=601:ppc601;                            \
    mcpu=603:ppc603;                            \
    mcpu=603e:ppc603;                           \
@@ -118,22 +144,51 @@ extern int darwin_emit_branch_islands;
    mcpu=970:ppc970;                            \
    mcpu=power4:ppc970;                         \
    mcpu=G5:ppc970;                             \
-   :ppc}}"
-
-/* crt2.o is at least partially required for 10.3.x and earlier.  */
+   :ppc}"
+
+/* We need to jam the crt to 10.5 for 10.6 (Rosetta) use.  */
+#undef DARWIN_CRT1_SPEC
+#define DARWIN_CRT1_SPEC                                               \
+  "%:version-compare(!> 10.5 mmacosx-version-min= -lcrt1.o)            \
+   %:version-compare(>< 10.5 10.7 mmacosx-version-min= -lcrt1.10.5.o)  \
+   %{fgnu-tm: -lcrttms.o}"
+
+/* crt2.o is at least partially required for 10.3.x and earlier.
+   It deals with registration of the unwind frames, where this is not
+   automatically provided by the system.  So we need it for any case that
+   might use exceptions.  */
+#undef DARWIN_CRT2_SPEC
 #define DARWIN_CRT2_SPEC \
-  "%{!m64:%:version-compare(!> 10.4 mmacosx-version-min= crt2.o%s)}"
-
-/* Determine a minimum version based on compiler options.  */
-#define DARWIN_MINVERSION_SPEC                                 \
-  "%{m64:%{fgnu-runtime:10.4;                                  \
-          ,objective-c|,objc-cpp-output:10.5;                  \
-          ,objective-c-header:10.5;                            \
-          ,objective-c++|,objective-c++-cpp-output:10.5;       \
-          ,objective-c++-header|,objc++-cpp-output:10.5;       \
-          :10.4};                                              \
-     shared-libgcc:10.3;                                       \
-     :10.1}"
+"%{!m64:%{shared-libgcc|static-libstdc++|fexceptions|fobjc-exceptions|fgnu-runtime: \
+   %:version-compare(!> 10.4 mmacosx-version-min= crt2.o%s) \
+  }}"
+
+/* crt3 deals with providing cxa_atexit on earlier systems (or fixing it up,
+   for broken versions).  It's only needed for c++ code, so we can make it
+   conditional on shared-libgcc since that's forced on for c++.  */
+#undef DARWIN_CRT3_SPEC
+#define DARWIN_CRT3_SPEC \
+"%{!m64:%{shared-libgcc|static-libstdc++:                                                      \
+   %:version-compare(>< 10.4 10.5 mmacosx-version-min= crt3.o%s) \
+   %:version-compare(!> 10.4 mmacosx-version-min= crt3_2.o%s) \
+  }}"
+
+/* As for crt1, we need to force the dylib crt for 10.6.  */
+#undef DARWIN_DYLIB1_SPEC
+#define DARWIN_DYLIB1_SPEC                                             \
+  "%:version-compare(!> 10.5 mmacosx-version-min= -ldylib1.o)          \
+   %:version-compare(>< 10.5 10.7 mmacosx-version-min= -ldylib1.10.5.o)"
+
+/* Likewise, the bundle crt.  */
+#undef DARWIN_BUNDLE1_SPEC
+#define DARWIN_BUNDLE1_SPEC \
+"%{!static:%:version-compare(< 10.7 mmacosx-version-min= -lbundle1.o)  \
+          %{fgnu-tm: -lcrttms.o}}"
+
+/* The PPC regs save/restore functions are leaves and could, conceivably
+   be used by the tm destructor.  */
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC TM_DESTRUCTOR " -lef_ppc"
 
 #undef SUBTARGET_EXTRA_SPECS
 #define SUBTARGET_EXTRA_SPECS                  \
@@ -158,19 +213,45 @@ extern int darwin_emit_branch_islands;
 #undef  RS6000_PIC_OFFSET_TABLE_REGNUM
 #define RS6000_PIC_OFFSET_TABLE_REGNUM 31
 
-/* Pad the outgoing args area to 16 bytes instead of the usual 8.  */
+/* Darwin's stack must remain 16-byte aligned for both 32 and 64 bit
+   ABIs.  */
+
+#undef  STACK_BOUNDARY
+#define STACK_BOUNDARY 128
+
+/* Offset within stack frame to start allocating local variables at.
+   For supported Darwin versions, FRAME_GROWS_DOWNWARD is true, therefore
+   this value is the offset to the END of the first local allocated.
+
+   On the RS/6000, the frame pointer is the same as the stack pointer,
+   except for dynamic allocations.  So we start after the fixed area and
+   outgoing parameter area.
+
+   If the function uses dynamic stack space (CALLS_ALLOCA is set), that
+   space needs to be aligned to STACK_BOUNDARY, i.e. the sum of the
+   sizes of the fixed area and the parameter area must be a multiple of
+   STACK_BOUNDARY.  */
+
+#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 STARTING_FRAME_OFFSET
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD                                                        \
-   ? 0                                                                 \
-   : (RS6000_ALIGN (crtl->outgoing_args_size, 16)              \
-      + RS6000_SAVE_AREA))
+/* Offset from the stack pointer register to an item dynamically
+   allocated on the stack, e.g., by `alloca'.
+
+   The default value for this macro is `STACK_POINTER_OFFSET' plus the
+   length of the outgoing arguments.  The default is correct for most
+   machines.  See `function.c' for details.
+
+   This value must be a multiple of STACK_BOUNDARY (hard coded in
+   `emit-rtl.c').  */
 
 #undef STACK_DYNAMIC_OFFSET
 #define STACK_DYNAMIC_OFFSET(FUNDECL)                                  \
-  (RS6000_ALIGN (crtl->outgoing_args_size, 16)         \
-   + (STACK_POINTER_OFFSET))
+  RS6000_ALIGN (crtl->outgoing_args_size.to_constant()                 \
+               + STACK_POINTER_OFFSET, 16)
 
 /* Darwin uses a function call if everything needs to be saved/restored.  */
 
@@ -188,25 +269,27 @@ extern int darwin_emit_branch_islands;
 #undef REGISTER_NAMES
 #define REGISTER_NAMES                                                 \
 {                                                                      \
+  /* GPRs */                                                           \
      "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",            \
      "r8",  "r9", "r10", "r11", "r12", "r13", "r14", "r15",            \
     "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",            \
     "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",            \
+  /* FPRs */                                                           \
      "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",            \
      "f8",  "f9", "f10", "f11", "f12", "f13", "f14", "f15",            \
     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",            \
     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",            \
-     "mq",  "lr", "ctr",  "ap",                                                \
+  /* VRs */                                                            \
+     "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",            \
+     "v8",  "v9", "v10", "v11", "v12", "v13", "v14", "v15",            \
+    "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",            \
+    "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",            \
+  /* lr ctr ca ap */                                                   \
+     "lr", "ctr", "xer",  "ap",                                                \
+  /* cr0..cr7 */                                                       \
     "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",            \
-    "xer",                                                             \
-     "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",             \
-     "v8",  "v9", "v10", "v11", "v12", "v13", "v14", "v15",             \
-    "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",             \
-    "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",             \
-    "vrsave", "vscr",                                                  \
-    "spe_acc", "spefscr",                                               \
-    "sfp",                                                             \
-    "tfhar", "tfiar", "texasr"                                         \
+  /* vrsave vscr sfp */                                                        \
+    "vrsave", "vscr", "sfp"                                            \
 }
 
 /* This outputs NAME to FILE.  */
@@ -252,9 +335,9 @@ extern int darwin_emit_branch_islands;
 /* This is supported in cctools 465 and later.  The macro test
    above prevents using it in earlier build environments.  */
 #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP)          \
-  if ((LOG) != 0)                                             \
+  if ((LOG) > 0)                                             \
     {                                                         \
-      if ((MAX_SKIP) == 0)                                    \
+      if ((MAX_SKIP) <= 0)                                    \
         fprintf ((FILE), "\t.p2align %d\n", (LOG));           \
       else                                                    \
         fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \
@@ -287,6 +370,9 @@ extern int darwin_emit_branch_islands;
 #undef  TARGET_IEEEQUAD
 #define TARGET_IEEEQUAD 0
 
+#undef  TARGET_IEEEQUAD_DEFAULT
+#define TARGET_IEEEQUAD_DEFAULT 0
+
 /* Since Darwin doesn't do TOCs, stub this out.  */
 
 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)  ((void)X, (void)MODE, 0)
@@ -313,24 +399,27 @@ extern int darwin_emit_branch_islands;
   ((CONSTANT_P (X)                                             \
     && reg_classes_intersect_p ((CLASS), FLOAT_REGS))          \
    ? NO_REGS                                                   \
-   : ((GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == HIGH)     \
+   : ((SYMBOL_REF_P (X) || GET_CODE (X) == HIGH)               \
       && reg_class_subset_p (BASE_REGS, (CLASS)))              \
    ? BASE_REGS                                                 \
    : (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT                        \
-      && (CLASS) == NON_SPECIAL_REGS)                          \
+      && (CLASS) == GEN_OR_FLOAT_REGS)                         \
    ? GENERAL_REGS                                              \
    : (CLASS))
 
-/* Compute field alignment.  This is similar to the version of the
-   macro in the Apple version of GCC, except that version supports
-   'mac68k' alignment, and that version uses the computed alignment
-   always for the first field of a structure.  The first-field
-   behavior is dealt with by
-   darwin_rs6000_special_round_type_align.  */
-#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED)    \
-  (TARGET_ALIGN_NATURAL ? (COMPUTED)           \
-   : (COMPUTED) == 128 ? 128                   \
-   : MIN ((COMPUTED), 32))
+/* Compute field alignment.
+   This implements the 'power' alignment rule by pegging the alignment of
+   items (beyond the first aggregate field) to 32 bits.  The pegging is
+   suppressed for vector and long double items (both 128 in size).
+   There is a dummy use of the FIELD argument to avoid an unused variable
+   warning (see PR59496).  */
+#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED)              \
+  ((void) (FIELD),                                             \
+    (TARGET_ALIGN_NATURAL                                      \
+     ? (COMPUTED)                                              \
+     : (COMPUTED) == 128                                       \
+       ? 128                                                   \
+       : MIN ((COMPUTED), 32)))
 
 /* Darwin increases natural record alignment to doubleword if the first
    field is an FP double while the FP fields remain word aligned.  */
@@ -349,7 +438,7 @@ extern int darwin_emit_branch_islands;
    registers and memory.  FIRST is nonzero if this is the only
    element.  */
 #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
-  (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE))
+  (!(FIRST) ? PAD_UPWARD : targetm.calls.function_arg_padding (MODE, TYPE))
 
 #define DOUBLE_INT_ASM_OP "\t.quad\t"
 
@@ -363,6 +452,7 @@ extern int darwin_emit_branch_islands;
   do \
     { \
       DARWIN_REGISTER_TARGET_PRAGMAS(); \
+      targetm.target_option.pragma_parse = rs6000_pragma_target_parse; \
       targetm.resolve_overloaded_builtin = altivec_resolve_overloaded_builtin; \
     } \
   while (0)
@@ -421,3 +511,10 @@ do {                                                                       \
 /* So far, there is no rs6000_fold_builtin, if one is introduced, then
    this will need to be modified similar to the x86 case.  */
 #define TARGET_FOLD_BUILTIN SUBTARGET_FOLD_BUILTIN
+
+/* First available SYMBOL flag bit for use by subtargets.  */
+#define SYMBOL_FLAG_SUBT_DEP (SYMBOL_FLAG_MACH_DEP)
+
+/* Use standard DWARF numbering for DWARF debugging information.  */
+#define RS6000_USE_DWARF_NUMBERING
+