OSDN Git Service

* config/mips/elf.h, config/mips/elf64.h, config/mips/netbsd.h,
[pf3gnuchains/gcc-fork.git] / gcc / config / mips / elf.h
1 /* Definitions of target machine for GNU compiler.  MIPS R3000 version with
2    GOFAST floating point library.
3    Copyright (C) 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /* Use ELF.  */
23 #define OBJECT_FORMAT_ELF
24
25 /* Until we figure out what MIPS ELF targets normally use, just do
26    stabs in ELF.  */
27 #ifndef PREFERRED_DEBUGGING_TYPE
28 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
29 #endif
30
31 /* Mostly like ECOFF.  */
32 #include "gofast.h"
33 #include "mips/ecoff.h"
34
35 /* We need to use .esize and .etype instead of .size and .type to
36    avoid conflicting with ELF directives.  */
37 #undef PUT_SDB_SIZE
38 #define PUT_SDB_SIZE(a)                                 \
39 do {                                                    \
40   extern FILE *asm_out_text_file;                       \
41   fprintf (asm_out_text_file, "\t.esize\t%d;", (a));    \
42 } while (0)
43
44 #undef PUT_SDB_TYPE
45 #define PUT_SDB_TYPE(a)                                 \
46 do {                                                    \
47   extern FILE *asm_out_text_file;                       \
48   fprintf (asm_out_text_file, "\t.etype\t0x%x;", (a));  \
49 } while (0)
50
51 /* Biggest alignment supported by the object file format of this
52    machine.  Use this macro to limit the alignment which can be
53    specified using the `__attribute__ ((aligned (N)))' construct.  If
54    not defined, the default value is `BIGGEST_ALIGNMENT'.  */
55
56 #undef MAX_OFILE_ALIGNMENT
57 #define MAX_OFILE_ALIGNMENT (32768*8)
58
59 /* Switch into a generic section.  */
60 #undef TARGET_ASM_NAMED_SECTION
61 #define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
62
63 /* Given that Irix has it's own headers, not having TARGET_GAS here
64    seems a mistake.  If we actually need to be prepared for file
65    switching, then we need a custom TARGET_ASM_NAMED_SECTION too.  */
66
67 #undef TEXT_SECTION
68 #define TEXT_SECTION()                          \
69 do {                                            \
70   if (TARGET_FILE_SWITCHING)                    \
71     abort ();                                   \
72   fputs (TEXT_SECTION_ASM_OP, asm_out_file);    \
73   fputc ('\n', asm_out_file);                   \
74 } while (0)
75
76 /* The following macro defines the format used to output the second
77    operand of the .type assembler directive.  Different svr4 assemblers
78    expect various different forms for this operand.  The one given here
79    is just a default.  You may need to override it in your machine-
80    specific tm.h file (depending upon the particulars of your assembler).  */
81
82 #define TYPE_OPERAND_FMT        "@%s"
83
84 /* Define the strings used for the special svr4 .type and .size directives.
85    These strings generally do not vary from one system running svr4 to
86    another, but if a given system (e.g. m88k running svr) needs to use
87    different pseudo-op names for these, they may be overridden in the
88    file which includes this one.  */
89
90 #undef TYPE_ASM_OP
91 #undef SIZE_ASM_OP
92 #define TYPE_ASM_OP     "\t.type\t"
93 #define SIZE_ASM_OP     "\t.size\t"
94
95 /* If defined, a C expression whose value is a string containing the
96    assembler operation to identify the following data as
97    uninitialized global data.  If not defined, and neither
98    `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
99    uninitialized global data will be output in the data section if
100    `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
101    used.  */
102 #ifndef BSS_SECTION_ASM_OP
103 #define BSS_SECTION_ASM_OP      "\t.section\t.bss"
104 #endif
105
106 #define SBSS_SECTION_ASM_OP     "\t.section .sbss"
107
108 /* Like `ASM_OUTPUT_BSS' except takes the required alignment as a
109    separate, explicit argument.  If you define this macro, it is used
110    in place of `ASM_OUTPUT_BSS', and gives you more flexibility in
111    handling the required alignment of the variable.  The alignment is
112    specified as the number of bits.
113
114    Try to use function `asm_output_aligned_bss' defined in file
115    `varasm.c' when defining this macro. */
116 #ifndef ASM_OUTPUT_ALIGNED_BSS
117 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
118 do {                                                                    \
119   ASM_GLOBALIZE_LABEL (FILE, NAME);                                     \
120   if (SIZE > 0 && SIZE <= mips_section_threshold)                       \
121     sbss_section ();                                                    \
122   else                                                                  \
123     bss_section ();                                                     \
124   ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT));          \
125   last_assemble_variable_decl = DECL;                                   \
126   ASM_DECLARE_OBJECT_NAME (FILE, NAME, DECL);                           \
127   ASM_OUTPUT_SKIP (FILE, SIZE ? SIZE : 1);                              \
128 } while (0)
129 #endif
130
131 /* These macros generate the special .type and .size directives which
132    are used to set the corresponding fields of the linker symbol table
133    entries in an ELF object file under SVR4.  These macros also output
134    the starting labels for the relevant functions/objects.  */
135
136 /* Write the extra assembler code needed to declare an object properly.  */
137
138 #undef ASM_DECLARE_OBJECT_NAME
139 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
140   do {                                                                  \
141     fprintf (FILE, "%s", TYPE_ASM_OP);                          \
142     assemble_name (FILE, NAME);                                         \
143     putc (',', FILE);                                                   \
144     fprintf (FILE, TYPE_OPERAND_FMT, "object");                         \
145     putc ('\n', FILE);                                                  \
146     size_directive_output = 0;                                          \
147     if (!flag_inhibit_size_directive && DECL_SIZE (DECL))               \
148       {                                                                 \
149         size_directive_output = 1;                                      \
150         fprintf (FILE, "%s", SIZE_ASM_OP);                              \
151         assemble_name (FILE, NAME);                                     \
152         fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
153       }                                                                 \
154     mips_declare_object (FILE, NAME, "", ":\n", 0);                     \
155   } while (0)
156
157 /* Output the size directive for a decl in rest_of_decl_compilation
158    in the case where we did not do so before the initializer.
159    Once we find the error_mark_node, we know that the value of
160    size_directive_output was set
161    by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
162
163 #undef ASM_FINISH_DECLARE_OBJECT
164 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)         \
165 do {                                                                     \
166      const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);             \
167      if (!flag_inhibit_size_directive && DECL_SIZE (DECL)                \
168          && ! AT_END && TOP_LEVEL                                        \
169          && DECL_INITIAL (DECL) == error_mark_node                       \
170          && !size_directive_output)                                      \
171        {                                                                 \
172          size_directive_output = 1;                                      \
173          fprintf (FILE, "%s", SIZE_ASM_OP);                              \
174          assemble_name (FILE, name);                                     \
175          fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL)));  \
176        }                                                                 \
177    } while (0)
178
179 #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)                            \
180  do { fputc ( '\t', FILE);                                            \
181       assemble_name (FILE, LABEL1);                                   \
182       fputs ( " = ", FILE);                                           \
183       assemble_name (FILE, LABEL2);                                   \
184       fputc ( '\n', FILE);                                            \
185  } while (0)
186
187 /* Note about .weak vs. .weakext
188    The mips native assemblers support .weakext, but not .weak.
189    mips-elf gas supports .weak, but not .weakext.
190    mips-elf gas has been changed to support both .weak and .weakext,
191    but until that support is generally available, the 'if' below
192    should serve. */
193
194 #undef ASM_WEAKEN_LABEL
195 #define ASM_WEAKEN_LABEL(FILE,NAME) ASM_OUTPUT_WEAK_ALIAS(FILE,NAME,0)
196 #define ASM_OUTPUT_WEAK_ALIAS(FILE,NAME,VALUE)  \
197  do {                                           \
198   if (TARGET_GAS)                               \
199       fputs ("\t.weak\t", FILE);                \
200   else                                          \
201       fputs ("\t.weakext\t", FILE);             \
202   assemble_name (FILE, NAME);                   \
203   if (VALUE)                                    \
204     {                                           \
205       fputc (' ', FILE);                        \
206       assemble_name (FILE, VALUE);              \
207     }                                           \
208   fputc ('\n', FILE);                           \
209  } while (0)
210
211 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
212 #undef UNIQUE_SECTION
213 #define UNIQUE_SECTION(DECL,RELOC) \
214   mips_unique_section ((DECL), (RELOC))
215
216 /* There's no point providing a default definition of __CTOR_LIST__
217    since people are expected either to use crtbegin.o, or an equivalent,
218    or provide their own definition.  */
219 #define CTOR_LISTS_DEFINED_EXTERNALLY
220
221 /* A list of other sections which the compiler might be "in" at any
222    given time.  */
223 #undef EXTRA_SECTIONS
224 #define EXTRA_SECTIONS in_sdata, in_sbss, in_rdata
225  
226 #define INVOKE__main
227
228 #undef EXTRA_SECTION_FUNCTIONS
229 #define EXTRA_SECTION_FUNCTIONS                                         \
230   SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP) \
231   SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP) \
232   SECTION_FUNCTION_TEMPLATE(rdata_section, in_rdata, RDATA_SECTION_ASM_OP)
233
234 #define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP)                               \
235 void FN ()                                                            \
236 {                                                                     \
237   if (in_section != ENUM)                                             \
238     {                                                                 \
239       fprintf (asm_out_file, "%s\n", OP);                             \
240       in_section = ENUM;                                              \
241     }                                                                 \
242 }
243
244 /* Don't set the target flags, this is done by the linker script */
245 #undef LIB_SPEC
246 #define LIB_SPEC ""
247
248 #undef  STARTFILE_SPEC
249 #define STARTFILE_SPEC "crtbegin%O%s %{!mno-crt0:crt0%O%s}"
250
251 #undef  ENDFILE_SPEC
252 #define ENDFILE_SPEC "crtend%O%s"