xref: /NextBSD/contrib/gcc/config/arm/freebsd.h (revision 95f7c2f56c7268d6ed9c2a56d357aeeac260363b)
1 /* Definitions for StrongARM running FreeBSD using the ELF format
2    Copyright (C) 2001, 2004 Free Software Foundation, Inc.
3    Contributed by David E. O'Brien <obrien@FreeBSD.org> and BSDi.
4 
5    This file is part of GCC.
6 
7    GCC is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published
9    by the Free Software Foundation; either version 2, or (at your
10    option) any later version.
11 
12    GCC is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with GCC; see the file COPYING.  If not, write to
19    the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20    Boston, MA 02110-1301, USA.  */
21 
22 #undef  SUBTARGET_CPP_SPEC
23 #define SUBTARGET_CPP_SPEC FBSD_CPP_SPEC
24 
25 #undef  SUBTARGET_EXTRA_SPECS
26 #define SUBTARGET_EXTRA_SPECS \
27   { "subtarget_extra_asm_spec",	SUBTARGET_EXTRA_ASM_SPEC }, \
28   { "subtarget_asm_float_spec", SUBTARGET_ASM_FLOAT_SPEC }, \
29   { "fbsd_dynamic_linker", FBSD_DYNAMIC_LINKER }
30 
31 #undef SUBTARGET_EXTRA_ASM_SPEC
32 #ifdef TARGET_ARM_EABI
33 #define SUBTARGET_EXTRA_ASM_SPEC	\
34   "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=4} %{fpic|fpie:-k} %{fPIC|fPIE:-k}"
35 #else
36 #define SUBTARGET_EXTRA_ASM_SPEC	\
37   "-matpcs %{fpic|fpie:-k} %{fPIC|fPIE:-k}"
38 #endif
39 
40 /* Default to full FPA if -mhard-float is specified. */
41 #undef SUBTARGET_ASM_FLOAT_SPEC
42 #define SUBTARGET_ASM_FLOAT_SPEC		\
43   "%{mhard-float:-mfpu=fpa}			\
44    %{mfloat-abi=hard:{!mfpu=*:-mfpu=fpa}}	\
45    %{!mhard-float: %{msoft-float:-mfpu=softvfp;:-mfpu=softvfp}}"
46 
47 #undef	LINK_SPEC
48 #define LINK_SPEC "							\
49   %{p:%nconsider using `-pg' instead of `-p' with gprof(1) }		\
50   %{v:-V}								\
51   %{assert*} %{R*} %{rpath*} %{defsym*}					\
52   %{shared:-Bshareable %{h*} %{soname*}}				\
53   %{!shared:								\
54     %{!static:								\
55       %{rdynamic:-export-dynamic}					\
56       %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }}	\
57     %{static:-Bstatic}}							\
58   %{!static:--hash-style=both --enable-new-dtags}			\
59   %{symbolic:-Bsymbolic}						\
60   -X %{mbig-endian:-EB} %{mlittle-endian:-EL}"
61 
62 /************************[  Target stuff  ]***********************************/
63 
64 
65 #ifndef TARGET_ENDIAN_DEFAULT
66 #define TARGET_ENDIAN_DEFAULT 0
67 #endif
68 
69 #ifdef TARGET_ARM_EABI
70 /* We default to a soft-float ABI so that binaries can run on all
71    target hardware.  */
72 #undef TARGET_DEFAULT_FLOAT_ABI
73 #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
74 
75 #undef TARGET_DEFAULT
76 #define TARGET_DEFAULT (MASK_INTERWORK | TARGET_ENDIAN_DEFAULT)
77 
78 #undef ARM_DEFAULT_ABI
79 #define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
80 
81 #undef  TARGET_OS_CPP_BUILTINS
82 #define TARGET_OS_CPP_BUILTINS() 		\
83   do						\
84     {						\
85       FBSD_TARGET_OS_CPP_BUILTINS();		\
86       TARGET_BPABI_CPP_BUILTINS();		\
87     }						\
88   while (false)
89 #else
90 /* Default it to use ATPCS with soft-VFP.  */
91 #undef TARGET_DEFAULT
92 #define TARGET_DEFAULT			\
93   (MASK_APCS_FRAME			\
94    | TARGET_ENDIAN_DEFAULT)
95 
96 #undef ARM_DEFAULT_ABI
97 #define ARM_DEFAULT_ABI ARM_ABI_ATPCS
98 
99 #undef FPUTYPE_DEFAULT
100 #define FPUTYPE_DEFAULT FPUTYPE_VFP
101 #endif
102 
103 /* Define the actual types of some ANSI-mandated types.
104    Needs to agree with <machine/ansi.h>.  GCC defaults come from c-decl.c,
105    c-common.c, and config/<arch>/<arch>.h.  */
106 
107 /* arm.h gets this wrong for FreeBSD.  We use the GCC defaults instead.  */
108 
109 #undef  SIZE_TYPE
110 #define SIZE_TYPE	"unsigned int"
111 
112 #undef  PTRDIFF_TYPE
113 #define PTRDIFF_TYPE	"int"
114 
115 /* We use the GCC defaults here.  */
116 #undef WCHAR_TYPE
117 
118 #if defined(FREEBSD_ARCH_armv6)
119 #undef  SUBTARGET_CPU_DEFAULT
120 #define SUBTARGET_CPU_DEFAULT	TARGET_CPU_arm1176jzs
121 #undef FBSD_TARGET_CPU_CPP_BUILTINS
122 #define FBSD_TARGET_CPU_CPP_BUILTINS()		\
123   do {						\
124     builtin_define ("__FreeBSD_ARCH_armv6__");	\
125   } while (0)
126 #undef  TARGET_VERSION
127 #define TARGET_VERSION fprintf (stderr, " (FreeBSD/armv6 ELF)");
128 #else
129 #undef  SUBTARGET_CPU_DEFAULT
130 #define SUBTARGET_CPU_DEFAULT	TARGET_CPU_arm9
131 #undef  TARGET_VERSION
132 #define TARGET_VERSION fprintf (stderr, " (FreeBSD/StrongARM ELF)");
133 #endif
134 
135 /* FreeBSD does its profiling differently to the Acorn compiler. We
136    don't need a word following the mcount call; and to skip it
137    requires either an assembly stub or use of fomit-frame-pointer when
138    compiling the profiling functions.  Since we break Acorn CC
139    compatibility below a little more won't hurt.  */
140 
141 #undef ARM_FUNCTION_PROFILER
142 #define ARM_FUNCTION_PROFILER(STREAM,LABELNO)		\
143 {							\
144   asm_fprintf (STREAM, "\tmov\t%Rip, %Rlr\n");		\
145   asm_fprintf (STREAM, "\tbl\t__mcount%s\n",		\
146 	       (TARGET_ARM && NEED_PLT_RELOC)		\
147 	       ? "(PLT)" : "");				\
148 }
149 
150 /* Clear the instruction cache from `BEG' to `END'.  This makes a
151    call to the ARM_SYNC_ICACHE architecture specific syscall.  */
152 #define CLEAR_INSN_CACHE(BEG, END)					\
153 do									\
154   {									\
155     extern int sysarch(int number, void *args);				\
156     struct								\
157       {									\
158 	unsigned int addr;						\
159 	int          len;						\
160       } s;								\
161     s.addr = (unsigned int)(BEG);					\
162     s.len = (END) - (BEG);						\
163     (void) sysarch (0, &s);						\
164   }									\
165 while (0)
166 
167