blob: 92153e993a23870a19a4126a90fef4fe45dba0cc [file] [log] [blame]
/* APPLE LOCAL file ARM darwin target */
/* Size of the Obj-C jump buffer. */
#define OBJC_JBLEN 28
#define SUBTARGET_CPU_DEFAULT arm920
#undef SUBTARGET_EXTRA_ASM_SPEC
#define SUBTARGET_EXTRA_ASM_SPEC ""
#define DEFAULT_TARGET_ARCH "arm"
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (arm Darwin)");
#define TARGET_OS_CPP_BUILTINS() \
do \
{ \
builtin_define ("__arm__") ; \
builtin_define ("__arm"); \
builtin_define ("__LITTLE_ENDIAN__"); \
darwin_cpp_builtins (pfile); \
} \
while (0)
/* We want -fPIC by default, unless we're using -static to compile for
the kernel or some such. */
#undef CC1_SPEC
#define CC1_SPEC "%<faltivec %<mcpu=G4 %<mcpu=G5 \
%{!mmacosx-version-min=*:-mmacosx-version-min=%(darwin_minversion)} \
%{static: %{Zdynamic: %e conflicting code gen style switches are used}} \
%{static: %{mdynamic-no-pic: %e conflicting code gen style switches are used}} \
%{!static:%{!mdynamic-no-pic:-fPIC}} \
%{!fbuiltin-strcat:-fno-builtin-strcat} \
%{!fbuiltin-strcpy:-fno-builtin-strcpy} \
%<fbuiltin-strcat \
%<fbuiltin-strcpy"
#undef LIB_SPEC
#define LIB_SPEC "%{!static:-lSystem}"
/* Use the following macro for any Darwin/x86-specific command-line option
translation. */
#define SUBTARGET_OPTION_TRANSLATE_TABLE \
{ "", "" }
#define REGISTER_PREFIX ""
/* The assembler's names for the registers. */
#ifndef REGISTER_NAMES
#define REGISTER_NAMES \
{ \
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
"r8", "r9", "r10","r11","ip", "sp", "lr", "pc", \
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"cc", "sfp", "afp", \
"mv0", "mv1", "mv2", "mv3", \
"mv4", "mv5", "mv6", "mv7", \
"mv8", "mv9", "mv10", "mv11", \
"mv12", "mv13", "mv14", "mv15", \
"wcgr0", "wcgr1", "wcgr2", "wcgr3", \
"wr0", "wr1", "wr2", "wr3", \
"wr4", "wr5", "wr6", "wr7", \
"wr8", "wr9", "wr10", "wr11", \
"wr12", "wr13", "wr14", "wr15", \
"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", \
"s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", \
"s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", \
"s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", \
"vfpcc" \
}
#endif
#ifndef ADDITIONAL_REGISTER_NAMES
#define ADDITIONAL_REGISTER_NAMES \
{ \
{"a1", 0}, \
{"a2", 1}, \
{"a3", 2}, \
{"a4", 3}, \
{"v1", 4}, \
{"v2", 5}, \
{"v3", 6}, \
{"v4", 7}, \
{"v5", 8}, \
{"v6", 9}, \
{"rfp", 9}, /* Gcc used to call it this */ \
{"sb", 9}, \
{"v7", 10}, \
{"sl", 10}, /* sl */ \
{"r12", 12}, /* ip */ \
{"r13", 13}, /* sp */ \
{"r14", 14}, /* lr */ \
{"r15", 15}, /* pc */ \
{"mvf0", 27}, \
{"mvf1", 28}, \
{"mvf2", 29}, \
{"mvf3", 30}, \
{"mvf4", 31}, \
{"mvf5", 32}, \
{"mvf6", 33}, \
{"mvf7", 34}, \
{"mvf8", 35}, \
{"mvf9", 36}, \
{"mvf10", 37}, \
{"mvf11", 38}, \
{"mvf12", 39}, \
{"mvf13", 40}, \
{"mvf14", 41}, \
{"mvf15", 42}, \
{"mvd0", 27}, \
{"mvd1", 28}, \
{"mvd2", 29}, \
{"mvd3", 30}, \
{"mvd4", 31}, \
{"mvd5", 32}, \
{"mvd6", 33}, \
{"mvd7", 34}, \
{"mvd8", 35}, \
{"mvd9", 36}, \
{"mvd10", 37}, \
{"mvd11", 38}, \
{"mvd12", 39}, \
{"mvd13", 40}, \
{"mvd14", 41}, \
{"mvd15", 42}, \
{"mvfx0", 27}, \
{"mvfx1", 28}, \
{"mvfx2", 29}, \
{"mvfx3", 30}, \
{"mvfx4", 31}, \
{"mvfx5", 32}, \
{"mvfx6", 33}, \
{"mvfx7", 34}, \
{"mvfx8", 35}, \
{"mvfx9", 36}, \
{"mvfx10", 37}, \
{"mvfx11", 38}, \
{"mvfx12", 39}, \
{"mvfx13", 40}, \
{"mvfx14", 41}, \
{"mvfx15", 42}, \
{"mvdx0", 27}, \
{"mvdx1", 28}, \
{"mvdx2", 29}, \
{"mvdx3", 30}, \
{"mvdx4", 31}, \
{"mvdx5", 32}, \
{"mvdx6", 33}, \
{"mvdx7", 34}, \
{"mvdx8", 35}, \
{"mvdx9", 36}, \
{"mvdx10", 37}, \
{"mvdx11", 38}, \
{"mvdx12", 39}, \
{"mvdx13", 40}, \
{"mvdx14", 41}, \
{"mvdx15", 42}, \
{"d0", 63}, \
{"d1", 65}, \
{"d2", 67}, \
{"d3", 69}, \
{"d4", 71}, \
{"d5", 73}, \
{"d6", 75}, \
{"d7", 77}, \
{"d8", 79}, \
{"d9", 81}, \
{"d10", 83}, \
{"d11", 85}, \
{"d12", 87}, \
{"d13", 89}, \
{"d14", 91}, \
{"d15", 93}, \
}
#endif
#define DBX_DEBUGGING_INFO 1
#ifndef ASM_COMMENT_START
#define ASM_COMMENT_START "@"
#endif
#undef ASM_DECLARE_FUNCTION_SIZE
#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
do \
{ \
ARM_DECLARE_FUNCTION_SIZE (FILE, FNAME, DECL); \
} \
while (0)
#define DARWIN_SUBARCH_SPEC " \
%{march=armv6k:armv6; \
march=armv5tej:armv5; \
march=xscale:xscale; \
march=armv4t:armv4t; \
mcpu=arm10tdmi:armv5; \
mcpu=arm1020t:armv5; \
mcpu=arm9e:armv5; \
mcpu=arm946e-s:armv5; \
mcpu=arm966e-s:armv5; \
mcpu=arm968e-s:armv5; \
mcpu=arm10e:armv5; \
mcpu=arm1020e:armv5; \
mcpu=arm1022e:armv5; \
mcpu=arm926ej-s:armv5; \
mcpu=arm1026ej-s:armv5; \
mcpu=xscale:xscale; \
mcpu=arm1136j-s:armv6; \
mcpu=arm1136jf-s:armv6; \
mcpu=arm1176jz-s:armv6; \
mcpu=arm1176jzf-s:armv6; \
:arm -force_cpusubtype_ALL}"
#define DARWIN_MINVERSION_SPEC "10.5"
#define DARWIN_DSYMUTIL_SPEC \
"%{gdwarf*: dsymutil %{o*:%*}%{!o:a.out}}"
#undef SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS \
DARWIN_EXTRA_SPECS \
{ "darwin_arch", DARWIN_SUBARCH_SPEC }, \
{ "darwin_subarch", DARWIN_SUBARCH_SPEC },
/* This can go away once we can feature test the assembler correctly. */
#define ASM_DEBUG_SPEC ""
#define SUBTARGET_OVERRIDE_OPTIONS \
do { \
if (1) \
{ \
if (MACHO_DYNAMIC_NO_PIC_P) \
{ \
if (flag_pic) \
warning (0, "-mdynamic-no-pic overrides -fpic or -fPIC"); \
flag_pic = 0; \
} \
else if (flag_pic == 1) \
{ \
/* Darwin doesn't support -fpic. */ \
warning (0, "-fpic is not supported; -fPIC assumed"); \
flag_pic = 2; \
} \
} \
} while(0)
/* We reserve r9 on darwin for thread local data. */
#undef SUBTARGET_CONDITIONAL_REGISTER_USAGE
#define SUBTARGET_CONDITIONAL_REGISTER_USAGE \
if (1) \
{ \
fixed_regs[9] = 1; \
call_used_regs[9] = 1; \
} \
if (TARGET_THUMB) \
{ \
fixed_regs[THUMB_HARD_FRAME_POINTER_REGNUM] = 1; \
call_used_regs[THUMB_HARD_FRAME_POINTER_REGNUM] = 1; \
global_regs[THUMB_HARD_FRAME_POINTER_REGNUM] = 1; \
}
#undef TARGET_MACHO
#define TARGET_MACHO 1
#undef DEFAULT_STRUCTURE_SIZE_BOUNDARY
#define DEFAULT_STRUCTURE_SIZE_BOUNDARY 8
#undef DOT_WORD
#define DOT_WORD ".long"
/* Output an element of a dispatch table. */
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
asm_fprintf (STREAM, "\t" DOT_WORD "\t%LL%d\n", VALUE)
#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
do { \
unsigned HOST_WIDE_INT _new_size = SIZE; \
fputs (".comm ", (FILE)); \
assemble_name ((FILE), (NAME)); \
if (_new_size == 0) _new_size = 1; \
fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED"\n", _new_size); \
} while (0)
#undef SUBTARGET_ASM_DECLARE_FUNCTION_NAME
#define SUBTARGET_ASM_DECLARE_FUNCTION_NAME ARM_DECLARE_FUNCTION_NAME
/* We default to VFP */
#define FPUTYPE_DEFAULT FPUTYPE_VFP
#undef TARGET_DEFAULT_FLOAT_ABI
#define TARGET_DEFAULT_FLOAT_ABI (arm_arch6 ? ARM_FLOAT_ABI_SOFTFP : ARM_FLOAT_ABI_SOFT)
#undef REGISTER_TARGET_PRAGMAS
#define REGISTER_TARGET_PRAGMAS DARWIN_REGISTER_TARGET_PRAGMAS
#undef DEFAULT_SIGNED_CHAR
#define DEFAULT_SIGNED_CHAR (1)
#undef GLOBAL_ASM_OP
#define GLOBAL_ASM_OP "\t.globl "
#define TARGET_64BIT 0
#define C_COMMON_OVERRIDE_OPTIONS do { \
SUBTARGET_C_COMMON_OVERRIDE_OPTIONS; \
} while (0)
/* The xxxvfp comparisons return 0 or 1. */
#define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, OPERATOR) \
((TARGET_MACHO && TARGET_THUMB && !TARGET_SOFT_FLOAT \
&& (flag_pic || MACHO_DYNAMIC_NO_PIC_P) \
&& (MODE == SFmode || MODE == DFmode)) ? 1 : 0)
/* Until dyld supports aligned commons... */
#undef ASM_OUTPUT_ALIGNED_COMMON
/* Adjust inlining parameters. */
#undef SUBTARGET_OPTIMIZATION_OPTIONS
#define SUBTARGET_OPTIMIZATION_OPTIONS \
if (optimize_size) \
{ \
set_param_value ("max-inline-insns-single", 9); \
set_param_value ("max-inline-insns-auto", 4); \
set_param_value ("inline-call-cost", 2); \
}
#undef ARM_DECLARE_FUNCTION_SIZE
#define ARM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL) \
if (!TARGET_LONG_CALLS || ! DECL_SECTION_NAME (DECL)) \
arm_encode_call_attribute (DECL, SYMBOL_SHORT_CALL)
/* Remove limit for -Os */
#undef MAX_CONDITIONAL_EXECUTE
#define MAX_CONDITIONAL_EXECUTE (optimize_size ? INT_MAX : (BRANCH_COST + 1))
/* Use stabs for now */
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
#undef TARGET_IASM_OP_CONSTRAINT
#define TARGET_IASM_OP_CONSTRAINT \
{ "ldr", 2, "m" },