|
|
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
1.1.1.4 ! root 21: the Free Software Foundation, 59 Temple Place - Suite 330,
! 22: Boston, MA 02111-1307, USA. */
1.1 root 23:
24: #include "m88k/m88k.h"
25:
26: /* Default switches */
27: #undef TARGET_DEFAULT
28: #define TARGET_DEFAULT (MASK_CHECK_ZERO_DIV | \
29: MASK_OCS_DEBUG_INFO | \
30: MASK_OCS_FRAME_POSITION)
31:
32: /* Macros to be automatically defined. */
33: #undef CPP_PREDEFINES
1.1.1.2 root 34: #define CPP_PREDEFINES "-Dm88000 -Dm88k -Dunix -DsysV88 -D__CLASSIFY_TYPE__=2 -Asystem(unix) -Asystem(svr3) -Acpu(m88k) -Amachine(m88k)"
1.1 root 35:
36: /* Override svr3.h to link with ?crt0.o instead of ?crt1.o and ?crtn.o.
37: From [email protected]. */
38: #undef STARTFILE_SPEC
39: #define STARTFILE_SPEC \
40: "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}} crtbegin.o%s"
41:
42: /* Profiled libraries live in a different directory but keep the same
43: names other than that. [email protected] says -lg is always needed. */
44: #undef LIB_SPEC
45: #define LIB_SPEC "%{p:-L/lib/libp}%{pg:%{!p:-L/lib/libp}} -lg -lc crtend.o%s"
46:
47: /* Hot version of the profiler that uses r10 to pass the address of
48: the counter. the _gcc_mcount routine knows not to screw with
49: the parameter registers.
50:
51: DG/UX does this; i wrote a gnu-c/88k specific version and put it
52: in libgcc2.c -- RBE; this macro knows about the leading underscore
53: convention. */
54: #undef FUNCTION_PROFILER
55: #define FUNCTION_PROFILER(FILE, LABELNO) \
56: output_function_profiler (FILE, LABELNO, "_gcc_mcount", 0)
57:
58: /* Various other changes that we want to have in place without
59: too many changes to the m88k.h file. */
60: #undef USE_LIBG
61: #define USE_LIBG
62:
63: /* Define a few machine-specific details of the implementation of
64: constructors. */
65:
66: /* Although the .init section is used, it is not automatically invoked. */
67: #define INVOKE__main
68:
69: /* State that atexit exists so __do_global_ctors will register
70: __do_global_dtors. */
71: #define HAVE_ATEXIT
72:
73: #define CTOR_LIST_BEGIN \
74: asm (INIT_SECTION_ASM_OP); \
75: asm ("\tsubu\t r31,r31,16"); /* (STACK_BOUNDARY / BITS_PER_UNIT) == 16 */ \
76: asm ("\tst\t r0,r31,32"); /* REG_PARM_STACK_SPACE (0) == 32 */
77: #define CTOR_LIST_END
78:
79: /* ASM_OUTPUT_CONSTRUCTOR outputs code into the .init section to push the
80: address of the constructor. This becomes the body of __do_global_ctors
81: in crtstuff.c. r13 is a temporary register. */
82: #undef ASM_OUTPUT_CONSTRUCTOR
83: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
84: do { \
85: init_section (); \
86: fprintf (FILE, "\tor.u\t r13,r0,hi16("); \
87: assemble_name (FILE, NAME); \
88: fprintf (FILE, ")\n\tor\t r13,r13,lo16("); \
89: assemble_name (FILE, NAME); \
90: fprintf (FILE, ")\n\tsubu\t r31,r31,%d\n\tst\t r13,r31,%d\n", \
91: STACK_BOUNDARY / BITS_PER_UNIT, REG_PARM_STACK_SPACE (0)); \
92: } while (0)
93:
94: #undef DO_GLOBAL_CTORS_BODY
95: #define DO_GLOBAL_CTORS_BODY \
96: do { \
1.1.1.3 root 97: func_ptr *__CTOR_LIST__ = __builtin_alloca (1), *p; \
98: for (p = __CTOR_LIST__ + 4; *p; p += 4) \
1.1 root 99: (*p) (); \
100: } while (0)
101:
102: #define DTOR_LIST_BEGIN \
103: asm (FINI_SECTION_ASM_OP); \
104: func_ptr __DTOR_LIST__[4] = { (func_ptr) (-1), (func_ptr) (-1), \
105: (func_ptr) (-1), (func_ptr) (-1) }
106: #define DTOR_LIST_END \
107: asm (FINI_SECTION_ASM_OP); \
108: func_ptr __DTOR_END__[4] = { (func_ptr) 0, (func_ptr) 0, \
109: (func_ptr) 0, (func_ptr) 0 }
110:
111: /* A C statement (sans semicolon) to output an element in the table of
112: global destructors. The table is constructed in the .fini section
113: so that an explicit linker script is not required. The complication
114: is that this section is padded with NOP instructions and to either
115: 8 or 16 byte alignment depending on the specific system. A clever
116: way to avoid trouble is to output a block of 16 bytes where the
117: extra words are known values (-1). */
118: #undef ASM_OUTPUT_DESTRUCTOR
119: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
120: do { \
121: register int i; \
122: fini_section (); \
123: fprintf (FILE, "\t%s\t ", ASM_LONG); \
124: assemble_name (FILE,NAME); \
125: fprintf (FILE, "\n"); \
126: for (i = 1; i < 4; i++) \
127: fprintf (FILE, "\t%s\t -1\n", ASM_LONG); \
128: } while (0)
129:
130: /* Walk the list looking for the terminating zero and ignoring all values of
131: -1. */
132: #undef DO_GLOBAL_DTORS_BODY
133: #define DO_GLOBAL_DTORS_BODY \
134: do { \
135: int i; \
136: for (i = 0; __DTOR_LIST__[i] != 0; i++) \
137: if (((int *)__DTOR_LIST__)[i] != -1) \
138: __DTOR_LIST__[i] (); \
139: } while (0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.