]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/i386/djgpp.h
target.h (gcc_target): Add asm_out.named_section, section_type_flags, have_named_sect...
[thirdparty/gcc.git] / gcc / config / i386 / djgpp.h
1 /* Configuration for an i386 running MS-DOS with DJGPP.
2 Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "dbxcoff.h"
22
23 /* Support generation of DWARF2 debugging info. */
24 #define DWARF2_DEBUGGING_INFO
25
26 /* Don't assume anything about the header files. */
27 #define NO_IMPLICIT_EXTERN_C
28
29 #define HANDLE_SYSV_PRAGMA
30
31 /* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop). */
32 #define HANDLE_PRAGMA_PACK_PUSH_POP 1
33
34 #define YES_UNDERSCORES
35
36 #include "i386/gas.h"
37
38 /* If defined, a C expression whose value is a string containing the
39 assembler operation to identify the following data as
40 uninitialized global data. If not defined, and neither
41 `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
42 uninitialized global data will be output in the data section if
43 `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
44 used. */
45 #undef BSS_SECTION_ASM_OP
46 #define BSS_SECTION_ASM_OP "\t.section\t.bss"
47
48 /* Define the name of the .ctor section. */
49 #undef CTORS_SECTION_ASM_OP
50 #define CTORS_SECTION_ASM_OP "\t.section .ctor"
51
52 /* Define the name of the .data section. */
53 #undef DATA_SECTION_ASM_OP
54 #define DATA_SECTION_ASM_OP "\t.section .data"
55
56 /* Define the name of the .dtor section. */
57 #undef DTORS_SECTION_ASM_OP
58 #define DTORS_SECTION_ASM_OP "\t.section .dtor"
59
60 /* Define the name of the .ident op. */
61 #undef IDENT_ASM_OP
62 #define IDENT_ASM_OP "\t.ident\t"
63
64 /* Define the name of the .int op. */
65 #undef INT_ASM_OP
66 #define INT_ASM_OP "\t.long\t"
67
68 /* Enable alias attribute support. */
69 #ifndef SET_ASM_OP
70 #define SET_ASM_OP "\t.set\t"
71 #endif
72
73 /* Define the name of the .text section. */
74 #undef TEXT_SECTION_ASM_OP
75 #define TEXT_SECTION_ASM_OP "\t.section .text"
76
77 /* How to output an unaligned integer. */
78 #undef UNALIGNED_INT_ASM_OP
79 #define UNALIGNED_INT_ASM_OP "\t.long\t"
80
81 /* How to output an unaligned double length integer. */
82 #undef UNALIGNED_DOUBLE_INT_ASM_OP
83 #define UNALIGNED_DOUBLE_INT_ASM_OP "\t.quad\t"
84
85 /* How to output an unaligned half length intenger. */
86 #undef UNALIGNED_SHORT_ASM_OP
87 #define UNALIGNED_SHORT_ASM_OP "\t.short\t"
88
89 /* Define standard DJGPP installation paths. */
90 /* We override default /usr or /usr/local part with /dev/env/DJDIR which */
91 /* points to actual DJGPP instalation directory. */
92
93 /* Standard include directory */
94 #undef STANDARD_INCLUDE_DIR
95 #define STANDARD_INCLUDE_DIR "/dev/env/DJDIR/include/"
96
97 /* Search for as.exe and ld.exe in DJGPP's binary directory. */
98 #undef MD_EXEC_PREFIX
99 #define MD_EXEC_PREFIX "/dev/env/DJDIR/bin/"
100
101 /* Standard DJGPP library and startup files */
102 #undef MD_STARTFILE_PREFIX
103 #define MD_STARTFILE_PREFIX "/dev/env/DJDIR/lib/"
104
105 /* Correctly handle absolute filename detection in cp/xref.c */
106 #define FILE_NAME_ABSOLUTE_P(NAME) \
107 (((NAME)[0] == '/') || ((NAME)[0] == '\\') || \
108 (((NAME)[0] >= 'A') && ((NAME)[0] <= 'z') && ((NAME)[1] == ':')))
109
110 #undef CPP_PREDEFINES
111 #define CPP_PREDEFINES "-D__MSDOS__ -D__GO32__ -Asystem=msdos"
112
113 /* Include <sys/version.h> so __DJGPP__ and __DJGPP_MINOR__ are defined. */
114 #undef CPP_SPEC
115 #define CPP_SPEC "-remap %(cpp_cpu) %{posix:-D_POSIX_SOURCE} \
116 %{!ansi:%{!std=c*:%{!std=i*:-DMSDOS}}} %{!ansi:%{!std=c*:%{!std=i*:-DGO32}}} \
117 -imacros %s../include/sys/version.h"
118
119 /* We need to override link_command_spec in gcc.c so support -Tdjgpp.djl.
120 This cannot be done in LINK_SPECS as that LINK_SPECS is processed
121 before library search directories are known by the linker.
122 This avoids problems when specs file is not available. An alternate way,
123 suggested by Robert Hoehne, is to use SUBTARGET_EXTRA_SPECS instead.
124 */
125
126 #undef LINK_COMMAND_SPEC
127 #define LINK_COMMAND_SPEC \
128 "%{!fsyntax-only: \
129 %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
130 \t%{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
131 \t%{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
132 \t%{static:} %{L*} %D %o\
133 \t%{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
134 \t%{!A:%{!nostdlib:%{!nostartfiles:%E}}}\
135 \t-Tdjgpp.djl %{T*}}}}}}}\n\
136 %{!c:%{!M:%{!MM:%{!E:%{!S:stubify %{v} %{o*:%*} %{!o*:a.out} }}}}}"
137
138 /* Always just link in 'libc.a'. */
139 #undef LIB_SPEC
140 #define LIB_SPEC "-lc"
141
142 /* Pick the right startup code depending on the -pg flag. */
143 #undef STARTFILE_SPEC
144 #define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:crt0.o%s}"
145
146 /* Make sure that gcc will not look for .h files in /usr/local/include
147 unless user explicitly requests it. */
148 #undef LOCAL_INCLUDE_DIR
149
150 #undef EXTRA_SECTIONS
151 #define EXTRA_SECTIONS in_ctor, in_dtor
152
153 #undef EXTRA_SECTION_FUNCTIONS
154 #define EXTRA_SECTION_FUNCTIONS \
155 CTOR_SECTION_FUNCTION \
156 DTOR_SECTION_FUNCTION
157
158 #define CTOR_SECTION_FUNCTION \
159 void \
160 ctor_section () \
161 { \
162 if (in_section != in_ctor) \
163 { \
164 fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
165 in_section = in_ctor; \
166 } \
167 }
168
169 #define DTOR_SECTION_FUNCTION \
170 void \
171 dtor_section () \
172 { \
173 if (in_section != in_dtor) \
174 { \
175 fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
176 in_section = in_dtor; \
177 } \
178 }
179
180 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
181 do { \
182 ctor_section (); \
183 fputs (ASM_LONG, FILE); \
184 assemble_name (FILE, NAME); \
185 fprintf (FILE, "\n"); \
186 } while (0)
187
188 /* Switch into a generic section. */
189 #define TARGET_ASM_NAMED_SECTION default_coff_asm_named_section
190
191 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
192 do { \
193 dtor_section (); \
194 fputs (ASM_LONG, FILE); \
195 assemble_name (FILE, NAME); \
196 fprintf (FILE, "\n"); \
197 } while (0)
198
199 /* Output at beginning of assembler file. */
200 /* The .file command should always begin the output. */
201
202 #undef ASM_FILE_START
203 #define ASM_FILE_START(FILE) \
204 do { \
205 output_file_directive (FILE, main_input_filename); \
206 } while (0)
207
208 /* This is how to output an assembler line
209 that says to advance the location counter
210 to a multiple of 2**LOG bytes. */
211
212 #undef ASM_OUTPUT_ALIGN
213 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
214 if ((LOG) != 0) fprintf ((FILE), "\t.p2align %d\n", LOG)
215
216 /* This is how to output a global symbol in the BSS section. */
217 #undef ASM_OUTPUT_ALIGNED_BSS
218 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
219 asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
220
221 /* This is how to tell assembler that a symbol is weak */
222 #undef ASM_WEAKEN_LABEL
223 #define ASM_WEAKEN_LABEL(FILE,NAME) \
224 do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
225 fputc ('\n', FILE); } while (0)
226
227 /* djgpp automatically calls its own version of __main, so don't define one
228 in libgcc, nor call one in main(). */
229 #define HAS_INIT_SECTION
230
231 /* Definitions for types and sizes. Wide characters are 16-bits long so
232 Win32 compiler add-ons will be wide character compatible. */
233 #undef WCHAR_UNSIGNED
234 #define WCHAR_UNSIGNED 1
235
236 #undef WCHAR_TYPE_SIZE
237 #define WCHAR_TYPE_SIZE 16
238
239 #undef WCHAR_TYPE
240 #define WCHAR_TYPE "short unsigned int"
241
242 #undef WINT_TYPE
243 #define WINT_TYPE "int"
244
245 #undef SIZE_TYPE
246 #define SIZE_TYPE "long unsigned int"
247
248 #undef PTRDIFF_TYPE
249 #define PTRDIFF_TYPE "int"
250
251 /* Used to be defined in xm-djgpp.h, but moved here for cross-compilers. */
252 #define LIBSTDCXX "-lstdcxx"
253
254 /* -mbnu210 is now ignored and obsolete. It was used to enable support for
255 weak symbols, and .gnu.linkonce support. */
256 #undef MASK_BNU210
257 #define MASK_BNU210 (0x40000000)
258
259 #undef SUBTARGET_SWITCHES
260 #define SUBTARGET_SWITCHES \
261 { "no-bnu210", -MASK_BNU210, "Ignored (obsolete)." }, \
262 { "bnu210", MASK_BNU210, "Ignored (obsolete)." },
263
264 /* Warn that -mbnu210 is now obsolete. */
265 #undef SUBTARGET_OVERRIDE_OPTIONS
266 #define SUBTARGET_OVERRIDE_OPTIONS \
267 do \
268 { \
269 if (target_flags & MASK_BNU210) \
270 { \
271 warning ("-mbnu210 is ignored (option is obsolete)."); \
272 } \
273 } \
274 while (0)
275
276 /* Support for C++ templates. */
277 #undef MAKE_DECL_ONE_ONLY
278 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
279
280 #undef UNIQUE_SECTION
281 #define UNIQUE_SECTION(DECL,RELOC) \
282 do { \
283 int len; \
284 const char *name, *prefix; \
285 char *string; \
286 \
287 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \
288 \
289 if (! DECL_ONE_ONLY (DECL)) \
290 { \
291 if (TREE_CODE (DECL) == FUNCTION_DECL) \
292 prefix = ".text."; \
293 else if (DECL_READONLY_SECTION (DECL, RELOC)) \
294 prefix = ".rodata."; \
295 else \
296 prefix = ".data."; \
297 } \
298 else if (TREE_CODE (DECL) == FUNCTION_DECL) \
299 prefix = ".gnu.linkonce.t."; \
300 else if (DECL_READONLY_SECTION (DECL, RELOC)) \
301 prefix = ".gnu.linkonce.r."; \
302 else \
303 prefix = ".gnu.linkonce.d."; \
304 \
305 len = strlen (name) + strlen (prefix); \
306 string = alloca (len + 1); \
307 sprintf (string, "%s%s", prefix, name); \
308 \
309 DECL_SECTION_NAME (DECL) = build_string (len, string); \
310 } while (0)