|
|
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.