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-2018 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. */ 39 #undef LONG_DOUBLE_TYPE_SIZE 40 #define LONG_DOUBLE_TYPE_SIZE (TARGET_68020 ? 80 : 64) 41 42 #undef SUBTARGET_EXTRA_SPECS 43 #define SUBTARGET_EXTRA_SPECS \ 44 { "netbsd_entry_point", NETBSD_ENTRY_POINT }, 45 46 47 /* Provide a CPP_SPEC appropriate for NetBSD m68k targets. Currently we 48 deal with the GCC option '-posix', as well as an indication as to 49 whether or not use of the FPU is allowed. */ 50 51 #undef CPP_SPEC 52 #define CPP_SPEC NETBSD_CPP_SPEC 53 54 55 /* Provide an ASM_SPEC appropriate for NetBSD m68k ELF targets. We need 56 to pass PIC code generation options. */ 57 58 #undef ASM_SPEC 59 #define ASM_SPEC \ 60 "%(asm_cpu_spec) %{" FPIE1_OR_FPIC1_SPEC ":-k} %{" FPIE2_OR_FPIC2_SPEC ":-k -K}" 61 62 /* Provide a LINK_SPEC appropriate for a NetBSD/m68k ELF target. */ 63 64 #undef LINK_SPEC 65 #define LINK_SPEC NETBSD_LINK_SPEC_ELF 66 67 #define NETBSD_ENTRY_POINT "_start" 68 69 /* Output assembler code to FILE to increment profiler label # LABELNO 70 for profiling a function only. */ 71 72 #undef FUNCTION_PROFILER 73 #define FUNCTION_PROFILER(FILE, LABELNO) \ 74 do \ 75 { \ 76 asm_fprintf (FILE, "\tlea (%LLP%d,%Rpc),%Ra1\n", (LABELNO)); \ 77 if (flag_pic) \ 78 fprintf (FILE, "\tbsr.l __mcount@PLTPC\n"); \ 79 else \ 80 fprintf (FILE, "\tjbsr __mcount\n"); \ 81 } \ 82 while (0) 83 84 85 /* Make gcc agree with <machine/ansi.h> */ 86 87 #undef SIZE_TYPE 88 #define SIZE_TYPE "unsigned int" 89 90 #undef PTRDIFF_TYPE 91 #define PTRDIFF_TYPE "int" 92 93 94 /* XXX 95 Here is a bunch of stuff lifted from m68kelf.h. We don't use that 96 file directly, because it has a lot of baggage we don't want. */ 97 98 99 /* The prefix for register names. Note that REGISTER_NAMES 100 is supposed to include this prefix. Also note that this is NOT an 101 fprintf format string, it is a literal string. */ 102 103 #undef REGISTER_PREFIX 104 #define REGISTER_PREFIX "%" 105 106 107 /* The prefix for local (compiler generated) lables. 108 These labels will not appear in the symbol table. */ 109 110 #undef LOCAL_LABEL_PREFIX 111 #define LOCAL_LABEL_PREFIX "." 112 113 114 /* The prefix to add to user-visible assembler symbols. */ 115 116 #undef USER_LABEL_PREFIX 117 #define USER_LABEL_PREFIX "" 118 119 120 #undef ASM_COMMENT_START 121 #define ASM_COMMENT_START "|" 122 123 124 /* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to 125 keep switch tables in the text section. */ 126 127 #undef JUMP_TABLES_IN_TEXT_SECTION 128 #define JUMP_TABLES_IN_TEXT_SECTION 1 129 130 131 /* Use the default action for outputting the case label. */ 132 #undef ASM_OUTPUT_CASE_LABEL 133 #define ASM_RETURN_CASE_JUMP \ 134 do { \ 135 if (TARGET_COLDFIRE) \ 136 { \ 137 if (ADDRESS_REG_P (operands[0])) \ 138 return "jmp %%pc@(2,%0:l)"; \ 139 else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \ 140 return "jmp %%pc@(2,%0:l)"; \ 141 else \ 142 return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \ 143 } \ 144 else if (TARGET_LONG_JUMP_TABLE_OFFSETS) \ 145 return "jmp %%pc@(2,%0:l)"; \ 146 else \ 147 return "jmp %%pc@(2,%0:w)"; \ 148 } while (0) 149 150 151 /* This is how to output an assembler line that says to advance the 152 location counter to a multiple of 2**LOG bytes. */ 153 154 #undef ASM_OUTPUT_ALIGN 155 #define ASM_OUTPUT_ALIGN(FILE,LOG) \ 156 do \ 157 { \ 158 if ((LOG) > 0) \ 159 fprintf ((FILE), "%s%u\n", ALIGN_ASM_OP, 1 << (LOG)); \ 160 } \ 161 while (0) 162 163 164 /* If defined, a C expression whose value is a string containing the 165 assembler operation to identify the following data as uninitialized global 166 data. */ 167 168 #define BSS_SECTION_ASM_OP ".section\t.bss" 169 170 171 #undef ASM_OUTPUT_ALIGNED_BSS 172 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ 173 asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) 174 175 176 #undef ASM_OUTPUT_COMMON 177 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \ 178 ( fputs (".comm ", (FILE)), \ 179 assemble_name ((FILE), (NAME)), \ 180 fprintf ((FILE), ",%u\n", (int)(SIZE))) 181 182 #undef ASM_OUTPUT_LOCAL 183 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ 184 ( fputs (".lcomm ", (FILE)), \ 185 assemble_name ((FILE), (NAME)), \ 186 fprintf ((FILE), ",%u\n", (int)(SIZE))) 187 188 189 /* XXX 190 This is the end of the chunk lifted from m68kelf.h */ 191 192 193 /* XXX 194 The following chunk is more or less lifted from m68kv4.h. 195 We'd like to just #include that file, but it has not yet 196 been converted to the new include style. 197 198 Should there be a m68kv4-abi.h ?? */ 199 200 201 /* Register in which address to store a structure value is passed to a 202 function. The default in m68k.h is a1. For m68k/SVR4 it is a0. */ 203 204 #undef M68K_STRUCT_VALUE_REGNUM 205 #define M68K_STRUCT_VALUE_REGNUM A0_REG 206 207 208 /* Register in which static-chain is passed to a function. The 209 default isn m68k.h is a0, but that is already the struct value 210 regnum. Make it a1 instead. */ 211 212 #undef STATIC_CHAIN_REGNUM 213 #define STATIC_CHAIN_REGNUM A1_REG 214 #undef M68K_STATIC_CHAIN_REG_NAME 215 #define M68K_STATIC_CHAIN_REG_NAME REGISTER_PREFIX "a1" 216 217 218 /* Now to renumber registers for dbx and gdb. 219 We use the Sun-3 convention, which is: 220 floating point registers have numbers 18 to 25, not 221 16 to 23 as they do in the compiler. */ 222 223 #undef DBX_REGISTER_NUMBER 224 #define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 16 ? (REGNO) : (REGNO) + 2) 225 226 227 /* 1 if N is a possible register number for a function value. For 228 m68k/SVR4 allow d0, a0, or fp0 as return registers, for integral, 229 pointer, or floating types, respectively. Reject fp0 if not using 230 a 68881 coprocessor. */ 231 232 #undef FUNCTION_VALUE_REGNO_P 233 #define FUNCTION_VALUE_REGNO_P(N) \ 234 ((N) == D0_REG || (N) == A0_REG || (TARGET_68881 && (N) == FP0_REG)) 235 236 237 /* Define this to be true when FUNCTION_VALUE_REGNO_P is true for 238 more than one register. */ 239 240 #undef NEEDS_UNTYPED_CALL 241 #define NEEDS_UNTYPED_CALL 1 242 243 244 /* Define how to generate (in the callee) the output value of a 245 function and how to find (in the caller) the value returned by a 246 function. VALTYPE is the data type of the value (as a tree). If 247 the precise function being called is known, FUNC is its 248 FUNCTION_DECL; otherwise, FUNC is 0. For m68k/SVR4 generate the 249 result in d0, a0, or fp0 as appropriate. */ 250 251 #undef FUNCTION_VALUE 252 #define FUNCTION_VALUE(VALTYPE, FUNC) \ 253 m68k_function_value (VALTYPE, FUNC) 254 255 256 /* Define how to find the value returned by a library function 257 assuming the value has mode MODE. 258 For m68k/SVR4 look for integer values in d0, pointer values in d0 259 (returned in both d0 and a0), and floating values in fp0. */ 260 261 #undef LIBCALL_VALUE 262 #define LIBCALL_VALUE(MODE) \ 263 m68k_libcall_value (MODE) 264 265 266 /* Boundary (in *bits*) on which stack pointer should be aligned. 267 The m68k/SVR4 convention is to keep the stack pointer longword aligned. */ 268 269 #undef STACK_BOUNDARY 270 #define STACK_BOUNDARY 32 271 272 273 /* Alignment of field after `int : 0' in a structure. 274 For m68k/SVR4, this is the next longword boundary. */ 275 276 #undef EMPTY_FIELD_BOUNDARY 277 #define EMPTY_FIELD_BOUNDARY 32 278 279 280 /* No data type wants to be aligned rounder than this. 281 For m68k/SVR4, some types (doubles for example) are aligned on 8 byte 282 boundaries */ 283 284 #undef BIGGEST_ALIGNMENT 285 #define BIGGEST_ALIGNMENT 64 286 287 288 /* The svr4 ABI for the m68k says that records and unions are returned 289 in memory. */ 290 291 #undef DEFAULT_PCC_STRUCT_RETURN 292 #define DEFAULT_PCC_STRUCT_RETURN 1 293 294 /* XXX 295 This is the end of the chunk lifted from m68kv4.h */ 296