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