]> gcc.gnu.org Git - gcc.git/blame - gcc/config/svr4.h
flags.h: Declare flag_no_ident.
[gcc.git] / gcc / config / svr4.h
CommitLineData
71df9112
RK
1/* Operating system specific defines to be used when targeting GCC for some
2 generic System V Release 4 system.
be163a70 3 Copyright (C) 1991, 94-98, 1999 Free Software Foundation, Inc.
66dae892 4 Contributed by Ron Guilmette (rfg@monkeys.com).
2a2ab3f9
JVA
5
6This file is part of GNU CC.
7
8GNU CC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GNU CC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU CC; see the file COPYING. If not, write to
0af195cf
RK
20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA.
2a2ab3f9
JVA
22
23 To use this file, make up a file with a name like:
24
25 ?????svr4.h
26
27 where ????? is replaced by the name of the basic hardware that you
28 are targeting for. Then, in the file ?????svr4.h, put something
29 like:
30
31 #include "?????.h"
32 #include "svr4.h"
33
34 followed by any really system-specific defines (or overrides of
35 defines) which you find that you need. For example, CPP_PREDEFINES
36 is defined here with only the defined -Dunix and -DSVR4. You should
37 probably override that in your target-specific ?????svr4.h file
38 with a set of defines that includes these, but also contains an
39 appropriate define for the type of hardware that you are targeting.
40*/
41
16ff428b
TW
42/* Define a symbol indicating that we are using svr4.h. */
43#define USING_SVR4_H
44
2a2ab3f9
JVA
45/* For the sake of libgcc2.c, indicate target supports atexit. */
46#define HAVE_ATEXIT
47
48/* Cpp, assembler, linker, library, and startfile spec's. */
49
50/* This defines which switch letters take arguments. On svr4, most of
51 the normal cases (defined in gcc.c) apply, and we also have -h* and
52 -z* options (for the linker). Note however that there is no such
53 thing as a -T option for svr4. */
54
55#define SWITCH_TAKES_ARG(CHAR) \
7d4ea832 56 (DEFAULT_SWITCH_TAKES_ARG (CHAR) \
2a2ab3f9 57 || (CHAR) == 'h' \
38c27e22 58 || (CHAR) == 'x' \
2a2ab3f9
JVA
59 || (CHAR) == 'z')
60
61/* This defines which multi-letter switches take arguments. On svr4,
62 there are no such switches except those implemented by GCC itself. */
63
64#define WORD_SWITCH_TAKES_ARG(STR) \
3b39b94f
ILT
65 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \
66 && strcmp (STR, "Tdata") && strcmp (STR, "Ttext") \
67 && strcmp (STR, "Tbss"))
2a2ab3f9
JVA
68
69/* You should redefine CPP_PREDEFINES in any file which includes this one.
70 The definition should be appropriate for the type of target system
71 involved, and it should include any -A (assertion) options which are
72 appropriate for the given target system. */
73#undef CPP_PREDEFINES
74
75/* Provide an ASM_SPEC appropriate for svr4. Here we try to support as
76 many of the specialized svr4 assembler options as seems reasonable,
77 given that there are certain options which we can't (or shouldn't)
96f158f7 78 support directly due to the fact that they conflict with other options
2a2ab3f9
JVA
79 for other svr4 tools (e.g. ld) or with other options for GCC itself.
80 For example, we don't support the -o (output file) or -R (remove
81 input file) options because GCC already handles these things. We
82 also don't support the -m (run m4) option for the assembler because
83 that conflicts with the -m (produce load map) option of the svr4
84 linker. We do however allow passing arbitrary options to the svr4
85 assembler via the -Wa, option.
86
87 Note that gcc doesn't allow a space to follow -Y in a -Ym,* or -Yd,*
88 option.
89*/
90
91#undef ASM_SPEC
92#define ASM_SPEC \
660d9d96 93 "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}"
2a2ab3f9
JVA
94
95/* svr4 assemblers need the `-' (indicating input from stdin) to come after
96 the -o option (and its argument) for some reason. If we try to put it
97 before the -o option, the assembler will try to read the file named as
98 the output file in the -o option as an input file (after it has already
99 written some stuff to it) and the binary stuff contained therein will
100 cause totally confuse the assembler, resulting in many spurious error
101 messages. */
102
103#undef ASM_FINAL_SPEC
bcc1f62c 104#define ASM_FINAL_SPEC "%|"
2a2ab3f9 105
93639b52
RS
106/* Under svr4, the normal location of the `ld' and `as' programs is the
107 /usr/ccs/bin directory. */
108
f905fc0d 109#ifndef CROSS_COMPILE
93639b52
RS
110#undef MD_EXEC_PREFIX
111#define MD_EXEC_PREFIX "/usr/ccs/bin/"
f905fc0d 112#endif
93639b52 113
2a2ab3f9
JVA
114/* Under svr4, the normal location of the various *crt*.o files is the
115 /usr/ccs/lib directory. */
116
f905fc0d 117#ifndef CROSS_COMPILE
2a2ab3f9
JVA
118#undef MD_STARTFILE_PREFIX
119#define MD_STARTFILE_PREFIX "/usr/ccs/lib/"
f905fc0d 120#endif
2a2ab3f9 121
b4ac57ab 122/* Provide a LIB_SPEC appropriate for svr4. Here we tack on the default
68d69835
JM
123 standard C library (unless we are building a shared library). */
124
125#undef LIB_SPEC
126#define LIB_SPEC "%{!shared:%{!symbolic:-lc}}"
127
68d69835
JM
128/* Provide an ENDFILE_SPEC appropriate for svr4. Here we tack on our own
129 magical crtend.o file (see crtstuff.c) which provides part of the
130 support for getting C++ file-scope static object constructed before
2a2ab3f9
JVA
131 entering `main', followed by the normal svr3/svr4 "finalizer" file,
132 which is either `gcrtn.o' or `crtn.o'. */
133
68d69835 134#undef ENDFILE_SPEC
a4ec6e2a 135#define ENDFILE_SPEC "crtend.o%s %{pg:gcrtn.o%s}%{!pg:crtn.o%s}"
2a2ab3f9
JVA
136
137/* Provide a LINK_SPEC appropriate for svr4. Here we provide support
138 for the special GCC options -static, -shared, and -symbolic which
139 allow us to link things in one of these three modes by applying the
140 appropriate combinations of options at link-time. We also provide
141 support here for as many of the other svr4 linker options as seems
142 reasonable, given that some of them conflict with options for other
143 svr4 tools (e.g. the assembler). In particular, we do support the
8b496c8d 144 -z*, -V, -b, -t, -Qy, -Qn, and -YP* options here, and the -e*,
2a2ab3f9
JVA
145 -l*, -o*, -r, -s, -u*, and -L* options are directly supported
146 by gcc.c itself. We don't directly support the -m (generate load
147 map) option because that conflicts with the -m (run m4) option of
148 the svr4 assembler. We also don't directly support the svr4 linker's
149 -I* or -M* options because these conflict with existing GCC options.
150 We do however allow passing arbitrary options to the svr4 linker
151 via the -Wl, option. We don't support the svr4 linker's -a option
152 at all because it is totally useless and because it conflicts with
153 GCC's own -a option.
154
155 Note that gcc doesn't allow a space to follow -Y in a -YP,* option.
156
157 When the -G link option is used (-shared and -symbolic) a final link is
158 not being done. */
159
160#undef LINK_SPEC
f905fc0d 161#ifdef CROSS_COMPILE
660d9d96 162#define LINK_SPEC "%{h*} %{v:-V} \
f905fc0d
DE
163 %{b} %{Wl,*:%*} \
164 %{static:-dn -Bstatic} \
8b496c8d
ILT
165 %{shared:-G -dy -z text} \
166 %{symbolic:-Bsymbolic -G -dy -z text} \
f905fc0d
DE
167 %{G:-G} \
168 %{YP,*} \
169 %{Qy:} %{!Qn:-Qy}"
170#else
660d9d96 171#define LINK_SPEC "%{h*} %{v:-V} \
b4ac57ab 172 %{b} %{Wl,*:%*} \
2a2ab3f9 173 %{static:-dn -Bstatic} \
8b496c8d
ILT
174 %{shared:-G -dy -z text} \
175 %{symbolic:-Bsymbolic -G -dy -z text} \
b4ac57ab 176 %{G:-G} \
2a2ab3f9
JVA
177 %{YP,*} \
178 %{!YP,*:%{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
179 %{!p:-Y P,/usr/ccs/lib:/usr/lib}} \
180 %{Qy:} %{!Qn:-Qy}"
f905fc0d 181#endif
2a2ab3f9
JVA
182
183/* Gcc automatically adds in one of the files /usr/ccs/lib/values-Xc.o,
184 /usr/ccs/lib/values-Xa.o, or /usr/ccs/lib/values-Xt.o for each final
185 link step (depending upon the other gcc options selected, such as
186 -traditional and -ansi). These files each contain one (initialized)
187 copy of a special variable called `_lib_version'. Each one of these
188 files has `_lib_version' initialized to a different (enum) value.
189 The SVR4 library routines query the value of `_lib_version' at run
190 to decide how they should behave. Specifically, they decide (based
191 upon the value of `_lib_version') if they will act in a strictly ANSI
b4ac57ab 192 conforming manner or not.
2a2ab3f9
JVA
193*/
194
195#undef STARTFILE_SPEC
196#define STARTFILE_SPEC "%{!shared: \
197 %{!symbolic: \
68d69835
JM
198 %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}}\
199 %{pg:gcrti.o%s}%{!pg:crti.o%s} \
200 %{ansi:values-Xc.o%s} \
201 %{!ansi: \
202 %{traditional:values-Xt.o%s} \
203 %{!traditional:values-Xa.o%s}} \
204 crtbegin.o%s"
2a2ab3f9 205
b4ac57ab 206/* Attach a special .ident directive to the end of the file to identify
2a2ab3f9 207 the version of GCC which compiled this code. The format of the
b4ac57ab 208 .ident string is patterned after the ones produced by native svr4
2a2ab3f9
JVA
209 C compilers. */
210
dd452eba
CH
211#define IDENT_ASM_OP ".ident"
212
2a2ab3f9
JVA
213#define ASM_FILE_END(FILE) \
214do { \
be163a70
ZW
215 if (!flag_no_ident) \
216 fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n", \
217 IDENT_ASM_OP, version_string); \
2a2ab3f9
JVA
218 } while (0)
219
220/* Allow #sccs in preprocessor. */
221
222#define SCCS_DIRECTIVE
223
224/* Output #ident as a .ident. */
225
226#define ASM_OUTPUT_IDENT(FILE, NAME) \
dd452eba 227 fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
2a2ab3f9
JVA
228
229/* Use periods rather than dollar signs in special g++ assembler names. */
230
231#define NO_DOLLAR_IN_LABEL
232
233/* Writing `int' for a bitfield forces int alignment for the structure. */
234
235#define PCC_BITFIELD_TYPE_MATTERS 1
236
237/* Implicit library calls should use memcpy, not bcopy, etc. */
238
239#define TARGET_MEM_FUNCTIONS
240
fc416d5b
RS
241/* Handle #pragma weak and #pragma pack. */
242
243#define HANDLE_SYSV_PRAGMA
244
2a2ab3f9
JVA
245/* System V Release 4 uses DWARF debugging info. */
246
247#define DWARF_DEBUGGING_INFO
248
9a666dda
JM
249/* All ELF targets can support DWARF-2. */
250
251#define DWARF2_DEBUGGING_INFO
252
2a2ab3f9
JVA
253/* The numbers used to denote specific machine registers in the System V
254 Release 4 DWARF debugging information are quite likely to be totally
255 different from the numbers used in BSD stabs debugging information
256 for the same kind of target machine. Thus, we undefine the macro
257 DBX_REGISTER_NUMBER here as an extra inducement to get people to
258 provide proper machine-specific definitions of DBX_REGISTER_NUMBER
259 (which is also used to provide DWARF registers numbers in dwarfout.c)
260 in their tm.h files which include this file. */
261
262#undef DBX_REGISTER_NUMBER
263
136bfcb3
ILT
264/* gas on SVR4 supports the use of .stabs. Permit -gstabs to be used
265 in general, although it will only work when using gas. */
266
267#define DBX_DEBUGGING_INFO
268
8092a8e8
ILT
269/* When generating stabs debugging, use N_BINCL entries. */
270
271#define DBX_USE_BINCL
272
136bfcb3
ILT
273/* Use DWARF debugging info by default. */
274
ab72fb3b 275#ifndef PREFERRED_DEBUGGING_TYPE
136bfcb3 276#define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
ab72fb3b 277#endif
136bfcb3
ILT
278
279/* Make LBRAC and RBRAC addresses relative to the start of the
280 function. The native Solaris stabs debugging format works this
281 way, gdb expects it, and it reduces the number of relocation
282 entries. */
283
284#define DBX_BLOCKS_FUNCTION_RELATIVE 1
285
286/* When using stabs, gcc2_compiled must be a stabs entry, not an
7f0d4f6d
JW
287 ordinary symbol, or gdb won't see it. Furthermore, since gdb reads
288 the input piecemeal, starting with each N_SO, it's a lot easier if
289 the gcc2 flag symbol is *after* the N_SO rather than before it. So
290 we emit an N_OPT stab there. */
136bfcb3
ILT
291
292#define ASM_IDENTIFY_GCC(FILE) \
293do \
294 { \
295 if (write_symbols != DBX_DEBUG) \
296 fputs ("gcc2_compiled.:\n", FILE); \
7f0d4f6d
JW
297 } \
298while (0)
299
300#define ASM_IDENTIFY_GCC_AFTER_SOURCE(FILE) \
301do \
302 { \
303 if (write_symbols == DBX_DEBUG) \
136bfcb3
ILT
304 fputs ("\t.stabs\t\"gcc2_compiled.\", 0x3c, 0, 0, 0\n", FILE); \
305 } \
306while (0)
307
308/* Like block addresses, stabs line numbers are relative to the
309 current function. */
310
311#define ASM_OUTPUT_SOURCE_LINE(file, line) \
312do \
313 { \
314 static int sym_lineno = 1; \
4925e137
PB
315 fprintf (file, ".stabn 68,0,%d,.LM%d-", \
316 line, sym_lineno); \
317 assemble_name (file, \
318 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
319 fprintf (file, "\n.LM%d:\n", sym_lineno); \
136bfcb3
ILT
320 sym_lineno += 1; \
321 } \
322while (0)
323
324/* In order for relative line numbers to work, we must output the
325 stabs entry for the function name first. */
326
327#define DBX_FUNCTION_FIRST
328
71df9112
RK
329/* Generate a blank trailing N_SO to mark the end of the .o file, since
330 we can't depend upon the linker to mark .o file boundaries with
331 embedded stabs. */
332
333#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
26ca940c
SC
334do \
335 { \
336 text_section (); \
337 fprintf (FILE, \
338 "\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO); \
339 } \
340while (0)
71df9112 341
2a2ab3f9
JVA
342/* Define the actual types of some ANSI-mandated types. (These
343 definitions should work for most SVR4 systems). */
344
345#undef SIZE_TYPE
346#define SIZE_TYPE "unsigned int"
347
348#undef PTRDIFF_TYPE
349#define PTRDIFF_TYPE "int"
350
351#undef WCHAR_TYPE
352#define WCHAR_TYPE "long int"
353
354#undef WCHAR_TYPE_SIZE
355#define WCHAR_TYPE_SIZE BITS_PER_WORD
356
1474c150
RS
357/* This causes trouble, because it requires the host machine
358 to support ANSI C. */
359/* #define MULTIBYTE_CHARS */
b3865ca9 360
2a2ab3f9 361#undef ASM_BYTE_OP
01e2750c
RS
362#define ASM_BYTE_OP ".byte"
363
364#undef SET_ASM_OP
365#define SET_ASM_OP ".set"
2a2ab3f9
JVA
366
367/* This is how to begin an assembly language file. Most svr4 assemblers want
368 at least a .file directive to come first, and some want to see a .version
369 directive come right after that. Here we just establish a default
370 which generates only the .file directive. If you need a .version
371 directive for any specific target, you should override this definition
372 in the target-specific file which includes this one. */
373
374#undef ASM_FILE_START
375#define ASM_FILE_START(FILE) \
376 output_file_directive ((FILE), main_input_filename)
377
378/* This is how to allocate empty space in some section. The .zero
379 pseudo-op is used for this on most svr4 assemblers. */
380
55ee1b03
RS
381#define SKIP_ASM_OP ".zero"
382
2a2ab3f9 383#undef ASM_OUTPUT_SKIP
55ee1b03
RS
384#define ASM_OUTPUT_SKIP(FILE,SIZE) \
385 fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
2a2ab3f9 386
74924ee9 387/* The prefix to add to user-visible assembler symbols.
2a2ab3f9
JVA
388
389 For System V Release 4 the convention is *not* to prepend a leading
390 underscore onto user-level symbol names. */
391
66dae892
RK
392#undef USER_LABEL_PREFIX
393#define USER_LABEL_PREFIX ""
2a2ab3f9 394
55ee1b03
RS
395/* This is how to output an internal numbered label where
396 PREFIX is the class of label and NUM is the number within the class.
397
55ee1b03 398 For most svr4 systems, the convention is that any symbol which begins
4b69d2a3 399 with a period is not put into the linker symbol table by the assembler. */
55ee1b03
RS
400
401#undef ASM_OUTPUT_INTERNAL_LABEL
402#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
403do { \
4b69d2a3 404 fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
55ee1b03
RS
405} while (0)
406
407/* This is how to store into the string LABEL
408 the symbol_ref name of an internal numbered label where
409 PREFIX is the class of label and NUM is the number within the class.
410 This is suitable for output with `assemble_name'.
411
55ee1b03 412 For most svr4 systems, the convention is that any symbol which begins
4b69d2a3 413 with a period is not put into the linker symbol table by the assembler. */
55ee1b03
RS
414
415#undef ASM_GENERATE_INTERNAL_LABEL
416#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
417do { \
32bd96ff 418 sprintf (LABEL, "*.%s%d", PREFIX, (unsigned) (NUM)); \
55ee1b03
RS
419} while (0)
420
13d39dbc 421/* Output the label which precedes a jumptable. Note that for all svr4
dd452eba
CH
422 systems where we actually generate jumptables (which is to say every
423 svr4 target except i386, where we use casesi instead) we put the jump-
424 tables into the .rodata section and since other stuff could have been
425 put into the .rodata section prior to any given jumptable, we have to
426 make sure that the location counter for the .rodata section gets pro-
427 perly re-aligned prior to the actual beginning of the jump table. */
428
429#define ALIGN_ASM_OP ".align"
430
207cdd07
RS
431#ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
432#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
433 ASM_OUTPUT_ALIGN ((FILE), 2);
434#endif
435
dd452eba
CH
436#undef ASM_OUTPUT_CASE_LABEL
437#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \
438 do { \
207cdd07 439 ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
dd452eba
CH
440 ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
441 } while (0)
442
2a2ab3f9
JVA
443/* The standard SVR4 assembler seems to require that certain builtin
444 library routines (e.g. .udiv) be explicitly declared as .globl
445 in each assembly file where they are referenced. */
446
447#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
448 ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
449
450/* This says how to output assembler code to declare an
451 uninitialized external linkage data object. Under SVR4,
452 the linker seems to want the alignment of data objects
453 to depend on their types. We do exactly that here. */
454
55ee1b03
RS
455#define COMMON_ASM_OP ".comm"
456
2a2ab3f9
JVA
457#undef ASM_OUTPUT_ALIGNED_COMMON
458#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
459do { \
55ee1b03 460 fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
2a2ab3f9
JVA
461 assemble_name ((FILE), (NAME)); \
462 fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
463} while (0)
464
465/* This says how to output assembler code to declare an
466 uninitialized internal linkage data object. Under SVR4,
467 the linker seems to want the alignment of data objects
468 to depend on their types. We do exactly that here. */
469
4b69d2a3 470#define LOCAL_ASM_OP ".local"
2a2ab3f9
JVA
471
472#undef ASM_OUTPUT_ALIGNED_LOCAL
473#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
474do { \
4b69d2a3
RS
475 fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
476 assemble_name ((FILE), (NAME)); \
477 fprintf ((FILE), "\n"); \
478 ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
2a2ab3f9
JVA
479} while (0)
480
a211c7b9
MM
481/* Biggest alignment supported by the object file format of this
482 machine. Use this macro to limit the alignment which can be
483 specified using the `__attribute__ ((aligned (N)))' construct. If
484 not defined, the default value is `BIGGEST_ALIGNMENT'. */
485
486#define MAX_OFILE_ALIGNMENT (32768*8)
487
2a2ab3f9
JVA
488/* This is the pseudo-op used to generate a 32-bit word of data with a
489 specific value in some section. This is the same for all known svr4
490 assemblers. */
491
b3865ca9 492#define INT_ASM_OP ".long"
2a2ab3f9
JVA
493
494/* This is the pseudo-op used to generate a contiguous sequence of byte
495 values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
496 AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */
497
498#undef ASCII_DATA_ASM_OP
499#define ASCII_DATA_ASM_OP ".ascii"
500
501/* Support const sections and the ctors and dtors sections for g++.
502 Note that there appears to be two different ways to support const
503 sections at the moment. You can either #define the symbol
504 READONLY_DATA_SECTION (giving it some code which switches to the
505 readonly data section) or else you can #define the symbols
506 EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
507 SELECT_RTX_SECTION. We do both here just to be on the safe side. */
508
509#define USE_CONST_SECTION 1
510
b3865ca9 511#define CONST_SECTION_ASM_OP ".section\t.rodata"
2a2ab3f9 512
68d69835
JM
513/* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
514
515 Note that we want to give these sections the SHF_WRITE attribute
516 because these sections will actually contain data (i.e. tables of
517 addresses of functions in the current root executable or shared library
518 file) and, in the case of a shared library, the relocatable addresses
519 will have to be properly resolved/relocated (and then written into) by
520 the dynamic linker when it actually attaches the given shared library
521 to the executing process. (Note that on SVR4, you may wish to use the
522 `-z text' option to the ELF linker, when building a shared library, as
523 an additional check that you are doing everything right. But if you do
524 use the `-z text' option when building a shared library, you will get
525 errors unless the .ctors and .dtors sections are marked as writable
526 via the SHF_WRITE attribute.) */
527
528#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
529#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\""
530
531/* On svr4, we *do* have support for the .init and .fini sections, and we
532 can put stuff in there to be executed before and after `main'. We let
533 crtstuff.c and other files know this by defining the following symbols.
534 The definitions say how to change sections to the .init and .fini
535 sections. This is the same for all known svr4 assemblers. */
2a2ab3f9 536
b3865ca9 537#define INIT_SECTION_ASM_OP ".section\t.init"
68d69835 538#define FINI_SECTION_ASM_OP ".section\t.fini"
2a2ab3f9
JVA
539
540/* A default list of other sections which we might be "in" at any given
541 time. For targets that use additional sections (e.g. .tdesc) you
542 should override this definition in the target-specific file which
543 includes this file. */
544
545#undef EXTRA_SECTIONS
546#define EXTRA_SECTIONS in_const, in_ctors, in_dtors
547
548/* A default list of extra section function definitions. For targets
549 that use additional sections (e.g. .tdesc) you should override this
550 definition in the target-specific file which includes this file. */
551
552#undef EXTRA_SECTION_FUNCTIONS
553#define EXTRA_SECTION_FUNCTIONS \
554 CONST_SECTION_FUNCTION \
555 CTORS_SECTION_FUNCTION \
556 DTORS_SECTION_FUNCTION
557
558#define READONLY_DATA_SECTION() const_section ()
559
a35f176b 560extern void text_section ();
2a2ab3f9
JVA
561
562#define CONST_SECTION_FUNCTION \
563void \
564const_section () \
565{ \
566 if (!USE_CONST_SECTION) \
567 text_section(); \
568 else if (in_section != in_const) \
569 { \
570 fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
571 in_section = in_const; \
572 } \
573}
574
575#define CTORS_SECTION_FUNCTION \
576void \
577ctors_section () \
578{ \
579 if (in_section != in_ctors) \
580 { \
55ee1b03 581 fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
2a2ab3f9
JVA
582 in_section = in_ctors; \
583 } \
584}
585
586#define DTORS_SECTION_FUNCTION \
587void \
588dtors_section () \
589{ \
590 if (in_section != in_dtors) \
591 { \
55ee1b03 592 fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
2a2ab3f9
JVA
593 in_section = in_dtors; \
594 } \
595}
596
ad4ff310
JM
597/* Switch into a generic section.
598
599 We make the section read-only and executable for a function decl,
600 read-only for a const data decl, and writable for a non-const data decl.
601
602 If the section has already been defined, we must not
603 emit the attributes here. The SVR4 assembler does not
604 recognize section redefinitions.
605 If DECL is NULL, no attributes are emitted. */
606
607#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
96f158f7
RK
608do { \
609 static struct section_info \
610 { \
611 struct section_info *next; \
612 char *name; \
613 enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type; \
614 } *sections; \
615 struct section_info *s; \
616 char *mode; \
617 enum sect_enum type; \
618 \
619 for (s = sections; s; s = s->next) \
620 if (!strcmp (NAME, s->name)) \
621 break; \
622 \
6de78183
JM
623 if (DECL && TREE_CODE (DECL) == FUNCTION_DECL) \
624 type = SECT_EXEC, mode = "ax"; \
ad4ff310 625 else if (DECL && DECL_READONLY_SECTION (DECL, RELOC)) \
6de78183
JM
626 type = SECT_RO, mode = "a"; \
627 else \
628 type = SECT_RW, mode = "aw"; \
96f158f7 629 \
6de78183 630 if (s == 0) \
96f158f7
RK
631 { \
632 s = (struct section_info *) xmalloc (sizeof (struct section_info)); \
633 s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME)); \
634 strcpy (s->name, NAME); \
635 s->type = type; \
636 s->next = sections; \
637 sections = s; \
638 fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, mode); \
639 } \
640 else \
641 { \
642 if (DECL && s->type != type) \
643 error_with_decl (DECL, "%s causes a section type conflict"); \
644 \
645 fprintf (FILE, ".section\t%s\n", NAME); \
646 } \
647} while (0)
5748cda9 648
ad4ff310
JM
649#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
650#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))
651#define UNIQUE_SECTION(DECL,RELOC) \
7988fa6d
JM
652do { \
653 int len; \
654 char *name, *string, *prefix; \
655 \
1e1eb6c5 656 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \
7988fa6d 657 \
ad4ff310 658 if (! DECL_ONE_ONLY (DECL)) \
7d0756fb
CM
659 { \
660 prefix = "."; \
661 if (TREE_CODE (DECL) == FUNCTION_DECL) \
662 prefix = ".text."; \
663 else if (DECL_READONLY_SECTION (DECL, RELOC)) \
664 prefix = ".rodata."; \
665 else \
666 prefix = ".data."; \
667 } \
ad4ff310 668 else if (TREE_CODE (DECL) == FUNCTION_DECL) \
29e29fd5 669 prefix = ".gnu.linkonce.t."; \
ad4ff310 670 else if (DECL_READONLY_SECTION (DECL, RELOC)) \
29e29fd5 671 prefix = ".gnu.linkonce.r."; \
7988fa6d 672 else \
29e29fd5 673 prefix = ".gnu.linkonce.d."; \
7988fa6d
JM
674 \
675 len = strlen (name) + strlen (prefix); \
676 string = alloca (len + 1); \
677 sprintf (string, "%s%s", prefix, name); \
678 \
679 DECL_SECTION_NAME (DECL) = build_string (len, string); \
680} while (0)
2a2ab3f9
JVA
681/* A C statement (sans semicolon) to output an element in the table of
682 global constructors. */
683#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
684 do { \
685 ctors_section (); \
b3865ca9 686 fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
2a2ab3f9
JVA
687 assemble_name (FILE, NAME); \
688 fprintf (FILE, "\n"); \
689 } while (0)
690
691/* A C statement (sans semicolon) to output an element in the table of
692 global destructors. */
693#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
694 do { \
695 dtors_section (); \
b3865ca9 696 fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
2a2ab3f9
JVA
697 assemble_name (FILE, NAME); \
698 fprintf (FILE, "\n"); \
699 } while (0)
700
701/* A C statement or statements to switch to the appropriate
702 section for output of DECL. DECL is either a `VAR_DECL' node
703 or a constant of some sort. RELOC indicates whether forming
704 the initial value of DECL requires link-time relocations. */
705
706#define SELECT_SECTION(DECL,RELOC) \
707{ \
df37d0fa
JM
708 if (flag_pic && RELOC) \
709 data_section (); \
710 else if (TREE_CODE (DECL) == STRING_CST) \
2a2ab3f9
JVA
711 { \
712 if (! flag_writable_strings) \
713 const_section (); \
714 else \
715 data_section (); \
716 } \
717 else if (TREE_CODE (DECL) == VAR_DECL) \
718 { \
ad4ff310 719 if (! DECL_READONLY_SECTION (DECL, RELOC)) \
2a2ab3f9
JVA
720 data_section (); \
721 else \
722 const_section (); \
723 } \
724 else \
725 const_section (); \
726}
727
728/* A C statement or statements to switch to the appropriate
729 section for output of RTX in mode MODE. RTX is some kind
730 of constant in RTL. The argument MODE is redundant except
731 in the case of a `const_int' rtx. Currently, these always
732 go into the const section. */
733
734#undef SELECT_RTX_SECTION
735#define SELECT_RTX_SECTION(MODE,RTX) const_section()
736
737/* Define the strings used for the special svr4 .type and .size directives.
738 These strings generally do not vary from one system running svr4 to
739 another, but if a given system (e.g. m88k running svr) needs to use
740 different pseudo-op names for these, they may be overridden in the
741 file which includes this one. */
742
b3865ca9
RS
743#define TYPE_ASM_OP ".type"
744#define SIZE_ASM_OP ".size"
daefd78b
JM
745
746/* This is how we tell the assembler that a symbol is weak. */
747
748#define ASM_WEAKEN_LABEL(FILE,NAME) \
749 do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
750 fputc ('\n', FILE); } while (0)
2a2ab3f9
JVA
751
752/* The following macro defines the format used to output the second
753 operand of the .type assembler directive. Different svr4 assemblers
754 expect various different forms for this operand. The one given here
755 is just a default. You may need to override it in your machine-
756 specific tm.h file (depending upon the particulars of your assembler). */
757
758#define TYPE_OPERAND_FMT "@%s"
759
55ee1b03
RS
760/* Write the extra assembler code needed to declare a function's result.
761 Most svr4 assemblers don't require any special declaration of the
762 result value, but there are exceptions. */
763
764#ifndef ASM_DECLARE_RESULT
765#define ASM_DECLARE_RESULT(FILE, RESULT)
766#endif
767
2a2ab3f9
JVA
768/* These macros generate the special .type and .size directives which
769 are used to set the corresponding fields of the linker symbol table
55ee1b03
RS
770 entries in an ELF object file under SVR4. These macros also output
771 the starting labels for the relevant functions/objects. */
2a2ab3f9 772
55ee1b03
RS
773/* Write the extra assembler code needed to declare a function properly.
774 Some svr4 assemblers need to also have something extra said about the
775 function's return value. We allow for that here. */
2a2ab3f9
JVA
776
777#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
778 do { \
b3865ca9 779 fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
2a2ab3f9
JVA
780 assemble_name (FILE, NAME); \
781 putc (',', FILE); \
782 fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
783 putc ('\n', FILE); \
55ee1b03 784 ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
2a2ab3f9
JVA
785 ASM_OUTPUT_LABEL(FILE, NAME); \
786 } while (0)
787
788/* Write the extra assembler code needed to declare an object properly. */
789
790#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
791 do { \
b3865ca9 792 fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
2a2ab3f9
JVA
793 assemble_name (FILE, NAME); \
794 putc (',', FILE); \
795 fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
796 putc ('\n', FILE); \
a35f176b 797 size_directive_output = 0; \
86615a62 798 if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
2a2ab3f9 799 { \
a35f176b 800 size_directive_output = 1; \
b3865ca9 801 fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
2a2ab3f9 802 assemble_name (FILE, NAME); \
634f516f 803 putc (',', FILE); \
6862dfac
JL
804 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
805 int_size_in_bytes (TREE_TYPE (DECL))); \
806 fputc ('\n', FILE); \
2a2ab3f9
JVA
807 } \
808 ASM_OUTPUT_LABEL(FILE, NAME); \
809 } while (0)
810
a35f176b
RS
811/* Output the size directive for a decl in rest_of_decl_compilation
812 in the case where we did not do so before the initializer.
813 Once we find the error_mark_node, we know that the value of
814 size_directive_output was set
815 by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
816
817#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
818do { \
819 char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
820 if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
821 && ! AT_END && TOP_LEVEL \
822 && DECL_INITIAL (DECL) == error_mark_node \
823 && !size_directive_output) \
824 { \
8b2e2b2f 825 size_directive_output = 1; \
a35f176b
RS
826 fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
827 assemble_name (FILE, name); \
634f516f 828 putc (',', FILE); \
6862dfac
JL
829 fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
830 int_size_in_bytes (TREE_TYPE (DECL))); \
831 fputc ('\n', FILE); \
a35f176b
RS
832 } \
833 } while (0)
834
2a2ab3f9
JVA
835/* This is how to declare the size of a function. */
836
837#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
838 do { \
839 if (!flag_inhibit_size_directive) \
840 { \
841 char label[256]; \
842 static int labelno; \
843 labelno++; \
844 ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
845 ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
b3865ca9 846 fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
2a2ab3f9
JVA
847 assemble_name (FILE, (FNAME)); \
848 fprintf (FILE, ","); \
849 assemble_name (FILE, label); \
850 fprintf (FILE, "-"); \
252043ee 851 assemble_name (FILE, (FNAME)); \
2a2ab3f9
JVA
852 putc ('\n', FILE); \
853 } \
854 } while (0)
855
856/* A table of bytes codes used by the ASM_OUTPUT_ASCII and
857 ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
858 corresponds to a particular byte value [0..255]. For any
859 given byte value, if the value in the corresponding table
860 position is zero, the given character can be output directly.
861 If the table value is 1, the byte must be output as a \ooo
862 octal escape. If the tables value is anything else, then the
863 byte value should be output as a \ followed by the value
864 in the table. Note that we can use standard UN*X escape
865 sequences for many control characters, but we don't use
866 \a to represent BEL because some svr4 assemblers (e.g. on
cfb8776e
MM
867 the i386) don't know about that. Also, we don't use \v
868 since some versions of gas, such as 2.2 did not accept it. */
2a2ab3f9
JVA
869
870#define ESCAPES \
cfb8776e 871"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
2a2ab3f9
JVA
872\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
873\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
874\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
875\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
876\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
877\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
878\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
879
880/* Some svr4 assemblers have a limit on the number of characters which
881 can appear in the operand of a .string directive. If your assembler
882 has such a limitation, you should define STRING_LIMIT to reflect that
883 limit. Note that at least some svr4 assemblers have a limit on the
884 actual number of bytes in the double-quoted string, and that they
b4ac57ab 885 count each character in an escape sequence as one byte. Thus, an
2a2ab3f9
JVA
886 escape sequence like \377 would count as four bytes.
887
888 If your target assembler doesn't support the .string directive, you
889 should define this to zero.
890*/
891
892#define STRING_LIMIT ((unsigned) 256)
893
894#define STRING_ASM_OP ".string"
895
896/* The routine used to output NUL terminated strings. We use a special
897 version of this for most svr4 targets because doing so makes the
898 generated assembly code more compact (and thus faster to assemble)
899 as well as more readable, especially for targets like the i386
900 (where the only alternative is to output character sequences as
901 comma separated lists of numbers). */
902
903#define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \
904 do \
905 { \
906 register unsigned char *_limited_str = (unsigned char *) (STR); \
907 register unsigned ch; \
908 fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \
9870475c 909 for (; (ch = *_limited_str); _limited_str++) \
2a2ab3f9
JVA
910 { \
911 register int escape; \
912 switch (escape = ESCAPES[ch]) \
913 { \
914 case 0: \
915 putc (ch, (FILE)); \
916 break; \
917 case 1: \
918 fprintf ((FILE), "\\%03o", ch); \
919 break; \
920 default: \
921 putc ('\\', (FILE)); \
922 putc (escape, (FILE)); \
923 break; \
924 } \
925 } \
926 fprintf ((FILE), "\"\n"); \
927 } \
928 while (0)
929
930/* The routine used to output sequences of byte values. We use a special
931 version of this for most svr4 targets because doing so makes the
932 generated assembly code more compact (and thus faster to assemble)
933 as well as more readable. Note that if we find subparts of the
934 character sequence which end with NUL (and which are shorter than
935 STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */
936
937#undef ASM_OUTPUT_ASCII
938#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \
939 do \
940 { \
941 register unsigned char *_ascii_bytes = (unsigned char *) (STR); \
942 register unsigned char *limit = _ascii_bytes + (LENGTH); \
943 register unsigned bytes_in_chunk = 0; \
944 for (; _ascii_bytes < limit; _ascii_bytes++) \
945 { \
946 register unsigned char *p; \
947 if (bytes_in_chunk >= 60) \
948 { \
949 fprintf ((FILE), "\"\n"); \
950 bytes_in_chunk = 0; \
951 } \
952 for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \
953 continue; \
df4f7565 954 if (p < limit && (p - _ascii_bytes) <= (long)STRING_LIMIT) \
2a2ab3f9
JVA
955 { \
956 if (bytes_in_chunk > 0) \
957 { \
958 fprintf ((FILE), "\"\n"); \
959 bytes_in_chunk = 0; \
960 } \
961 ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \
962 _ascii_bytes = p; \
963 } \
964 else \
965 { \
966 register int escape; \
967 register unsigned ch; \
968 if (bytes_in_chunk == 0) \
969 fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP); \
970 switch (escape = ESCAPES[ch = *_ascii_bytes]) \
971 { \
972 case 0: \
973 putc (ch, (FILE)); \
974 bytes_in_chunk++; \
975 break; \
976 case 1: \
977 fprintf ((FILE), "\\%03o", ch); \
978 bytes_in_chunk += 4; \
979 break; \
980 default: \
981 putc ('\\', (FILE)); \
982 putc (escape, (FILE)); \
983 bytes_in_chunk += 2; \
984 break; \
985 } \
986 } \
987 } \
988 if (bytes_in_chunk > 0) \
989 fprintf ((FILE), "\"\n"); \
990 } \
991 while (0)
68d69835
JM
992
993/* All SVR4 targets use the ELF object file format. */
994#define OBJECT_FORMAT_ELF
This page took 0.632802 seconds and 5 git commands to generate.