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 75245539Sandrew#undef ARM_DEFAULT_ABI 76245539Sandrew#define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX 77245539Sandrew 78245539Sandrew#undef TARGET_OS_CPP_BUILTINS 79245539Sandrew#define TARGET_OS_CPP_BUILTINS() \ 80245539Sandrew do \ 81245539Sandrew { \ 82245539Sandrew FBSD_TARGET_OS_CPP_BUILTINS(); \ 83245539Sandrew TARGET_BPABI_CPP_BUILTINS(); \ 84245539Sandrew } \ 85245539Sandrew while (false) 86245539Sandrew#else 87169711Skan/* Default it to use ATPCS with soft-VFP. */ 88246317Sandrew#undef TARGET_DEFAULT 89169711Skan#define TARGET_DEFAULT \ 90169711Skan (MASK_APCS_FRAME \ 91169711Skan | TARGET_ENDIAN_DEFAULT) 92169711Skan 93169711Skan#undef ARM_DEFAULT_ABI 94169711Skan#define ARM_DEFAULT_ABI ARM_ABI_ATPCS 95169711Skan 96245539Sandrew#undef FPUTYPE_DEFAULT 97245539Sandrew#define FPUTYPE_DEFAULT FPUTYPE_VFP 98245539Sandrew#endif 99245539Sandrew 100169711Skan/* Define the actual types of some ANSI-mandated types. 10190075Sobrien Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c, 10290075Sobrien c-common.c, and config/<arch>/<arch>.h. */ 10390075Sobrien 10490075Sobrien/* arm.h gets this wrong for FreeBSD. We use the GCC defaults instead. */ 10590075Sobrien 10690075Sobrien#undef SIZE_TYPE 10790075Sobrien#define SIZE_TYPE "unsigned int" 10890075Sobrien 10990075Sobrien#undef PTRDIFF_TYPE 11090075Sobrien#define PTRDIFF_TYPE "int" 11190075Sobrien 11290075Sobrien/* We use the GCC defaults here. */ 11390075Sobrien#undef WCHAR_TYPE 11490075Sobrien 115239272Sgonzo#if defined(FREEBSD_ARCH_armv6) 11690075Sobrien#undef SUBTARGET_CPU_DEFAULT 117239272Sgonzo#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm1176jzs 118239272Sgonzo#undef FBSD_TARGET_CPU_CPP_BUILTINS 119239272Sgonzo#define FBSD_TARGET_CPU_CPP_BUILTINS() \ 120239272Sgonzo do { \ 121239272Sgonzo builtin_define ("__FreeBSD_ARCH_armv6__"); \ 122239272Sgonzo } while (0) 123239272Sgonzo#undef TARGET_VERSION 124239272Sgonzo#define TARGET_VERSION fprintf (stderr, " (FreeBSD/armv6 ELF)"); 125239272Sgonzo#else 126239272Sgonzo#undef SUBTARGET_CPU_DEFAULT 127245413Sandrew#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9 128239272Sgonzo#undef TARGET_VERSION 129239272Sgonzo#define TARGET_VERSION fprintf (stderr, " (FreeBSD/StrongARM ELF)"); 130239272Sgonzo#endif 13190075Sobrien 132169711Skan/* FreeBSD does its profiling differently to the Acorn compiler. We 133169711Skan don't need a word following the mcount call; and to skip it 134169711Skan requires either an assembly stub or use of fomit-frame-pointer when 135169711Skan compiling the profiling functions. Since we break Acorn CC 136169711Skan compatibility below a little more won't hurt. */ 137169711Skan 138169711Skan#undef ARM_FUNCTION_PROFILER 139169711Skan#define ARM_FUNCTION_PROFILER(STREAM,LABELNO) \ 140169711Skan{ \ 141169711Skan asm_fprintf (STREAM, "\tmov\t%Rip, %Rlr\n"); \ 142169711Skan asm_fprintf (STREAM, "\tbl\t__mcount%s\n", \ 143169711Skan (TARGET_ARM && NEED_PLT_RELOC) \ 144169711Skan ? "(PLT)" : ""); \ 145169711Skan} 146169711Skan 147169711Skan/* Clear the instruction cache from `BEG' to `END'. This makes a 148169711Skan call to the ARM_SYNC_ICACHE architecture specific syscall. */ 149169711Skan#define CLEAR_INSN_CACHE(BEG, END) \ 150169711Skando \ 151169711Skan { \ 152169711Skan extern int sysarch(int number, void *args); \ 153169711Skan struct \ 154169711Skan { \ 155169711Skan unsigned int addr; \ 156169711Skan int len; \ 157169711Skan } s; \ 158169711Skan s.addr = (unsigned int)(BEG); \ 159169711Skan s.len = (END) - (BEG); \ 160169711Skan (void) sysarch (0, &s); \ 161169711Skan } \ 162169711Skanwhile (0) 163169819Scognet 164