xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/m68k/netbsd-elf.h (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* Definitions of target machine for GNU compiler,
2    for m68k (including m68010) NetBSD platforms using the
3    ELF object format.
4    Copyright (C) 2002-2015 Free Software Foundation, Inc.
5    Contributed by Wasabi Systems. Inc.
6 
7    This file is derived from <m68k/m68kv4.h>, <m68k/m68kelf.h>,
8    and <m68k/linux.h>.
9 
10 This file is part of GCC.
11 
12 GCC is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
15 any later version.
16 
17 GCC is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 GNU General Public License for more details.
21 
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3.  If not see
24 <http://www.gnu.org/licenses/>.  */
25 
26 #define TARGET_OS_CPP_BUILTINS()		\
27   do						\
28     {						\
29       NETBSD_OS_CPP_BUILTINS_ELF();		\
30       builtin_define ("__m68k__");		\
31       builtin_define ("__SVR4_ABI__");		\
32       builtin_define ("__motorola__");		\
33       if (TARGET_HARD_FLOAT)			\
34 	builtin_define ("__HAVE_FPU__");	\
35     }						\
36   while (0)
37 
38 /* Don't try using XFmode on the 68010 or coldfire.  */
39 #undef LONG_DOUBLE_TYPE_SIZE
40 #define LONG_DOUBLE_TYPE_SIZE (TARGET_68020 ? 80 : 64)
41 
42 #undef SUBTARGET_OVERRIDE_OPTIONS
43 #define SUBTARGET_OVERRIDE_OPTIONS \
44   { \
45     if (TARGET_COLDFIRE) \
46       { \
47 	target_flags |= MASK_STRICT_ALIGNMENT | MASK_CF_HWDIV; \
48 	if ((target_flags_explicit & MASK_HARD_FLOAT) == 0) \
49 	  { \
50 	    target_flags &= ~MASK_HARD_FLOAT; \
51 	    m68k_fpu = FPUTYPE_NONE; \
52 	  } \
53       } \
54   }
55 
56 
57 /* Provide a CPP_SPEC appropriate for NetBSD m68k targets.  Currently we
58    deal with the GCC option '-posix', as well as an indication as to
59    whether or not use of the FPU is allowed.  */
60 
61 #undef CPP_SPEC
62 #define CPP_SPEC \
63   "%(netbsd_cpp_spec)"
64 
65 
66 /* Provide an ASM_SPEC appropriate for NetBSD m68k ELF targets.  We need
67    to pass PIC code generation options.  */
68 
69 #undef ASM_SPEC
70 #define ASM_SPEC \
71   "%(asm_default_spec) \
72     %{m68010} %{m68020} %{m68030} %{m68040} %{m68060} \
73     %{m5200} %{m5206e} %{m528x} %{m5307} %{m5407} %{mcfv4e}\
74     %{mcpu=*:-mcpu=%*} %{march=*:-march=%*}\
75     %{fpic|fpie:-k} %{fPIC|fPIE:-k -K}"
76 
77 /* Provide a LINK_SPEC appropriate for a NetBSD/m68k ELF target.  */
78 
79 #undef LINK_SPEC
80 #define LINK_SPEC NETBSD_LINK_SPEC_ELF
81 
82 /* NetBSD/sun2 does not support shlibs, avoid using libgcc_pic.  */
83 #if TARGET_DEFAULT_CPU == 0
84 #undef REAL_LIBGCC_SPEC
85 #define REAL_LIBGCC_SPEC	"-lgcc"
86 #endif
87 
88 #define NETBSD_ENTRY_POINT "_start"
89 
90 /* Output assembler code to FILE to increment profiler label # LABELNO
91    for profiling a function only.  */
92 
93 #undef FUNCTION_PROFILER
94 #define FUNCTION_PROFILER(FILE, LABELNO)				\
95 do									\
96   {									\
97     if (TARGET_COLDFIRE)						\
98       {									\
99         asm_fprintf (FILE, "\tmovea.l #%LLP%d-.,%Ra1\n", (LABELNO));	\
100         asm_fprintf (FILE, "\tlea (-6,%Rpc,%Ra1),%Ra1\n");	\
101       }									\
102     else								\
103       asm_fprintf (FILE, "\tlea (%LLP%d,%Rpc),%Ra1\n", (LABELNO));	\
104     if (flag_pic)							\
105       fprintf (FILE, "\tbsr.l __mcount@PLTPC\n");			\
106     else								\
107       fprintf (FILE, "\tjbsr __mcount\n");				\
108   }									\
109 while (0)
110 
111 
112 /* Make gcc agree with <machine/ansi.h>  */
113 
114 #undef SIZE_TYPE
115 #define SIZE_TYPE "unsigned int"
116 
117 #undef PTRDIFF_TYPE
118 #define PTRDIFF_TYPE "int"
119 
120 
121 /* XXX
122    Here is a bunch of stuff lifted from m68kelf.h.  We don't use that
123    file directly, because it has a lot of baggage we don't want.  */
124 
125 
126 /* The prefix for register names.  Note that REGISTER_NAMES
127    is supposed to include this prefix.  Also note that this is NOT an
128    fprintf format string, it is a literal string.  */
129 
130 #undef REGISTER_PREFIX
131 #define REGISTER_PREFIX "%"
132 
133 
134 /* The prefix for local (compiler generated) lables.
135    These labels will not appear in the symbol table.  */
136 
137 #undef LOCAL_LABEL_PREFIX
138 #define LOCAL_LABEL_PREFIX "."
139 
140 
141 /* The prefix to add to user-visible assembler symbols.  */
142 
143 #undef USER_LABEL_PREFIX
144 #define USER_LABEL_PREFIX ""
145 
146 
147 #undef ASM_COMMENT_START
148 #define ASM_COMMENT_START "|"
149 
150 
151 /* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to
152    keep switch tables in the text section.  */
153 
154 #undef JUMP_TABLES_IN_TEXT_SECTION
155 #define JUMP_TABLES_IN_TEXT_SECTION 1
156 
157 
158 /* Use the default action for outputting the case label.  */
159 #undef ASM_OUTPUT_CASE_LABEL
160 #define ASM_RETURN_CASE_JUMP				\
161   do {							\
162     if (TARGET_COLDFIRE)				\
163       {							\
164 	if (ADDRESS_REG_P (operands[0]))		\
165 	  return "jmp %%pc@(2,%0:l)";			\
166 	else						\
167 	  return "ext%.l %0\n\tjmp %%pc@(2,%0:l)";	\
168       }							\
169     else						\
170       return "jmp %%pc@(2,%0:w)";			\
171   } while (0)
172 
173 
174 /* This is how to output an assembler line that says to advance the
175    location counter to a multiple of 2**LOG bytes.  */
176 
177 #undef ASM_OUTPUT_ALIGN
178 #define ASM_OUTPUT_ALIGN(FILE,LOG)					\
179 do									\
180   {									\
181     if ((LOG) > 0)							\
182       fprintf ((FILE), "%s%u\n", ALIGN_ASM_OP, 1 << (LOG));		\
183   }									\
184 while (0)
185 
186 
187 /* If defined, a C expression whose value is a string containing the
188    assembler operation to identify the following data as uninitialized global
189    data.  */
190 
191 #define BSS_SECTION_ASM_OP	".section\t.bss"
192 
193 
194 #undef ASM_OUTPUT_ALIGNED_BSS
195 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)		\
196   asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
197 
198 
199 #undef ASM_OUTPUT_COMMON
200 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)			\
201 ( fputs (".comm ", (FILE)),						\
202   assemble_name ((FILE), (NAME)),					\
203   fprintf ((FILE), ",%u\n", (int)(SIZE)))
204 
205 #undef ASM_OUTPUT_LOCAL
206 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)			\
207 ( fputs (".lcomm ", (FILE)),						\
208   assemble_name ((FILE), (NAME)),					\
209   fprintf ((FILE), ",%u\n", (int)(SIZE)))
210 
211 
212 /* XXX
213    This is the end of the chunk lifted from m68kelf.h  */
214 
215 
216 /* XXX
217    The following chunk is more or less lifted from m68kv4.h.
218    We'd like to just #include that file, but it has not yet
219    been converted to the new include style.
220 
221    Should there be a m68kv4-abi.h ??  */
222 
223 
224 /* Register in which address to store a structure value is passed to a
225    function.  The default in m68k.h is a1.  For m68k/SVR4 it is a0. */
226 
227 #undef M68K_STRUCT_VALUE_REGNUM
228 #define M68K_STRUCT_VALUE_REGNUM A0_REG
229 
230 
231 /* Register in which static-chain is passed to a function.  The
232    default isn m68k.h is a0, but that is already the struct value
233    regnum.  Make it a1 instead.  */
234 
235 #undef STATIC_CHAIN_REGNUM
236 #define STATIC_CHAIN_REGNUM A1_REG
237 #undef M68K_STATIC_CHAIN_REG_NAME
238 #define M68K_STATIC_CHAIN_REG_NAME REGISTER_PREFIX "a1"
239 
240 
241 /* Now to renumber registers for dbx and gdb.
242    We use the Sun-3 convention, which is:
243    floating point registers have numbers 18 to 25, not
244    16 to 23 as they do in the compiler.  */
245 
246 #undef DBX_REGISTER_NUMBER
247 #define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 16 ? (REGNO) : (REGNO) + 2)
248 
249 
250 /* 1 if N is a possible register number for a function value.  For
251    m68k/SVR4 allow d0, a0, or fp0 as return registers, for integral,
252    pointer, or floating types, respectively.  Reject fp0 if not using
253    a 68881 coprocessor.  */
254 
255 #undef FUNCTION_VALUE_REGNO_P
256 #define FUNCTION_VALUE_REGNO_P(N)					\
257   ((N) == D0_REG || (N) == A0_REG || (TARGET_68881 && (N) == FP0_REG))
258 
259 
260 /* Define this to be true when FUNCTION_VALUE_REGNO_P is true for
261    more than one register.  */
262 
263 #undef NEEDS_UNTYPED_CALL
264 #define NEEDS_UNTYPED_CALL 1
265 
266 
267 /* Define how to generate (in the callee) the output value of a
268    function and how to find (in the caller) the value returned by a
269    function.  VALTYPE is the data type of the value (as a tree).  If
270    the precise function being called is known, FUNC is its
271    FUNCTION_DECL; otherwise, FUNC is 0.  For m68k/SVR4 generate the
272    result in d0, a0, or fp0 as appropriate.  */
273 
274 #undef FUNCTION_VALUE
275 #define FUNCTION_VALUE(VALTYPE, FUNC)					\
276   m68k_function_value (VALTYPE, FUNC)
277 
278 
279 /* Define how to find the value returned by a library function
280    assuming the value has mode MODE.
281    For m68k/SVR4 look for integer values in d0, pointer values in d0
282    (returned in both d0 and a0), and floating values in fp0.  */
283 
284 #undef LIBCALL_VALUE
285 #define LIBCALL_VALUE(MODE)						\
286   m68k_libcall_value (MODE)
287 
288 
289 /* Boundary (in *bits*) on which stack pointer should be aligned.
290    The m68k/SVR4 convention is to keep the stack pointer longword aligned.  */
291 
292 #undef STACK_BOUNDARY
293 #define STACK_BOUNDARY 32
294 #undef PREFERRED_STACK_BOUNDARY
295 #define PREFERRED_STACK_BOUNDARY 32
296 
297 
298 /* Alignment of field after `int : 0' in a structure.
299    For m68k/SVR4, this is the next longword boundary.  */
300 
301 #undef EMPTY_FIELD_BOUNDARY
302 #define EMPTY_FIELD_BOUNDARY 32
303 
304 
305 /* No data type wants to be aligned rounder than this.
306    For m68k/SVR4, some types (doubles for example) are aligned on 8 byte
307    boundaries */
308 
309 #undef BIGGEST_ALIGNMENT
310 #define BIGGEST_ALIGNMENT 64
311 
312 
313 /* The svr4 ABI for the m68k says that records and unions are returned
314    in memory.  */
315 
316 #undef DEFAULT_PCC_STRUCT_RETURN
317 #define DEFAULT_PCC_STRUCT_RETURN 1
318 
319 /* XXX
320    This is the end of the chunk lifted from m68kv4.h  */
321