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