190075Sobrien/* Definitions for StrongARM running FreeBSD using the ELF format 2132718Skan Copyright (C) 2001, 2004 Free Software Foundation, Inc. 390075Sobrien Contributed by David E. O'Brien <obrien@FreeBSD.org> and BSDi. 490075Sobrien 5132718Skan This file is part of GCC. 690075Sobrien 7132718Skan GCC is free software; you can redistribute it and/or modify it 8132718Skan under the terms of the GNU General Public License as published 9132718Skan by the Free Software Foundation; either version 2, or (at your 10132718Skan option) any later version. 1190075Sobrien 12132718Skan GCC is distributed in the hope that it will be useful, but WITHOUT 13132718Skan ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14132718Skan or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15132718Skan License for more details. 1690075Sobrien 17132718Skan You should have received a copy of the GNU General Public License 18132718Skan along with GCC; see the file COPYING. If not, write to 19169689Skan the Free Software Foundation, 51 Franklin Street, Fifth Floor, 20169689Skan Boston, MA 02110-1301, USA. */ 2190075Sobrien 22169711Skan#undef SUBTARGET_CPP_SPEC 23169711Skan#define SUBTARGET_CPP_SPEC FBSD_CPP_SPEC 2490075Sobrien 25132718Skan#undef SUBTARGET_EXTRA_SPECS 26132718Skan#define SUBTARGET_EXTRA_SPECS \ 27169711Skan { "subtarget_extra_asm_spec", SUBTARGET_EXTRA_ASM_SPEC }, \ 28169711Skan { "subtarget_asm_float_spec", SUBTARGET_ASM_FLOAT_SPEC }, \ 29132718Skan { "fbsd_dynamic_linker", FBSD_DYNAMIC_LINKER } 30132718Skan 31169711Skan#undef SUBTARGET_EXTRA_ASM_SPEC 32245539Sandrew#ifdef TARGET_ARM_EABI 33169711Skan#define SUBTARGET_EXTRA_ASM_SPEC \ 34245539Sandrew "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=4} %{fpic|fpie:-k} %{fPIC|fPIE:-k}" 35245539Sandrew#else 36245539Sandrew#define SUBTARGET_EXTRA_ASM_SPEC \ 37169711Skan "-matpcs %{fpic|fpie:-k} %{fPIC|fPIE:-k}" 38245539Sandrew#endif 3990075Sobrien 40169711Skan/* Default to full FPA if -mhard-float is specified. */ 41169711Skan#undef SUBTARGET_ASM_FLOAT_SPEC 42169711Skan#define SUBTARGET_ASM_FLOAT_SPEC \ 43169711Skan "%{mhard-float:-mfpu=fpa} \ 44169711Skan %{mfloat-abi=hard:{!mfpu=*:-mfpu=fpa}} \ 45169711Skan %{!mhard-float: %{msoft-float:-mfpu=softvfp;:-mfpu=softvfp}}" 46169711Skan 47132718Skan#undef LINK_SPEC 48132718Skan#define LINK_SPEC " \ 49132718Skan %{p:%nconsider using `-pg' instead of `-p' with gprof(1) } \ 50132718Skan %{v:-V} \ 51132718Skan %{assert*} %{R*} %{rpath*} %{defsym*} \ 52132718Skan %{shared:-Bshareable %{h*} %{soname*}} \ 53132718Skan %{!shared: \ 54132718Skan %{!static: \ 55132718Skan %{rdynamic:-export-dynamic} \ 56132718Skan %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ 57132718Skan %{static:-Bstatic}} \ 58238472Skib %{!static:--hash-style=both --enable-new-dtags} \ 59169711Skan %{symbolic:-Bsymbolic} \ 60169711Skan -X %{mbig-endian:-EB} %{mlittle-endian:-EL}" 6190075Sobrien 6290075Sobrien/************************[ Target stuff ]***********************************/ 6390075Sobrien 64169711Skan 65169711Skan#ifndef TARGET_ENDIAN_DEFAULT 66169711Skan#define TARGET_ENDIAN_DEFAULT 0 67169711Skan#endif 68169711Skan 69245539Sandrew#ifdef TARGET_ARM_EABI 70245539Sandrew/* We default to a soft-float ABI so that binaries can run on all 71245539Sandrew target hardware. */ 72245539Sandrew#undef TARGET_DEFAULT_FLOAT_ABI 73245539Sandrew#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT 74245539Sandrew 75260565Sandrew#undef TARGET_DEFAULT 76260565Sandrew#define TARGET_DEFAULT (MASK_INTERWORK | TARGET_ENDIAN_DEFAULT) 77260565Sandrew 78245539Sandrew#undef ARM_DEFAULT_ABI 79245539Sandrew#define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX 80245539Sandrew 81245539Sandrew#undef TARGET_OS_CPP_BUILTINS 82245539Sandrew#define TARGET_OS_CPP_BUILTINS() \ 83245539Sandrew do \ 84245539Sandrew { \ 85245539Sandrew FBSD_TARGET_OS_CPP_BUILTINS(); \ 86245539Sandrew TARGET_BPABI_CPP_BUILTINS(); \ 87245539Sandrew } \ 88245539Sandrew while (false) 89245539Sandrew#else 90169711Skan/* Default it to use ATPCS with soft-VFP. */ 91246317Sandrew#undef TARGET_DEFAULT 92169711Skan#define TARGET_DEFAULT \ 93169711Skan (MASK_APCS_FRAME \ 94169711Skan | TARGET_ENDIAN_DEFAULT) 95169711Skan 96169711Skan#undef ARM_DEFAULT_ABI 97169711Skan#define ARM_DEFAULT_ABI ARM_ABI_ATPCS 98169711Skan 99245539Sandrew#undef FPUTYPE_DEFAULT 100245539Sandrew#define FPUTYPE_DEFAULT FPUTYPE_VFP 101245539Sandrew#endif 102245539Sandrew 103169711Skan/* Define the actual types of some ANSI-mandated types. 10490075Sobrien Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c, 10590075Sobrien c-common.c, and config/<arch>/<arch>.h. */ 10690075Sobrien 10790075Sobrien/* arm.h gets this wrong for FreeBSD. We use the GCC defaults instead. */ 10890075Sobrien 10990075Sobrien#undef SIZE_TYPE 11090075Sobrien#define SIZE_TYPE "unsigned int" 11190075Sobrien 11290075Sobrien#undef PTRDIFF_TYPE 11390075Sobrien#define PTRDIFF_TYPE "int" 11490075Sobrien 11590075Sobrien/* We use the GCC defaults here. */ 11690075Sobrien#undef WCHAR_TYPE 11790075Sobrien 118239272Sgonzo#if defined(FREEBSD_ARCH_armv6) 11990075Sobrien#undef SUBTARGET_CPU_DEFAULT 120239272Sgonzo#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm1176jzs 121239272Sgonzo#undef FBSD_TARGET_CPU_CPP_BUILTINS 122239272Sgonzo#define FBSD_TARGET_CPU_CPP_BUILTINS() \ 123239272Sgonzo do { \ 124239272Sgonzo builtin_define ("__FreeBSD_ARCH_armv6__"); \ 125239272Sgonzo } while (0) 126239272Sgonzo#undef TARGET_VERSION 127239272Sgonzo#define TARGET_VERSION fprintf (stderr, " (FreeBSD/armv6 ELF)"); 128239272Sgonzo#else 129239272Sgonzo#undef SUBTARGET_CPU_DEFAULT 130245413Sandrew#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9 131239272Sgonzo#undef TARGET_VERSION 132239272Sgonzo#define TARGET_VERSION fprintf (stderr, " (FreeBSD/StrongARM ELF)"); 133239272Sgonzo#endif 13490075Sobrien 135169711Skan/* FreeBSD does its profiling differently to the Acorn compiler. We 136169711Skan don't need a word following the mcount call; and to skip it 137169711Skan requires either an assembly stub or use of fomit-frame-pointer when 138169711Skan compiling the profiling functions. Since we break Acorn CC 139169711Skan compatibility below a little more won't hurt. */ 140169711Skan 141169711Skan#undef ARM_FUNCTION_PROFILER 142169711Skan#define ARM_FUNCTION_PROFILER(STREAM,LABELNO) \ 143169711Skan{ \ 144169711Skan asm_fprintf (STREAM, "\tmov\t%Rip, %Rlr\n"); \ 145169711Skan asm_fprintf (STREAM, "\tbl\t__mcount%s\n", \ 146169711Skan (TARGET_ARM && NEED_PLT_RELOC) \ 147169711Skan ? "(PLT)" : ""); \ 148169711Skan} 149169711Skan 150169711Skan/* Clear the instruction cache from `BEG' to `END'. This makes a 151169711Skan call to the ARM_SYNC_ICACHE architecture specific syscall. */ 152169711Skan#define CLEAR_INSN_CACHE(BEG, END) \ 153169711Skando \ 154169711Skan { \ 155169711Skan extern int sysarch(int number, void *args); \ 156169711Skan struct \ 157169711Skan { \ 158169711Skan unsigned int addr; \ 159169711Skan int len; \ 160169711Skan } s; \ 161169711Skan s.addr = (unsigned int)(BEG); \ 162169711Skan s.len = (END) - (BEG); \ 163169711Skan (void) sysarch (0, &s); \ 164169711Skan } \ 165169711Skanwhile (0) 166169819Scognet 167