1/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format 2 Copyright (C) 1996 Free Software Foundation, Inc. 3 Contributed by Eric Youngdale. 4 Modified for stabs-in-ELF by H.J. Lu. 5 Adapted from GNU/Linux version by John Polstra. 6 Added support for generating "old a.out gas" on the fly by Peter Wemm. |
7 Continued development by David O'Brien <obrien@freebsd.org> |
8 9This file is part of GNU CC. 10 11GNU CC is free software; you can redistribute it and/or modify 12it under the terms of the GNU General Public License as published by 13the Free Software Foundation; either version 2, or (at your option) 14any later version. 15 16GNU CC is distributed in the hope that it will be useful, 17but WITHOUT ANY WARRANTY; without even the implied warranty of 18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19GNU General Public License for more details. 20 21You should have received a copy of the GNU General Public License 22along with GNU CC; see the file COPYING. If not, write to 23the Free Software Foundation, 59 Temple Place - Suite 330, 24Boston, MA 02111-1307, USA. */ 25 |
26/* $FreeBSD: head/contrib/gcc/config/i386/freebsd.h 52112 1999-10-10 22:33:40Z obrien $ */ |
27 28 29#undef TARGET_VERSION 30#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); 31 32#define MASK_PROFILER_EPILOGUE 010000000000 33#define MASK_AOUT 004000000000 /* a.out not elf */ 34#define MASK_UNDERSCORES 002000000000 /* use leading _ */ 35 36#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE) 37#define TARGET_AOUT (target_flags & MASK_AOUT) 38#define TARGET_ELF ((target_flags & MASK_AOUT) == 0) 39#define TARGET_UNDERSCORES ((target_flags & MASK_UNDERSCORES) != 0) 40 41#undef SUBTARGET_SWITCHES |
42#define SUBTARGET_SWITCHES \ 43 { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \ 44 { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE}, \ 45 { "aout", MASK_AOUT}, \ 46 { "no-aout", -MASK_AOUT}, \ 47 { "underscores", MASK_UNDERSCORES}, \ |
48 { "no-underscores", -MASK_UNDERSCORES}, 49 50/* Prefix for internally generated assembler labels. If we aren't using 51 underscores, we are using prefix `.'s to identify labels that should 52 be ignored, as in `i386/gas.h' --karl@cs.umb.edu */ 53#undef LPREFIX 54#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L") 55 56/* Override the default comment-starter of "/". */ 57#undef ASM_COMMENT_START 58#define ASM_COMMENT_START "#" 59 60#undef ASM_APP_ON 61#define ASM_APP_ON "#APP\n" 62 63#undef ASM_APP_OFF 64#define ASM_APP_OFF "#NO_APP\n" 65 |
66#undef SET_ASM_OP |
67#define SET_ASM_OP ".set" 68 69/* Output at beginning of assembler file. */ 70/* The .file command should always begin the output. */ 71 72#undef ASM_FILE_START 73#define ASM_FILE_START(FILE) \ 74 do { \ |
75 output_file_directive ((FILE), main_input_filename); \ |
76 if (TARGET_ELF) \ |
77 fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ |
78 } while (0) 79 80/* Identify the front-end which produced this file. To keep symbol 81 space down, and not confuse kdb, only do this if the language is 82 not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */ 83#undef ASM_IDENTIFY_LANGUAGE 84#define ASM_IDENTIFY_LANGUAGE(STREAM) \ 85{ \ --- 9 unchanged lines hidden (view full) --- 95#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ 96 sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \ 97 (PREFIX), (NUMBER)) 98 99/* This is how to output an internal numbered label where 100 PREFIX is the class of label and NUM is the number within the class. */ 101#undef ASM_OUTPUT_INTERNAL_LABEL 102#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ |
103 fprintf ((FILE), "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \ 104 (PREFIX), (NUM)) |
105 106/* This is how to output a reference to a user-level label named NAME. */ 107#undef ASM_OUTPUT_LABELREF |
108#define ASM_OUTPUT_LABELREF(FILE, NAME) \ 109 fprintf ((FILE), "%s%s", (TARGET_UNDERSCORES) ? "_" : "", (NAME)) |
110 111 112/* This is how to output an element of a case-vector that is relative. 113 This is only used for PIC code. See comments by the `casesi' insn in 114 i386.md for an explanation of the expression this outputs. */ 115#undef ASM_OUTPUT_ADDR_DIFF_ELT 116#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ |
117 fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE)) |
118 119#undef ASM_OUTPUT_ALIGN |
120#define ASM_OUTPUT_ALIGN(FILE, LOG) \ |
121 if ((LOG)!=0) { \ 122 if (in_text_section()) \ 123 fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG)); \ 124 else \ 125 fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ 126 } 127 128/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */ 129#undef USE_CONST_SECTION 130#define USE_CONST_SECTION TARGET_ELF 131 132/* The a.out tools do not support "linkonce" sections. */ |
133#undef SUPPORTS_ONE_ONLY |
134#define SUPPORTS_ONE_ONLY TARGET_ELF 135 136/* The a.out tools do not support "Lscope" .stabs symbols. */ |
137#undef NO_DBX_FUNCTION_END |
138#define NO_DBX_FUNCTION_END TARGET_AOUT 139 140/* A C statement (sans semicolon) to output an element in the table of 141 global constructors. */ 142#undef ASM_OUTPUT_CONSTRUCTOR |
143#define ASM_OUTPUT_CONSTRUCTOR(FILE, NAME) \ |
144 do { \ 145 if (TARGET_ELF) { \ 146 ctors_section (); \ |
147 fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ 148 assemble_name ((FILE), (NAME)); \ 149 fprintf ((FILE), "\n"); \ |
150 } else { \ 151 fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 152 (TARGET_UNDERSCORES) ? "_" : ""); \ 153 assemble_name (asm_out_file, name); \ 154 fputc ('\n', asm_out_file); \ 155 } \ 156 } while (0) 157 158/* A C statement (sans semicolon) to output an element in the table of 159 global destructors. */ 160#undef ASM_OUTPUT_DESTRUCTOR |
161#define ASM_OUTPUT_DESTRUCTOR(FILE, NAME) \ |
162 do { \ 163 if (TARGET_ELF) { \ 164 dtors_section (); \ |
165 fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ 166 assemble_name ((FILE), (NAME)); \ 167 fprintf ((FILE), "\n"); \ |
168 } else { \ 169 fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 170 (TARGET_UNDERSCORES) ? "_" : ""); \ 171 assemble_name (asm_out_file, name); \ 172 fputc ('\n', asm_out_file); \ 173 } \ 174 } while (0) 175 --- 4 unchanged lines hidden (view full) --- 180 181#undef ASM_OUTPUT_ALIGNED_LOCAL 182#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 183do { \ 184 if (TARGET_ELF) { \ 185 fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ 186 assemble_name ((FILE), (NAME)); \ 187 fprintf ((FILE), "\n"); \ |
188 ASM_OUTPUT_ALIGNED_COMMON ((FILE), (NAME), (SIZE), (ALIGN)); \ |
189 } else { \ 190 int rounded = (SIZE); \ 191 if (rounded == 0) rounded = 1; \ 192 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 193 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 194 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 195 fputs (".lcomm ", (FILE)); \ 196 assemble_name ((FILE), (NAME)); \ --- 21 unchanged lines hidden (view full) --- 218} while (0) 219 220/* Turn off svr4.h version, it chokes the old gas. The old layout 221 works fine under new gas anyway. */ 222#undef ASM_OUTPUT_ASCII 223 224/* How to output some space */ 225#undef ASM_OUTPUT_SKIP |
226#define ASM_OUTPUT_SKIP(FILE, SIZE) \ |
227do { \ 228 if (TARGET_ELF) { \ |
229 fprintf ((FILE), "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \ |
230 } else { \ |
231 fprintf ((FILE), "\t.space %u\n", (SIZE)); \ |
232 } \ 233} while (0) 234 235#undef ASM_OUTPUT_SOURCE_LINE |
236#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \ |
237do { \ 238 static int sym_lineno = 1; \ 239 if (TARGET_ELF) { \ |
240 fprintf ((FILE), ".stabn 68,0,%d,.LM%d-", (LINE), sym_lineno); \ 241 assemble_name ((FILE), XSTR (XEXP (DECL_RTL (current_function_decl),\ 242 0), 0)); \ 243 fprintf ((FILE), "\n.LM%d:\n", sym_lineno); \ |
244 sym_lineno += 1; \ 245 } else { \ |
246 fprintf ((FILE), "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \ |
247 } \ 248} while (0) 249 250/* in elf, the function stabs come first, before the relative offsets */ 251#undef DBX_FUNCTION_FIRST 252#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF 253 254/* tag end of file in elf mode */ 255#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END 256#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ 257do { \ 258 if (TARGET_ELF) { \ |
259 fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \ 260 N_SO); \ |
261 } \ 262} while (0) 263 264/* stabs-in-elf has offsets relative to function beginning */ 265#undef DBX_OUTPUT_LBRAC |
266#define DBX_OUTPUT_LBRAC(FILE, NAME) \ |
267do { \ 268 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \ 269 assemble_name (asmfile, buf); \ 270 if (TARGET_ELF) { \ 271 fputc ('-', asmfile); \ |
272 assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\ 273 0), 0)); \ |
274 } \ 275 fprintf (asmfile, "\n"); \ 276} while (0) 277 278#undef DBX_OUTPUT_RBRAC |
279#define DBX_OUTPUT_RBRAC(FILE, NAME) \ |
280do { \ 281 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \ 282 assemble_name (asmfile, buf); \ 283 if (TARGET_ELF) { \ 284 fputc ('-', asmfile); \ |
285 assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\ 286 0), 0)); \ |
287 } \ 288 fprintf (asmfile, "\n"); \ 289} while (0) 290 291 292/* Define macro used to output shift-double opcodes when the shift 293 count is in %cl. Some assemblers require %cl as an argument; 294 some don't. 295 296 *OLD* GAS requires the %cl argument, so override i386/unix.h. */ 297 298#undef AS3_SHIFT_DOUBLE 299#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d) 300 301/* Indicate that jump tables go in the text section. This is 302 necessary when compiling PIC code. */ |
303#undef JUMP_TABLES_IN_TEXT_SECTION |
304#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) 305 306/* override the exception table positioning */ |
307#undef EXCEPTION_SECTION |
308#define EXCEPTION_SECTION() \ 309do { \ 310 if (TARGET_ELF) { \ 311 named_section (NULL_TREE, ".gcc_except_table", 0); \ 312 } else { \ 313 if (flag_pic) \ 314 data_section (); \ 315 else \ 316 readonly_data_section (); \ 317 } \ 318} while (0); 319 320/* supply our own hook for calling __main() from main() */ |
321#undef GEN_CALL__MAIN |
322#define GEN_CALL__MAIN \ 323 do { \ 324 if (!(TARGET_ELF)) \ 325 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ 326 VOIDmode, 0); \ 327 } while (0) 328 329/* Copy this from the svr4 specifications... */ --- 60 unchanged lines hidden (view full) --- 390 : (n) == 4 ? 6 \ 391 : (n) == 5 ? 7 \ 392 : (n) == 6 ? 5 \ 393 : (n) == 7 ? 4 \ 394 : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ 395 : (-1)) 396 397/* Now what stabs expects in the register. */ |
398#undef STABS_DBX_REGISTER_NUMBER |
399#define STABS_DBX_REGISTER_NUMBER(n) \ 400((n) == 0 ? 0 : \ 401 (n) == 1 ? 2 : \ 402 (n) == 2 ? 1 : \ 403 (n) == 3 ? 3 : \ 404 (n) == 4 ? 6 : \ 405 (n) == 5 ? 7 : \ 406 (n) == 6 ? 4 : \ --- 12 unchanged lines hidden (view full) --- 419 for profiling a function entry. */ 420/* Redefine this to not pass an unused label in %edx. */ 421 422#undef FUNCTION_PROFILER 423#define FUNCTION_PROFILER(FILE, LABELNO) \ 424{ \ 425 if (flag_pic) \ 426 { \ |
427 fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", \ |
428 TARGET_AOUT ? "mcount" : ".mcount"); \ 429 } \ 430 else \ 431 { \ |
432 fprintf ((FILE), "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \ |
433 } \ 434} 435 |
436#undef FUNCTION_PROFILER_EPILOGUE |
437#define FUNCTION_PROFILER_EPILOGUE(FILE) \ 438{ \ 439 if (TARGET_PROFILER_EPILOGUE) \ 440 { \ 441 if (flag_pic) \ |
442 fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", \ |
443 TARGET_AOUT ? "mexitcount" : ".mexitcount"); \ 444 else \ |
445 fprintf ((FILE), "\tcall %s\n", \ |
446 TARGET_AOUT ? "mexitcount" : ".mexitcount"); \ 447 } \ 448} 449 450#undef SIZE_TYPE 451#define SIZE_TYPE "unsigned int" 452 453#undef PTRDIFF_TYPE 454#define PTRDIFF_TYPE "int" |
455 |
456#undef WCHAR_TYPE 457#define WCHAR_TYPE "int" 458 |
459#undef WCHAR_UNSIGNED |
460#define WCHAR_UNSIGNED 0 461 462#undef WCHAR_TYPE_SIZE 463#define WCHAR_TYPE_SIZE BITS_PER_WORD |
464 |
465#undef CPP_PREDEFINES 466#define CPP_PREDEFINES "-Di386 -Acpu(i386) -Amachine(i386)" CPP_FBSD_PREDEFINES 467 468#undef CPP_SPEC 469#if TARGET_CPU_DEFAULT == 2 470#define CPP_SPEC "\ 471%{!maout: -D__ELF__} \ 472%{munderscores: -D__UNDERSCORES__} \ --- 51 unchanged lines hidden (view full) --- 524/* A C statement to output to the stdio stream FILE an assembler 525 command to advance the location counter to a multiple of 1<<LOG 526 bytes if it is within MAX_SKIP bytes. 527 528 This is used to align code labels according to Intel recommendations. */ 529 530#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN 531#error "we don't have this for the aout gas" |
532#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \ 533 if ((LOG)!=0) \ 534 if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ |
535 else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) 536#endif 537 538#undef STARTFILE_SPEC 539#define STARTFILE_SPEC "\ 540 %{maout: %{shared:c++rt0.o%s} \ 541 %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \ 542 %{!maout: %{!shared: \ --- 16 unchanged lines hidden --- |