Mercurial > hg > CbC > CbC_gcc
diff gcc/config/rs6000/darwin.h @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/gcc/config/rs6000/darwin.h Thu Oct 25 07:37:49 2018 +0900 +++ b/gcc/config/rs6000/darwin.h Thu Feb 13 11:34:05 2020 +0900 @@ -1,5 +1,5 @@ /* Target definitions for PowerPC running Darwin (Mac OS X). - Copyright (C) 1997-2018 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 @@ -53,17 +52,28 @@ #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 @@ #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 @@ -98,11 +126,10 @@ %<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; \ @@ -117,7 +144,7 @@ mcpu=970:ppc970; \ mcpu=power4:ppc970; \ mcpu=G5:ppc970; \ - :ppc}}" + :ppc}" /* We need to jam the crt to 10.5 for 10.6 (Rosetta) use. */ #undef DARWIN_CRT1_SPEC @@ -126,9 +153,42 @@ %: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. */ +/* 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)}" +"%{!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 \ @@ -137,12 +197,6 @@ { "darwin_crt2", DARWIN_CRT2_SPEC }, \ { "darwin_subarch", DARWIN_SUBARCH_SPEC }, -/* We need to jam the dylib crt to 10.5 for 10.6 (Rosetta) use. */ -#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)" - /* Output a .machine directive. */ #undef TARGET_ASM_FILE_START #define TARGET_ASM_FILE_START rs6000_darwin_file_start @@ -159,17 +213,45 @@ #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 \ - (RS6000_ALIGN (crtl->outgoing_args_size, 16) \ - + RS6000_SAVE_AREA) + (cfun->calls_alloca \ + ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16) \ + : (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.to_constant (), 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. */ @@ -187,24 +269,27 @@ #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", \ - "sfp", \ - "tfhar", "tfiar", "texasr" \ + /* vrsave vscr sfp */ \ + "vrsave", "vscr", "sfp" \ } /* This outputs NAME to FILE. */ @@ -250,9 +335,9 @@ /* 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)); \ @@ -314,11 +399,11 @@ ((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)) @@ -367,6 +452,7 @@ do \ { \ DARWIN_REGISTER_TARGET_PRAGMAS(); \ + targetm.target_option.pragma_parse = rs6000_pragma_target_parse; \ targetm.resolve_overloaded_builtin = altivec_resolve_overloaded_builtin; \ } \ while (0) @@ -426,6 +512,9 @@ 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