|
|
1.1 ! root 1: /* Definitions of target machine for GNU compiler. ! 2: Motorola m88100 running the AT&T/Unisoft/Motorola V.3 reference port. ! 3: Copyright (C) 1990, 1991 Free Software Foundation, Inc. ! 4: Contributed by Ray Essick ([email protected]) ! 5: Enhanced by Tom Wood ([email protected]) ! 6: ! 7: This file is part of GNU CC. ! 8: ! 9: GNU CC is free software; you can redistribute it and/or modify ! 10: it under the terms of the GNU General Public License as published by ! 11: the Free Software Foundation; either version 2, or (at your option) ! 12: any later version. ! 13: ! 14: GNU CC is distributed in the hope that it will be useful, ! 15: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 17: GNU General Public License for more details. ! 18: ! 19: You should have received a copy of the GNU General Public License ! 20: along with GNU CC; see the file COPYING. If not, write to ! 21: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 22: ! 23: #include "m88k/m88k.h" ! 24: ! 25: /* Default switches */ ! 26: #undef TARGET_DEFAULT ! 27: #define TARGET_DEFAULT (MASK_CHECK_ZERO_DIV | \ ! 28: MASK_OCS_DEBUG_INFO | \ ! 29: MASK_OCS_FRAME_POSITION) ! 30: ! 31: /* Macros to be automatically defined. */ ! 32: #undef CPP_PREDEFINES ! 33: #define CPP_PREDEFINES "-Dm88000 -Dm88k -Dunix -DsysV88 -D__CLASSIFY_TYPE__=2 -Asystem(unix) -Asystem(svr3) -Acpu(m88k) -Amachine(m88k)" ! 34: ! 35: /* Override svr3.h to link with ?crt0.o instead of ?crt1.o and ?crtn.o. ! 36: From [email protected]. */ ! 37: #undef STARTFILE_SPEC ! 38: #define STARTFILE_SPEC \ ! 39: "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}} crtbegin.o%s" ! 40: ! 41: /* Profiled libraries live in a different directory but keep the same ! 42: names other than that. [email protected] says -lg is always needed. */ ! 43: #undef LIB_SPEC ! 44: #define LIB_SPEC "%{p:-L/lib/libp}%{pg:%{!p:-L/lib/libp}} -lg -lc crtend.o%s" ! 45: ! 46: /* Hot version of the profiler that uses r10 to pass the address of ! 47: the counter. the _gcc_mcount routine knows not to screw with ! 48: the parameter registers. ! 49: ! 50: DG/UX does this; i wrote a gnu-c/88k specific version and put it ! 51: in libgcc2.c -- RBE; this macro knows about the leading underscore ! 52: convention. */ ! 53: #undef FUNCTION_PROFILER ! 54: #define FUNCTION_PROFILER(FILE, LABELNO) \ ! 55: output_function_profiler (FILE, LABELNO, "_gcc_mcount", 0) ! 56: ! 57: /* Various other changes that we want to have in place without ! 58: too many changes to the m88k.h file. */ ! 59: #undef USE_LIBG ! 60: #define USE_LIBG ! 61: ! 62: /* Define a few machine-specific details of the implementation of ! 63: constructors. */ ! 64: ! 65: /* Although the .init section is used, it is not automatically invoked. */ ! 66: #define INVOKE__main ! 67: ! 68: /* State that atexit exists so __do_global_ctors will register ! 69: __do_global_dtors. */ ! 70: #define HAVE_ATEXIT ! 71: ! 72: #define CTOR_LIST_BEGIN \ ! 73: asm (INIT_SECTION_ASM_OP); \ ! 74: asm ("\tsubu\t r31,r31,16"); /* (STACK_BOUNDARY / BITS_PER_UNIT) == 16 */ \ ! 75: asm ("\tst\t r0,r31,32"); /* REG_PARM_STACK_SPACE (0) == 32 */ ! 76: #define CTOR_LIST_END ! 77: ! 78: /* ASM_OUTPUT_CONSTRUCTOR outputs code into the .init section to push the ! 79: address of the constructor. This becomes the body of __do_global_ctors ! 80: in crtstuff.c. r13 is a temporary register. */ ! 81: #undef ASM_OUTPUT_CONSTRUCTOR ! 82: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ ! 83: do { \ ! 84: init_section (); \ ! 85: fprintf (FILE, "\tor.u\t r13,r0,hi16("); \ ! 86: assemble_name (FILE, NAME); \ ! 87: fprintf (FILE, ")\n\tor\t r13,r13,lo16("); \ ! 88: assemble_name (FILE, NAME); \ ! 89: fprintf (FILE, ")\n\tsubu\t r31,r31,%d\n\tst\t r13,r31,%d\n", \ ! 90: STACK_BOUNDARY / BITS_PER_UNIT, REG_PARM_STACK_SPACE (0)); \ ! 91: } while (0) ! 92: ! 93: #undef DO_GLOBAL_CTORS_BODY ! 94: #define DO_GLOBAL_CTORS_BODY \ ! 95: do { \ ! 96: func_ptr *__CTOR_LIST__ = __builtin_alloca (0), *p; \ ! 97: for (p = __CTOR_LIST__; *p; p += 4) \ ! 98: (*p) (); \ ! 99: } while (0) ! 100: ! 101: #define DTOR_LIST_BEGIN \ ! 102: asm (FINI_SECTION_ASM_OP); \ ! 103: func_ptr __DTOR_LIST__[4] = { (func_ptr) (-1), (func_ptr) (-1), \ ! 104: (func_ptr) (-1), (func_ptr) (-1) } ! 105: #define DTOR_LIST_END \ ! 106: asm (FINI_SECTION_ASM_OP); \ ! 107: func_ptr __DTOR_END__[4] = { (func_ptr) 0, (func_ptr) 0, \ ! 108: (func_ptr) 0, (func_ptr) 0 } ! 109: ! 110: /* A C statement (sans semicolon) to output an element in the table of ! 111: global destructors. The table is constructed in the .fini section ! 112: so that an explicit linker script is not required. The complication ! 113: is that this section is padded with NOP instructions and to either ! 114: 8 or 16 byte alignment depending on the specific system. A clever ! 115: way to avoid trouble is to output a block of 16 bytes where the ! 116: extra words are known values (-1). */ ! 117: #undef ASM_OUTPUT_DESTRUCTOR ! 118: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \ ! 119: do { \ ! 120: register int i; \ ! 121: fini_section (); \ ! 122: fprintf (FILE, "\t%s\t ", ASM_LONG); \ ! 123: assemble_name (FILE,NAME); \ ! 124: fprintf (FILE, "\n"); \ ! 125: for (i = 1; i < 4; i++) \ ! 126: fprintf (FILE, "\t%s\t -1\n", ASM_LONG); \ ! 127: } while (0) ! 128: ! 129: /* Walk the list looking for the terminating zero and ignoring all values of ! 130: -1. */ ! 131: #undef DO_GLOBAL_DTORS_BODY ! 132: #define DO_GLOBAL_DTORS_BODY \ ! 133: do { \ ! 134: int i; \ ! 135: for (i = 0; __DTOR_LIST__[i] != 0; i++) \ ! 136: if (((int *)__DTOR_LIST__)[i] != -1) \ ! 137: __DTOR_LIST__[i] (); \ ! 138: } while (0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.