Initial import from FreeBSD RELENG_4:
[games.git] / contrib / gcc / config / i386 / svr3gas.h
1 /* Definitions for Intel 386 running system V, using gas.
2    Copyright (C) 1992, 1996 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 "i386/gas.h"
22
23 /* Add stuff that normally comes from i386/sysv3.h */
24
25 /* longjmp may fail to restore the registers if called from the same
26    function that called setjmp.  To compensate, the compiler avoids
27    putting variables in registers in functions that use both setjmp
28    and longjmp.  */
29
30 #define NON_SAVING_SETJMP \
31   (current_function_calls_setjmp && current_function_calls_longjmp)
32
33 /* longjmp may fail to restore the stack pointer if the saved frame
34    pointer is the same as the caller's frame pointer.  Requiring a frame
35    pointer in any function that calls setjmp or longjmp avoids this
36    problem, unless setjmp and longjmp are called from the same function.
37    Since a frame pointer will be required in such a function, it is OK
38    that the stack pointer is not restored.  */
39
40 #undef FRAME_POINTER_REQUIRED
41 #define FRAME_POINTER_REQUIRED \
42   (current_function_calls_setjmp || current_function_calls_longjmp)
43
44 /* Modify ASM_OUTPUT_LOCAL slightly to test -msvr3-shlib, adapted to gas  */
45 #undef ASM_OUTPUT_LOCAL
46 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)     \
47   do {                                                  \
48     int align = exact_log2 (ROUNDED);                   \
49     if (align > 2) align = 2;                           \
50     if (TARGET_SVR3_SHLIB)                              \
51       {                                                 \
52         data_section ();                                \
53         ASM_OUTPUT_ALIGN ((FILE), align == -1 ? 2 : align); \
54         ASM_OUTPUT_LABEL ((FILE), (NAME));              \
55         fprintf ((FILE), "\t.set .,.+%u\n", (ROUNDED)); \
56       }                                                 \
57     else                                                \
58       {                                                 \
59         fputs (".lcomm ", (FILE));                      \
60         assemble_name ((FILE), (NAME));                 \
61         fprintf ((FILE), ",%u\n", (ROUNDED));           \
62       }                                                 \
63   } while (0)
64
65 /* Add stuff that normally comes from i386/sysv3.h via svr3.h */
66
67 /* Define the actual types of some ANSI-mandated types.  These
68    definitions should work for most SVR3 systems.  */
69
70 #undef SIZE_TYPE
71 #define SIZE_TYPE "unsigned int"
72
73 #undef PTRDIFF_TYPE
74 #define PTRDIFF_TYPE "int"
75
76 #undef WCHAR_TYPE
77 #define WCHAR_TYPE "long int"
78
79 #undef WCHAR_TYPE_SIZE
80 #define WCHAR_TYPE_SIZE BITS_PER_WORD
81 \f
82 /* ??? This stuff is copied from config/svr3.h.  In the future,
83    this file should be rewritten to include config/svr3.h
84    and override what isn't right.  */
85
86 /* Support const sections and the ctors and dtors sections for g++.
87    Note that there appears to be two different ways to support const
88    sections at the moment.  You can either #define the symbol
89    READONLY_DATA_SECTION (giving it some code which switches to the
90    readonly data section) or else you can #define the symbols
91    EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
92    SELECT_RTX_SECTION.  We do both here just to be on the safe side.
93    However, use of the const section is turned off by default
94    unless the specific tm.h file turns it on by defining
95    USE_CONST_SECTION as 1.  */
96
97 /* Define a few machine-specific details of the implementation of
98    constructors.
99
100    The __CTORS_LIST__ goes in the .init section.  Define CTOR_LIST_BEGIN
101    and CTOR_LIST_END to contribute to the .init section an instruction to
102    push a word containing 0 (or some equivalent of that).
103
104    Define ASM_OUTPUT_CONSTRUCTOR to push the address of the constructor.  */
105
106 #define USE_CONST_SECTION       0
107
108 #define INIT_SECTION_ASM_OP     ".section\t.init"
109 #define FINI_SECTION_ASM_OP     ".section .fini,\"x\""
110 #define CONST_SECTION_ASM_OP    ".section\t.rodata, \"x\""
111 #define CTORS_SECTION_ASM_OP    INIT_SECTION_ASM_OP
112 #define DTORS_SECTION_ASM_OP    FINI_SECTION_ASM_OP
113
114 /* CTOR_LIST_BEGIN and CTOR_LIST_END are machine-dependent
115    because they push on the stack.  */
116
117 #ifdef STACK_GROWS_DOWNWARD
118
119 /* Constructor list on stack is in reverse order.  Go to the end of the
120    list and go backwards to call constructors in the right order.  */
121 #define DO_GLOBAL_CTORS_BODY                                    \
122 do {                                                            \
123   func_ptr *p, *beg = alloca (0);                               \
124   for (p = beg; *p; p++)                                        \
125     ;                                                           \
126   while (p != beg)                                              \
127     (*--p) ();                                                  \
128 } while (0)
129
130 #else
131
132 /* Constructor list on stack is in correct order.  Just call them.  */
133 #define DO_GLOBAL_CTORS_BODY                                    \
134 do {                                                            \
135   func_ptr *p, *beg = alloca (0);                               \
136   for (p = beg; *p; )                                           \
137     (*p++) ();                                                  \
138 } while (0)
139
140 #endif /* STACK_GROWS_DOWNWARD */
141
142 /* Add extra sections .rodata, .init and .fini.  */
143
144 #undef EXTRA_SECTIONS
145 #define EXTRA_SECTIONS in_const, in_init, in_fini
146
147 #undef EXTRA_SECTION_FUNCTIONS
148 #define EXTRA_SECTION_FUNCTIONS                                 \
149   CONST_SECTION_FUNCTION                                        \
150   INIT_SECTION_FUNCTION                                         \
151   FINI_SECTION_FUNCTION
152
153 #define INIT_SECTION_FUNCTION                                   \
154 void                                                            \
155 init_section ()                                                 \
156 {                                                               \
157   if (in_section != in_init)                                    \
158     {                                                           \
159       fprintf (asm_out_file, "\t%s\n", INIT_SECTION_ASM_OP);    \
160       in_section = in_init;                                     \
161     }                                                           \
162 }
163
164 #define FINI_SECTION_FUNCTION                                   \
165 void                                                            \
166 fini_section ()                                                 \
167 {                                                               \
168   if (in_section != in_fini)                                    \
169     {                                                           \
170       fprintf (asm_out_file, "\t%s\n", FINI_SECTION_ASM_OP);    \
171       in_section = in_fini;                                     \
172     }                                                           \
173 }
174
175 #define READONLY_DATA_SECTION() const_section ()
176
177 #define CONST_SECTION_FUNCTION                                          \
178 void                                                                    \
179 const_section ()                                                        \
180 {                                                                       \
181   extern void text_section();                                           \
182   if (!USE_CONST_SECTION)                                               \
183     text_section();                                                     \
184   else if (in_section != in_const)                                      \
185     {                                                                   \
186       fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);             \
187       in_section = in_const;                                            \
188     }                                                                   \
189 }
190
191 /* The ctors and dtors sections are not normally put into use 
192    by EXTRA_SECTIONS and EXTRA_SECTION_FUNCTIONS as defined in svr3.h,
193    but it can't hurt to define these macros for whatever systems use them.  */
194 #define CTORS_SECTION_FUNCTION                                          \
195 void                                                                    \
196 ctors_section ()                                                        \
197 {                                                                       \
198   if (in_section != in_ctors)                                           \
199     {                                                                   \
200       fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);             \
201       in_section = in_ctors;                                            \
202     }                                                                   \
203 }
204
205 #define DTORS_SECTION_FUNCTION                                          \
206 void                                                                    \
207 dtors_section ()                                                        \
208 {                                                                       \
209   if (in_section != in_dtors)                                           \
210     {                                                                   \
211       fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);             \
212       in_section = in_dtors;                                            \
213     }                                                                   \
214 }
215
216 /* This is machine-dependent
217    because it needs to push something on the stack.  */
218 #undef ASM_OUTPUT_CONSTRUCTOR
219
220 /* A C statement (sans semicolon) to output an element in the table of
221    global destructors.  */
222 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                                \
223   do {                                                                  \
224     fini_section ();                                            \
225     fprintf (FILE, "%s\t ", ASM_LONG);                                  \
226     assemble_name (FILE, NAME);                                         \
227     fprintf (FILE, "\n");                                               \
228   } while (0)
229
230 /* A C statement or statements to switch to the appropriate
231    section for output of DECL.  DECL is either a `VAR_DECL' node
232    or a constant of some sort.  RELOC indicates whether forming
233    the initial value of DECL requires link-time relocations.  */
234
235 #define SELECT_SECTION(DECL,RELOC)                                      \
236 {                                                                       \
237   if (TREE_CODE (DECL) == STRING_CST)                                   \
238     {                                                                   \
239       if (! flag_writable_strings)                                      \
240         const_section ();                                               \
241       else                                                              \
242         data_section ();                                                \
243     }                                                                   \
244   else if (TREE_CODE (DECL) == VAR_DECL)                                \
245     {                                                                   \
246       if ((0 && RELOC)  /* should be (flag_pic && RELOC) */             \
247           || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)          \
248           || !DECL_INITIAL (DECL)                                       \
249           || (DECL_INITIAL (DECL) != error_mark_node                    \
250               && !TREE_CONSTANT (DECL_INITIAL (DECL))))                 \
251         data_section ();                                                \
252       else                                                              \
253         const_section ();                                               \
254     }                                                                   \
255   else                                                                  \
256     const_section ();                                                   \
257 }
258
259 /* A C statement or statements to switch to the appropriate
260    section for output of RTX in mode MODE.  RTX is some kind
261    of constant in RTL.  The argument MODE is redundant except
262    in the case of a `const_int' rtx.  Currently, these always
263    go into the const section.  */
264
265 #define SELECT_RTX_SECTION(MODE,RTX) const_section()
266 \f
267 /* This is copied from i386/sysv3.h.  */
268
269 /* Define a few machine-specific details of the implementation of
270    constructors.
271
272    The __CTORS_LIST__ goes in the .init section.  Define CTOR_LIST_BEGIN
273    and CTOR_LIST_END to contribute to the .init section an instruction to
274    push a word containing 0 (or some equivalent of that).
275
276    ASM_OUTPUT_CONSTRUCTOR should be defined to push the address of the
277    constructor.  */
278
279 #undef INIT_SECTION_ASM_OP
280 #define INIT_SECTION_ASM_OP     ".section .init,\"x\""
281
282 #define CTOR_LIST_BEGIN                         \
283   asm (INIT_SECTION_ASM_OP);                    \
284   asm ("pushl $0")
285 #define CTOR_LIST_END CTOR_LIST_BEGIN
286
287 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)       \
288   do {                                          \
289     init_section ();                            \
290     fprintf (FILE, "\tpushl $");                \
291     assemble_name (FILE, NAME);                 \
292     fprintf (FILE, "\n");                       \
293   } while (0)