OSDN Git Service

d196008f829f21429cc2cd40335ed89d08c2aac6
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / svr3gas.h
1 /* Definitions for Intel 386 running system V, using gas.
2    Copyright (C) 1992, 1996, 2000 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     "\t.section\t.init"
109 #define FINI_SECTION_ASM_OP     "\t.section .fini,\"x\""
110 #define CONST_SECTION_ASM_OP    "\t.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, "%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, "%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   if (!USE_CONST_SECTION)                                               \
182     text_section();                                                     \
183   else if (in_section != in_const)                                      \
184     {                                                                   \
185       fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);             \
186       in_section = in_const;                                            \
187     }                                                                   \
188 }
189
190 /* The ctors and dtors sections are not normally put into use 
191    by EXTRA_SECTIONS and EXTRA_SECTION_FUNCTIONS as defined in svr3.h,
192    but it can't hurt to define these macros for whatever systems use them.  */
193 #define CTORS_SECTION_FUNCTION                                          \
194 void                                                                    \
195 ctors_section ()                                                        \
196 {                                                                       \
197   if (in_section != in_ctors)                                           \
198     {                                                                   \
199       fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);             \
200       in_section = in_ctors;                                            \
201     }                                                                   \
202 }
203
204 #define DTORS_SECTION_FUNCTION                                          \
205 void                                                                    \
206 dtors_section ()                                                        \
207 {                                                                       \
208   if (in_section != in_dtors)                                           \
209     {                                                                   \
210       fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);             \
211       in_section = in_dtors;                                            \
212     }                                                                   \
213 }
214
215 /* This is machine-dependent
216    because it needs to push something on the stack.  */
217 #undef ASM_OUTPUT_CONSTRUCTOR
218
219 /* A C statement (sans semicolon) to output an element in the table of
220    global destructors.  */
221 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                                \
222   do {                                                                  \
223     fini_section ();                                            \
224     fprintf (FILE, "%s\t ", ASM_LONG);                                  \
225     assemble_name (FILE, NAME);                                         \
226     fprintf (FILE, "\n");                                               \
227   } while (0)
228
229 /* A C statement or statements to switch to the appropriate
230    section for output of DECL.  DECL is either a `VAR_DECL' node
231    or a constant of some sort.  RELOC indicates whether forming
232    the initial value of DECL requires link-time relocations.  */
233
234 #define SELECT_SECTION(DECL,RELOC)                                      \
235 {                                                                       \
236   if (TREE_CODE (DECL) == STRING_CST)                                   \
237     {                                                                   \
238       if (! flag_writable_strings)                                      \
239         const_section ();                                               \
240       else                                                              \
241         data_section ();                                                \
242     }                                                                   \
243   else if (TREE_CODE (DECL) == VAR_DECL)                                \
244     {                                                                   \
245       if ((0 && RELOC)  /* should be (flag_pic && RELOC) */             \
246           || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)          \
247           || !DECL_INITIAL (DECL)                                       \
248           || (DECL_INITIAL (DECL) != error_mark_node                    \
249               && !TREE_CONSTANT (DECL_INITIAL (DECL))))                 \
250         data_section ();                                                \
251       else                                                              \
252         const_section ();                                               \
253     }                                                                   \
254   else                                                                  \
255     const_section ();                                                   \
256 }
257
258 /* A C statement or statements to switch to the appropriate
259    section for output of RTX in mode MODE.  RTX is some kind
260    of constant in RTL.  The argument MODE is redundant except
261    in the case of a `const_int' rtx.  Currently, these always
262    go into the const section.  */
263
264 #define SELECT_RTX_SECTION(MODE,RTX) const_section()
265 \f
266 /* This is copied from i386/sysv3.h.  */
267
268 /* Define a few machine-specific details of the implementation of
269    constructors.
270
271    The __CTORS_LIST__ goes in the .init section.  Define CTOR_LIST_BEGIN
272    and CTOR_LIST_END to contribute to the .init section an instruction to
273    push a word containing 0 (or some equivalent of that).
274
275    ASM_OUTPUT_CONSTRUCTOR should be defined to push the address of the
276    constructor.  */
277
278 #undef INIT_SECTION_ASM_OP
279 #define INIT_SECTION_ASM_OP     "\t.section .init,\"x\""
280
281 #define CTOR_LIST_BEGIN                         \
282   asm (INIT_SECTION_ASM_OP);                    \
283   asm ("pushl $0")
284 #define CTOR_LIST_END CTOR_LIST_BEGIN
285
286 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)       \
287   do {                                          \
288     init_section ();                            \
289     fprintf (FILE, "\tpushl $");                \
290     assemble_name (FILE, NAME);                 \
291     fprintf (FILE, "\n");                       \
292   } while (0)