|
|
1.1 root 1: /* Definitions of target machine for GNU compiler for Intel 80386
2: running FreeBSD.
3: Copyright (C) 1988, 1992, 1994 Free Software Foundation, Inc.
4: Contributed by Poul-Henning Kamp <[email protected]>
5:
6: This file is part of GNU CC.
7:
8: GNU CC is free software; you can redistribute it and/or modify
9: it under the terms of the GNU General Public License as published by
10: the Free Software Foundation; either version 2, or (at your option)
11: any later version.
12:
13: GNU CC is distributed in the hope that it will be useful,
14: but WITHOUT ANY WARRANTY; without even the implied warranty of
15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: GNU General Public License for more details.
17:
18: You should have received a copy of the GNU General Public License
19: along with GNU CC; see the file COPYING. If not, write to
20: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21:
22: /* This goes away when the math-emulator is fixed */
23: #define TARGET_CPU_DEFAULT 0400 /* TARGET_NO_FANCY_MATH_387 */
24:
25: /* This is tested by i386gas.h. */
26: #define YES_UNDERSCORES
27:
28: /* Don't assume anything about the header files. */
29: #define NO_IMPLICIT_EXTERN_C
30:
31: #include "i386/gstabs.h"
32:
33: /* Get perform_* macros to build libgcc.a. */
34: #include "i386/perform.h"
35:
36: #undef CPP_PREDEFINES
37: #define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__ -D__386BSD__ -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
38:
39: /* Like the default, except no -lg. */
40: #define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
41:
42: #undef SIZE_TYPE
43: #define SIZE_TYPE "unsigned int"
44:
45: #undef PTRDIFF_TYPE
46: #define PTRDIFF_TYPE "int"
47:
48: #undef WCHAR_TYPE
49: #define WCHAR_TYPE "short unsigned int"
50:
51: #define WCHAR_UNSIGNED 1
52:
53: #undef WCHAR_TYPE_SIZE
54: #define WCHAR_TYPE_SIZE 16
55:
56: #define HAVE_ATEXIT
57:
58: /* There are conflicting reports about whether this system uses
59: a different assembler syntax. [email protected] says # is right. */
60: #undef COMMENT_BEGIN
61: #define COMMENT_BEGIN "#"
62:
63: #undef ASM_APP_ON
64: #define ASM_APP_ON "#APP\n"
65:
66: #undef ASM_APP_OFF
67: #define ASM_APP_OFF "#NO_APP\n"
68:
69: /* The following macros are stolen from i386v4.h */
70: /* These have to be defined to get PIC code correct */
71:
72: /* This is how to output an element of a case-vector that is relative.
73: This is only used for PIC code. See comments by the `casesi' insn in
74: i386.md for an explanation of the expression this outputs. */
75:
76: #undef ASM_OUTPUT_ADDR_DIFF_ELT
77: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
78: fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
79:
80: /* Indicate that jump tables go in the text section. This is
81: necessary when compiling PIC code. */
82:
83: #define JUMP_TABLES_IN_TEXT_SECTION
84:
85: /* Don't default to pcc-struct-return, because gcc is the only compiler, and
86: we want to retain compatibility with older gcc versions. */
87: #define DEFAULT_PCC_STRUCT_RETURN 0
88:
89: /* Profiling routines, partially copied from i386/osfrose.h. */
90:
91: /* Redefine this to use %eax instead of %edx. */
92: #undef FUNCTION_PROFILER
93: #define FUNCTION_PROFILER(FILE, LABELNO) \
94: { \
95: if (flag_pic) \
96: { \
97: fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%eax\n", \
98: LPREFIX, (LABELNO)); \
99: fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \
100: } \
101: else \
102: { \
103: fprintf (FILE, "\tmovl $%sP%d,%%eax\n", LPREFIX, (LABELNO)); \
104: fprintf (FILE, "\tcall mcount\n"); \
105: } \
106: }
107:
108: /*
109: * Some imports from svr4.h in support of shared libraries.
110: * Currently, we need the DECLARE_OBJECT_SIZE stuff.
111: */
112:
113: /* Define the strings used for the special svr4 .type and .size directives.
114: These strings generally do not vary from one system running svr4 to
115: another, but if a given system (e.g. m88k running svr) needs to use
116: different pseudo-op names for these, they may be overridden in the
117: file which includes this one. */
118:
119: #define TYPE_ASM_OP ".type"
120: #define SIZE_ASM_OP ".size"
121: #define WEAK_ASM_OP ".weak"
122:
123: /* The following macro defines the format used to output the second
124: operand of the .type assembler directive. Different svr4 assemblers
125: expect various different forms for this operand. The one given here
126: is just a default. You may need to override it in your machine-
127: specific tm.h file (depending upon the particulars of your assembler). */
128:
129: #define TYPE_OPERAND_FMT "@%s"
130:
131: /* Write the extra assembler code needed to declare a function's result.
132: Most svr4 assemblers don't require any special declaration of the
133: result value, but there are exceptions. */
134:
135: #ifndef ASM_DECLARE_RESULT
136: #define ASM_DECLARE_RESULT(FILE, RESULT)
137: #endif
138:
139: /* These macros generate the special .type and .size directives which
140: are used to set the corresponding fields of the linker symbol table
141: entries in an ELF object file under SVR4. These macros also output
142: the starting labels for the relevant functions/objects. */
143:
144: /* Write the extra assembler code needed to declare a function properly.
145: Some svr4 assemblers need to also have something extra said about the
146: function's return value. We allow for that here. */
147:
148: #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
149: do { \
150: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
151: assemble_name (FILE, NAME); \
152: putc (',', FILE); \
153: fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
154: putc ('\n', FILE); \
155: ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
156: ASM_OUTPUT_LABEL(FILE, NAME); \
157: } while (0)
158:
159: /* Write the extra assembler code needed to declare an object properly. */
160:
161: #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
162: do { \
163: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
164: assemble_name (FILE, NAME); \
165: putc (',', FILE); \
166: fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
167: putc ('\n', FILE); \
168: size_directive_output = 0; \
169: if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
170: { \
171: size_directive_output = 1; \
172: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
173: assemble_name (FILE, NAME); \
174: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
175: } \
176: ASM_OUTPUT_LABEL(FILE, NAME); \
177: } while (0)
178:
179: /* Output the size directive for a decl in rest_of_decl_compilation
180: in the case where we did not do so before the initializer.
181: Once we find the error_mark_node, we know that the value of
182: size_directive_output was set
183: by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
184:
185: #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
186: do { \
187: char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
188: if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
189: && ! AT_END && TOP_LEVEL \
190: && DECL_INITIAL (DECL) == error_mark_node \
191: && !size_directive_output) \
192: { \
193: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
194: assemble_name (FILE, name); \
195: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL)));\
196: } \
197: } while (0)
198:
199:
200: /* This is how to declare the size of a function. */
201:
202: #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
203: do { \
204: if (!flag_inhibit_size_directive) \
205: { \
206: char label[256]; \
207: static int labelno; \
208: labelno++; \
209: ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
210: ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
211: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
212: assemble_name (FILE, (FNAME)); \
213: fprintf (FILE, ","); \
214: assemble_name (FILE, label); \
215: fprintf (FILE, "-"); \
216: assemble_name (FILE, (FNAME)); \
217: putc ('\n', FILE); \
218: } \
219: } while (0)
220:
221: #define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k}"
222: #define LINK_SPEC \
223: "%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} %{assert*}"
224:
225: /* This is defined when gcc is compiled in the BSD-directory-tree, and must
226: * make up for the gap to all the stuff done in the GNU-makefiles.
227: */
228:
229: #ifdef FREEBSD_NATIVE
230:
231: #define INCLUDE_DEFAULTS { \
232: { "/usr/include", 0 }, \
233: { "/usr/include/g++", 1 }, \
234: { 0, 0} \
235: }
236:
237: #undef MD_EXEC_PREFIX
238: #define MD_EXEC_PREFIX "/usr/libexec/"
239:
240: #undef STANDARD_STARTFILE_PREFIX
241: #define STANDARD_STARTFILE_PREFIX "/usr/lib"
242:
243: #if 0 /* This is very wrong!!! */
244: #define DEFAULT_TARGET_MACHINE "i386-unknown-freebsd_1.0"
245: #define GPLUSPLUS_INCLUDE_DIR "/usr/local/lib/gcc-lib/i386-unknown-freebsd_1.0/2.5.8/include"
246: #define TOOL_INCLUDE_DIR "/usr/local/i386-unknown-freebsd_1.0/include"
247: #define GCC_INCLUDE_DIR "/usr/local/lib/gcc-lib/i386-unknown-freebsd_1.0/2.5.8/include"
248: #endif
249:
250: #endif /* FREEBSD_NATIVE */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.