OSDN Git Service

* config/mips/elf64.h (TARGET_ASM_UNIQUE_SECTION): Delete.
[pf3gnuchains/gcc-fork.git] / gcc / config / mips / linux.h
1 /* Definitions for MIPS running Linux-based GNU systems with ELF format.
2    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
3    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 #undef WCHAR_TYPE
23 #define WCHAR_TYPE "int"
24
25 #undef WCHAR_TYPE_SIZE
26 #define WCHAR_TYPE_SIZE 32
27
28 /* If defined, a C expression whose value is a string containing the
29    assembler operation to identify the following data as
30    uninitialized global data.  If not defined, and neither
31    `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
32    uninitialized global data will be output in the data section if
33    `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
34    used.  */
35 #define BSS_SECTION_ASM_OP      "\t.section\t.bss"
36
37 #define SBSS_SECTION_ASM_OP     "\t.section .sbss"
38
39 /* Like `ASM_OUTPUT_BSS' except takes the required alignment as a
40    separate, explicit argument.  If you define this macro, it is used
41    in place of `ASM_OUTPUT_BSS', and gives you more flexibility in
42    handling the required alignment of the variable.  The alignment is
43    specified as the number of bits.
44
45    Try to use function `asm_output_aligned_bss' defined in file
46    `varasm.c' when defining this macro.  */
47 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)   \
48 do {                                                            \
49   if (SIZE > 0 && (long)(SIZE) <= mips_section_threshold)       \
50     named_section (0, ".sbss", 0);                              \
51   else                                                          \
52     bss_section ();                                             \
53   ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT));  \
54   last_assemble_variable_decl = DECL;                           \
55   ASM_DECLARE_OBJECT_NAME (FILE, NAME, DECL);                   \
56   ASM_OUTPUT_SKIP (FILE, SIZE ? SIZE : 1);                      \
57 } while (0)
58
59 /* These macros generate the special .type and .size directives which
60    are used to set the corresponding fields of the linker symbol table
61    entries in an ELF object file under SVR4.  These macros also output
62    the starting labels for the relevant functions/objects.  */
63
64 /* Write the extra assembler code needed to declare an object properly.  */
65
66 #undef ASM_DECLARE_OBJECT_NAME
67 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
68   do {                                                                  \
69     HOST_WIDE_INT size;                                                 \
70     ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");                   \
71     size_directive_output = 0;                                          \
72     if (!flag_inhibit_size_directive && DECL_SIZE (DECL))               \
73       {                                                                 \
74         size_directive_output = 1;                                      \
75         size = int_size_in_bytes (TREE_TYPE (DECL));                    \
76         ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size);                   \
77       }                                                                 \
78     mips_declare_object (FILE, NAME, "", ":\n", 0);                     \
79   } while (0)
80
81 #undef TARGET_VERSION
82 #if TARGET_ENDIAN_DEFAULT == 0
83 #define TARGET_VERSION fprintf (stderr, " (MIPSel GNU/Linux with ELF)");
84 #else
85 #define TARGET_VERSION fprintf (stderr, " (MIPS GNU/Linux with ELF)");
86 #endif
87
88 #undef MD_EXEC_PREFIX
89 #undef MD_STARTFILE_PREFIX
90
91 /* Required to keep collect2.c happy */
92 #undef OBJECT_FORMAT_COFF
93
94 /* If we don't set MASK_ABICALLS, we can't default to PIC.  */
95 #undef TARGET_DEFAULT
96 #define TARGET_DEFAULT (MASK_ABICALLS|MASK_GAS)
97
98 #define TARGET_OS_CPP_BUILTINS()                                \
99     do {                                                        \
100         builtin_define ("__gnu_linux__");                       \
101         builtin_define ("__PIC__");                             \
102         builtin_define ("__pic__");                             \
103         builtin_define_std ("unix");                            \
104         builtin_define_std ("linux");                           \
105         builtin_assert ("system=linux");                        \
106         /* The GNU C++ standard library requires this.  */      \
107         if (c_dialect_cxx ())                                   \
108           builtin_define ("_GNU_SOURCE");                       \
109                                                                 \
110       if (mips_abi == ABI_N32)                                  \
111       {                                                         \
112         builtin_define ("_ABIN32=2");                           \
113         builtin_define ("_MIPS_SIM=_ABIN32");                   \
114         builtin_define ("_MIPS_SZLONG=32");                     \
115         builtin_define ("_MIPS_SZPTR=32");                      \
116       }                                                         \
117      else if (mips_abi == ABI_64)                               \
118       {                                                         \
119         builtin_define ("_ABI64=3");                            \
120         builtin_define ("_MIPS_SIM=_ABI64");                    \
121         builtin_define ("_MIPS_SZLONG=64");                     \
122         builtin_define ("_MIPS_SZPTR=64");                      \
123       }                                                         \
124      else                                                       \
125       {                                                         \
126         builtin_define ("_MIPS_SIM=_MIPS_SIM_ABI32");           \
127         builtin_define ("_MIPS_SZLONG=32");                     \
128         builtin_define ("_MIPS_SZPTR=32");                      \
129       }                                                         \
130      if (TARGET_FLOAT64)                                        \
131         builtin_define ("_MIPS_FPSET=32");                      \
132      else                                                       \
133         builtin_define ("_MIPS_FPSET=16");                      \
134                                                                 \
135      if (TARGET_INT64)                                          \
136         builtin_define ("_MIPS_SZINT=64");                      \
137      else                                                       \
138         builtin_define ("_MIPS_SZINT=32");                      \
139 } while (0)
140
141 #undef  SUBTARGET_CPP_SPEC
142 #define SUBTARGET_CPP_SPEC "\
143 %{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} \
144 %{fPIC|fPIE|fpic|fpie:-D__PIC__ -D__pic__} \
145 %{pthread:-D_REENTRANT}"
146
147 /* From iris5.h */
148 /* -G is incompatible with -KPIC which is the default, so only allow objects
149    in the small data section if the user explicitly asks for it.  */
150 #undef MIPS_DEFAULT_GVALUE
151 #define MIPS_DEFAULT_GVALUE 0
152
153 /* Borrowed from sparc/linux.h */
154 #undef LINK_SPEC
155 #define LINK_SPEC \
156  "%(endian_spec) \
157   %{shared:-shared} \
158   %{!shared: \
159     %{!ibcs: \
160       %{!static: \
161         %{rdynamic:-export-dynamic} \
162         %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
163         %{static:-static}}}"
164
165 #undef SUBTARGET_ASM_SPEC
166 #define SUBTARGET_ASM_SPEC "\
167 %{mabi=64: -64} \
168 %{!fno-PIC:%{!fno-pic:-KPIC}} \
169 %{fno-PIC:-non_shared} %{fno-pic:-non_shared}"
170
171 #undef  SUBTARGET_ASM_DEBUGGING_SPEC
172 #define SUBTARGET_ASM_DEBUGGING_SPEC "-g0"
173
174 /* The MIPS assembler has different syntax for .set. We set it to
175    .dummy to trap any errors.  */
176 #undef SET_ASM_OP
177 #define SET_ASM_OP "\t.dummy\t"
178
179 #undef ASM_OUTPUT_DEF
180 #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)                              \
181  do {                                                                   \
182         fputc ( '\t', FILE);                                            \
183         assemble_name (FILE, LABEL1);                                   \
184         fputs ( " = ", FILE);                                           \
185         assemble_name (FILE, LABEL2);                                   \
186         fputc ( '\n', FILE);                                            \
187  } while (0)
188
189 #undef ASM_DECLARE_FUNCTION_NAME
190 #define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL)                   \
191   do {                                                                  \
192     if (!flag_inhibit_size_directive)                                   \
193       {                                                                 \
194         fputs ("\t.ent\t", STREAM);                                     \
195         assemble_name (STREAM, NAME);                                   \
196         putc ('\n', STREAM);                                            \
197       }                                                                 \
198     ASM_OUTPUT_TYPE_DIRECTIVE (STREAM, NAME, "function");               \
199     assemble_name (STREAM, NAME);                                       \
200     fputs (":\n", STREAM);                                              \
201   } while (0)
202
203 #undef ASM_DECLARE_FUNCTION_SIZE
204 #define ASM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL)                   \
205   do {                                                                  \
206     if (!flag_inhibit_size_directive)                                   \
207       {                                                                 \
208         fputs ("\t.end\t", STREAM);                                     \
209         assemble_name (STREAM, NAME);                                   \
210         putc ('\n', STREAM);                                            \
211       }                                                                 \
212   } while (0)
213
214 /* Tell function_prologue in mips.c that we have already output the .ent/.end
215    pseudo-ops.  */
216 #define FUNCTION_NAME_ALREADY_DECLARED
217
218 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL)                      \
219   (flag_pic                                                             \
220     ? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
221    : DW_EH_PE_absptr)
222
223 /* The glibc _mcount stub will save $v0 for us.  Don't mess with saving
224    it, since ASM_OUTPUT_REG_PUSH/ASM_OUTPUT_REG_POP do not work in the
225    presence of $gp-relative calls.  */
226 #undef ASM_OUTPUT_REG_PUSH
227 #undef ASM_OUTPUT_REG_POP
228
229 /* The current Linux binutils uses MIPS_STABS_ELF and doesn't support
230    COFF.  */
231 #undef SDB_DEBUGGING_INFO
232
233 #undef LIB_SPEC
234 #define LIB_SPEC "\
235 %{shared: -lc} \
236 %{!static:-rpath-link %R/lib:%R/usr/lib} \
237 %{!shared: %{pthread:-lpthread} \
238   %{profile:-lc_p} %{!profile: -lc}}"