]>
Commit | Line | Data |
---|---|---|
800e920a | 1 | /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF. |
7a00d767 | 2 | Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008, |
3895ec53 | 3 | 2009, 2010 Free Software Foundation, Inc. |
800e920a RK |
4 | Contributed by Richard Henderson (rth@tamu.edu). |
5 | ||
7ec022b2 | 6 | This file is part of GCC. |
800e920a | 7 | |
7ec022b2 | 8 | GCC is free software; you can redistribute it and/or modify |
800e920a | 9 | it under the terms of the GNU General Public License as published by |
2f83c7d6 | 10 | the Free Software Foundation; either version 3, or (at your option) |
800e920a RK |
11 | any later version. |
12 | ||
7ec022b2 | 13 | GCC is distributed in the hope that it will be useful, |
800e920a RK |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
2f83c7d6 NC |
19 | along with GCC; see the file COPYING3. If not see |
20 | <http://www.gnu.org/licenses/>. */ | |
800e920a | 21 | |
800e920a RK |
22 | #undef OBJECT_FORMAT_COFF |
23 | #undef EXTENDED_COFF | |
24 | #define OBJECT_FORMAT_ELF | |
25 | ||
80a8aac6 RH |
26 | /* ??? Move all SDB stuff from alpha.h to osf.h. */ |
27 | #undef SDB_DEBUGGING_INFO | |
28 | ||
23532de9 JT |
29 | #define DBX_DEBUGGING_INFO 1 |
30 | #define DWARF2_DEBUGGING_INFO 1 | |
800e920a | 31 | |
d38d55b4 | 32 | #undef PREFERRED_DEBUGGING_TYPE |
48adb36e | 33 | #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG |
800e920a | 34 | |
b0435cf4 | 35 | #undef ASM_FINAL_SPEC |
800e920a | 36 | |
4e2e315f NB |
37 | /* alpha/ doesn't use elfos.h for some reason. */ |
38 | #define TARGET_OBJFMT_CPP_BUILTINS() \ | |
39 | do \ | |
40 | { \ | |
41 | builtin_define ("__ELF__"); \ | |
42 | } \ | |
43 | while (0) | |
cf0005c6 | 44 | |
d38d55b4 | 45 | #undef CC1_SPEC |
bb8ebb7f RH |
46 | #define CC1_SPEC "%{G*}" |
47 | ||
d38d55b4 | 48 | #undef ASM_SPEC |
48adb36e | 49 | #define ASM_SPEC "%{G*} %{relax:-relax} %{!gstabs*:-no-mdebug}%{gstabs*:-mdebug}" |
bb8ebb7f | 50 | |
74e5aa4b | 51 | #undef IDENT_ASM_OP |
8c13c7b3 | 52 | #define IDENT_ASM_OP "\t.ident\t" |
800e920a | 53 | |
800e920a | 54 | /* Output #ident as a .ident. */ |
94984e91 | 55 | #undef ASM_OUTPUT_IDENT |
800e920a | 56 | #define ASM_OUTPUT_IDENT(FILE, NAME) \ |
8202cda0 | 57 | fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME); |
800e920a RK |
58 | |
59 | /* This is how to allocate empty space in some section. The .zero | |
60 | pseudo-op is used for this on most svr4 assemblers. */ | |
61 | ||
74e5aa4b | 62 | #undef SKIP_ASM_OP |
8c13c7b3 | 63 | #define SKIP_ASM_OP "\t.zero\t" |
800e920a | 64 | |
d38d55b4 DB |
65 | #undef ASM_OUTPUT_SKIP |
66 | #define ASM_OUTPUT_SKIP(FILE, SIZE) \ | |
58e15542 | 67 | fprintf (FILE, "%s"HOST_WIDE_INT_PRINT_UNSIGNED"\n", SKIP_ASM_OP, (SIZE)) |
800e920a RK |
68 | |
69 | /* Output the label which precedes a jumptable. Note that for all svr4 | |
70 | systems where we actually generate jumptables (which is to say every | |
71 | svr4 target except i386, where we use casesi instead) we put the jump- | |
72 | tables into the .rodata section and since other stuff could have been | |
73 | put into the .rodata section prior to any given jumptable, we have to | |
74 | make sure that the location counter for the .rodata section gets pro- | |
75 | perly re-aligned prior to the actual beginning of the jump table. */ | |
76 | ||
74e5aa4b | 77 | #undef ALIGN_ASM_OP |
8c13c7b3 | 78 | #define ALIGN_ASM_OP "\t.align\t" |
800e920a RK |
79 | |
80 | #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL | |
d38d55b4 | 81 | #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \ |
800e920a RK |
82 | ASM_OUTPUT_ALIGN ((FILE), 2); |
83 | #endif | |
84 | ||
d38d55b4 DB |
85 | #undef ASM_OUTPUT_CASE_LABEL |
86 | #define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE) \ | |
800e920a RK |
87 | do { \ |
88 | ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \ | |
4977bab6 | 89 | (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM); \ |
800e920a RK |
90 | } while (0) |
91 | ||
92 | /* The standard SVR4 assembler seems to require that certain builtin | |
93 | library routines (e.g. .udiv) be explicitly declared as .globl | |
94 | in each assembly file where they are referenced. */ | |
95 | ||
74e5aa4b | 96 | #undef ASM_OUTPUT_EXTERNAL_LIBCALL |
800e920a | 97 | #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ |
5eb99654 | 98 | (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0)) |
800e920a RK |
99 | |
100 | /* This says how to output assembler code to declare an | |
101 | uninitialized external linkage data object. Under SVR4, | |
102 | the linker seems to want the alignment of data objects | |
103 | to depend on their types. We do exactly that here. */ | |
104 | ||
74e5aa4b | 105 | #undef COMMON_ASM_OP |
8c13c7b3 | 106 | #define COMMON_ASM_OP "\t.comm\t" |
800e920a | 107 | |
d38d55b4 | 108 | #undef ASM_OUTPUT_ALIGNED_COMMON |
800e920a RK |
109 | #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ |
110 | do { \ | |
8202cda0 | 111 | fprintf ((FILE), "%s", COMMON_ASM_OP); \ |
800e920a | 112 | assemble_name ((FILE), (NAME)); \ |
74eda121 | 113 | fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ |
800e920a RK |
114 | } while (0) |
115 | ||
116 | /* This says how to output assembler code to declare an | |
117 | uninitialized internal linkage data object. Under SVR4, | |
118 | the linker seems to want the alignment of data objects | |
119 | to depend on their types. We do exactly that here. */ | |
120 | ||
d38d55b4 | 121 | #undef ASM_OUTPUT_ALIGNED_LOCAL |
800e920a RK |
122 | #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ |
123 | do { \ | |
fa37ed29 | 124 | if ((SIZE) <= (unsigned HOST_WIDE_INT) g_switch_value) \ |
d6b5193b | 125 | switch_to_section (sbss_section); \ |
bb8ebb7f | 126 | else \ |
d6b5193b | 127 | switch_to_section (bss_section); \ |
2be2ac70 | 128 | ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ |
bb8ebb7f | 129 | if (!flag_inhibit_size_directive) \ |
2be2ac70 | 130 | ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \ |
bb8ebb7f RH |
131 | ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \ |
132 | ASM_OUTPUT_LABEL(FILE, NAME); \ | |
95bfe95f | 133 | ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \ |
800e920a RK |
134 | } while (0) |
135 | ||
3660d217 RH |
136 | /* This says how to output assembler code to declare an |
137 | uninitialized external linkage data object. */ | |
138 | ||
139 | #undef ASM_OUTPUT_ALIGNED_BSS | |
140 | #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ | |
141 | do { \ | |
3660d217 RH |
142 | ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \ |
143 | } while (0) | |
144 | ||
7a00d767 UB |
145 | /* The biggest alignment supported by ELF in bits. 32-bit ELF |
146 | supports section alignment up to (0x80000000 * 8), while | |
147 | 64-bit ELF supports (0x8000000000000000 * 8). If this macro | |
148 | is not defined, the default is the largest alignment supported | |
149 | by 32-bit ELF and representable on a 32-bit host. Use this | |
150 | macro to limit the alignment which can be specified using | |
151 | the `__attribute__ ((aligned (N)))' construct. | |
bb8ebb7f RH |
152 | |
153 | This value is really 2^63. Since gcc figures the alignment in bits, | |
093354e0 | 154 | we could only potentially get to 2^60 on suitable hosts. Due to other |
bb8ebb7f RH |
155 | considerations in varasm, we must restrict this to what fits in an int. */ |
156 | ||
74e5aa4b | 157 | #undef MAX_OFILE_ALIGNMENT |
7a00d767 | 158 | #define MAX_OFILE_ALIGNMENT (((unsigned int) 1 << 28) * 8) |
bb8ebb7f | 159 | |
800e920a RK |
160 | /* This is the pseudo-op used to generate a contiguous sequence of byte |
161 | values from a double-quoted string WITHOUT HAVING A TERMINATING NUL | |
162 | AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */ | |
163 | ||
d38d55b4 | 164 | #undef ASCII_DATA_ASM_OP |
8c13c7b3 | 165 | #define ASCII_DATA_ASM_OP "\t.ascii\t" |
800e920a | 166 | |
d48bc59a RH |
167 | #undef READONLY_DATA_SECTION_ASM_OP |
168 | #define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata" | |
74e5aa4b | 169 | #undef BSS_SECTION_ASM_OP |
8c13c7b3 | 170 | #define BSS_SECTION_ASM_OP "\t.section\t.bss" |
74e5aa4b | 171 | #undef SBSS_SECTION_ASM_OP |
8c13c7b3 | 172 | #define SBSS_SECTION_ASM_OP "\t.section\t.sbss,\"aw\"" |
74e5aa4b | 173 | #undef SDATA_SECTION_ASM_OP |
8c13c7b3 | 174 | #define SDATA_SECTION_ASM_OP "\t.section\t.sdata,\"aw\"" |
bb8ebb7f | 175 | |
800e920a RK |
176 | /* On svr4, we *do* have support for the .init and .fini sections, and we |
177 | can put stuff in there to be executed before and after `main'. We let | |
178 | crtstuff.c and other files know this by defining the following symbols. | |
179 | The definitions say how to change sections to the .init and .fini | |
180 | sections. This is the same for all known svr4 assemblers. */ | |
181 | ||
74e5aa4b | 182 | #undef INIT_SECTION_ASM_OP |
8c13c7b3 | 183 | #define INIT_SECTION_ASM_OP "\t.section\t.init" |
74e5aa4b | 184 | #undef FINI_SECTION_ASM_OP |
8c13c7b3 | 185 | #define FINI_SECTION_ASM_OP "\t.section\t.fini" |
800e920a | 186 | |
201556f0 JJ |
187 | #ifdef HAVE_GAS_SUBSECTION_ORDERING |
188 | ||
189 | #define ASM_SECTION_START_OP "\t.subsection\t-1" | |
190 | ||
191 | /* Output assembly directive to move to the beginning of current section. */ | |
192 | #define ASM_OUTPUT_SECTION_START(FILE) \ | |
193 | fprintf ((FILE), "%s\n", ASM_SECTION_START_OP) | |
194 | ||
195 | #endif | |
196 | ||
7c262518 RH |
197 | /* Switch into a generic section. */ |
198 | #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section | |
ae46c4e0 | 199 | #define TARGET_ASM_SELECT_SECTION default_elf_select_section |
ef7d91cd | 200 | |
01414194 LR |
201 | #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) |
202 | ||
800e920a RK |
203 | /* Define the strings used for the special svr4 .type and .size directives. |
204 | These strings generally do not vary from one system running svr4 to | |
205 | another, but if a given system (e.g. m88k running svr) needs to use | |
206 | different pseudo-op names for these, they may be overridden in the | |
207 | file which includes this one. */ | |
208 | ||
74e5aa4b | 209 | #undef TYPE_ASM_OP |
8c13c7b3 | 210 | #define TYPE_ASM_OP "\t.type\t" |
74e5aa4b | 211 | #undef SIZE_ASM_OP |
8c13c7b3 | 212 | #define SIZE_ASM_OP "\t.size\t" |
800e920a RK |
213 | |
214 | /* This is how we tell the assembler that a symbol is weak. */ | |
215 | ||
74e5aa4b | 216 | #undef ASM_WEAKEN_LABEL |
d38d55b4 | 217 | #define ASM_WEAKEN_LABEL(FILE, NAME) \ |
800e920a RK |
218 | do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \ |
219 | fputc ('\n', FILE); } while (0) | |
220 | ||
221 | /* This is how we tell the assembler that two symbols have the same value. */ | |
222 | ||
74e5aa4b | 223 | #undef ASM_OUTPUT_DEF |
41ba8a20 RH |
224 | #define ASM_OUTPUT_DEF(FILE, ALIAS, NAME) \ |
225 | do { \ | |
226 | assemble_name(FILE, ALIAS); \ | |
227 | fputs(" = ", FILE); \ | |
228 | assemble_name(FILE, NAME); \ | |
229 | fputc('\n', FILE); \ | |
230 | } while (0) | |
231 | ||
232 | #undef ASM_OUTPUT_DEF_FROM_DECLS | |
233 | #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \ | |
234 | do { \ | |
235 | const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ | |
236 | const char *name = IDENTIFIER_POINTER (TARGET); \ | |
237 | if (TREE_CODE (DECL) == FUNCTION_DECL) \ | |
238 | { \ | |
239 | fputc ('$', FILE); \ | |
240 | assemble_name (FILE, alias); \ | |
241 | fputs ("..ng = $", FILE); \ | |
242 | assemble_name (FILE, name); \ | |
243 | fputs ("..ng\n", FILE); \ | |
244 | } \ | |
245 | assemble_name(FILE, alias); \ | |
246 | fputs(" = ", FILE); \ | |
247 | assemble_name(FILE, name); \ | |
248 | fputc('\n', FILE); \ | |
249 | } while (0) | |
800e920a RK |
250 | |
251 | /* The following macro defines the format used to output the second | |
252 | operand of the .type assembler directive. Different svr4 assemblers | |
253 | expect various different forms for this operand. The one given here | |
254 | is just a default. You may need to override it in your machine- | |
255 | specific tm.h file (depending upon the particulars of your assembler). */ | |
256 | ||
74e5aa4b | 257 | #undef TYPE_OPERAND_FMT |
800e920a RK |
258 | #define TYPE_OPERAND_FMT "@%s" |
259 | ||
260 | /* Write the extra assembler code needed to declare a function's result. | |
261 | Most svr4 assemblers don't require any special declaration of the | |
262 | result value, but there are exceptions. */ | |
263 | ||
264 | #ifndef ASM_DECLARE_RESULT | |
265 | #define ASM_DECLARE_RESULT(FILE, RESULT) | |
266 | #endif | |
267 | ||
268 | /* These macros generate the special .type and .size directives which | |
269 | are used to set the corresponding fields of the linker symbol table | |
270 | entries in an ELF object file under SVR4. These macros also output | |
271 | the starting labels for the relevant functions/objects. */ | |
272 | ||
273 | /* Write the extra assembler code needed to declare an object properly. */ | |
274 | ||
85fac79c UB |
275 | #ifdef HAVE_GAS_GNU_UNIQUE_OBJECT |
276 | #define USE_GNU_UNIQUE_OBJECT 1 | |
277 | #else | |
278 | #define USE_GNU_UNIQUE_OBJECT 0 | |
279 | #endif | |
280 | ||
74e5aa4b | 281 | #undef ASM_DECLARE_OBJECT_NAME |
85fac79c UB |
282 | #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ |
283 | do { \ | |
284 | HOST_WIDE_INT size; \ | |
285 | \ | |
286 | /* For template static data member instantiations or \ | |
3895ec53 JJ |
287 | inline fn local statics and their guard variables, use \ |
288 | gnu_unique_object so that they will be combined even under \ | |
289 | RTLD_LOCAL. Don't use gnu_unique_object for typeinfo, \ | |
290 | vtables and other read-only artificial decls. */ \ | |
291 | if (USE_GNU_UNIQUE_OBJECT && DECL_ONE_ONLY (DECL) \ | |
292 | && (!DECL_ARTIFICIAL (DECL) || !TREE_READONLY (DECL))) \ | |
85fac79c UB |
293 | ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "gnu_unique_object"); \ |
294 | else \ | |
295 | ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ | |
296 | \ | |
297 | size_directive_output = 0; \ | |
298 | if (!flag_inhibit_size_directive \ | |
299 | && (DECL) && DECL_SIZE (DECL)) \ | |
300 | { \ | |
301 | size_directive_output = 1; \ | |
302 | size = int_size_in_bytes (TREE_TYPE (DECL)); \ | |
303 | ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \ | |
304 | } \ | |
305 | \ | |
306 | ASM_OUTPUT_LABEL (FILE, NAME); \ | |
800e920a RK |
307 | } while (0) |
308 | ||
309 | /* Output the size directive for a decl in rest_of_decl_compilation | |
310 | in the case where we did not do so before the initializer. | |
311 | Once we find the error_mark_node, we know that the value of | |
312 | size_directive_output was set | |
313 | by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */ | |
314 | ||
74e5aa4b | 315 | #undef ASM_FINISH_DECLARE_OBJECT |
ca7cdae3 | 316 | #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \ |
e2bef702 | 317 | do { \ |
e03c5670 | 318 | const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ |
e2bef702 RH |
319 | HOST_WIDE_INT size; \ |
320 | if (!flag_inhibit_size_directive \ | |
321 | && DECL_SIZE (DECL) \ | |
322 | && ! AT_END && TOP_LEVEL \ | |
323 | && DECL_INITIAL (DECL) == error_mark_node \ | |
324 | && !size_directive_output \ | |
325 | && (size = int_size_in_bytes (TREE_TYPE (DECL))) > 0) \ | |
326 | { \ | |
327 | size_directive_output = 1; \ | |
2be2ac70 | 328 | ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size); \ |
e2bef702 RH |
329 | } \ |
330 | } while (0) | |
800e920a RK |
331 | |
332 | /* A table of bytes codes used by the ASM_OUTPUT_ASCII and | |
333 | ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table | |
334 | corresponds to a particular byte value [0..255]. For any | |
335 | given byte value, if the value in the corresponding table | |
336 | position is zero, the given character can be output directly. | |
337 | If the table value is 1, the byte must be output as a \ooo | |
338 | octal escape. If the tables value is anything else, then the | |
339 | byte value should be output as a \ followed by the value | |
340 | in the table. Note that we can use standard UN*X escape | |
341 | sequences for many control characters, but we don't use | |
342 | \a to represent BEL because some svr4 assemblers (e.g. on | |
343 | the i386) don't know about that. Also, we don't use \v | |
344 | since some versions of gas, such as 2.2 did not accept it. */ | |
345 | ||
74e5aa4b | 346 | #undef ESCAPES |
800e920a RK |
347 | #define ESCAPES \ |
348 | "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ | |
349 | \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ | |
350 | \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\ | |
351 | \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\ | |
352 | \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ | |
353 | \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ | |
354 | \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ | |
355 | \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1" | |
356 | ||
357 | /* Some svr4 assemblers have a limit on the number of characters which | |
358 | can appear in the operand of a .string directive. If your assembler | |
359 | has such a limitation, you should define STRING_LIMIT to reflect that | |
360 | limit. Note that at least some svr4 assemblers have a limit on the | |
361 | actual number of bytes in the double-quoted string, and that they | |
362 | count each character in an escape sequence as one byte. Thus, an | |
363 | escape sequence like \377 would count as four bytes. | |
364 | ||
365 | If your target assembler doesn't support the .string directive, you | |
b0435cf4 | 366 | should define this to zero. */ |
800e920a | 367 | |
74e5aa4b | 368 | #undef STRING_LIMIT |
800e920a | 369 | #define STRING_LIMIT ((unsigned) 256) |
74e5aa4b | 370 | #undef STRING_ASM_OP |
8c13c7b3 | 371 | #define STRING_ASM_OP "\t.string\t" |
800e920a | 372 | |
b0435cf4 | 373 | /* GAS is the only Alpha/ELF assembler. */ |
d38d55b4 | 374 | #undef TARGET_GAS |
800e920a RK |
375 | #define TARGET_GAS (1) |
376 | ||
b0435cf4 RH |
377 | /* Provide a STARTFILE_SPEC appropriate for ELF. Here we add the |
378 | (even more) magical crtbegin.o file which provides part of the | |
ee8d66f7 | 379 | support for getting C++ file-scope static object constructed |
d6b4baa4 | 380 | before entering `main'. */ |
800e920a | 381 | |
800e920a | 382 | #undef STARTFILE_SPEC |
24a4dd31 | 383 | #ifdef HAVE_LD_PIE |
800e920a | 384 | #define STARTFILE_SPEC \ |
24a4dd31 JJ |
385 | "%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}\ |
386 | crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" | |
387 | #else | |
388 | #define STARTFILE_SPEC \ | |
389 | "%{!shared: %{pg|p:gcrt1.o%s;:crt1.o%s}}\ | |
390 | crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" | |
391 | #endif | |
800e920a | 392 | |
b0435cf4 RH |
393 | /* Provide a ENDFILE_SPEC appropriate for ELF. Here we tack on the |
394 | magical crtend.o file which provides part of the support for | |
395 | getting C++ file-scope static object constructed before entering | |
396 | `main', followed by a normal ELF "finalizer" file, `crtn.o'. */ | |
800e920a RK |
397 | |
398 | #undef ENDFILE_SPEC | |
399 | #define ENDFILE_SPEC \ | |
567d20f0 | 400 | "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ |
24a4dd31 | 401 | %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s" |
b0435cf4 | 402 | |
2a1ee410 RH |
403 | /* Select a format to encode pointers in exception handling data. CODE |
404 | is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is | |
405 | true if the symbol may be affected by dynamic relocations. | |
406 | ||
407 | Since application size is already constrained to <2GB by the form of | |
408 | the ldgp relocation, we can use a 32-bit pc-relative relocation to | |
409 | static data. Dynamic data is accessed indirectly to allow for read | |
410 | only EH sections. */ | |
411 | #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ | |
412 | (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) | |
1eb356b9 RH |
413 | |
414 | /* If defined, a C statement to be executed just prior to the output of | |
415 | assembler code for INSN. */ | |
416 | #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \ | |
417 | (alpha_this_literal_sequence_number = 0, \ | |
418 | alpha_this_gpdisp_sequence_number = 0) | |
419 | extern int alpha_this_literal_sequence_number; | |
420 | extern int alpha_this_gpdisp_sequence_number; | |
cea3bd3e RH |
421 | |
422 | /* Since the bits of the _init and _fini function is spread across | |
423 | many object files, each potentially with its own GP, we must assume | |
424 | we need to load our GP. Further, the .init/.fini section can | |
425 | easily be more than 4MB away from the function to call so we can't | |
426 | use bsr. */ | |
427 | #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ | |
428 | asm (SECTION_OP "\n" \ | |
429 | " br $29,1f\n" \ | |
430 | "1: ldgp $29,0($29)\n" \ | |
431 | " unop\n" \ | |
432 | " jsr $26," USER_LABEL_PREFIX #FUNC "\n" \ | |
433 | " .align 3\n" \ | |
434 | " .previous"); | |
435 | ||
436 | /* If we have the capability create headers for efficient EH lookup. | |
437 | As of Jan 2002, only glibc 2.2.4 can actually make use of this, but | |
438 | I imagine that other systems will catch up. In the meantime, it | |
439 | doesn't harm to make sure that the data exists to be used later. */ | |
440 | #if defined(HAVE_LD_EH_FRAME_HDR) | |
441 | #define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " | |
442 | #endif | |
5d88d3be UB |
443 | |
444 | /* A C statement (sans semicolon) to output to the stdio stream STREAM | |
445 | any text necessary for declaring the name of an external symbol | |
446 | named NAME which is referenced in this compilation but not defined. | |
447 | It is needed to properly support non-default visibility. */ | |
448 | ||
449 | #ifndef ASM_OUTPUT_EXTERNAL | |
450 | #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ | |
451 | default_elf_asm_output_external (FILE, DECL, NAME) | |
452 | #endif |