OSDN Git Service

* c-cppbuiltin.c (TARGET_OS_CPP_BUILTINS, TARGET_OBJFMT_CPP_BUILTINS):
[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 && SIZE <= mips_section_threshold)               \
50     sbss_section ();                                            \
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 #define TARGET_ASM_UNIQUE_SECTION  mips_unique_section
82
83 /* A list of other sections which the compiler might be "in" at any
84    given time.  */
85 #undef EXTRA_SECTIONS
86 #define EXTRA_SECTIONS in_sdata, in_sbss
87
88 #undef EXTRA_SECTION_FUNCTIONS
89 #define EXTRA_SECTION_FUNCTIONS                                         \
90   SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP) \
91   SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP)
92
93 #define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP)                 \
94 void FN ()                                                      \
95 {                                                               \
96   if (in_section != ENUM)                                       \
97     {                                                           \
98       fprintf (asm_out_file, "%s\n", OP);                       \
99       in_section = ENUM;                                        \
100     }                                                           \
101 }
102
103 #undef TARGET_VERSION
104 #if TARGET_ENDIAN_DEFAULT == 0
105 #define TARGET_VERSION fprintf (stderr, " (MIPSel GNU/Linux with ELF)");
106 #else
107 #define TARGET_VERSION fprintf (stderr, " (MIPS GNU/Linux with ELF)");
108 #endif
109
110 #undef MD_EXEC_PREFIX
111 #undef MD_STARTFILE_PREFIX
112
113 /* Required to keep collect2.c happy */
114 #undef OBJECT_FORMAT_COFF
115
116 /* If we don't set MASK_ABICALLS, we can't default to PIC.  */
117 #undef TARGET_DEFAULT
118 #define TARGET_DEFAULT (MASK_ABICALLS|MASK_GAS)
119
120 #define TARGET_OS_CPP_BUILTINS()                                \
121     do {                                                        \
122         builtin_define ("__gnu_linux__");                       \
123         builtin_define ("__PIC__");                             \
124         builtin_define ("__pic__");                             \
125         builtin_define_std ("unix");                            \
126         builtin_define_std ("linux");                           \
127         builtin_assert ("system=linux");                        \
128         /* The GNU C++ standard library requires this.  */      \
129         if (c_language == clk_cplusplus)                        \
130           builtin_define ("_GNU_SOURCE");                       \
131                                                                 \
132       if (mips_abi == ABI_N32)                                  \
133       {                                                         \
134         builtin_define ("_ABIN32=2");                           \
135         builtin_define ("_MIPS_SIM=_ABIN32");                   \
136         builtin_define ("_MIPS_SZLONG=32");                     \
137         builtin_define ("_MIPS_SZPTR=32");                      \
138       }                                                         \
139      else if (mips_abi == ABI_64)                               \
140       {                                                         \
141         builtin_define ("_ABI64=3");                            \
142         builtin_define ("_MIPS_SIM=_ABI64");                    \
143         builtin_define ("_MIPS_SZLONG=64");                     \
144         builtin_define ("_MIPS_SZPTR=64");                      \
145       }                                                         \
146      else                                                       \
147       {                                                         \
148         builtin_define ("_MIPS_SIM=_MIPS_SIM_ABI32");           \
149         builtin_define ("_MIPS_SZLONG=32");                     \
150         builtin_define ("_MIPS_SZPTR=32");                      \
151       }                                                         \
152      if (TARGET_FLOAT64)                                        \
153         builtin_define ("_MIPS_FPSET=32");                      \
154      else                                                       \
155         builtin_define ("_MIPS_FPSET=16");                      \
156                                                                 \
157      if (TARGET_INT64)                                          \
158         builtin_define ("_MIPS_SZINT=64");                      \
159      else                                                       \
160         builtin_define ("_MIPS_SZINT=32");                      \
161 } while (0)
162
163 #undef  SUBTARGET_CPP_SPEC
164 #define SUBTARGET_CPP_SPEC "\
165 %{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} \
166 %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} \
167 %{pthread:-D_REENTRANT}"
168
169 /* From iris5.h */
170 /* -G is incompatible with -KPIC which is the default, so only allow objects
171    in the small data section if the user explicitly asks for it.  */
172 #undef MIPS_DEFAULT_GVALUE
173 #define MIPS_DEFAULT_GVALUE 0
174
175 /* Borrowed from sparc/linux.h */
176 #undef LINK_SPEC
177 #define LINK_SPEC \
178  "%(endian_spec) \
179   %{shared:-shared} \
180   %{!shared: \
181     %{!ibcs: \
182       %{!static: \
183         %{rdynamic:-export-dynamic} \
184         %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
185         %{static:-static}}}"
186
187 #undef SUBTARGET_ASM_SPEC
188 #define SUBTARGET_ASM_SPEC "\
189 %{mabi=64: -64} \
190 %{!fno-PIC:%{!fno-pic:-KPIC}} \
191 %{fno-PIC:-non_shared} %{fno-pic:-non_shared}"
192
193 #undef  SUBTARGET_ASM_DEBUGGING_SPEC
194 #define SUBTARGET_ASM_DEBUGGING_SPEC "-g0"
195
196 /* The MIPS assembler has different syntax for .set. We set it to
197    .dummy to trap any errors.  */
198 #undef SET_ASM_OP
199 #define SET_ASM_OP "\t.dummy\t"
200
201 #undef ASM_OUTPUT_DEF
202 #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)                              \
203  do {                                                                   \
204         fputc ( '\t', FILE);                                            \
205         assemble_name (FILE, LABEL1);                                   \
206         fputs ( " = ", FILE);                                           \
207         assemble_name (FILE, LABEL2);                                   \
208         fputc ( '\n', FILE);                                            \
209  } while (0)
210
211 #undef ASM_DECLARE_FUNCTION_NAME
212 #define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL)                   \
213   do {                                                                  \
214     if (!flag_inhibit_size_directive)                                   \
215       {                                                                 \
216         fputs ("\t.ent\t", STREAM);                                     \
217         assemble_name (STREAM, NAME);                                   \
218         putc ('\n', STREAM);                                            \
219       }                                                                 \
220     ASM_OUTPUT_TYPE_DIRECTIVE (STREAM, NAME, "function");               \
221     assemble_name (STREAM, NAME);                                       \
222     fputs (":\n", STREAM);                                              \
223   } while (0)
224
225 #undef ASM_DECLARE_FUNCTION_SIZE
226 #define ASM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL)                   \
227   do {                                                                  \
228     if (!flag_inhibit_size_directive)                                   \
229       {                                                                 \
230         fputs ("\t.end\t", STREAM);                                     \
231         assemble_name (STREAM, NAME);                                   \
232         putc ('\n', STREAM);                                            \
233       }                                                                 \
234   } while (0)
235
236 /* Tell function_prologue in mips.c that we have already output the .ent/.end
237    pseudo-ops.  */
238 #define FUNCTION_NAME_ALREADY_DECLARED
239
240 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL)                      \
241   (flag_pic                                                             \
242     ? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
243    : DW_EH_PE_absptr)
244
245 /* The glibc _mcount stub will save $v0 for us.  Don't mess with saving
246    it, since ASM_OUTPUT_REG_PUSH/ASM_OUTPUT_REG_POP do not work in the
247    presence of $gp-relative calls.  */
248 #undef ASM_OUTPUT_REG_PUSH
249 #undef ASM_OUTPUT_REG_POP
250
251 /* The current Linux binutils uses MIPS_STABS_ELF and doesn't support
252    COFF.  */
253 #undef SDB_DEBUGGING_INFO
254
255 #undef LIB_SPEC
256 #define LIB_SPEC "\
257 %{!static:-rpath-link %R/lib:%R/usr/lib} \
258 %{!shared: %{pthread:-lthread} \
259   %{profile:-lc_p} %{!profile: -lc}}"