]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/varasm.c
alias.c (nonlocal_mentioned_p, [...]): Use, LABEL_P, JUMP_P, CALL_P, NONJUMP_INSN_P...
[thirdparty/gcc.git] / gcc / varasm.c
CommitLineData
79e68feb 1/* Output variables, constants and external declarations, for GNU compiler.
06ceef4e 2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
06e4eab5 3 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
79e68feb 4
1322177d 5This file is part of GCC.
79e68feb 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
79e68feb 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
79e68feb
RS
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
79e68feb
RS
21
22
23/* This file handles generation of all the assembler code
24 *except* the instructions of a function.
25 This includes declarations of variables and their initial values.
26
27 We also output the assembler code for constants stored in memory
28 and are responsible for combining constants with the same value. */
29
e9a25f70 30#include "config.h"
670ee920 31#include "system.h"
4977bab6
ZW
32#include "coretypes.h"
33#include "tm.h"
79e68feb
RS
34#include "rtl.h"
35#include "tree.h"
36#include "flags.h"
57632c51 37#include "function.h"
79e68feb
RS
38#include "expr.h"
39#include "hard-reg-set.h"
40#include "regs.h"
24b09b50 41#include "real.h"
c7836bcd 42#include "output.h"
10f0ad3d 43#include "toplev.h"
bd7cf17e 44#include "hashtab.h"
3d6f7931 45#include "c-pragma.h"
87ff9c8e 46#include "ggc.h"
ac79cd5a 47#include "langhooks.h"
aa388f29 48#include "tm_p.h"
653e276c 49#include "debug.h"
7c262518 50#include "target.h"
6de9cd9a 51#include "tree-mudflap.h"
1668aabc 52#include "cgraph.h"
750054a2 53#include "cfglayout.h"
79e68feb 54
440aabf8
NB
55#ifdef XCOFF_DEBUGGING_INFO
56#include "xcoffout.h" /* Needed for external data
57 declarations for e.g. AIX 4.x. */
58#endif
59
79e68feb 60#ifndef ASM_STABS_OP
0a3e1f45 61#define ASM_STABS_OP "\t.stabs\t"
79e68feb
RS
62#endif
63
79e68feb 64/* The (assembler) name of the first globally-visible object output. */
3b304f5b
ZW
65const char *first_global_object_name;
66const char *weak_global_object_name;
79e68feb 67
36edd3cc 68struct addr_const;
e2500fed 69struct constant_descriptor_rtx;
3234b52d 70struct rtx_constant_pool;
36edd3cc 71
e2500fed 72struct varasm_status GTY(())
36edd3cc 73{
3234b52d
RH
74 /* If we're using a per-function constant pool, this is it. */
75 struct rtx_constant_pool *pool;
10b6a274
ZW
76
77 /* Number of tree-constants deferred during the expansion of this
78 function. */
79 unsigned int deferred_constants;
36edd3cc
BS
80};
81
10b6a274 82#define n_deferred_constants (cfun->varasm->deferred_constants)
36edd3cc 83
79e68feb
RS
84/* Number for making the label on the next
85 constant that is stored in memory. */
86
17211ab5 87static GTY(()) int const_labelno;
79e68feb 88
dcc8e5e6
RS
89/* Carry information from ASM_DECLARE_OBJECT_NAME
90 to ASM_FINISH_DECLARE_OBJECT. */
91
92int size_directive_output;
93
cbed4565
RS
94/* The last decl for which assemble_variable was called,
95 if it did ASM_DECLARE_OBJECT_NAME.
96 If the last call to assemble_variable didn't do that,
97 this holds 0. */
98
99tree last_assemble_variable_decl;
100
750054a2
CT
101/* The following global variable indicates if the section label for the
102 "cold" section of code has been output yet to the assembler. The
103 label is useful when running gdb. This is part of the optimization that
104 partitions hot and cold basic blocks into separate sections of the .o
105 file. */
106
107bool unlikely_section_label_printed = false;
108
a79e3a45
RK
109/* RTX_UNCHANGING_P in a MEM can mean it is stored into, for initialization.
110 So giving constant the alias set for the type will allow such
111 initializations to appear to conflict with the load of the constant. We
112 avoid this by giving all constants an alias set for just constants.
a8154559 113 Since there will be no stores to that alias set, nothing will ever
a79e3a45
RK
114 conflict with them. */
115
116static HOST_WIDE_INT const_alias_set;
117
2e1eedd6
AJ
118static const char *strip_reg_name (const char *);
119static int contains_pointers_p (tree);
9be6533a
RS
120#ifdef ASM_OUTPUT_EXTERNAL
121static bool incorporeal_function_p (tree);
122#endif
2e1eedd6
AJ
123static void decode_addr_const (tree, struct addr_const *);
124static hashval_t const_desc_hash (const void *);
125static int const_desc_eq (const void *, const void *);
126static hashval_t const_hash_1 (const tree);
127static int compare_constant (const tree, const tree);
128static tree copy_constant (tree);
129static void output_constant_def_contents (rtx);
b2218cc1 130static void output_addressed_constants (tree);
2e1eedd6
AJ
131static unsigned HOST_WIDE_INT array_size_for_constructor (tree);
132static unsigned min_align (unsigned, unsigned);
133static void output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int);
134static void globalize_decl (tree);
135static void maybe_assemble_visibility (tree);
136static int in_named_entry_eq (const void *, const void *);
137static hashval_t in_named_entry_hash (const void *);
78a47b1d 138#ifdef BSS_SECTION_ASM_OP
0e05e8ea 139#ifdef ASM_OUTPUT_BSS
2e1eedd6
AJ
140static void asm_output_bss (FILE *, tree, const char *,
141 unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
0e05e8ea
JL
142#endif
143#ifdef ASM_OUTPUT_ALIGNED_BSS
2e1eedd6
AJ
144static void asm_output_aligned_bss (FILE *, tree, const char *,
145 unsigned HOST_WIDE_INT, int)
146 ATTRIBUTE_UNUSED;
0e05e8ea 147#endif
cab634f2 148#endif /* BSS_SECTION_ASM_OP */
2e1eedd6
AJ
149static bool asm_emit_uninitialised (tree, const char*,
150 unsigned HOST_WIDE_INT,
151 unsigned HOST_WIDE_INT);
152static void mark_weak (tree);
79e68feb 153\f
750054a2
CT
154enum in_section { no_section, in_text, in_unlikely_executed_text, in_data,
155 in_named
e5887033
DE
156#ifdef BSS_SECTION_ASM_OP
157 , in_bss
158#endif
2cc07db4
RH
159#ifdef CTORS_SECTION_ASM_OP
160 , in_ctors
161#endif
162#ifdef DTORS_SECTION_ASM_OP
163 , in_dtors
164#endif
d48bc59a
RH
165#ifdef READONLY_DATA_SECTION_ASM_OP
166 , in_readonly_data
167#endif
79e68feb 168#ifdef EXTRA_SECTIONS
e5887033 169 , EXTRA_SECTIONS
79e68feb 170#endif
17211ab5
GK
171};
172static GTY(()) enum in_section in_section = no_section;
79e68feb 173
0e9e1e0a 174/* Return a nonzero value if DECL has a section attribute. */
a56e7c08 175#ifndef IN_NAMED_SECTION
8a425a05
DE
176#define IN_NAMED_SECTION(DECL) \
177 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
178 && DECL_SECTION_NAME (DECL) != NULL_TREE)
a56e7c08 179#endif
46f9491e 180
8a425a05 181/* Text of section name when in_section == in_named. */
17211ab5 182static GTY(()) const char *in_named_name;
8a425a05 183
715bdd29
RH
184/* Hash table of flags that have been used for a particular named section. */
185
17211ab5 186struct in_named_entry GTY(())
715bdd29
RH
187{
188 const char *name;
189 unsigned int flags;
a8c01a59 190 bool declared;
715bdd29
RH
191};
192
17211ab5 193static GTY((param_is (struct in_named_entry))) htab_t in_named_htab;
715bdd29 194
79e68feb
RS
195/* Define functions like text_section for any extra sections. */
196#ifdef EXTRA_SECTION_FUNCTIONS
197EXTRA_SECTION_FUNCTIONS
198#endif
199
200/* Tell assembler to switch to text section. */
201
202void
2e1eedd6 203text_section (void)
79e68feb
RS
204{
205 if (in_section != in_text)
206 {
d48bc59a 207 in_section = in_text;
34982294
AP
208 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
209 ASM_OUTPUT_ALIGN (asm_out_file, 2);
750054a2
CT
210 }
211}
212
213/* Tell assembler to switch to unlikely-to-be-executed text section. */
214
215void
216unlikely_text_section (void)
217{
218 if ((in_section != in_unlikely_executed_text)
219 && (in_section != in_named
220 || strcmp (in_named_name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) != 0))
221 {
34982294
AP
222 if (targetm.have_named_sections)
223 named_section (NULL_TREE, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0);
224 else
225 {
226 in_section = in_unlikely_executed_text;
227 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
34982294 228 }
750054a2 229
750054a2
CT
230 if (!unlikely_section_label_printed)
231 {
232 fprintf (asm_out_file, "__%s_unlikely_section:\n",
233 current_function_name ());
234 unlikely_section_label_printed = true;
73ad3de5 235
1ae58c30 236 /* Make sure that we have appropriate alignment for instructions
73ad3de5
RH
237 in this section. */
238 assemble_align (FUNCTION_BOUNDARY);
750054a2 239 }
79e68feb
RS
240 }
241}
242
79e68feb
RS
243/* Tell assembler to switch to data section. */
244
245void
2e1eedd6 246data_section (void)
79e68feb
RS
247{
248 if (in_section != in_data)
249 {
d48bc59a 250 in_section = in_data;
dc79b3b8 251 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
79e68feb
RS
252 }
253}
c26fbbca 254
7c6d68c8
RS
255/* Tell assembler to switch to read-only data section. This is normally
256 the text section. */
257
258void
2e1eedd6 259readonly_data_section (void)
7c6d68c8
RS
260{
261#ifdef READONLY_DATA_SECTION
262 READONLY_DATA_SECTION (); /* Note this can call data_section. */
d48bc59a
RH
263#else
264#ifdef READONLY_DATA_SECTION_ASM_OP
265 if (in_section != in_readonly_data)
266 {
267 in_section = in_readonly_data;
268 fputs (READONLY_DATA_SECTION_ASM_OP, asm_out_file);
269 fputc ('\n', asm_out_file);
270 }
7c6d68c8
RS
271#else
272 text_section ();
273#endif
d48bc59a 274#endif
7c6d68c8
RS
275}
276
0f41302f 277/* Determine if we're in the text section. */
79e68feb
RS
278
279int
2e1eedd6 280in_text_section (void)
79e68feb
RS
281{
282 return in_section == in_text;
283}
8a425a05 284
750054a2
CT
285/* Determine if we're in the unlikely-to-be-executed text section. */
286
287int
288in_unlikely_text_section (void)
289{
290 return in_section == in_unlikely_executed_text;
291}
292
0f41302f 293/* Determine if we're in the data section. */
6f2f3db7 294
274351ba 295int
2e1eedd6 296in_data_section (void)
274351ba
RK
297{
298 return in_section == in_data;
299}
6f2f3db7 300
715bdd29
RH
301/* Helper routines for maintaining in_named_htab. */
302
303static int
2e1eedd6 304in_named_entry_eq (const void *p1, const void *p2)
715bdd29
RH
305{
306 const struct in_named_entry *old = p1;
307 const char *new = p2;
308
309 return strcmp (old->name, new) == 0;
310}
311
312static hashval_t
2e1eedd6 313in_named_entry_hash (const void *p)
715bdd29
RH
314{
315 const struct in_named_entry *old = p;
316 return htab_hash_string (old->name);
317}
318
319/* If SECTION has been seen before as a named section, return the flags
320 that were used. Otherwise, return 0. Note, that 0 is a perfectly valid
321 set of flags for a section to have, so 0 does not mean that the section
322 has not been seen. */
323
324unsigned int
2e1eedd6 325get_named_section_flags (const char *section)
715bdd29
RH
326{
327 struct in_named_entry **slot;
328
c26fbbca 329 slot = (struct in_named_entry **)
715bdd29
RH
330 htab_find_slot_with_hash (in_named_htab, section,
331 htab_hash_string (section), NO_INSERT);
332
333 return slot ? (*slot)->flags : 0;
334}
335
a8c01a59 336/* Returns true if the section has been declared before. Sets internal
c26fbbca 337 flag on this section in in_named_hash so subsequent calls on this
2ba84f36 338 section will return false. */
a8c01a59
RL
339
340bool
2e1eedd6 341named_section_first_declaration (const char *name)
a8c01a59
RL
342{
343 struct in_named_entry **slot;
344
c26fbbca
KH
345 slot = (struct in_named_entry **)
346 htab_find_slot_with_hash (in_named_htab, name,
a8c01a59
RL
347 htab_hash_string (name), NO_INSERT);
348 if (! (*slot)->declared)
349 {
350 (*slot)->declared = true;
351 return true;
352 }
c26fbbca 353 else
a8c01a59
RL
354 {
355 return false;
356 }
357}
358
359
715bdd29
RH
360/* Record FLAGS for SECTION. If SECTION was previously recorded with a
361 different set of flags, return false. */
362
363bool
2e1eedd6 364set_named_section_flags (const char *section, unsigned int flags)
715bdd29
RH
365{
366 struct in_named_entry **slot, *entry;
367
c26fbbca 368 slot = (struct in_named_entry **)
715bdd29
RH
369 htab_find_slot_with_hash (in_named_htab, section,
370 htab_hash_string (section), INSERT);
371 entry = *slot;
372
373 if (!entry)
374 {
703ad42b 375 entry = ggc_alloc (sizeof (*entry));
715bdd29
RH
376 *slot = entry;
377 entry->name = ggc_strdup (section);
378 entry->flags = flags;
8d2134aa 379 entry->declared = false;
715bdd29
RH
380 }
381 else if (entry->flags != flags)
382 return false;
383
384 return true;
385}
386
7c262518
RH
387/* Tell assembler to change to section NAME with attributes FLAGS. */
388
389void
2e1eedd6 390named_section_flags (const char *name, unsigned int flags)
7c262518 391{
715bdd29 392 if (in_section != in_named || strcmp (name, in_named_name) != 0)
7c262518 393 {
715bdd29
RH
394 if (! set_named_section_flags (name, flags))
395 abort ();
396
5fd9b178 397 targetm.asm_out.named_section (name, flags);
7c262518
RH
398
399 if (flags & SECTION_FORGET)
400 in_section = no_section;
401 else
402 {
403 in_named_name = ggc_strdup (name);
404 in_section = in_named;
405 }
406 }
407}
408
2ffe831c
DE
409/* Tell assembler to change to section NAME for DECL.
410 If DECL is NULL, just switch to section NAME.
ad4ff310
JM
411 If NAME is NULL, get the name from DECL.
412 If RELOC is 1, the initializer for DECL contains relocs. */
8a425a05
DE
413
414void
2e1eedd6 415named_section (tree decl, const char *name, int reloc)
8a425a05 416{
7c262518
RH
417 unsigned int flags;
418
2f939d94 419 if (decl != NULL_TREE && !DECL_P (decl))
2ffe831c
DE
420 abort ();
421 if (name == NULL)
422 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
423
245f1bfa 424 flags = targetm.section_type_flags (decl, name, reloc);
715bdd29
RH
425
426 /* Sanity check user variables for flag changes. Non-user
10c45943
AG
427 section flag changes will abort in named_section_flags.
428 However, don't complain if SECTION_OVERRIDE is set.
429 We trust that the setter knows that it is safe to ignore
430 the default flags for this decl. */
715bdd29
RH
431 if (decl && ! set_named_section_flags (name, flags))
432 {
715bdd29 433 flags = get_named_section_flags (name);
10c45943 434 if ((flags & SECTION_OVERRIDE) == 0)
ddd2d57e 435 error ("%J%D causes a section type conflict", decl, decl);
715bdd29
RH
436 }
437
438 named_section_flags (name, flags);
7c262518 439}
e9a25f70 440
7c262518
RH
441/* If required, set DECL_SECTION_NAME to a unique name. */
442
89ce1c8f 443void
2e1eedd6
AJ
444resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED,
445 int flag_function_or_data_sections)
7c262518
RH
446{
447 if (DECL_SECTION_NAME (decl) == NULL_TREE
ae46c4e0 448 && targetm.have_named_sections
1b18fc2c 449 && (flag_function_or_data_sections
ae46c4e0 450 || DECL_ONE_ONLY (decl)))
5fd9b178 451 targetm.asm_out.unique_section (decl, reloc);
8a425a05 452}
4d1065ed 453
e5887033
DE
454#ifdef BSS_SECTION_ASM_OP
455
456/* Tell the assembler to switch to the bss section. */
457
458void
2e1eedd6 459bss_section (void)
e5887033
DE
460{
461 if (in_section != in_bss)
462 {
abf843c4 463 fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);
e5887033
DE
464 in_section = in_bss;
465 }
466}
467
468#ifdef ASM_OUTPUT_BSS
469
470/* Utility function for ASM_OUTPUT_BSS for targets to use if
471 they don't support alignments in .bss.
472 ??? It is believed that this function will work in most cases so such
473 support is localized here. */
474
475static void
2e1eedd6
AJ
476asm_output_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
477 const char *name,
478 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
479 unsigned HOST_WIDE_INT rounded)
e5887033 480{
5fd9b178 481 targetm.asm_out.globalize_label (file, name);
e5887033 482 bss_section ();
91fddd7c
DE
483#ifdef ASM_DECLARE_OBJECT_NAME
484 last_assemble_variable_decl = decl;
485 ASM_DECLARE_OBJECT_NAME (file, name, decl);
486#else
487 /* Standard thing is just output label for the object. */
e5887033 488 ASM_OUTPUT_LABEL (file, name);
91fddd7c 489#endif /* ASM_DECLARE_OBJECT_NAME */
95bfe95f 490 ASM_OUTPUT_SKIP (file, rounded ? rounded : 1);
e5887033
DE
491}
492
493#endif
494
495#ifdef ASM_OUTPUT_ALIGNED_BSS
496
497/* Utility function for targets to use in implementing
498 ASM_OUTPUT_ALIGNED_BSS.
499 ??? It is believed that this function will work in most cases so such
500 support is localized here. */
501
502static void
2e1eedd6
AJ
503asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
504 const char *name, unsigned HOST_WIDE_INT size,
505 int align)
e5887033 506{
e5887033
DE
507 bss_section ();
508 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
91fddd7c
DE
509#ifdef ASM_DECLARE_OBJECT_NAME
510 last_assemble_variable_decl = decl;
511 ASM_DECLARE_OBJECT_NAME (file, name, decl);
512#else
513 /* Standard thing is just output label for the object. */
e5887033 514 ASM_OUTPUT_LABEL (file, name);
91fddd7c 515#endif /* ASM_DECLARE_OBJECT_NAME */
f8bc3367 516 ASM_OUTPUT_SKIP (file, size ? size : 1);
e5887033
DE
517}
518
519#endif
520
521#endif /* BSS_SECTION_ASM_OP */
522
4d1065ed
DE
523/* Switch to the section for function DECL.
524
525 If DECL is NULL_TREE, switch to the text section.
526 ??? It's not clear that we will ever be passed NULL_TREE, but it's
527 safer to handle it. */
528
529void
2e1eedd6 530function_section (tree decl)
4d1065ed 531{
750054a2
CT
532 if (scan_ahead_for_unlikely_executed_note (get_insns()))
533 unlikely_text_section ();
8b43265c 534 else
750054a2
CT
535 {
536 if (decl != NULL_TREE
537 && DECL_SECTION_NAME (decl) != NULL_TREE)
538 named_section (decl, (char *) 0, 0);
539 else
540 text_section ();
541 }
4d1065ed 542}
f9da1f35 543
ae46c4e0
RH
544/* Switch to section for variable DECL. RELOC is the same as the
545 argument to SELECT_SECTION. */
f9da1f35
DE
546
547void
2e1eedd6 548variable_section (tree decl, int reloc)
f9da1f35
DE
549{
550 if (IN_NAMED_SECTION (decl))
ad4ff310 551 named_section (decl, NULL, reloc);
f9da1f35 552 else
5fd9b178 553 targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
f9da1f35 554}
6adb4e3a 555
201556f0
JJ
556/* Tell assembler to switch to the section for string merging. */
557
558void
2e1eedd6
AJ
559mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
560 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
561 unsigned int flags ATTRIBUTE_UNUSED)
201556f0 562{
5d4856a0 563 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
201556f0
JJ
564 && TREE_CODE (decl) == STRING_CST
565 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
566 && align <= 256
567 && TREE_STRING_LENGTH (decl) >= int_size_in_bytes (TREE_TYPE (decl)))
568 {
569 enum machine_mode mode;
570 unsigned int modesize;
571 const char *str;
572 int i, j, len, unit;
573 char name[30];
574
575 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
576 modesize = GET_MODE_BITSIZE (mode);
577 if (modesize >= 8 && modesize <= 256
578 && (modesize & (modesize - 1)) == 0)
579 {
580 if (align < modesize)
581 align = modesize;
582
583 str = TREE_STRING_POINTER (decl);
584 len = TREE_STRING_LENGTH (decl);
585 unit = GET_MODE_SIZE (mode);
586
587 /* Check for embedded NUL characters. */
588 for (i = 0; i < len; i += unit)
589 {
590 for (j = 0; j < unit; j++)
c26fbbca 591 if (str[i + j] != '\0')
201556f0
JJ
592 break;
593 if (j == unit)
594 break;
595 }
596 if (i == len - unit)
597 {
598 sprintf (name, ".rodata.str%d.%d", modesize / 8,
599 (int) (align / 8));
600 flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
601 if (!i && modesize < align)
602 {
603 /* A "" string with requested alignment greater than
604 character size might cause a problem:
605 if some other string required even bigger
606 alignment than "", then linker might think the
607 "" is just part of padding after some other string
608 and not put it into the hash table initially.
609 But this means "" could have smaller alignment
610 than requested. */
611#ifdef ASM_OUTPUT_SECTION_START
612 named_section_flags (name, flags);
613 ASM_OUTPUT_SECTION_START (asm_out_file);
614#else
615 readonly_data_section ();
616#endif
617 return;
618 }
619
620 named_section_flags (name, flags);
621 return;
622 }
623 }
624 }
5d4856a0 625
201556f0 626 readonly_data_section ();
c26fbbca 627}
201556f0
JJ
628
629/* Tell assembler to switch to the section for constant merging. */
630
631void
2e1eedd6
AJ
632mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
633 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
634 unsigned int flags ATTRIBUTE_UNUSED)
201556f0 635{
201556f0
JJ
636 unsigned int modesize = GET_MODE_BITSIZE (mode);
637
5d4856a0 638 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
201556f0
JJ
639 && mode != VOIDmode
640 && mode != BLKmode
641 && modesize <= align
642 && align >= 8
643 && align <= 256
644 && (align & (align - 1)) == 0)
645 {
646 char name[24];
647
648 sprintf (name, ".rodata.cst%d", (int) (align / 8));
649 flags |= (align / 8) | SECTION_MERGE;
650 named_section_flags (name, flags);
651 return;
c26fbbca 652 }
5d4856a0 653
201556f0
JJ
654 readonly_data_section ();
655}
79e68feb 656\f
b4ac57ab
RS
657/* Given NAME, a putative register name, discard any customary prefixes. */
658
87e11268 659static const char *
2e1eedd6 660strip_reg_name (const char *name)
b4ac57ab
RS
661{
662#ifdef REGISTER_PREFIX
663 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
664 name += strlen (REGISTER_PREFIX);
665#endif
666 if (name[0] == '%' || name[0] == '#')
667 name++;
668 return name;
669}
dcfedcd0 670\f
79e68feb
RS
671/* Decode an `asm' spec for a declaration as a register name.
672 Return the register number, or -1 if nothing specified,
c09e6498
RS
673 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
674 or -3 if ASMSPEC is `cc' and is not recognized,
675 or -4 if ASMSPEC is `memory' and is not recognized.
dcfedcd0
RK
676 Accept an exact spelling or a decimal number.
677 Prefixes such as % are optional. */
79e68feb
RS
678
679int
2e1eedd6 680decode_reg_name (const char *asmspec)
79e68feb
RS
681{
682 if (asmspec != 0)
683 {
684 int i;
685
b4ac57ab
RS
686 /* Get rid of confusing prefixes. */
687 asmspec = strip_reg_name (asmspec);
46f9491e 688
fff9e713
MT
689 /* Allow a decimal number as a "register name". */
690 for (i = strlen (asmspec) - 1; i >= 0; i--)
0df6c2c7 691 if (! ISDIGIT (asmspec[i]))
fff9e713
MT
692 break;
693 if (asmspec[0] != 0 && i < 0)
694 {
695 i = atoi (asmspec);
696 if (i < FIRST_PSEUDO_REGISTER && i >= 0)
697 return i;
698 else
699 return -2;
700 }
701
79e68feb 702 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
b4ac57ab
RS
703 if (reg_names[i][0]
704 && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
79e68feb
RS
705 return i;
706
79e68feb
RS
707#ifdef ADDITIONAL_REGISTER_NAMES
708 {
83182544 709 static const struct { const char *const name; const int number; } table[]
79e68feb
RS
710 = ADDITIONAL_REGISTER_NAMES;
711
b6a1cbae 712 for (i = 0; i < (int) ARRAY_SIZE (table); i++)
79e68feb
RS
713 if (! strcmp (asmspec, table[i].name))
714 return table[i].number;
79e68feb
RS
715 }
716#endif /* ADDITIONAL_REGISTER_NAMES */
717
c09e6498
RS
718 if (!strcmp (asmspec, "memory"))
719 return -4;
720
dcfedcd0
RK
721 if (!strcmp (asmspec, "cc"))
722 return -3;
723
79e68feb
RS
724 return -2;
725 }
726
727 return -1;
728}
729\f
19e7881c
MM
730/* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should
731 have static storage duration. In other words, it should not be an
732 automatic variable, including PARM_DECLs.
733
734 There is, however, one exception: this function handles variables
735 explicitly placed in a particular register by the user.
736
737 ASMSPEC, if not 0, is the string which the user specified as the
738 assembler symbol name.
79e68feb
RS
739
740 This is never called for PARM_DECL nodes. */
741
742void
2e1eedd6 743make_decl_rtl (tree decl, const char *asmspec)
79e68feb 744{
63ad61ed 745 const char *name = 0;
ca695ac9 746 int reg_number;
abde42f7 747 rtx x;
ca695ac9 748
19e7881c 749 /* Check that we are not being given an automatic variable. */
9ea07fd0 750 /* A weak alias has TREE_PUBLIC set but not the other bits. */
19e7881c
MM
751 if (TREE_CODE (decl) == PARM_DECL
752 || TREE_CODE (decl) == RESULT_DECL
753 || (TREE_CODE (decl) == VAR_DECL
754 && !TREE_STATIC (decl)
9ea07fd0 755 && !TREE_PUBLIC (decl)
19e7881c
MM
756 && !DECL_EXTERNAL (decl)
757 && !DECL_REGISTER (decl)))
758 abort ();
759 /* And that we were not given a type or a label. */
46f9491e 760 else if (TREE_CODE (decl) == TYPE_DECL
19e7881c
MM
761 || TREE_CODE (decl) == LABEL_DECL)
762 abort ();
763
63ad61ed
ZW
764 /* For a duplicate declaration, we can be called twice on the
765 same DECL node. Don't discard the RTL already made. */
19e7881c 766 if (DECL_RTL_SET_P (decl))
79e68feb 767 {
63ad61ed
ZW
768 /* If the old RTL had the wrong mode, fix the mode. */
769 if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
c4e59f51
RK
770 SET_DECL_RTL (decl, adjust_address_nv (DECL_RTL (decl),
771 DECL_MODE (decl), 0));
76095e2f 772
b2e2d0cc
EC
773 /* ??? Another way to do this would be to maintain a hashed
774 table of such critters. Instead of adding stuff to a DECL
775 to give certain attributes to it, we could use an external
776 hash map from DECL to set of attributes. */
777
63ad61ed
ZW
778 /* Let the target reassign the RTL if it wants.
779 This is necessary, for example, when one machine specific
780 decl attribute overrides another. */
245f1bfa 781 targetm.encode_section_info (decl, DECL_RTL (decl), false);
6de9cd9a
DN
782
783 /* Make this function static known to the mudflap runtime. */
784 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
785 mudflap_enqueue_decl (decl);
786
63ad61ed 787 return;
79e68feb
RS
788 }
789
63ad61ed
ZW
790 reg_number = decode_reg_name (asmspec);
791 if (reg_number == -2)
8f820299
ZW
792 {
793 /* ASMSPEC is given, and not the name of a register. Mark the
794 name with a star so assemble_name won't munge it. */
795 char *starred = alloca (strlen (asmspec) + 2);
796 starred[0] = '*';
797 strcpy (starred + 1, asmspec);
fccc4eb2 798 change_decl_assembler_name (decl, get_identifier (starred));
8f820299 799 }
63ad61ed 800
26e0dcb3
GK
801 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
802
63ad61ed 803 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
79e68feb 804 {
79e68feb 805 /* First detect errors in declaring global registers. */
63ad61ed 806 if (reg_number == -1)
ddd2d57e 807 error ("%Jregister name not specified for '%D'", decl, decl);
63ad61ed 808 else if (reg_number < 0)
ddd2d57e 809 error ("%Jinvalid register name for '%D'", decl, decl);
63ad61ed 810 else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
ddd2d57e
RH
811 error ("%Jdata type of '%D' isn't suitable for a register",
812 decl, decl);
63ad61ed 813 else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl))))
ddd2d57e
RH
814 error ("%Jregister specified for '%D' isn't suitable for data type",
815 decl, decl);
79e68feb 816 /* Now handle properly declared static register variables. */
63ad61ed 817 else
79e68feb
RS
818 {
819 int nregs;
12266a61 820
e3406b2a 821 if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
79e68feb
RS
822 {
823 DECL_INITIAL (decl) = 0;
824 error ("global register variable has initial value");
825 }
79e68feb
RS
826 if (TREE_THIS_VOLATILE (decl))
827 warning ("volatile register variables don't work as you might wish");
31e4b1c0
RK
828
829 /* If the user specified one of the eliminables registers here,
830 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
3ada20ee
RH
831 confused with that register and be eliminated. This usage is
832 somewhat suspect... */
833
834 SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number));
835 ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
79e68feb
RS
836 REG_USERVAR_P (DECL_RTL (decl)) = 1;
837
6c418184 838 if (TREE_STATIC (decl))
79e68feb 839 {
ad800eb1
RK
840 /* Make this register global, so not usable for anything
841 else. */
1cb36a98
RH
842#ifdef ASM_DECLARE_REGISTER_GLOBAL
843 ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
844#endif
66fd46b6 845 nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)];
79e68feb 846 while (nregs > 0)
ad800eb1 847 globalize_reg (reg_number + --nregs);
79e68feb 848 }
79e68feb 849
63ad61ed
ZW
850 /* As a register variable, it has no section. */
851 return;
852 }
853 }
0a5152d0 854
63ad61ed
ZW
855 /* Now handle ordinary static variables and functions (in memory).
856 Also handle vars declared register invalidly. */
857
858 if (reg_number >= 0 || reg_number == -3)
ddd2d57e 859 error ("%Jregister name given for non-register variable '%D'", decl, decl);
63ad61ed
ZW
860
861 /* Specifying a section attribute on a variable forces it into a
2d76cb1a 862 non-.bss section, and thus it cannot be common. */
63ad61ed
ZW
863 if (TREE_CODE (decl) == VAR_DECL
864 && DECL_SECTION_NAME (decl) != NULL_TREE
865 && DECL_INITIAL (decl) == NULL_TREE
866 && DECL_COMMON (decl))
867 DECL_COMMON (decl) = 0;
868
5ff225fc
MM
869 /* Variables can't be both common and weak. */
870 if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
871 DECL_COMMON (decl) = 0;
872
52859c77
RH
873 x = gen_rtx_SYMBOL_REF (Pmode, name);
874 SYMBOL_REF_WEAK (x) = DECL_WEAK (decl);
875 SYMBOL_REF_DECL (x) = decl;
2e1eedd6 876
52859c77 877 x = gen_rtx_MEM (DECL_MODE (decl), x);
63ad61ed 878 if (TREE_CODE (decl) != FUNCTION_DECL)
abde42f7
JH
879 set_mem_attributes (x, decl, 1);
880 SET_DECL_RTL (decl, x);
63ad61ed
ZW
881
882 /* Optionally set flags or add text to the name to record information
883 such as that it is a function name.
884 If the name is changed, the macro ASM_OUTPUT_LABELREF
885 will have to know how to strip this information. */
245f1bfa 886 targetm.encode_section_info (decl, DECL_RTL (decl), true);
6de9cd9a
DN
887
888 /* Make this function static known to the mudflap runtime. */
889 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
890 mudflap_enqueue_decl (decl);
79e68feb 891}
4724d87a
RS
892
893/* Make the rtl for variable VAR be volatile.
894 Use this only for static variables. */
895
fcbaecc6 896void
2e1eedd6 897make_var_volatile (tree var)
4724d87a 898{
3c0cb5de 899 if (!MEM_P (DECL_RTL (var)))
4724d87a
RS
900 abort ();
901
902 MEM_VOLATILE_P (DECL_RTL (var)) = 1;
903}
79e68feb
RS
904\f
905/* Output a string of literal assembler code
906 for an `asm' keyword used between functions. */
907
908void
2e1eedd6 909assemble_asm (tree string)
79e68feb
RS
910{
911 app_enable ();
912
913 if (TREE_CODE (string) == ADDR_EXPR)
914 string = TREE_OPERAND (string, 0);
915
916 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
917}
918
2cc07db4
RH
919/* Record an element in the table of global destructors. SYMBOL is
920 a SYMBOL_REF of the function to be called; PRIORITY is a number
921 between 0 and MAX_INIT_PRIORITY. */
79e68feb
RS
922
923void
2e1eedd6 924default_stabs_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
79e68feb 925{
2cc07db4
RH
926 /* Tell GNU LD that this is part of the static destructor set.
927 This will work for any system that uses stabs, most usefully
928 aout systems. */
929 fprintf (asm_out_file, "%s\"___DTOR_LIST__\",22,0,0,", ASM_STABS_OP);
930 assemble_name (asm_out_file, XSTR (symbol, 0));
931 fputc ('\n', asm_out_file);
932}
47907859 933
2cc07db4 934void
2e1eedd6 935default_named_section_asm_out_destructor (rtx symbol, int priority)
2cc07db4
RH
936{
937 const char *section = ".dtors";
938 char buf[16];
47907859 939
6d2f8887 940 /* ??? This only works reliably with the GNU linker. */
2cc07db4 941 if (priority != DEFAULT_INIT_PRIORITY)
47907859 942 {
47907859
RH
943 sprintf (buf, ".dtors.%.5u",
944 /* Invert the numbering so the linker puts us in the proper
945 order; constructors are run from right to left, and the
946 linker sorts in increasing order. */
947 MAX_INIT_PRIORITY - priority);
2cc07db4 948 section = buf;
47907859
RH
949 }
950
715bdd29
RH
951 named_section_flags (section, SECTION_WRITE);
952 assemble_align (POINTER_SIZE);
c8af3574 953 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
2cc07db4
RH
954}
955
956#ifdef DTORS_SECTION_ASM_OP
957void
2e1eedd6 958dtors_section (void)
2cc07db4
RH
959{
960 if (in_section != in_dtors)
79e68feb 961 {
2cc07db4
RH
962 in_section = in_dtors;
963 fputs (DTORS_SECTION_ASM_OP, asm_out_file);
79e68feb
RS
964 fputc ('\n', asm_out_file);
965 }
79e68feb
RS
966}
967
2cc07db4 968void
2e1eedd6
AJ
969default_dtor_section_asm_out_destructor (rtx symbol,
970 int priority ATTRIBUTE_UNUSED)
2cc07db4
RH
971{
972 dtors_section ();
c8af3574
RH
973 assemble_align (POINTER_SIZE);
974 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
2cc07db4
RH
975}
976#endif
977
79e68feb
RS
978/* Likewise for global constructors. */
979
980void
2e1eedd6 981default_stabs_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
79e68feb 982{
2cc07db4
RH
983 /* Tell GNU LD that this is part of the static destructor set.
984 This will work for any system that uses stabs, most usefully
985 aout systems. */
986 fprintf (asm_out_file, "%s\"___CTOR_LIST__\",22,0,0,", ASM_STABS_OP);
987 assemble_name (asm_out_file, XSTR (symbol, 0));
988 fputc ('\n', asm_out_file);
989}
47907859 990
2cc07db4 991void
2e1eedd6 992default_named_section_asm_out_constructor (rtx symbol, int priority)
2cc07db4
RH
993{
994 const char *section = ".ctors";
995 char buf[16];
47907859 996
6d2f8887 997 /* ??? This only works reliably with the GNU linker. */
2cc07db4 998 if (priority != DEFAULT_INIT_PRIORITY)
47907859 999 {
47907859
RH
1000 sprintf (buf, ".ctors.%.5u",
1001 /* Invert the numbering so the linker puts us in the proper
1002 order; constructors are run from right to left, and the
1003 linker sorts in increasing order. */
1004 MAX_INIT_PRIORITY - priority);
2cc07db4 1005 section = buf;
47907859
RH
1006 }
1007
715bdd29 1008 named_section_flags (section, SECTION_WRITE);
c8af3574
RH
1009 assemble_align (POINTER_SIZE);
1010 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
2cc07db4
RH
1011}
1012
1013#ifdef CTORS_SECTION_ASM_OP
1014void
2e1eedd6 1015ctors_section (void)
2cc07db4
RH
1016{
1017 if (in_section != in_ctors)
79e68feb 1018 {
2cc07db4
RH
1019 in_section = in_ctors;
1020 fputs (CTORS_SECTION_ASM_OP, asm_out_file);
79e68feb
RS
1021 fputc ('\n', asm_out_file);
1022 }
79e68feb 1023}
2cc07db4
RH
1024
1025void
2e1eedd6
AJ
1026default_ctor_section_asm_out_constructor (rtx symbol,
1027 int priority ATTRIBUTE_UNUSED)
2cc07db4
RH
1028{
1029 ctors_section ();
c8af3574
RH
1030 assemble_align (POINTER_SIZE);
1031 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
2cc07db4
RH
1032}
1033#endif
79e68feb 1034\f
97adc6ed 1035/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
0e9e1e0a 1036 a nonzero value if the constant pool should be output before the
97adc6ed
ILT
1037 start of the function, or a zero value if the pool should output
1038 after the end of the function. The default is to put it before the
1039 start. */
1040
1041#ifndef CONSTANT_POOL_BEFORE_FUNCTION
1042#define CONSTANT_POOL_BEFORE_FUNCTION 1
1043#endif
1044
810db579
JH
1045/* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going
1046 to be output to assembler.
1047 Set first_global_object_name and weak_global_object_name as appropriate. */
1048
1049void
1050notice_global_symbol (tree decl)
1051{
8af11e80
JH
1052 const char **type = &first_global_object_name;
1053
1054 if (first_global_object_name
1055 || !TREE_PUBLIC (decl) || DECL_EXTERNAL (decl)
1056 || !DECL_NAME (decl)
1057 || (TREE_CODE (decl) != FUNCTION_DECL
1058 && (TREE_CODE (decl) != VAR_DECL
1059 || (DECL_COMMON (decl)
1060 && (DECL_INITIAL (decl) == 0
0f334035 1061 || DECL_INITIAL (decl) == error_mark_node))))
3c0cb5de 1062 || !MEM_P (DECL_RTL (decl)))
8af11e80
JH
1063 return;
1064
321440fd 1065 /* We win when global object is found, but it is useful to know about weak
8af11e80
JH
1066 symbol as well so we can produce nicer unique names. */
1067 if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl))
1068 type = &weak_global_object_name;
1069
1070 if (!*type)
810db579
JH
1071 {
1072 const char *p;
1073 char *name;
1074 rtx decl_rtl = DECL_RTL (decl);
1075
245f1bfa 1076 p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0));
810db579
JH
1077 name = xstrdup (p);
1078
8af11e80 1079 *type = name;
810db579
JH
1080 }
1081}
1082
79e68feb
RS
1083/* Output assembler code for the constant pool of a function and associated
1084 with defining the name of the function. DECL describes the function.
1085 NAME is the function's name. For the constant pool, we use the current
1086 constant pool data. */
1087
1088void
2e1eedd6 1089assemble_start_function (tree decl, const char *fnname)
79e68feb
RS
1090{
1091 int align;
1092
750054a2
CT
1093 unlikely_section_label_printed = false;
1094
79e68feb
RS
1095 /* The following code does not need preprocessing in the assembler. */
1096
1097 app_disable ();
1098
97adc6ed
ILT
1099 if (CONSTANT_POOL_BEFORE_FUNCTION)
1100 output_constant_pool (fnname, decl);
79e68feb 1101
1b18fc2c 1102 resolve_unique_section (decl, 0, flag_function_sections);
4d1065ed 1103 function_section (decl);
79e68feb
RS
1104
1105 /* Tell assembler to move to target machine's alignment for functions. */
1106 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
f963b5d9
RS
1107 if (align < force_align_functions_log)
1108 align = force_align_functions_log;
79e68feb 1109 if (align > 0)
91ea4f8d
KG
1110 {
1111 ASM_OUTPUT_ALIGN (asm_out_file, align);
1112 }
79e68feb 1113
efa3896a
GK
1114 /* Handle a user-specified function alignment.
1115 Note that we still need to align to FUNCTION_BOUNDARY, as above,
1116 because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */
194734e9
JH
1117 if (align_functions_log > align
1118 && cfun->function_frequency != FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
efa3896a
GK
1119 {
1120#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
46f9491e 1121 ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
c26fbbca 1122 align_functions_log, align_functions - 1);
efa3896a
GK
1123#else
1124 ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1125#endif
1126 }
1127
79e68feb
RS
1128#ifdef ASM_OUTPUT_FUNCTION_PREFIX
1129 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1130#endif
1131
653e276c 1132 (*debug_hooks->begin_function) (decl);
79e68feb
RS
1133
1134 /* Make function name accessible from other files, if appropriate. */
1135
1136 if (TREE_PUBLIC (decl))
1137 {
810db579 1138 notice_global_symbol (decl);
06bb02f7 1139
19c5b1cf 1140 globalize_decl (decl);
b14707c3
RH
1141
1142 maybe_assemble_visibility (decl);
79e68feb
RS
1143 }
1144
6614fd40 1145 /* Do any machine/system dependent processing of the function name. */
8bd16853 1146#ifdef ASM_DECLARE_FUNCTION_NAME
b93a436e 1147 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
8bd16853 1148#else
b93a436e
JL
1149 /* Standard thing is just output label for the function. */
1150 ASM_OUTPUT_LABEL (asm_out_file, fnname);
79e68feb
RS
1151#endif /* ASM_DECLARE_FUNCTION_NAME */
1152}
1153
1154/* Output assembler code associated with defining the size of the
1155 function. DECL describes the function. NAME is the function's name. */
1156
1157void
2e1eedd6 1158assemble_end_function (tree decl, const char *fnname)
79e68feb
RS
1159{
1160#ifdef ASM_DECLARE_FUNCTION_SIZE
1161 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1162#endif
97adc6ed 1163 if (! CONSTANT_POOL_BEFORE_FUNCTION)
83488369
RK
1164 {
1165 output_constant_pool (fnname, decl);
1166 function_section (decl); /* need to switch back */
1167 }
79e68feb
RS
1168}
1169\f
1170/* Assemble code to leave SIZE bytes of zeros. */
1171
1172void
2e1eedd6 1173assemble_zeros (unsigned HOST_WIDE_INT size)
79e68feb 1174{
3c350eb3
CB
1175 /* Do no output if -fsyntax-only. */
1176 if (flag_syntax_only)
1177 return;
1178
79e68feb
RS
1179#ifdef ASM_NO_SKIP_IN_TEXT
1180 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1181 so we must output 0s explicitly in the text section. */
750054a2
CT
1182 if ((ASM_NO_SKIP_IN_TEXT && in_text_section ())
1183 || (ASM_NO_SKIP_IN_TEXT && in_unlikely_text_section ()))
79e68feb 1184 {
58e15542 1185 unsigned HOST_WIDE_INT i;
c8af3574
RH
1186 for (i = 0; i < size; i++)
1187 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
79e68feb
RS
1188 }
1189 else
1190#endif
41fe4d9e 1191 if (size > 0)
b93a436e 1192 ASM_OUTPUT_SKIP (asm_out_file, size);
79e68feb
RS
1193}
1194
a785e67e
RS
1195/* Assemble an alignment pseudo op for an ALIGN-bit boundary. */
1196
1197void
2e1eedd6 1198assemble_align (int align)
a785e67e
RS
1199{
1200 if (align > BITS_PER_UNIT)
91ea4f8d
KG
1201 {
1202 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1203 }
a785e67e
RS
1204}
1205
79e68feb
RS
1206/* Assemble a string constant with the specified C string as contents. */
1207
1208void
2e1eedd6 1209assemble_string (const char *p, int size)
79e68feb 1210{
79e68feb
RS
1211 int pos = 0;
1212 int maximum = 2000;
1213
1214 /* If the string is very long, split it up. */
1215
1216 while (pos < size)
1217 {
1218 int thissize = size - pos;
1219 if (thissize > maximum)
1220 thissize = maximum;
1221
b93a436e 1222 ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
79e68feb
RS
1223
1224 pos += thissize;
1225 p += thissize;
1226 }
1227}
69249c1b 1228
79e68feb 1229\f
b8694195
NC
1230#if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1231#define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1232 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1233#else
1234#if defined ASM_OUTPUT_ALIGNED_LOCAL
1235#define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1236 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl))
1237#else
1238#define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1239 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded)
1240#endif
1241#endif
1242
1243#if defined ASM_OUTPUT_ALIGNED_BSS
1244#define ASM_EMIT_BSS(decl, name, size, rounded) \
1245 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1246#else
1247#if defined ASM_OUTPUT_BSS
1248#define ASM_EMIT_BSS(decl, name, size, rounded) \
1249 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded)
1250#else
1251#undef ASM_EMIT_BSS
1252#endif
1253#endif
1254
1255#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1256#define ASM_EMIT_COMMON(decl, name, size, rounded) \
1257 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1258#else
1259#if defined ASM_OUTPUT_ALIGNED_COMMON
1260#define ASM_EMIT_COMMON(decl, name, size, rounded) \
1261 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl))
1262#else
1263#define ASM_EMIT_COMMON(decl, name, size, rounded) \
1264 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded)
1265#endif
1266#endif
1267
54fbf6a1 1268static bool
2e1eedd6
AJ
1269asm_emit_uninitialised (tree decl, const char *name,
1270 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1271 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
b8694195 1272{
a56e7c08
NC
1273 enum
1274 {
b8694195
NC
1275 asm_dest_common,
1276 asm_dest_bss,
1277 asm_dest_local
1278 }
1279 destination = asm_dest_local;
46f9491e 1280
54fbf6a1
DE
1281 /* ??? We should handle .bss via select_section mechanisms rather than
1282 via special target hooks. That would eliminate this special case. */
b8694195
NC
1283 if (TREE_PUBLIC (decl))
1284 {
54fbf6a1
DE
1285 if (!DECL_COMMON (decl))
1286#ifdef ASM_EMIT_BSS
b8694195 1287 destination = asm_dest_bss;
54fbf6a1
DE
1288#else
1289 return false;
46f9491e 1290#endif
54fbf6a1 1291 else
b8694195
NC
1292 destination = asm_dest_common;
1293 }
1294
1bd6476f
RH
1295 if (destination == asm_dest_bss)
1296 globalize_decl (decl);
1b18fc2c 1297 resolve_unique_section (decl, 0, flag_data_sections);
ecb0eece 1298
b8694195
NC
1299 if (flag_shared_data)
1300 {
1301 switch (destination)
1302 {
1303#ifdef ASM_OUTPUT_SHARED_BSS
1304 case asm_dest_bss:
1305 ASM_OUTPUT_SHARED_BSS (asm_out_file, decl, name, size, rounded);
1306 return;
1307#endif
1308#ifdef ASM_OUTPUT_SHARED_COMMON
1309 case asm_dest_common:
1310 ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
1311 return;
1312#endif
1313#ifdef ASM_OUTPUT_SHARED_LOCAL
1314 case asm_dest_local:
1315 ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
1316 return;
1317#endif
1318 default:
1319 break;
1320 }
1321 }
1322
1323 switch (destination)
1324 {
1325#ifdef ASM_EMIT_BSS
1326 case asm_dest_bss:
1327 ASM_EMIT_BSS (decl, name, size, rounded);
1328 break;
1329#endif
1330 case asm_dest_common:
1331 ASM_EMIT_COMMON (decl, name, size, rounded);
1332 break;
1333 case asm_dest_local:
1334 ASM_EMIT_LOCAL (decl, name, size, rounded);
1335 break;
1336 default:
1337 abort ();
1338 }
1339
54fbf6a1 1340 return true;
b8694195
NC
1341}
1342
79e68feb
RS
1343/* Assemble everything that is needed for a variable or function declaration.
1344 Not used for automatic variables, and not used for function definitions.
1345 Should not be called for variables of incomplete structure type.
1346
1347 TOP_LEVEL is nonzero if this variable has file scope.
1348 AT_END is nonzero if this is the special handling, at end of compilation,
ff8f4401
RS
1349 to define things that have had only tentative definitions.
1350 DONT_OUTPUT_DATA if nonzero means don't actually output the
1351 initial value (that will be done by the caller). */
79e68feb
RS
1352
1353void
2e1eedd6
AJ
1354assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
1355 int at_end ATTRIBUTE_UNUSED, int dont_output_data)
79e68feb 1356{
b3694847 1357 const char *name;
f8344bea 1358 unsigned int align;
79e68feb 1359 int reloc = 0;
17eee61c 1360 rtx decl_rtl;
79e68feb 1361
d35543c0 1362 if (lang_hooks.decls.prepare_assemble_variable)
ae2bcd98 1363 lang_hooks.decls.prepare_assemble_variable (decl);
d35543c0 1364
cbed4565
RS
1365 last_assemble_variable_decl = 0;
1366
d36d70cc 1367 /* Normally no need to say anything here for external references,
9faa82d8 1368 since assemble_external is called by the language-specific code
d36d70cc 1369 when a declaration is first seen. */
79e68feb 1370
44fe2e80 1371 if (DECL_EXTERNAL (decl))
79e68feb
RS
1372 return;
1373
1374 /* Output no assembler code for a function declaration.
1375 Only definitions of functions output anything. */
1376
1377 if (TREE_CODE (decl) == FUNCTION_DECL)
1378 return;
1379
3914abb4 1380 /* Do nothing for global register variables. */
f8cfc6aa 1381 if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl)))
3914abb4
NB
1382 {
1383 TREE_ASM_WRITTEN (decl) = 1;
1384 return;
1385 }
1386
79e68feb
RS
1387 /* If type was incomplete when the variable was declared,
1388 see if it is complete now. */
1389
1390 if (DECL_SIZE (decl) == 0)
1391 layout_decl (decl, 0);
1392
1393 /* Still incomplete => don't allocate it; treat the tentative defn
1394 (which is what it must have been) as an `extern' reference. */
1395
ff8f4401 1396 if (!dont_output_data && DECL_SIZE (decl) == 0)
79e68feb 1397 {
ddd2d57e 1398 error ("%Jstorage size of `%D' isn't known", decl, decl);
1c1a7ba4 1399 TREE_ASM_WRITTEN (decl) = 1;
79e68feb
RS
1400 return;
1401 }
1402
1403 /* The first declaration of a variable that comes through this function
1404 decides whether it is global (in C, has external linkage)
1405 or local (in C, has internal linkage). So do nothing more
1406 if this function has already run. */
1407
1408 if (TREE_ASM_WRITTEN (decl))
1409 return;
1410
fb49053f
RH
1411 /* Make sure targetm.encode_section_info is invoked before we set
1412 ASM_WRITTEN. */
17eee61c 1413 decl_rtl = DECL_RTL (decl);
46f9491e 1414
79e68feb
RS
1415 TREE_ASM_WRITTEN (decl) = 1;
1416
3c350eb3
CB
1417 /* Do no output if -fsyntax-only. */
1418 if (flag_syntax_only)
1419 return;
1420
809d6575 1421 app_disable ();
79e68feb 1422
770ae6cc
RK
1423 if (! dont_output_data
1424 && ! host_integerp (DECL_SIZE_UNIT (decl), 1))
ff8f4401 1425 {
ddd2d57e 1426 error ("%Jsize of variable '%D' is too large", decl, decl);
544f03b4 1427 return;
79e68feb
RS
1428 }
1429
17eee61c 1430 name = XSTR (XEXP (decl_rtl, 0), 0);
810db579
JH
1431 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1432 notice_global_symbol (decl);
f796d997 1433
8a198bd2
JW
1434 /* Compute the alignment of this data. */
1435
1436 align = DECL_ALIGN (decl);
1437
1438 /* In the case for initialing an array whose length isn't specified,
1439 where we have not yet been able to do the layout,
1440 figure out the proper alignment now. */
1441 if (dont_output_data && DECL_SIZE (decl) == 0
1442 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1443 align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1444
1445 /* Some object file formats have a maximum alignment which they support.
1446 In particular, a.out format supports a maximum alignment of 4. */
1447#ifndef MAX_OFILE_ALIGNMENT
1448#define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
1449#endif
1450 if (align > MAX_OFILE_ALIGNMENT)
1451 {
ddd2d57e
RH
1452 warning ("%Jalignment of '%D' is greater than maximum object "
1453 "file alignment. Using %d", decl, decl,
1454 MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
8a198bd2
JW
1455 align = MAX_OFILE_ALIGNMENT;
1456 }
1457
1458 /* On some machines, it is good to increase alignment sometimes. */
51084e13
RH
1459 if (! DECL_USER_ALIGN (decl))
1460 {
8a198bd2 1461#ifdef DATA_ALIGNMENT
51084e13 1462 align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
8a198bd2
JW
1463#endif
1464#ifdef CONSTANT_ALIGNMENT
51084e13 1465 if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
41077ce4 1466 align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
8a198bd2 1467#endif
51084e13 1468 }
8a198bd2
JW
1469
1470 /* Reset the alignment in case we have made it tighter, so we can benefit
1471 from it in get_pointer_alignment. */
1472 DECL_ALIGN (decl) = align;
c952ff4b 1473 set_mem_align (decl_rtl, align);
8a198bd2 1474
b14707c3
RH
1475 if (TREE_PUBLIC (decl))
1476 maybe_assemble_visibility (decl);
1477
15409448
JM
1478 /* Output any data that we will need to use the address of. */
1479 if (DECL_INITIAL (decl) == error_mark_node)
1480 reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;
1481 else if (DECL_INITIAL (decl))
b2218cc1
AO
1482 {
1483 reloc = compute_reloc_for_constant (DECL_INITIAL (decl));
1484 output_addressed_constants (DECL_INITIAL (decl));
1485 }
d88a8ff5 1486 resolve_unique_section (decl, reloc, flag_data_sections);
15409448 1487
79e68feb
RS
1488 /* Handle uninitialized definitions. */
1489
3d78f2e9
RH
1490 /* If the decl has been given an explicit section name, then it
1491 isn't common, and shouldn't be handled as such. */
1492 if (DECL_SECTION_NAME (decl) || dont_output_data)
1493 ;
1494 /* We don't implement common thread-local data at present. */
1495 else if (DECL_THREAD_LOCAL (decl))
1496 {
1497 if (DECL_COMMON (decl))
1498 sorry ("thread-local COMMON data not implemented");
1499 }
3d78f2e9
RH
1500 else if (DECL_INITIAL (decl) == 0
1501 || DECL_INITIAL (decl) == error_mark_node
41077ce4 1502 || (flag_zero_initialized_in_bss
af75fb67
JM
1503 /* Leave constant zeroes in .rodata so they can be shared. */
1504 && !TREE_READONLY (decl)
3d78f2e9 1505 && initializer_zerop (DECL_INITIAL (decl))))
79e68feb 1506 {
770ae6cc
RK
1507 unsigned HOST_WIDE_INT size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
1508 unsigned HOST_WIDE_INT rounded = size;
79e68feb 1509
79e68feb
RS
1510 /* Don't allocate zero bytes of common,
1511 since that means "undefined external" in the linker. */
770ae6cc
RK
1512 if (size == 0)
1513 rounded = 1;
1514
79e68feb
RS
1515 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1516 so that each uninitialized object starts on such a boundary. */
1517 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1518 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1519 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
46f9491e 1520
ec1bff50 1521#if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_DECL_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
4cf7705a 1522 if ((unsigned HOST_WIDE_INT) DECL_ALIGN (decl) / BITS_PER_UNIT > rounded)
ddd2d57e
RH
1523 warning ("%Jrequested alignment for '%D' is greater than "
1524 "implemented alignment of %d", decl, decl, rounded);
4bcfa7a8 1525#endif
46f9491e 1526
54fbf6a1
DE
1527 /* If the target cannot output uninitialized but not common global data
1528 in .bss, then we have to use .data, so fall through. */
1529 if (asm_emit_uninitialised (decl, name, size, rounded))
1530 return;
79e68feb
RS
1531 }
1532
e5887033
DE
1533 /* Handle initialized definitions.
1534 Also handle uninitialized global definitions if -fno-common and the
1535 target doesn't support ASM_OUTPUT_BSS. */
79e68feb
RS
1536
1537 /* First make the assembler name(s) global if appropriate. */
1538 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
19c5b1cf 1539 globalize_decl (decl);
79e68feb 1540
f9da1f35
DE
1541 /* Switch to the appropriate section. */
1542 variable_section (decl, reloc);
79e68feb 1543
a8e2f179 1544 /* dbxout.c needs to know this. */
750054a2 1545 if (in_text_section () || in_unlikely_text_section ())
a8e2f179
RS
1546 DECL_IN_TEXT_SECTION (decl) = 1;
1547
8a198bd2 1548 /* Output the alignment of this data. */
79e68feb 1549 if (align > BITS_PER_UNIT)
91ea4f8d
KG
1550 {
1551 ASM_OUTPUT_ALIGN (asm_out_file,
1552 floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT));
1553 }
79e68feb
RS
1554
1555 /* Do any machine/system dependent processing of the object. */
8bd16853 1556#ifdef ASM_DECLARE_OBJECT_NAME
b93a436e
JL
1557 last_assemble_variable_decl = decl;
1558 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
8bd16853 1559#else
b93a436e
JL
1560 /* Standard thing is just output label for the object. */
1561 ASM_OUTPUT_LABEL (asm_out_file, name);
79e68feb
RS
1562#endif /* ASM_DECLARE_OBJECT_NAME */
1563
ff8f4401 1564 if (!dont_output_data)
79e68feb 1565 {
08a8c6b6
JB
1566 if (DECL_INITIAL (decl)
1567 && DECL_INITIAL (decl) != error_mark_node
1568 && !initializer_zerop (DECL_INITIAL (decl)))
ff8f4401 1569 /* Output the actual data. */
770ae6cc 1570 output_constant (DECL_INITIAL (decl),
c8af3574
RH
1571 tree_low_cst (DECL_SIZE_UNIT (decl), 1),
1572 align);
ff8f4401
RS
1573 else
1574 /* Leave space for it. */
770ae6cc 1575 assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
79e68feb 1576 }
79e68feb
RS
1577}
1578
2e9effae
RS
1579/* Return 1 if type TYPE contains any pointers. */
1580
1581static int
2e1eedd6 1582contains_pointers_p (tree type)
2e9effae
RS
1583{
1584 switch (TREE_CODE (type))
1585 {
1586 case POINTER_TYPE:
1587 case REFERENCE_TYPE:
1588 /* I'm not sure whether OFFSET_TYPE needs this treatment,
1589 so I'll play safe and return 1. */
1590 case OFFSET_TYPE:
1591 return 1;
1592
1593 case RECORD_TYPE:
1594 case UNION_TYPE:
1595 case QUAL_UNION_TYPE:
1596 {
1597 tree fields;
1598 /* For a type that has fields, see if the fields have pointers. */
1599 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
ce49ea8a
JM
1600 if (TREE_CODE (fields) == FIELD_DECL
1601 && contains_pointers_p (TREE_TYPE (fields)))
2e9effae
RS
1602 return 1;
1603 return 0;
1604 }
1605
1606 case ARRAY_TYPE:
1607 /* An array type contains pointers if its element type does. */
1608 return contains_pointers_p (TREE_TYPE (type));
1609
1610 default:
1611 return 0;
1612 }
1613}
1614
9be6533a
RS
1615#ifdef ASM_OUTPUT_EXTERNAL
1616/* True if DECL is a function decl for which no out-of-line copy exists.
1617 It is assumed that DECL's assembler name has been set. */
1618
1619static bool
1620incorporeal_function_p (tree decl)
1621{
1622 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
1623 {
1624 const char *name;
1625
1626 if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
1627 && DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA)
1628 return true;
1629
1630 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1631 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
1632 return true;
1633 }
1634 return false;
1635}
1636#endif
1637
79e68feb 1638/* Output something to declare an external symbol to the assembler.
fff9e713
MT
1639 (Most assemblers don't need this, so we normally output nothing.)
1640 Do nothing if DECL is not external. */
79e68feb
RS
1641
1642void
2e1eedd6 1643assemble_external (tree decl ATTRIBUTE_UNUSED)
79e68feb 1644{
e6855a2d
MM
1645 /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
1646 main body of this code is only rarely exercised. To provide some
1647 testing, on all platforms, we make sure that the ASM_OUT_FILE is
1648 open. If it's not, we should not be calling this function. */
1649 if (!asm_out_file)
1650 abort ();
1651
79e68feb 1652#ifdef ASM_OUTPUT_EXTERNAL
2f939d94 1653 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
79e68feb 1654 {
fff9e713
MT
1655 rtx rtl = DECL_RTL (decl);
1656
3c0cb5de 1657 if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
9be6533a
RS
1658 && !SYMBOL_REF_USED (XEXP (rtl, 0))
1659 && !incorporeal_function_p (decl))
fff9e713
MT
1660 {
1661 /* Some systems do require some output. */
1662 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
1663 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
1664 }
79e68feb
RS
1665 }
1666#endif
1667}
1668
1669/* Similar, for calling a library function FUN. */
1670
1671void
6773a41c 1672assemble_external_libcall (rtx fun)
79e68feb 1673{
b93a436e
JL
1674 /* Declare library function name external when first used, if nec. */
1675 if (! SYMBOL_REF_USED (fun))
79e68feb 1676 {
b93a436e 1677 SYMBOL_REF_USED (fun) = 1;
5fd9b178 1678 targetm.asm_out.external_libcall (fun);
79e68feb 1679 }
79e68feb
RS
1680}
1681
79e68feb
RS
1682/* Assemble a label named NAME. */
1683
1684void
2e1eedd6 1685assemble_label (const char *name)
79e68feb 1686{
b93a436e 1687 ASM_OUTPUT_LABEL (asm_out_file, name);
79e68feb
RS
1688}
1689
bb9a388d 1690/* Set the symbol_referenced flag for ID. */
4d7d0451 1691void
2e1eedd6 1692mark_referenced (tree id)
4d7d0451 1693{
4d7d0451
JH
1694 TREE_SYMBOL_REFERENCED (id) = 1;
1695}
1696
bb9a388d
ZW
1697/* Set the symbol_referenced flag for DECL and notify callgraph. */
1698void
1699mark_decl_referenced (tree decl)
1700{
1701 if (TREE_CODE (decl) == FUNCTION_DECL)
1702 cgraph_mark_needed_node (cgraph_node (decl));
1703 else if (TREE_CODE (decl) == VAR_DECL)
1704 cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
1705 /* else do nothing - we can get various sorts of CST nodes here,
1706 which do not need to be marked. */
1707}
1708
79e68feb
RS
1709/* Output to FILE a reference to the assembler name of a C-level name NAME.
1710 If NAME starts with a *, the rest of NAME is output verbatim.
1711 Otherwise NAME is transformed in an implementation-defined way
1712 (usually by the addition of an underscore).
1713 Many macros in the tm file are defined to call this function. */
1714
1715void
2e1eedd6 1716assemble_name (FILE *file, const char *name)
79e68feb 1717{
ec940faa 1718 const char *real_name;
a94dbf2c 1719 tree id;
648fb7cf 1720
245f1bfa 1721 real_name = targetm.strip_name_encoding (name);
87907387 1722
a94dbf2c
JM
1723 id = maybe_get_identifier (real_name);
1724 if (id)
4d7d0451 1725 mark_referenced (id);
03e42132 1726
79e68feb 1727 if (name[0] == '*')
b93a436e 1728 fputs (&name[1], file);
79e68feb 1729 else
86aff125 1730 ASM_OUTPUT_LABELREF (file, name);
79e68feb
RS
1731}
1732
1733/* Allocate SIZE bytes writable static space with a gensym name
1734 and return an RTX to refer to its address. */
1735
1736rtx
2e1eedd6 1737assemble_static_space (unsigned HOST_WIDE_INT size)
79e68feb
RS
1738{
1739 char name[12];
520a57c8 1740 const char *namestring;
79e68feb 1741 rtx x;
79e68feb
RS
1742
1743#if 0
1744 if (flag_shared_data)
1745 data_section ();
1746#endif
1747
1748 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1749 ++const_labelno;
a8a05998 1750 namestring = ggc_strdup (name);
79e68feb 1751
b93a436e 1752 x = gen_rtx_SYMBOL_REF (Pmode, namestring);
52859c77 1753 SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
ca695ac9 1754
e9a25f70 1755#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
b93a436e
JL
1756 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
1757 BIGGEST_ALIGNMENT);
e9a25f70 1758#else
79e68feb 1759#ifdef ASM_OUTPUT_ALIGNED_LOCAL
b93a436e 1760 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
79e68feb 1761#else
e016950d
KG
1762 {
1763 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1764 so that each uninitialized object starts on such a boundary. */
2d76cb1a 1765 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */
58e15542 1766 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
47c3ed98
KG
1767 = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1768 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1769 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
e016950d
KG
1770 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1771 }
e9a25f70 1772#endif
79e68feb
RS
1773#endif
1774 return x;
1775}
1776
1777/* Assemble the static constant template for function entry trampolines.
1778 This is done at most once per compilation.
1779 Returns an RTX for the address of the template. */
1780
6de9cd9a
DN
1781static GTY(()) rtx initial_trampoline;
1782
f0e969bd 1783#ifdef TRAMPOLINE_TEMPLATE
79e68feb 1784rtx
2e1eedd6 1785assemble_trampoline_template (void)
79e68feb
RS
1786{
1787 char label[256];
fc608b03 1788 const char *name;
79e68feb 1789 int align;
52859c77 1790 rtx symbol;
79e68feb 1791
6de9cd9a
DN
1792 if (initial_trampoline)
1793 return initial_trampoline;
1794
37552631 1795 /* By default, put trampoline templates in read-only data section. */
f49acdb4 1796
37552631
RS
1797#ifdef TRAMPOLINE_SECTION
1798 TRAMPOLINE_SECTION ();
1799#else
c8c29f85 1800 readonly_data_section ();
37552631 1801#endif
f49acdb4 1802
79e68feb 1803 /* Write the assembler code to define one. */
073b0524 1804 align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
79e68feb 1805 if (align > 0)
91ea4f8d
KG
1806 {
1807 ASM_OUTPUT_ALIGN (asm_out_file, align);
1808 }
79e68feb 1809
5fd9b178 1810 targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
79e68feb
RS
1811 TRAMPOLINE_TEMPLATE (asm_out_file);
1812
1813 /* Record the rtl to refer to it. */
1814 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
a8a05998 1815 name = ggc_strdup (label);
52859c77
RH
1816 symbol = gen_rtx_SYMBOL_REF (Pmode, name);
1817 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
1818
6de9cd9a
DN
1819 initial_trampoline = gen_rtx_MEM (BLKmode, symbol);
1820 set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
1821
1822 return initial_trampoline;
79e68feb 1823}
f0e969bd 1824#endif
79e68feb 1825\f
c8af3574
RH
1826/* A and B are either alignments or offsets. Return the minimum alignment
1827 that may be assumed after adding the two together. */
1828
1829static inline unsigned
2e1eedd6 1830min_align (unsigned int a, unsigned int b)
c8af3574
RH
1831{
1832 return (a | b) & -(a | b);
1833}
79e68feb 1834
301d03af
RS
1835/* Return the assembler directive for creating a given kind of integer
1836 object. SIZE is the number of bytes in the object and ALIGNED_P
1837 indicates whether it is known to be aligned. Return NULL if the
1838 assembly dialect has no such directive.
79e68feb 1839
301d03af
RS
1840 The returned string should be printed at the start of a new line and
1841 be followed immediately by the object's initial value. */
1842
1843const char *
2e1eedd6 1844integer_asm_op (int size, int aligned_p)
79e68feb 1845{
301d03af 1846 struct asm_int_op *ops;
79e68feb 1847
301d03af
RS
1848 if (aligned_p)
1849 ops = &targetm.asm_out.aligned_op;
c8af3574 1850 else
301d03af
RS
1851 ops = &targetm.asm_out.unaligned_op;
1852
1853 switch (size)
c8af3574 1854 {
301d03af
RS
1855 case 1:
1856 return targetm.asm_out.byte_op;
1857 case 2:
1858 return ops->hi;
1859 case 4:
1860 return ops->si;
1861 case 8:
1862 return ops->di;
1863 case 16:
1864 return ops->ti;
1865 default:
1866 return NULL;
1867 }
1868}
c8af3574 1869
301d03af
RS
1870/* Use directive OP to assemble an integer object X. Print OP at the
1871 start of the line, followed immediately by the value of X. */
c8af3574 1872
301d03af 1873void
2e1eedd6 1874assemble_integer_with_op (const char *op, rtx x)
301d03af
RS
1875{
1876 fputs (op, asm_out_file);
1877 output_addr_const (asm_out_file, x);
1878 fputc ('\n', asm_out_file);
1879}
79e68feb 1880
301d03af 1881/* The default implementation of the asm_out.integer target hook. */
79e68feb 1882
301d03af 1883bool
2e1eedd6
AJ
1884default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
1885 unsigned int size ATTRIBUTE_UNUSED,
1886 int aligned_p ATTRIBUTE_UNUSED)
301d03af
RS
1887{
1888 const char *op = integer_asm_op (size, aligned_p);
1889 return op && (assemble_integer_with_op (op, x), true);
1890}
79e68feb 1891
301d03af
RS
1892/* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
1893 the alignment of the integer in bits. Return 1 if we were able to output
0e9e1e0a 1894 the constant, otherwise 0. If FORCE is nonzero, abort if we can't output
301d03af 1895 the constant. */
79e68feb 1896
301d03af 1897bool
2e1eedd6 1898assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
301d03af
RS
1899{
1900 int aligned_p;
79e68feb 1901
301d03af 1902 aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
79e68feb 1903
301d03af 1904 /* See if the target hook can handle this kind of object. */
5fd9b178 1905 if (targetm.asm_out.integer (x, size, aligned_p))
301d03af 1906 return true;
79e68feb 1907
301d03af
RS
1908 /* If the object is a multi-byte one, try splitting it up. Split
1909 it into words it if is multi-word, otherwise split it into bytes. */
1910 if (size > 1)
c8af3574
RH
1911 {
1912 enum machine_mode omode, imode;
301d03af
RS
1913 unsigned int subalign;
1914 unsigned int subsize, i;
46f9491e 1915
301d03af
RS
1916 subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
1917 subalign = MIN (align, subsize * BITS_PER_UNIT);
1918 omode = mode_for_size (subsize * BITS_PER_UNIT, MODE_INT, 0);
c8af3574
RH
1919 imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1920
301d03af 1921 for (i = 0; i < size; i += subsize)
c8af3574 1922 {
301d03af
RS
1923 rtx partial = simplify_subreg (omode, x, imode, i);
1924 if (!partial || !assemble_integer (partial, subsize, subalign, 0))
c8af3574
RH
1925 break;
1926 }
c8af3574 1927 if (i == size)
301d03af
RS
1928 return true;
1929
1930 /* If we've printed some of it, but not all of it, there's no going
1931 back now. */
c8af3574
RH
1932 if (i > 0)
1933 abort ();
1934 }
1935
79e68feb
RS
1936 if (force)
1937 abort ();
1938
301d03af 1939 return false;
79e68feb
RS
1940}
1941\f
82af613f 1942void
2e1eedd6 1943assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align)
94aca342 1944{
82af613f 1945 long data[4];
b409761a
ZW
1946 int i;
1947 int bitsize, nelts, nunits, units_per;
1948
02befdf4 1949 /* This is hairy. We have a quantity of known size. real_to_target
b409761a
ZW
1950 will put it into an array of *host* longs, 32 bits per element
1951 (even if long is more than 32 bits). We need to determine the
1952 number of array elements that are occupied (nelts) and the number
1953 of *target* min-addressable units that will be occupied in the
02befdf4
ZW
1954 object file (nunits). We cannot assume that 32 divides the
1955 mode's bitsize (size * BITS_PER_UNIT) evenly.
1956
1957 size * BITS_PER_UNIT is used here to make sure that padding bits
1958 (which might appear at either end of the value; real_to_target
1959 will include the padding bits in its output array) are included. */
1960
1961 nunits = GET_MODE_SIZE (mode);
1962 bitsize = nunits * BITS_PER_UNIT;
b409761a
ZW
1963 nelts = CEIL (bitsize, 32);
1964 units_per = 32 / BITS_PER_UNIT;
1965
1966 real_to_target (data, &d, mode);
1967
1968 /* Put out the first word with the specified alignment. */
1969 assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1);
1970 nunits -= units_per;
1971
1972 /* Subsequent words need only 32-bit alignment. */
1973 align = min_align (align, 32);
1974
1975 for (i = 1; i < nelts; i++)
79e68feb 1976 {
b409761a
ZW
1977 assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1);
1978 nunits -= units_per;
79e68feb 1979 }
94aca342 1980}
79e68feb 1981\f
79e68feb
RS
1982/* Given an expression EXP with a constant value,
1983 reduce it to the sum of an assembler symbol and an integer.
1984 Store them both in the structure *VALUE.
1985 Abort if EXP does not reduce. */
1986
e2500fed 1987struct addr_const GTY(())
79e68feb
RS
1988{
1989 rtx base;
fb351073 1990 HOST_WIDE_INT offset;
79e68feb
RS
1991};
1992
1993static void
2e1eedd6 1994decode_addr_const (tree exp, struct addr_const *value)
79e68feb 1995{
b3694847
SS
1996 tree target = TREE_OPERAND (exp, 0);
1997 int offset = 0;
1998 rtx x;
79e68feb
RS
1999
2000 while (1)
2001 {
2002 if (TREE_CODE (target) == COMPONENT_REF
770ae6cc 2003 && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
665f2503 2004
79e68feb 2005 {
770ae6cc 2006 offset += int_byte_position (TREE_OPERAND (target, 1));
79e68feb
RS
2007 target = TREE_OPERAND (target, 0);
2008 }
b4e3fabb
RK
2009 else if (TREE_CODE (target) == ARRAY_REF
2010 || TREE_CODE (target) == ARRAY_RANGE_REF)
79e68feb 2011 {
770ae6cc
RK
2012 offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2013 * tree_low_cst (TREE_OPERAND (target, 1), 0));
79e68feb
RS
2014 target = TREE_OPERAND (target, 0);
2015 }
2016 else
2017 break;
2018 }
2019
2020 switch (TREE_CODE (target))
2021 {
2022 case VAR_DECL:
2023 case FUNCTION_DECL:
2024 x = DECL_RTL (target);
2025 break;
2026
2027 case LABEL_DECL:
b93a436e 2028 x = gen_rtx_MEM (FUNCTION_MODE,
046e4e36 2029 gen_rtx_LABEL_REF (VOIDmode, force_label_rtx (target)));
79e68feb
RS
2030 break;
2031
2032 case REAL_CST:
2033 case STRING_CST:
2034 case COMPLEX_CST:
2035 case CONSTRUCTOR:
2cf55b55 2036 case INTEGER_CST:
44e3910a 2037 x = output_constant_def (target, 1);
79e68feb
RS
2038 break;
2039
2040 default:
2041 abort ();
2042 }
2043
3c0cb5de 2044 if (!MEM_P (x))
b93a436e
JL
2045 abort ();
2046 x = XEXP (x, 0);
79e68feb
RS
2047
2048 value->base = x;
2049 value->offset = offset;
2050}
2051\f
2052/* Uniquize all constants that appear in memory.
2053 Each constant in memory thus far output is recorded
5e9295fa 2054 in `const_desc_table'. */
79e68feb 2055
e2500fed 2056struct constant_descriptor_tree GTY(())
79e68feb 2057{
e2500fed 2058 /* A MEM for the constant. */
14a774a9 2059 rtx rtl;
e2500fed
GK
2060
2061 /* The value of the constant. */
2062 tree value;
79e68feb
RS
2063};
2064
10b6a274
ZW
2065static GTY((param_is (struct constant_descriptor_tree)))
2066 htab_t const_desc_htab;
79e68feb 2067
2e1eedd6
AJ
2068static struct constant_descriptor_tree * build_constant_desc (tree);
2069static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
bd7cf17e 2070
79e68feb
RS
2071/* Compute a hash code for a constant expression. */
2072
10b6a274 2073static hashval_t
2e1eedd6 2074const_desc_hash (const void *ptr)
46b33600 2075{
10b6a274 2076 return const_hash_1 (((struct constant_descriptor_tree *)ptr)->value);
46b33600
RH
2077}
2078
10b6a274 2079static hashval_t
2e1eedd6 2080const_hash_1 (const tree exp)
79e68feb 2081{
b3694847 2082 const char *p;
10b6a274 2083 hashval_t hi;
46b33600 2084 int len, i;
b3694847 2085 enum tree_code code = TREE_CODE (exp);
79e68feb 2086
a9d07d6e
RK
2087 /* Either set P and LEN to the address and len of something to hash and
2088 exit the switch or return a value. */
2089
2090 switch (code)
79e68feb 2091 {
a9d07d6e 2092 case INTEGER_CST:
2afaa41c
GM
2093 p = (char *) &TREE_INT_CST (exp);
2094 len = sizeof TREE_INT_CST (exp);
a9d07d6e
RK
2095 break;
2096
2097 case REAL_CST:
46b33600 2098 return real_hash (TREE_REAL_CST_PTR (exp));
79e68feb 2099
a9d07d6e 2100 case STRING_CST:
3521b33c
ZW
2101 p = TREE_STRING_POINTER (exp);
2102 len = TREE_STRING_LENGTH (exp);
a9d07d6e 2103 break;
5e9295fa 2104
a9d07d6e 2105 case COMPLEX_CST:
46b33600
RH
2106 return (const_hash_1 (TREE_REALPART (exp)) * 5
2107 + const_hash_1 (TREE_IMAGPART (exp)));
a9d07d6e
RK
2108
2109 case CONSTRUCTOR:
2110 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
79e68feb 2111 {
3cce094d
KG
2112 char *tmp;
2113
a9d07d6e 2114 len = int_size_in_bytes (TREE_TYPE (exp));
703ad42b 2115 tmp = alloca (len);
3cce094d
KG
2116 get_set_constructor_bytes (exp, (unsigned char *) tmp, len);
2117 p = tmp;
a9d07d6e
RK
2118 break;
2119 }
2120 else
2121 {
b3694847 2122 tree link;
a9d07d6e 2123
46b33600 2124 hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
a9d07d6e
RK
2125
2126 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2127 if (TREE_VALUE (link))
46b33600 2128 hi = hi * 603 + const_hash_1 (TREE_VALUE (link));
a9d07d6e
RK
2129
2130 return hi;
79e68feb 2131 }
79e68feb 2132
a9d07d6e 2133 case ADDR_EXPR:
5d056e9b 2134 case FDESC_EXPR:
a9d07d6e
RK
2135 {
2136 struct addr_const value;
2137
2138 decode_addr_const (exp, &value);
2139 if (GET_CODE (value.base) == SYMBOL_REF)
2140 {
2141 /* Don't hash the address of the SYMBOL_REF;
2142 only use the offset and the symbol name. */
2143 hi = value.offset;
2144 p = XSTR (value.base, 0);
2145 for (i = 0; p[i] != 0; i++)
2146 hi = ((hi * 613) + (unsigned) (p[i]));
2147 }
2148 else if (GET_CODE (value.base) == LABEL_REF)
2149 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
6a651371 2150 else
c203e7fe 2151 abort ();
a9d07d6e 2152 }
79e68feb 2153 return hi;
a9d07d6e
RK
2154
2155 case PLUS_EXPR:
2156 case MINUS_EXPR:
46b33600
RH
2157 return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
2158 + const_hash_1 (TREE_OPERAND (exp, 1)));
a9d07d6e
RK
2159
2160 case NOP_EXPR:
2161 case CONVERT_EXPR:
2162 case NON_LVALUE_EXPR:
46b33600 2163 return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
46f9491e 2164
e9a25f70 2165 default:
2d76cb1a 2166 /* A language specific constant. Just hash the code. */
46b33600 2167 return code;
79e68feb 2168 }
79e68feb 2169
f9da5064 2170 /* Compute hashing function. */
79e68feb
RS
2171 hi = len;
2172 for (i = 0; i < len; i++)
0f41302f 2173 hi = ((hi * 613) + (unsigned) (p[i]));
79e68feb 2174
79e68feb
RS
2175 return hi;
2176}
79e68feb 2177
10b6a274
ZW
2178/* Wrapper of compare_constant, for the htab interface. */
2179static int
2e1eedd6 2180const_desc_eq (const void *p1, const void *p2)
10b6a274
ZW
2181{
2182 return compare_constant (((struct constant_descriptor_tree *)p1)->value,
2183 ((struct constant_descriptor_tree *)p2)->value);
2184}
2185
e2500fed
GK
2186/* Compare t1 and t2, and return 1 only if they are known to result in
2187 the same bit pattern on output. */
79e68feb 2188
e2500fed 2189static int
2e1eedd6 2190compare_constant (const tree t1, const tree t2)
79e68feb 2191{
e2500fed 2192 enum tree_code typecode;
79e68feb 2193
e2500fed
GK
2194 if (t1 == NULL_TREE)
2195 return t2 == NULL_TREE;
2196 if (t2 == NULL_TREE)
79e68feb
RS
2197 return 0;
2198
e2500fed
GK
2199 if (TREE_CODE (t1) != TREE_CODE (t2))
2200 return 0;
a9d07d6e 2201
e2500fed 2202 switch (TREE_CODE (t1))
79e68feb 2203 {
a9d07d6e 2204 case INTEGER_CST:
79e68feb 2205 /* Integer constants are the same only if the same width of type. */
e2500fed 2206 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
79e68feb 2207 return 0;
e2500fed 2208 return tree_int_cst_equal (t1, t2);
a9d07d6e
RK
2209
2210 case REAL_CST:
79e68feb 2211 /* Real constants are the same only if the same width of type. */
e2500fed 2212 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
79e68feb 2213 return 0;
a9d07d6e 2214
e2500fed 2215 return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
a9d07d6e
RK
2216
2217 case STRING_CST:
e2500fed 2218 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
79e68feb 2219 return 0;
a9d07d6e 2220
e2500fed
GK
2221 return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2222 && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2223 TREE_STRING_LENGTH (t1)));
79e68feb 2224
a9d07d6e 2225 case COMPLEX_CST:
e2500fed
GK
2226 return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2227 && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
79e68feb 2228
a9d07d6e 2229 case CONSTRUCTOR:
e2500fed
GK
2230 typecode = TREE_CODE (TREE_TYPE (t1));
2231 if (typecode != TREE_CODE (TREE_TYPE (t2)))
2232 return 0;
eb528802 2233
e2500fed 2234 if (typecode == SET_TYPE)
77fa0940 2235 {
e2500fed
GK
2236 int len = int_size_in_bytes (TREE_TYPE (t2));
2237 unsigned char *tmp1, *tmp2;
a9d07d6e 2238
e2500fed 2239 if (int_size_in_bytes (TREE_TYPE (t1)) != len)
a9d07d6e
RK
2240 return 0;
2241
703ad42b
KG
2242 tmp1 = alloca (len);
2243 tmp2 = alloca (len);
a9d07d6e 2244
e2500fed
GK
2245 if (get_set_constructor_bytes (t1, tmp1, len) != NULL_TREE)
2246 return 0;
2247 if (get_set_constructor_bytes (t2, tmp2, len) != NULL_TREE)
a9d07d6e 2248 return 0;
b2e2d0cc 2249
eae216e8 2250 return memcmp (tmp1, tmp2, len) == 0;
e2500fed
GK
2251 }
2252 else
2253 {
2254 tree l1, l2;
a9d07d6e 2255
e2500fed 2256 if (typecode == ARRAY_TYPE)
14a774a9 2257 {
e2500fed
GK
2258 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2259 /* For arrays, check that the sizes all match. */
2260 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2261 || size_1 == -1
2262 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
14a774a9 2263 return 0;
14a774a9 2264 }
e2500fed 2265 else
77fa0940 2266 {
e2500fed
GK
2267 /* For record and union constructors, require exact type
2268 equality. */
2269 if (TREE_TYPE (t1) != TREE_TYPE (t2))
77fa0940
RK
2270 return 0;
2271 }
a9d07d6e 2272
e2500fed
GK
2273 for (l1 = CONSTRUCTOR_ELTS (t1), l2 = CONSTRUCTOR_ELTS (t2);
2274 l1 && l2;
2275 l1 = TREE_CHAIN (l1), l2 = TREE_CHAIN (l2))
77fa0940 2276 {
4b7e68e7 2277 /* Check that each value is the same... */
e2500fed
GK
2278 if (! compare_constant (TREE_VALUE (l1), TREE_VALUE (l2)))
2279 return 0;
2280 /* ... and that they apply to the same fields! */
2281 if (typecode == ARRAY_TYPE)
a9d07d6e 2282 {
e2500fed
GK
2283 if (! compare_constant (TREE_PURPOSE (l1),
2284 TREE_PURPOSE (l2)))
a9d07d6e
RK
2285 return 0;
2286 }
2287 else
2288 {
e2500fed 2289 if (TREE_PURPOSE (l1) != TREE_PURPOSE (l2))
e5e809f4 2290 return 0;
a9d07d6e 2291 }
77fa0940 2292 }
b2e2d0cc 2293
e2500fed 2294 return l1 == NULL_TREE && l2 == NULL_TREE;
77fa0940
RK
2295 }
2296
a9d07d6e 2297 case ADDR_EXPR:
5d056e9b 2298 case FDESC_EXPR:
a9d07d6e 2299 {
e2500fed 2300 struct addr_const value1, value2;
a9d07d6e 2301
e2500fed
GK
2302 decode_addr_const (t1, &value1);
2303 decode_addr_const (t2, &value2);
2304 return (value1.offset == value2.offset
2305 && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
a9d07d6e 2306 }
a9d07d6e
RK
2307
2308 case PLUS_EXPR:
2309 case MINUS_EXPR:
fa212801 2310 case RANGE_EXPR:
e2500fed
GK
2311 return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2312 && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
a9d07d6e
RK
2313
2314 case NOP_EXPR:
2315 case CONVERT_EXPR:
2316 case NON_LVALUE_EXPR:
a3d71605 2317 case VIEW_CONVERT_EXPR:
e2500fed 2318 return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
e9a25f70
JL
2319
2320 default:
ac79cd5a 2321 {
e2500fed 2322 tree nt1, nt2;
ae2bcd98
RS
2323 nt1 = lang_hooks.expand_constant (t1);
2324 nt2 = lang_hooks.expand_constant (t2);
e2500fed
GK
2325 if (nt1 != t1 || nt2 != t2)
2326 return compare_constant (nt1, nt2);
ac79cd5a
RK
2327 else
2328 return 0;
2329 }
79e68feb
RS
2330 }
2331
e2500fed
GK
2332 /* Should not get here. */
2333 abort ();
79e68feb
RS
2334}
2335\f
e2500fed
GK
2336/* Make a copy of the whole tree structure for a constant. This
2337 handles the same types of nodes that compare_constant handles. */
d12516f1
RS
2338
2339static tree
2e1eedd6 2340copy_constant (tree exp)
d12516f1
RS
2341{
2342 switch (TREE_CODE (exp))
2343 {
310bbbf4
JW
2344 case ADDR_EXPR:
2345 /* For ADDR_EXPR, we do not want to copy the decl whose address
2346 is requested. We do want to copy constants though. */
2347 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
2348 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2349 copy_constant (TREE_OPERAND (exp, 0)));
2350 else
2351 return copy_node (exp);
2352
d12516f1
RS
2353 case INTEGER_CST:
2354 case REAL_CST:
2355 case STRING_CST:
d12516f1
RS
2356 return copy_node (exp);
2357
2358 case COMPLEX_CST:
28eb1cb8
RK
2359 return build_complex (TREE_TYPE (exp),
2360 copy_constant (TREE_REALPART (exp)),
d12516f1
RS
2361 copy_constant (TREE_IMAGPART (exp)));
2362
2363 case PLUS_EXPR:
2364 case MINUS_EXPR:
2365 return build (TREE_CODE (exp), TREE_TYPE (exp),
2366 copy_constant (TREE_OPERAND (exp, 0)),
2367 copy_constant (TREE_OPERAND (exp, 1)));
2368
2369 case NOP_EXPR:
2370 case CONVERT_EXPR:
a9d07d6e 2371 case NON_LVALUE_EXPR:
a71c8ddc 2372 case VIEW_CONVERT_EXPR:
d12516f1
RS
2373 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2374 copy_constant (TREE_OPERAND (exp, 0)));
2375
2376 case CONSTRUCTOR:
2377 {
2378 tree copy = copy_node (exp);
2379 tree list = copy_list (CONSTRUCTOR_ELTS (exp));
2380 tree tail;
2381
bb31ce0a 2382 CONSTRUCTOR_ELTS (copy) = list;
d12516f1
RS
2383 for (tail = list; tail; tail = TREE_CHAIN (tail))
2384 TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
474bda6c
PB
2385 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2386 for (tail = list; tail; tail = TREE_CHAIN (tail))
2387 TREE_PURPOSE (tail) = copy_constant (TREE_PURPOSE (tail));
d12516f1
RS
2388
2389 return copy;
2390 }
2391
2392 default:
e2500fed
GK
2393 {
2394 tree t;
ae2bcd98 2395 t = lang_hooks.expand_constant (exp);
e2500fed
GK
2396 if (t != exp)
2397 return copy_constant (t);
2398 else
2399 abort ();
2400 }
d12516f1
RS
2401 }
2402}
ff8f4401 2403\f
293107d1
ZW
2404/* Subroutine of output_constant_def:
2405 No constant equal to EXP is known to have been output.
2406 Make a constant descriptor to enter EXP in the hash table.
2407 Assign the label number and construct RTL to refer to the
2408 constant's location in memory.
2409 Caller is responsible for updating the hash table. */
2410
2411static struct constant_descriptor_tree *
2e1eedd6 2412build_constant_desc (tree exp)
293107d1
ZW
2413{
2414 rtx symbol;
2415 rtx rtl;
2416 char label[256];
2417 int labelno;
2418 struct constant_descriptor_tree *desc;
2419
2420 desc = ggc_alloc (sizeof (*desc));
3521b33c 2421 desc->value = copy_constant (exp);
293107d1 2422
9cf737f8 2423 /* Propagate marked-ness to copied constant. */
6de9cd9a
DN
2424 if (flag_mudflap && mf_marked_p (exp))
2425 mf_mark (desc->value);
2426
293107d1
ZW
2427 /* Create a string containing the label name, in LABEL. */
2428 labelno = const_labelno++;
2429 ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
2430
2431 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
2432 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2433 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2adb9af1
RH
2434 SYMBOL_REF_DECL (symbol) = desc->value;
2435 TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
293107d1
ZW
2436
2437 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
2438 set_mem_attributes (rtl, exp, 1);
2439 set_mem_alias_set (rtl, 0);
2440 set_mem_alias_set (rtl, const_alias_set);
2441
2442 /* Set flags or add text to the name to record information, such as
2443 that it is a local symbol. If the name is changed, the macro
2444 ASM_OUTPUT_LABELREF will have to know how to strip this
10b6a274
ZW
2445 information. This call might invalidate our local variable
2446 SYMBOL; we can't use it afterward. */
2447
5fd9b178 2448 targetm.encode_section_info (exp, rtl, true);
293107d1
ZW
2449
2450 desc->rtl = rtl;
293107d1
ZW
2451
2452 return desc;
2453}
2454
79e68feb
RS
2455/* Return an rtx representing a reference to constant data in memory
2456 for the constant expression EXP.
ff8f4401 2457
79e68feb
RS
2458 If assembler code for such a constant has already been output,
2459 return an rtx to refer to it.
b20cbca2 2460 Otherwise, output such a constant in memory
ff8f4401
RS
2461 and generate an rtx for it.
2462
10b6a274
ZW
2463 If DEFER is nonzero, this constant can be deferred and output only
2464 if referenced in the function after all optimizations.
bd7cf17e 2465
5e9295fa 2466 `const_desc_table' records which constants already have label strings. */
79e68feb
RS
2467
2468rtx
2e1eedd6 2469output_constant_def (tree exp, int defer)
79e68feb 2470{
e2500fed 2471 struct constant_descriptor_tree *desc;
10b6a274
ZW
2472 struct constant_descriptor_tree key;
2473 void **loc;
79e68feb 2474
10b6a274
ZW
2475 /* Look up EXP in the table of constant descriptors. If we didn't find
2476 it, create a new one. */
2477 key.value = exp;
2478 loc = htab_find_slot (const_desc_htab, &key, INSERT);
46f9491e 2479
10b6a274 2480 desc = *loc;
14a774a9 2481 if (desc == 0)
00f07fb9 2482 {
293107d1 2483 desc = build_constant_desc (exp);
10b6a274 2484 *loc = desc;
14a774a9
RK
2485 }
2486
10b6a274 2487 maybe_output_constant_def_contents (desc, defer);
293107d1
ZW
2488 return desc->rtl;
2489}
79e68feb 2490
10b6a274
ZW
2491/* Subroutine of output_constant_def: Decide whether or not we need to
2492 output the constant DESC now, and if so, do it. */
293107d1 2493static void
2e1eedd6
AJ
2494maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
2495 int defer)
293107d1 2496{
10b6a274 2497 rtx symbol = XEXP (desc->rtl, 0);
2adb9af1 2498 tree exp = desc->value;
10b6a274 2499
293107d1
ZW
2500 if (flag_syntax_only)
2501 return;
79e68feb 2502
2adb9af1 2503 if (TREE_ASM_WRITTEN (exp))
10b6a274
ZW
2504 /* Already output; don't do it again. */
2505 return;
2506
3521b33c
ZW
2507 /* We can always defer constants as long as the context allows
2508 doing so. */
2509 if (defer)
bd7cf17e 2510 {
2adb9af1
RH
2511 /* Increment n_deferred_constants if it exists. It needs to be at
2512 least as large as the number of constants actually referred to
2513 by the function. If it's too small we'll stop looking too early
2514 and fail to emit constants; if it's too large we'll only look
2515 through the entire function when we could have stopped earlier. */
10b6a274
ZW
2516 if (cfun)
2517 n_deferred_constants++;
32a61907 2518 return;
ff8f4401
RS
2519 }
2520
10b6a274 2521 output_constant_def_contents (symbol);
ff8f4401
RS
2522}
2523
10b6a274 2524/* We must output the constant data referred to by SYMBOL; do so. */
79e68feb 2525
ff8f4401 2526static void
2e1eedd6 2527output_constant_def_contents (rtx symbol)
ff8f4401 2528{
10b6a274
ZW
2529 tree exp = SYMBOL_REF_DECL (symbol);
2530 const char *label = XSTR (symbol, 0);
18f3e349 2531 HOST_WIDE_INT size;
10b6a274 2532
293107d1
ZW
2533 /* Make sure any other constants whose addresses appear in EXP
2534 are assigned label numbers. */
b2218cc1 2535 int reloc = compute_reloc_for_constant (exp);
ff8f4401 2536
201556f0 2537 /* Align the location counter as required by EXP's data type. */
293107d1 2538 int align = TYPE_ALIGN (TREE_TYPE (exp));
201556f0
JJ
2539#ifdef CONSTANT_ALIGNMENT
2540 align = CONSTANT_ALIGNMENT (exp, align);
2541#endif
2542
b2218cc1
AO
2543 output_addressed_constants (exp);
2544
10b6a274 2545 /* We are no longer deferring this constant. */
2adb9af1 2546 TREE_ASM_WRITTEN (exp) = 1;
10b6a274 2547
8a425a05 2548 if (IN_NAMED_SECTION (exp))
ad4ff310 2549 named_section (exp, NULL, reloc);
8a425a05 2550 else
5fd9b178 2551 targetm.asm_out.select_section (exp, reloc, align);
79e68feb 2552
ff8f4401 2553 if (align > BITS_PER_UNIT)
91ea4f8d
KG
2554 {
2555 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2556 }
79e68feb 2557
18f3e349
GK
2558 size = int_size_in_bytes (TREE_TYPE (exp));
2559 if (TREE_CODE (exp) == STRING_CST)
2560 size = MAX (TREE_STRING_LENGTH (exp), size);
2561
2562 /* Do any machine/system dependent processing of the constant. */
2563#ifdef ASM_DECLARE_CONSTANT_NAME
2564 ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
2565#else
2566 /* Standard thing is just output label for the constant. */
293107d1 2567 ASM_OUTPUT_LABEL (asm_out_file, label);
18f3e349 2568#endif /* ASM_DECLARE_CONSTANT_NAME */
79e68feb 2569
ff8f4401 2570 /* Output the value of EXP. */
18f3e349 2571 output_constant (exp, size, align);
6de9cd9a
DN
2572 if (flag_mudflap)
2573 mudflap_enqueue_constant (exp);
a2a6a79b 2574}
75c20980
RH
2575
2576/* Look up EXP in the table of constant descriptors. Return the rtl
2577 if it has been emitted, else null. */
2578
2579rtx
2580lookup_constant_def (tree exp)
2581{
2582 struct constant_descriptor_tree *desc;
2583 struct constant_descriptor_tree key;
2584
2585 key.value = exp;
2586 desc = htab_find (const_desc_htab, &key);
2587
2588 return (desc ? desc->rtl : NULL_RTX);
2589}
79e68feb 2590\f
e2500fed
GK
2591/* Used in the hash tables to avoid outputting the same constant
2592 twice. Unlike 'struct constant_descriptor_tree', RTX constants
3234b52d
RH
2593 are output once per function, not once per file. */
2594/* ??? Only a few targets need per-function constant pools. Most
2595 can use one per-file pool. Should add a targetm bit to tell the
2596 difference. */
2597
2598struct rtx_constant_pool GTY(())
2599{
2600 /* Pointers to first and last constant in pool, as ordered by offset. */
2601 struct constant_descriptor_rtx *first;
2602 struct constant_descriptor_rtx *last;
2603
2604 /* Hash facility for making memory-constants from constant rtl-expressions.
2605 It is used on RISC machines where immediate integer arguments and
2606 constant addresses are restricted so that such constants must be stored
2607 in memory. */
2608 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
2609 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_sym_htab;
2610
2611 /* Current offset in constant pool (does not include any
2612 machine-specific header). */
2613 HOST_WIDE_INT offset;
e2500fed
GK
2614};
2615
3234b52d 2616struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
79e68feb 2617{
3234b52d
RH
2618 struct constant_descriptor_rtx *next;
2619 rtx mem;
2620 rtx sym;
79e68feb 2621 rtx constant;
3234b52d
RH
2622 HOST_WIDE_INT offset;
2623 hashval_t hash;
94b01be3 2624 enum machine_mode mode;
a79e3a45 2625 unsigned int align;
3234b52d 2626 int labelno;
91674c37 2627 int mark;
79e68feb
RS
2628};
2629
3234b52d 2630/* Hash and compare functions for const_rtx_htab. */
79e68feb 2631
3234b52d
RH
2632static hashval_t
2633const_desc_rtx_hash (const void *ptr)
2634{
2635 const struct constant_descriptor_rtx *desc = ptr;
2636 return desc->hash;
2637}
79e68feb 2638
3234b52d
RH
2639static int
2640const_desc_rtx_eq (const void *a, const void *b)
79e68feb 2641{
3234b52d
RH
2642 const struct constant_descriptor_rtx *x = a;
2643 const struct constant_descriptor_rtx *y = b;
2644
2645 if (x->mode != y->mode)
2646 return 0;
2647 return rtx_equal_p (x->constant, y->constant);
57632c51 2648}
79e68feb 2649
3234b52d 2650/* Hash and compare functions for const_rtx_sym_htab. */
79e68feb 2651
3234b52d
RH
2652static hashval_t
2653const_desc_rtx_sym_hash (const void *ptr)
79e68feb 2654{
3234b52d
RH
2655 const struct constant_descriptor_rtx *desc = ptr;
2656 return htab_hash_string (XSTR (desc->sym, 0));
2657}
79e68feb 2658
3234b52d
RH
2659static int
2660const_desc_rtx_sym_eq (const void *a, const void *b)
2661{
2662 const struct constant_descriptor_rtx *x = a;
2663 const struct constant_descriptor_rtx *y = b;
a8c0bbc7 2664 return XSTR (x->sym, 0) == XSTR (y->sym, 0);
3234b52d 2665}
79e68feb 2666
3234b52d 2667/* This is the worker function for const_rtx_hash, called via for_each_rtx. */
46b33600 2668
3234b52d
RH
2669static int
2670const_rtx_hash_1 (rtx *xp, void *data)
2671{
2672 unsigned HOST_WIDE_INT hwi;
2673 enum machine_mode mode;
2674 enum rtx_code code;
2675 hashval_t h, *hp;
2676 rtx x;
46b33600 2677
3234b52d
RH
2678 x = *xp;
2679 code = GET_CODE (x);
2680 mode = GET_MODE (x);
2681 h = (hashval_t) code * 1048573 + mode;
79e68feb 2682
3234b52d
RH
2683 switch (code)
2684 {
2685 case CONST_INT:
2686 hwi = INTVAL (x);
2687 fold_hwi:
69ef87e2 2688 {
3234b52d
RH
2689 const int shift = sizeof (hashval_t) * CHAR_BIT;
2690 const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
2691 int i;
69ef87e2 2692
3234b52d
RH
2693 h ^= (hashval_t) hwi;
2694 for (i = 1; i < n; ++i)
46b33600 2695 {
3234b52d
RH
2696 hwi >>= shift;
2697 h ^= (hashval_t) hwi;
69ef87e2
AH
2698 }
2699 }
2700 break;
2701
3234b52d
RH
2702 case CONST_DOUBLE:
2703 if (mode == VOIDmode)
2704 {
2705 hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
2706 goto fold_hwi;
2707 }
2708 else
2709 h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
79e68feb
RS
2710 break;
2711
2712 case SYMBOL_REF:
3234b52d
RH
2713 h ^= htab_hash_string (XSTR (x, 0));
2714 break;
2715
79e68feb 2716 case LABEL_REF:
3234b52d 2717 h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
79e68feb
RS
2718 break;
2719
3234b52d
RH
2720 case UNSPEC:
2721 case UNSPEC_VOLATILE:
2722 h = h * 251 + XINT (x, 1);
79e68feb
RS
2723 break;
2724
2725 default:
fdf473ae 2726 break;
79e68feb
RS
2727 }
2728
3234b52d
RH
2729 hp = data;
2730 *hp = *hp * 509 + h;
2731 return 0;
79e68feb
RS
2732}
2733
3234b52d 2734/* Compute a hash value for X, which should be a constant. */
57632c51 2735
3234b52d
RH
2736static hashval_t
2737const_rtx_hash (rtx x)
57632c51 2738{
3234b52d
RH
2739 hashval_t h = 0;
2740 for_each_rtx (&x, const_rtx_hash_1, &h);
2741 return h;
57632c51
RS
2742}
2743
3234b52d
RH
2744\f
2745/* Initialize constant pool hashing for a new function. */
79e68feb 2746
3234b52d
RH
2747void
2748init_varasm_status (struct function *f)
79e68feb 2749{
3234b52d
RH
2750 struct varasm_status *p;
2751 struct rtx_constant_pool *pool;
79e68feb 2752
3234b52d
RH
2753 p = ggc_alloc (sizeof (struct varasm_status));
2754 f->varasm = p;
79e68feb 2755
3234b52d
RH
2756 pool = ggc_alloc (sizeof (struct rtx_constant_pool));
2757 p->pool = pool;
2758 p->deferred_constants = 0;
79e68feb 2759
3234b52d
RH
2760 pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
2761 const_desc_rtx_eq, NULL);
2762 pool->const_rtx_sym_htab = htab_create_ggc (31, const_desc_rtx_sym_hash,
2763 const_desc_rtx_sym_eq, NULL);
2764 pool->first = pool->last = NULL;
2765 pool->offset = 0;
79e68feb 2766}
3234b52d
RH
2767\f
2768/* Given a MINUS expression, simplify it if both sides
2769 include the same symbol. */
79e68feb 2770
3234b52d
RH
2771rtx
2772simplify_subtraction (rtx x)
79e68feb 2773{
3234b52d
RH
2774 rtx r = simplify_rtx (x);
2775 return r ? r : x;
79e68feb
RS
2776}
2777\f
2778/* Given a constant rtx X, make (or find) a memory constant for its value
2779 and return a MEM rtx to refer to it in memory. */
2780
2781rtx
2e1eedd6 2782force_const_mem (enum machine_mode mode, rtx x)
79e68feb 2783{
3234b52d
RH
2784 struct constant_descriptor_rtx *desc, tmp;
2785 struct rtx_constant_pool *pool = cfun->varasm->pool;
79e68feb 2786 char label[256];
52859c77 2787 rtx def, symbol;
3234b52d 2788 hashval_t hash;
a79e3a45 2789 unsigned int align;
3234b52d 2790 void **slot;
79e68feb 2791
3a04ff64 2792 /* If we're not allowed to drop X into the constant pool, don't. */
5fd9b178 2793 if (targetm.cannot_force_const_mem (x))
3a04ff64
RH
2794 return NULL_RTX;
2795
3234b52d
RH
2796 /* Lookup the value in the hashtable. */
2797 tmp.constant = x;
2798 tmp.mode = mode;
2799 hash = const_rtx_hash (x);
2800 slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
2801 desc = *slot;
2802
2803 /* If the constant was already present, return its memory. */
2804 if (desc)
2805 return copy_rtx (desc->mem);
2806
2807 /* Otherwise, create a new descriptor. */
2808 desc = ggc_alloc (sizeof (*desc));
2809 *slot = desc;
c26fbbca 2810
a79e3a45
RK
2811 /* Align the location counter as required by EXP's data type. */
2812 align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
e5e8a8bf 2813#ifdef CONSTANT_ALIGNMENT
1063147c 2814 {
ae2bcd98 2815 tree type = lang_hooks.types.type_for_mode (mode, 0);
1063147c
RS
2816 if (type != NULL_TREE)
2817 align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
2818 }
e5e8a8bf 2819#endif
79e68feb 2820
3234b52d
RH
2821 pool->offset += (align / BITS_PER_UNIT) - 1;
2822 pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
2823
2824 desc->next = NULL;
2825 desc->constant = tmp.constant;
2826 desc->offset = pool->offset;
2827 desc->hash = hash;
2828 desc->mode = mode;
2829 desc->align = align;
2830 desc->labelno = const_labelno;
2831 desc->mark = 0;
2832
2833 pool->offset += GET_MODE_SIZE (mode);
2834 if (pool->last)
2835 pool->last->next = desc;
a79e3a45 2836 else
3234b52d
RH
2837 pool->first = pool->last = desc;
2838 pool->last = desc;
79e68feb 2839
a79e3a45
RK
2840 /* Create a string containing the label name, in LABEL. */
2841 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
a79e3a45 2842 ++const_labelno;
79e68feb 2843
3234b52d
RH
2844 /* Construct the SYMBOL_REF. Make sure to mark it as belonging to
2845 the constants pool. */
2846 desc->sym = symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
52859c77 2847 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
3234b52d
RH
2848 CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2849 current_function_uses_const_pool = 1;
2850
2851 /* Insert the descriptor into the symbol cross-reference table too. */
2852 slot = htab_find_slot (pool->const_rtx_sym_htab, desc, INSERT);
2853 if (*slot)
2854 abort ();
2855 *slot = desc;
52859c77 2856
3234b52d
RH
2857 /* Construct the MEM. */
2858 desc->mem = def = gen_rtx_MEM (mode, symbol);
ae2bcd98 2859 set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
79e68feb 2860 RTX_UNCHANGING_P (def) = 1;
289c5b45 2861
3234b52d
RH
2862 /* If we're dropping a label to the constant pool, make sure we
2863 don't delete it. */
2864 if (GET_CODE (x) == LABEL_REF)
2865 LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
79e68feb 2866
21e9fc47 2867 return copy_rtx (def);
79e68feb
RS
2868}
2869\f
2870/* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3234b52d 2871 the corresponding constant_descriptor_rtx structure. */
79e68feb 2872
3234b52d
RH
2873static struct constant_descriptor_rtx *
2874find_pool_constant (struct rtx_constant_pool *pool, rtx sym)
79e68feb 2875{
3234b52d
RH
2876 struct constant_descriptor_rtx tmp;
2877 tmp.sym = sym;
2878 return htab_find (pool->const_rtx_sym_htab, &tmp);
79e68feb
RS
2879}
2880
2881/* Given a constant pool SYMBOL_REF, return the corresponding constant. */
2882
2883rtx
2e1eedd6 2884get_pool_constant (rtx addr)
79e68feb 2885{
3234b52d 2886 return find_pool_constant (cfun->varasm->pool, addr)->constant;
36edd3cc
BS
2887}
2888
149d6f9e
JJ
2889/* Given a constant pool SYMBOL_REF, return the corresponding constant
2890 and whether it has been output or not. */
2891
2892rtx
2e1eedd6 2893get_pool_constant_mark (rtx addr, bool *pmarked)
149d6f9e 2894{
3234b52d
RH
2895 struct constant_descriptor_rtx *desc;
2896
2897 desc = find_pool_constant (cfun->varasm->pool, addr);
2898 *pmarked = (desc->mark != 0);
2899 return desc->constant;
149d6f9e
JJ
2900}
2901
36edd3cc
BS
2902/* Likewise, but for the constant pool of a specific function. */
2903
2904rtx
2e1eedd6 2905get_pool_constant_for_function (struct function *f, rtx addr)
36edd3cc 2906{
3234b52d 2907 return find_pool_constant (f->varasm->pool, addr)->constant;
79e68feb
RS
2908}
2909
2910/* Similar, return the mode. */
2911
2912enum machine_mode
2e1eedd6 2913get_pool_mode (rtx addr)
79e68feb 2914{
3234b52d 2915 return find_pool_constant (cfun->varasm->pool, addr)->mode;
36edd3cc
BS
2916}
2917
2918enum machine_mode
2e1eedd6 2919get_pool_mode_for_function (struct function *f, rtx addr)
36edd3cc 2920{
3234b52d 2921 return find_pool_constant (f->varasm->pool, addr)->mode;
79e68feb
RS
2922}
2923
2924/* Similar, return the offset in the constant pool. */
2925
2926int
2e1eedd6 2927get_pool_offset (rtx addr)
79e68feb 2928{
3234b52d 2929 return find_pool_constant (cfun->varasm->pool, addr)->offset;
79e68feb
RS
2930}
2931
2932/* Return the size of the constant pool. */
2933
2934int
2e1eedd6 2935get_pool_size (void)
79e68feb 2936{
3234b52d 2937 return cfun->varasm->pool->offset;
79e68feb
RS
2938}
2939\f
3234b52d
RH
2940/* Worker function for output_constant_pool_1. Emit assembly for X
2941 in MODE with known alignment ALIGN. */
79e68feb 2942
3234b52d
RH
2943static void
2944output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
79e68feb 2945{
3234b52d 2946 switch (GET_MODE_CLASS (mode))
79e68feb 2947 {
3234b52d
RH
2948 case MODE_FLOAT:
2949 if (GET_CODE (x) != CONST_DOUBLE)
2950 abort ();
2951 else
085ce8c6 2952 {
3234b52d
RH
2953 REAL_VALUE_TYPE r;
2954 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
2955 assemble_real (r, mode, align);
085ce8c6 2956 }
3234b52d 2957 break;
79e68feb 2958
3234b52d
RH
2959 case MODE_INT:
2960 case MODE_PARTIAL_INT:
2961 assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
2962 break;
79e68feb 2963
3234b52d
RH
2964 case MODE_VECTOR_FLOAT:
2965 case MODE_VECTOR_INT:
2966 {
2967 int i, units;
2968 enum machine_mode submode = GET_MODE_INNER (mode);
2969 unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
79e68feb 2970
3234b52d
RH
2971 if (GET_CODE (x) != CONST_VECTOR)
2972 abort ();
2973 units = CONST_VECTOR_NUNITS (x);
79e68feb 2974
3234b52d 2975 for (i = 0; i < units; i++)
69ef87e2 2976 {
3234b52d
RH
2977 rtx elt = CONST_VECTOR_ELT (x, i);
2978 output_constant_pool_2 (submode, elt, i ? subalign : align);
69ef87e2 2979 }
3234b52d
RH
2980 }
2981 break;
69ef87e2 2982
3234b52d
RH
2983 default:
2984 abort ();
2985 }
2986}
69ef87e2 2987
3234b52d 2988/* Worker function for output_constant_pool. Emit POOL. */
69ef87e2 2989
3234b52d
RH
2990static void
2991output_constant_pool_1 (struct constant_descriptor_rtx *desc)
2992{
2993 rtx x, tmp;
69ef87e2 2994
3234b52d
RH
2995 if (!desc->mark)
2996 return;
2997 x = desc->constant;
2998
2999 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3000 whose CODE_LABEL has been deleted. This can occur if a jump table
3001 is eliminated by optimization. If so, write a constant of zero
3002 instead. Note that this can also happen by turning the
3003 CODE_LABEL into a NOTE. */
3004 /* ??? This seems completely and utterly wrong. Certainly it's
3005 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3006 functioning even with INSN_DELETED_P and friends. */
3007
3008 tmp = x;
3009 switch (GET_CODE (x))
3010 {
3011 case CONST:
3012 if (GET_CODE (XEXP (x, 0)) != PLUS
3013 || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3014 break;
3015 tmp = XEXP (XEXP (x, 0), 0);
3016 /* FALLTHRU */
69ef87e2 3017
3234b52d
RH
3018 case LABEL_REF:
3019 tmp = XEXP (x, 0);
3020 if (INSN_DELETED_P (tmp)
4b4bf941 3021 || (NOTE_P (tmp)
3234b52d
RH
3022 && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_DELETED))
3023 {
79e68feb 3024 abort ();
3234b52d 3025 x = const0_rtx;
79e68feb 3026 }
3234b52d 3027 break;
79e68feb 3028
3234b52d
RH
3029 default:
3030 break;
3031 }
3032
3033 /* First switch to correct section. */
5fd9b178 3034 targetm.asm_out.select_rtx_section (desc->mode, x, desc->align);
f4111593 3035
29a82058 3036#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3234b52d
RH
3037 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3038 desc->align, desc->labelno, done);
29a82058 3039#endif
7f83c0e7 3040
3234b52d 3041 assemble_align (desc->align);
5c8c0abd 3042
3234b52d 3043 /* Output the label. */
5fd9b178 3044 targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
91674c37 3045
3234b52d
RH
3046 /* Output the data. */
3047 output_constant_pool_2 (desc->mode, x, desc->align);
91674c37 3048
3234b52d
RH
3049 /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3050 sections have proper size. */
3051 if (desc->align > GET_MODE_BITSIZE (desc->mode)
3052 && in_section == in_named
3053 && get_named_section_flags (in_named_name) & SECTION_MERGE)
3054 assemble_align (desc->align);
91674c37 3055
3234b52d
RH
3056#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3057 done:
3058#endif
3059 return;
3060}
91674c37 3061
3234b52d
RH
3062/* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3063 to as used. Emit referenced deferred strings. This function can
3064 be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */
d2ce9169 3065
3234b52d
RH
3066static int
3067mark_constant (rtx *current_rtx, void *data)
3068{
3069 struct rtx_constant_pool *pool = data;
3070 rtx x = *current_rtx;
91674c37 3071
3234b52d
RH
3072 if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3073 return 0;
afdfb380 3074
3234b52d
RH
3075 if (CONSTANT_POOL_ADDRESS_P (x))
3076 {
3077 struct constant_descriptor_rtx *desc = find_pool_constant (pool, x);
3078 if (desc->mark == 0)
3079 {
3080 desc->mark = 1;
3081 for_each_rtx (&desc->constant, mark_constant, pool);
3082 }
afdfb380 3083 }
3234b52d
RH
3084 else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3085 {
3086 tree exp = SYMBOL_REF_DECL (x);
3087 if (!TREE_ASM_WRITTEN (exp))
3088 {
3089 n_deferred_constants--;
3090 output_constant_def_contents (x);
3091 }
3092 }
3093
3094 return -1;
3095}
91674c37 3096
3234b52d 3097/* Look through appropriate parts of INSN, marking all entries in the
fcbd8ef2
JO
3098 constant pool which are actually being used. Entries that are only
3099 referenced by other constants are also marked as used. Emit
3100 deferred strings that are used. */
3101
91674c37 3102static void
3234b52d 3103mark_constants (struct rtx_constant_pool *pool, rtx insn)
91674c37 3104{
3234b52d 3105 if (!INSN_P (insn))
91674c37
ILT
3106 return;
3107
91674c37
ILT
3108 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3109 insns, not any notes that may be attached. We don't want to mark
3110 a constant just because it happens to appear in a REG_EQUIV note. */
3234b52d 3111 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
91674c37 3112 {
3234b52d
RH
3113 rtx seq = PATTERN (insn);
3114 int i, n = XVECLEN (seq, 0);
3115 for (i = 0; i < n; ++i)
3116 {
3117 rtx subinsn = XVECEXP (seq, 0, i);
3118 if (INSN_P (subinsn))
3119 for_each_rtx (&PATTERN (subinsn), mark_constant, pool);
3120 }
91674c37 3121 }
3234b52d
RH
3122 else
3123 for_each_rtx (&PATTERN (insn), mark_constant, pool);
3124}
91674c37 3125
3234b52d
RH
3126/* Look through the instructions for this function, and mark all the
3127 entries in POOL which are actually being used. Emit deferred constants
3128 which have indeed been used. */
91674c37 3129
3234b52d
RH
3130static void
3131mark_constant_pool (struct rtx_constant_pool *pool)
3132{
3133 rtx insn, link;
91674c37 3134
3234b52d
RH
3135 if (pool->first == 0 && n_deferred_constants == 0)
3136 return;
91674c37 3137
3234b52d
RH
3138 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3139 mark_constants (pool, insn);
91674c37 3140
3234b52d
RH
3141 for (link = current_function_epilogue_delay_list;
3142 link;
3143 link = XEXP (link, 1))
3144 mark_constants (pool, XEXP (link, 0));
91674c37 3145}
fcbd8ef2 3146
3234b52d 3147/* Write all the constants in the constant pool. */
fcbd8ef2 3148
3234b52d
RH
3149void
3150output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3151 tree fndecl ATTRIBUTE_UNUSED)
fcbd8ef2 3152{
3234b52d
RH
3153 struct rtx_constant_pool *pool = cfun->varasm->pool;
3154 struct constant_descriptor_rtx *desc;
fcbd8ef2 3155
3234b52d
RH
3156 /* It is possible for gcc to call force_const_mem and then to later
3157 discard the instructions which refer to the constant. In such a
3158 case we do not need to output the constant. */
3159 mark_constant_pool (pool);
a79e3a45 3160
3234b52d
RH
3161#ifdef ASM_OUTPUT_POOL_PROLOGUE
3162 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3163#endif
3164
3165 for (desc = pool->first; desc ; desc = desc->next)
3166 output_constant_pool_1 (desc);
3167
3168#ifdef ASM_OUTPUT_POOL_EPILOGUE
3169 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3170#endif
fcbd8ef2 3171}
79e68feb 3172\f
b2218cc1 3173/* Determine what kind of relocations EXP may need. */
79e68feb 3174
b2218cc1
AO
3175int
3176compute_reloc_for_constant (tree exp)
79e68feb 3177{
7eca317a 3178 int reloc = 0, reloc2;
ac79cd5a 3179 tree tem;
79e68feb 3180
c165f94f
CC
3181 /* Give the front-end a chance to convert VALUE to something that
3182 looks more like a constant to the back-end. */
ae2bcd98 3183 exp = lang_hooks.expand_constant (exp);
c165f94f 3184
79e68feb
RS
3185 switch (TREE_CODE (exp))
3186 {
3187 case ADDR_EXPR:
5d056e9b 3188 case FDESC_EXPR:
ac79cd5a
RK
3189 /* Go inside any operations that get_inner_reference can handle and see
3190 if what's inside is a constant: no need to do anything here for
3191 addresses of variables or functions. */
3192 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3193 tem = TREE_OPERAND (tem, 0))
3194 ;
79e68feb 3195
d2c35e67
JH
3196 if (TREE_PUBLIC (tem))
3197 reloc |= 2;
3198 else
3199 reloc |= 1;
79e68feb
RS
3200 break;
3201
3202 case PLUS_EXPR:
b2218cc1
AO
3203 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3204 reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
79e68feb
RS
3205 break;
3206
7eca317a 3207 case MINUS_EXPR:
b2218cc1
AO
3208 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3209 reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
7eca317a
JJ
3210 /* The difference of two local labels is computable at link time. */
3211 if (reloc == 1 && reloc2 == 1)
3212 reloc = 0;
3213 else
3214 reloc |= reloc2;
3215 break;
3216
79e68feb
RS
3217 case NOP_EXPR:
3218 case CONVERT_EXPR:
37a52112 3219 case NON_LVALUE_EXPR:
b2218cc1 3220 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
79e68feb
RS
3221 break;
3222
3223 case CONSTRUCTOR:
ac79cd5a
RK
3224 for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3225 if (TREE_VALUE (tem) != 0)
b2218cc1 3226 reloc |= compute_reloc_for_constant (TREE_VALUE (tem));
ac79cd5a 3227
79e68feb
RS
3228 break;
3229
e9a25f70 3230 default:
79e68feb
RS
3231 break;
3232 }
3233 return reloc;
3234}
b2218cc1
AO
3235
3236/* Find all the constants whose addresses are referenced inside of EXP,
3237 and make sure assembler code with a label has been output for each one.
3238 Indicate whether an ADDR_EXPR has been encountered. */
3239
3240static void
3241output_addressed_constants (tree exp)
3242{
3243 tree tem;
3244
3245 /* Give the front-end a chance to convert VALUE to something that
3246 looks more like a constant to the back-end. */
ae2bcd98 3247 exp = lang_hooks.expand_constant (exp);
b2218cc1
AO
3248
3249 switch (TREE_CODE (exp))
3250 {
3251 case ADDR_EXPR:
3252 case FDESC_EXPR:
3253 /* Go inside any operations that get_inner_reference can handle and see
3254 if what's inside is a constant: no need to do anything here for
3255 addresses of variables or functions. */
3256 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3257 tem = TREE_OPERAND (tem, 0))
3258 ;
3259
3260 if (TREE_CODE_CLASS (TREE_CODE (tem)) == 'c'
3261 || TREE_CODE (tem) == CONSTRUCTOR)
3262 output_constant_def (tem, 0);
3263 break;
3264
3265 case PLUS_EXPR:
3266 case MINUS_EXPR:
3267 output_addressed_constants (TREE_OPERAND (exp, 1));
3268 /* Fall through. */
3269
3270 case NOP_EXPR:
3271 case CONVERT_EXPR:
3272 case NON_LVALUE_EXPR:
3273 output_addressed_constants (TREE_OPERAND (exp, 0));
3274 break;
3275
3276 case CONSTRUCTOR:
3277 for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3278 if (TREE_VALUE (tem) != 0)
3279 output_addressed_constants (TREE_VALUE (tem));
3280
3281 break;
3282
3283 default:
3284 break;
3285 }
3286}
79e68feb 3287\f
14a774a9
RK
3288/* Return nonzero if VALUE is a valid constant-valued expression
3289 for use in initializing a static variable; one that can be an
3290 element of a "constant" initializer.
3291
3292 Return null_pointer_node if the value is absolute;
3293 if it is relocatable, return the variable that determines the relocation.
3294 We assume that VALUE has been folded as much as possible;
3295 therefore, we do not need to check for such things as
3296 arithmetic-combinations of integers. */
3297
3298tree
2e1eedd6 3299initializer_constant_valid_p (tree value, tree endtype)
14a774a9 3300{
99740276
MM
3301 /* Give the front-end a chance to convert VALUE to something that
3302 looks more like a constant to the back-end. */
ae2bcd98 3303 value = lang_hooks.expand_constant (value);
99740276 3304
14a774a9
RK
3305 switch (TREE_CODE (value))
3306 {
3307 case CONSTRUCTOR:
3308 if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3309 || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3310 && TREE_CONSTANT (value)
3311 && CONSTRUCTOR_ELTS (value))
cf9ad9a7
MM
3312 {
3313 tree elt;
3314 bool absolute = true;
3315
3316 for (elt = CONSTRUCTOR_ELTS (value); elt; elt = TREE_CHAIN (elt))
3317 {
3318 tree reloc;
3319 value = TREE_VALUE (elt);
3320 reloc = initializer_constant_valid_p (value, TREE_TYPE (value));
3321 if (!reloc)
3322 return NULL_TREE;
3323 if (reloc != null_pointer_node)
3324 absolute = false;
3325 }
3326 /* For a non-absolute relocation, there is no single
3327 variable that can be "the variable that determines the
3328 relocation." */
3329 return absolute ? null_pointer_node : error_mark_node;
3330 }
46f9491e 3331
cf9ad9a7 3332 return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
14a774a9
RK
3333
3334 case INTEGER_CST:
69ef87e2 3335 case VECTOR_CST:
14a774a9
RK
3336 case REAL_CST:
3337 case STRING_CST:
3338 case COMPLEX_CST:
3339 return null_pointer_node;
3340
3341 case ADDR_EXPR:
67231816 3342 case FDESC_EXPR:
8c8de5fc 3343 return staticp (TREE_OPERAND (value, 0)) ? TREE_OPERAND (value, 0) : 0;
14a774a9 3344
ed239f5a 3345 case VIEW_CONVERT_EXPR:
14a774a9
RK
3346 case NON_LVALUE_EXPR:
3347 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3348
3349 case CONVERT_EXPR:
3350 case NOP_EXPR:
3351 /* Allow conversions between pointer types. */
3352 if (POINTER_TYPE_P (TREE_TYPE (value))
3353 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3354 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3355
3356 /* Allow conversions between real types. */
3357 if (FLOAT_TYPE_P (TREE_TYPE (value))
3358 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3359 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3360
3361 /* Allow length-preserving conversions between integer types. */
3362 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3363 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3364 && (TYPE_PRECISION (TREE_TYPE (value))
3365 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3366 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3367
3368 /* Allow conversions between other integer types only if
3369 explicit value. */
3370 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3371 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3372 {
3373 tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3374 endtype);
3375 if (inner == null_pointer_node)
3376 return null_pointer_node;
3377 break;
3378 }
3379
3380 /* Allow (int) &foo provided int is as wide as a pointer. */
3381 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3382 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3383 && (TYPE_PRECISION (TREE_TYPE (value))
3384 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3385 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3386 endtype);
3387
3388 /* Likewise conversions from int to pointers, but also allow
3389 conversions from 0. */
0dff37fb
MM
3390 if ((POINTER_TYPE_P (TREE_TYPE (value))
3391 || TREE_CODE (TREE_TYPE (value)) == OFFSET_TYPE)
14a774a9
RK
3392 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3393 {
3394 if (integer_zerop (TREE_OPERAND (value, 0)))
3395 return null_pointer_node;
3396 else if (TYPE_PRECISION (TREE_TYPE (value))
3397 <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
3398 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3399 endtype);
3400 }
3401
64480988
MM
3402 /* Allow conversions to struct or union types if the value
3403 inside is okay. */
3404 if (TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE
3405 || TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
14a774a9
RK
3406 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3407 endtype);
3408 break;
3409
3410 case PLUS_EXPR:
3411 if (! INTEGRAL_TYPE_P (endtype)
3412 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
c26fbbca 3413 {
14a774a9
RK
3414 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3415 endtype);
3416 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3417 endtype);
3418 /* If either term is absolute, use the other terms relocation. */
3419 if (valid0 == null_pointer_node)
3420 return valid1;
3421 if (valid1 == null_pointer_node)
3422 return valid0;
c26fbbca 3423 }
14a774a9
RK
3424 break;
3425
3426 case MINUS_EXPR:
3427 if (! INTEGRAL_TYPE_P (endtype)
3428 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3429 {
3430 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3431 endtype);
3432 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3433 endtype);
3434 /* Win if second argument is absolute. */
3435 if (valid1 == null_pointer_node)
3436 return valid0;
3437 /* Win if both arguments have the same relocation.
3438 Then the value is absolute. */
3439 if (valid0 == valid1 && valid0 != 0)
3440 return null_pointer_node;
212addfa
JO
3441
3442 /* Since GCC guarantees that string constants are unique in the
3443 generated code, a subtraction between two copies of the same
3444 constant string is absolute. */
3445 if (valid0 && TREE_CODE (valid0) == STRING_CST &&
3446 valid1 && TREE_CODE (valid1) == STRING_CST &&
3447 TREE_STRING_POINTER (valid0) == TREE_STRING_POINTER (valid1))
3448 return null_pointer_node;
14a774a9
RK
3449 }
3450
3451 /* Support differences between labels. */
3452 if (INTEGRAL_TYPE_P (endtype))
3453 {
3454 tree op0, op1;
3455 op0 = TREE_OPERAND (value, 0);
3456 op1 = TREE_OPERAND (value, 1);
fdf473ae
RH
3457
3458 /* Like STRIP_NOPS except allow the operand mode to widen.
14b493d6 3459 This works around a feature of fold that simplifies
fdf473ae
RH
3460 (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3461 that the narrower operation is cheaper. */
3462
3463 while (TREE_CODE (op0) == NOP_EXPR
3464 || TREE_CODE (op0) == CONVERT_EXPR
3465 || TREE_CODE (op0) == NON_LVALUE_EXPR)
3466 {
3467 tree inner = TREE_OPERAND (op0, 0);
3468 if (inner == error_mark_node
3469 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3470 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
3471 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3472 break;
3473 op0 = inner;
3474 }
3475
3476 while (TREE_CODE (op1) == NOP_EXPR
3477 || TREE_CODE (op1) == CONVERT_EXPR
3478 || TREE_CODE (op1) == NON_LVALUE_EXPR)
3479 {
3480 tree inner = TREE_OPERAND (op1, 0);
3481 if (inner == error_mark_node
3482 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3483 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
3484 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3485 break;
3486 op1 = inner;
3487 }
14a774a9
RK
3488
3489 if (TREE_CODE (op0) == ADDR_EXPR
3490 && TREE_CODE (TREE_OPERAND (op0, 0)) == LABEL_DECL
3491 && TREE_CODE (op1) == ADDR_EXPR
3492 && TREE_CODE (TREE_OPERAND (op1, 0)) == LABEL_DECL)
3493 return null_pointer_node;
3494 }
3495 break;
3496
3497 default:
3498 break;
3499 }
3500
3501 return 0;
3502}
3503\f
79e68feb
RS
3504/* Output assembler code for constant EXP to FILE, with no label.
3505 This includes the pseudo-op such as ".int" or ".byte", and a newline.
3506 Assumes output_addressed_constants has been done on EXP already.
3507
3508 Generate exactly SIZE bytes of assembler data, padding at the end
3509 with zeros if necessary. SIZE must always be specified.
3510
3511 SIZE is important for structure constructors,
3512 since trailing members may have been omitted from the constructor.
3513 It is also important for initialization of arrays from string constants
3514 since the full length of the string constant might not be wanted.
3515 It is also needed for initialization of unions, where the initializer's
3516 type is just one member, and that may not be as long as the union.
3517
3518 There a case in which we would fail to output exactly SIZE bytes:
3519 for a structure constructor that wants to produce more than SIZE bytes.
c8af3574
RH
3520 But such constructors will never be generated for any possible input.
3521
3522 ALIGN is the alignment of the data in bits. */
79e68feb
RS
3523
3524void
2e1eedd6 3525output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
79e68feb 3526{
ac79cd5a 3527 enum tree_code code;
58e15542 3528 unsigned HOST_WIDE_INT thissize;
79e68feb 3529
14b493d6 3530 /* Some front-ends use constants other than the standard language-independent
ed239f5a
RK
3531 varieties, but which may still be output directly. Give the front-end a
3532 chance to convert EXP to a language-independent representation. */
ae2bcd98 3533 exp = lang_hooks.expand_constant (exp);
e697e20a 3534
e9996db7 3535 if (size == 0 || flag_syntax_only)
79e68feb
RS
3536 return;
3537
ac79cd5a
RK
3538 /* Eliminate any conversions since we'll be outputting the underlying
3539 constant. */
3540 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
ed239f5a
RK
3541 || TREE_CODE (exp) == NON_LVALUE_EXPR
3542 || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
ac79cd5a
RK
3543 exp = TREE_OPERAND (exp, 0);
3544
3545 code = TREE_CODE (TREE_TYPE (exp));
3546 thissize = int_size_in_bytes (TREE_TYPE (exp));
be1ad04c 3547
fff9e713
MT
3548 /* Allow a constructor with no elements for any data type.
3549 This means to fill the space with zeros. */
77fa0940 3550 if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
fff9e713 3551 {
b93a436e 3552 assemble_zeros (size);
fff9e713
MT
3553 return;
3554 }
3555
67231816
RH
3556 if (TREE_CODE (exp) == FDESC_EXPR)
3557 {
f42f3c2d 3558#ifdef ASM_OUTPUT_FDESC
67231816
RH
3559 HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
3560 tree decl = TREE_OPERAND (exp, 0);
67231816
RH
3561 ASM_OUTPUT_FDESC (asm_out_file, decl, part);
3562#else
3563 abort ();
3564#endif
3565 return;
3566 }
3567
ac79cd5a 3568 /* Now output the underlying data. If we've handling the padding, return.
42048866 3569 Otherwise, break and ensure SIZE is the size written. */
79e68feb
RS
3570 switch (code)
3571 {
644ea577
RS
3572 case CHAR_TYPE:
3573 case BOOLEAN_TYPE:
79e68feb
RS
3574 case INTEGER_TYPE:
3575 case ENUMERAL_TYPE:
3576 case POINTER_TYPE:
3577 case REFERENCE_TYPE:
a5ac359a 3578 case OFFSET_TYPE:
37366632 3579 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
79e68feb 3580 EXPAND_INITIALIZER),
42048866 3581 MIN (size, thissize), align, 0))
79e68feb 3582 error ("initializer for integer value is too complicated");
79e68feb
RS
3583 break;
3584
3585 case REAL_TYPE:
3586 if (TREE_CODE (exp) != REAL_CST)
3587 error ("initializer for floating value is not a floating constant");
3588
02befdf4 3589 assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
79e68feb
RS
3590 break;
3591
3592 case COMPLEX_TYPE:
ac79cd5a
RK
3593 output_constant (TREE_REALPART (exp), thissize / 2, align);
3594 output_constant (TREE_IMAGPART (exp), thissize / 2,
3595 min_align (align, BITS_PER_UNIT * (thissize / 2)));
79e68feb
RS
3596 break;
3597
3598 case ARRAY_TYPE:
e6834654 3599 case VECTOR_TYPE:
79e68feb
RS
3600 if (TREE_CODE (exp) == CONSTRUCTOR)
3601 {
c8af3574 3602 output_constructor (exp, size, align);
79e68feb
RS
3603 return;
3604 }
3605 else if (TREE_CODE (exp) == STRING_CST)
3606 {
58e15542
JH
3607 thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
3608 size);
ac79cd5a 3609 assemble_string (TREE_STRING_POINTER (exp), thissize);
79e68feb 3610 }
d744e06e
AH
3611 else if (TREE_CODE (exp) == VECTOR_CST)
3612 {
3613 int elt_size;
3614 tree link;
3615 unsigned int nalign;
3616 enum machine_mode inner;
3617
3618 inner = GET_MODE_INNER (TYPE_MODE (TREE_TYPE (exp)));
3619 nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
3620
3621 elt_size = GET_MODE_UNIT_SIZE (TYPE_MODE (TREE_TYPE (exp)));
3622
3623 link = TREE_VECTOR_CST_ELTS (exp);
3624 output_constant (TREE_VALUE (link), elt_size, align);
3625 while ((link = TREE_CHAIN (link)) != NULL)
3626 output_constant (TREE_VALUE (link), elt_size, nalign);
3627 }
79e68feb
RS
3628 else
3629 abort ();
3630 break;
3631
3632 case RECORD_TYPE:
3633 case UNION_TYPE:
3634 if (TREE_CODE (exp) == CONSTRUCTOR)
c8af3574 3635 output_constructor (exp, size, align);
79e68feb
RS
3636 else
3637 abort ();
3638 return;
474bda6c
PB
3639
3640 case SET_TYPE:
3641 if (TREE_CODE (exp) == INTEGER_CST)
3642 assemble_integer (expand_expr (exp, NULL_RTX,
3643 VOIDmode, EXPAND_INITIALIZER),
c26fbbca 3644 thissize, align, 1);
474bda6c
PB
3645 else if (TREE_CODE (exp) == CONSTRUCTOR)
3646 {
703ad42b 3647 unsigned char *buffer = alloca (thissize);
ac79cd5a 3648 if (get_set_constructor_bytes (exp, buffer, thissize))
474bda6c 3649 abort ();
ac79cd5a 3650 assemble_string ((char *) buffer, thissize);
474bda6c
PB
3651 }
3652 else
3653 error ("unknown set constructor type");
3654 return;
e9a25f70 3655
0974a3b8
RK
3656 case ERROR_MARK:
3657 return;
3658
e9a25f70 3659 default:
ac79cd5a 3660 abort ();
79e68feb
RS
3661 }
3662
d3e0dffb
JH
3663 if (size > thissize)
3664 assemble_zeros (size - thissize);
79e68feb 3665}
ca695ac9 3666
79e68feb 3667\f
a25f1211
RH
3668/* Subroutine of output_constructor, used for computing the size of
3669 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
3670 type with an unspecified upper bound. */
3671
ffc5c6a9 3672static unsigned HOST_WIDE_INT
2e1eedd6 3673array_size_for_constructor (tree val)
a25f1211
RH
3674{
3675 tree max_index, i;
3676
ac79cd5a
RK
3677 /* This code used to attempt to handle string constants that are not
3678 arrays of single-bytes, but nothing else does, so there's no point in
3679 doing it here. */
b6fc7110 3680 if (TREE_CODE (val) == STRING_CST)
ac79cd5a
RK
3681 return TREE_STRING_LENGTH (val);
3682
a25f1211 3683 max_index = NULL_TREE;
c26fbbca 3684 for (i = CONSTRUCTOR_ELTS (val); i; i = TREE_CHAIN (i))
a25f1211
RH
3685 {
3686 tree index = TREE_PURPOSE (i);
3687
3688 if (TREE_CODE (index) == RANGE_EXPR)
3689 index = TREE_OPERAND (index, 1);
3690 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
3691 max_index = index;
3692 }
3693
a25f1211 3694 if (max_index == NULL_TREE)
ffc5c6a9 3695 return 0;
a25f1211
RH
3696
3697 /* Compute the total number of array elements. */
46f9491e 3698 i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
ffc5c6a9
RH
3699 convert (sizetype,
3700 TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
3701 i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
a25f1211
RH
3702
3703 /* Multiply by the array element unit size to find number of bytes. */
ffc5c6a9 3704 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
a25f1211
RH
3705
3706 return tree_low_cst (i, 1);
3707}
3708
3709/* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
79e68feb
RS
3710 Generate at least SIZE bytes, padding if necessary. */
3711
5a13eaa4 3712static void
2e1eedd6
AJ
3713output_constructor (tree exp, unsigned HOST_WIDE_INT size,
3714 unsigned int align)
79e68feb 3715{
85f3d674 3716 tree type = TREE_TYPE (exp);
b3694847 3717 tree link, field = 0;
85f3d674 3718 tree min_index = 0;
79e68feb
RS
3719 /* Number of bytes output or skipped so far.
3720 In other words, current position within the constructor. */
85f3d674 3721 HOST_WIDE_INT total_bytes = 0;
272d0bee 3722 /* Nonzero means BYTE contains part of a byte, to be output. */
79e68feb 3723 int byte_buffer_in_use = 0;
b3694847 3724 int byte = 0;
79e68feb 3725
37366632 3726 if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
79e68feb
RS
3727 abort ();
3728
85f3d674
RK
3729 if (TREE_CODE (type) == RECORD_TYPE)
3730 field = TYPE_FIELDS (type);
79e68feb 3731
85f3d674
RK
3732 if (TREE_CODE (type) == ARRAY_TYPE
3733 && TYPE_DOMAIN (type) != 0)
3734 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
13b457e7 3735
79e68feb
RS
3736 /* As LINK goes through the elements of the constant,
3737 FIELD goes through the structure fields, if the constant is a structure.
3738 if the constant is a union, then we override this,
3739 by getting the field from the TREE_LIST element.
43f7bed5
VM
3740 But the constant could also be an array. Then FIELD is zero.
3741
3742 There is always a maximum of one element in the chain LINK for unions
3743 (even if the initializer in a source program incorrectly contains
2d76cb1a 3744 more one). */
79e68feb
RS
3745 for (link = CONSTRUCTOR_ELTS (exp);
3746 link;
3747 link = TREE_CHAIN (link),
3748 field = field ? TREE_CHAIN (field) : 0)
3749 {
3750 tree val = TREE_VALUE (link);
3181cbfd
RS
3751 tree index = 0;
3752
85f3d674
RK
3753 /* The element in a union constructor specifies the proper field
3754 or index. */
3755 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
3756 || TREE_CODE (type) == QUAL_UNION_TYPE)
3757 && TREE_PURPOSE (link) != 0)
3758 field = TREE_PURPOSE (link);
3181cbfd 3759
85f3d674 3760 else if (TREE_CODE (type) == ARRAY_TYPE)
3181cbfd
RS
3761 index = TREE_PURPOSE (link);
3762
907393db 3763#ifdef ASM_COMMENT_START
bce988a2
AH
3764 if (field && flag_verbose_asm)
3765 fprintf (asm_out_file, "%s %s:\n",
3766 ASM_COMMENT_START,
3767 DECL_NAME (field)
3768 ? IDENTIFIER_POINTER (DECL_NAME (field))
3769 : "<anonymous>");
907393db 3770#endif
bce988a2 3771
79e68feb 3772 /* Eliminate the marker that makes a cast not be an lvalue. */
d964285c
CH
3773 if (val != 0)
3774 STRIP_NOPS (val);
79e68feb 3775
8311a11f
PB
3776 if (index && TREE_CODE (index) == RANGE_EXPR)
3777 {
bf1aaf0a 3778 unsigned HOST_WIDE_INT fieldsize
85f3d674
RK
3779 = int_size_in_bytes (TREE_TYPE (type));
3780 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
3781 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
8311a11f 3782 HOST_WIDE_INT index;
c8af3574 3783 unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
85f3d674 3784
8311a11f
PB
3785 for (index = lo_index; index <= hi_index; index++)
3786 {
3787 /* Output the element's initial value. */
3788 if (val == 0)
3789 assemble_zeros (fieldsize);
3790 else
c8af3574 3791 output_constant (val, fieldsize, align2);
8311a11f
PB
3792
3793 /* Count its size. */
3794 total_bytes += fieldsize;
3795 }
3796 }
3797 else if (field == 0 || !DECL_BIT_FIELD (field))
79e68feb 3798 {
3181cbfd
RS
3799 /* An element that is not a bit-field. */
3800
bf1aaf0a 3801 unsigned HOST_WIDE_INT fieldsize;
79e68feb
RS
3802 /* Since this structure is static,
3803 we know the positions are constant. */
85f3d674 3804 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
c8af3574 3805 unsigned int align2;
770ae6cc 3806
3181cbfd 3807 if (index != 0)
85f3d674
RK
3808 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
3809 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
79e68feb 3810
3181cbfd 3811 /* Output any buffered-up bit-fields preceding this element. */
79e68feb
RS
3812 if (byte_buffer_in_use)
3813 {
eac50d7a 3814 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
3815 total_bytes++;
3816 byte_buffer_in_use = 0;
3817 }
3818
3819 /* Advance to offset of this element.
3820 Note no alignment needed in an array, since that is guaranteed
3821 if each element has the proper size. */
85f3d674 3822 if ((field != 0 || index != 0) && pos != total_bytes)
79e68feb 3823 {
85f3d674
RK
3824 assemble_zeros (pos - total_bytes);
3825 total_bytes = pos;
79e68feb 3826 }
ca2eed21 3827
c8af3574
RH
3828 /* Find the alignment of this element. */
3829 align2 = min_align (align, BITS_PER_UNIT * pos);
46f9491e 3830
79e68feb
RS
3831 /* Determine size this element should occupy. */
3832 if (field)
a25f1211 3833 {
ffc5c6a9
RH
3834 fieldsize = 0;
3835
3836 /* If this is an array with an unspecified upper bound,
3837 the initializer determines the size. */
3838 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
3839 but we cannot do this until the deprecated support for
3840 initializing zero-length array members is removed. */
3841 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
3842 && TYPE_DOMAIN (TREE_TYPE (field))
3843 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
3844 {
a25f1211 3845 fieldsize = array_size_for_constructor (val);
ffc5c6a9
RH
3846 /* Given a non-empty initialization, this field had
3847 better be last. */
3848 if (fieldsize != 0 && TREE_CHAIN (field) != NULL_TREE)
3849 abort ();
3850 }
3851 else if (DECL_SIZE_UNIT (field))
3852 {
3853 /* ??? This can't be right. If the decl size overflows
3854 a host integer we will silently emit no data. */
3855 if (host_integerp (DECL_SIZE_UNIT (field), 1))
3856 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
3857 }
a25f1211 3858 }
79e68feb 3859 else
85f3d674 3860 fieldsize = int_size_in_bytes (TREE_TYPE (type));
79e68feb
RS
3861
3862 /* Output the element's initial value. */
3863 if (val == 0)
3864 assemble_zeros (fieldsize);
3865 else
c8af3574 3866 output_constant (val, fieldsize, align2);
79e68feb
RS
3867
3868 /* Count its size. */
3869 total_bytes += fieldsize;
3870 }
3871 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
3872 error ("invalid initial value for member `%s'",
3873 IDENTIFIER_POINTER (DECL_NAME (field)));
3874 else
3875 {
3876 /* Element that is a bit-field. */
3877
770ae6cc
RK
3878 HOST_WIDE_INT next_offset = int_bit_position (field);
3879 HOST_WIDE_INT end_offset
3880 = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
79e68feb
RS
3881
3882 if (val == 0)
3883 val = integer_zero_node;
3884
3885 /* If this field does not start in this (or, next) byte,
3886 skip some bytes. */
3887 if (next_offset / BITS_PER_UNIT != total_bytes)
3888 {
3889 /* Output remnant of any bit field in previous bytes. */
3890 if (byte_buffer_in_use)
3891 {
eac50d7a 3892 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
3893 total_bytes++;
3894 byte_buffer_in_use = 0;
3895 }
3896
3897 /* If still not at proper byte, advance to there. */
3898 if (next_offset / BITS_PER_UNIT != total_bytes)
3899 {
3900 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
3901 total_bytes = next_offset / BITS_PER_UNIT;
3902 }
3903 }
3904
3905 if (! byte_buffer_in_use)
3906 byte = 0;
3907
3908 /* We must split the element into pieces that fall within
3909 separate bytes, and combine each byte with previous or
3910 following bit-fields. */
3911
b4ac57ab 3912 /* next_offset is the offset n fbits from the beginning of
79e68feb
RS
3913 the structure to the next bit of this element to be processed.
3914 end_offset is the offset of the first bit past the end of
3915 this element. */
3916 while (next_offset < end_offset)
3917 {
3918 int this_time;
e7105755
JW
3919 int shift;
3920 HOST_WIDE_INT value;
85f3d674
RK
3921 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
3922 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
79e68feb
RS
3923
3924 /* Advance from byte to byte
3925 within this element when necessary. */
3926 while (next_byte != total_bytes)
3927 {
eac50d7a 3928 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
3929 total_bytes++;
3930 byte = 0;
3931 }
3932
3933 /* Number of bits we can process at once
3934 (all part of the same byte). */
3935 this_time = MIN (end_offset - next_offset,
3936 BITS_PER_UNIT - next_bit);
f76b9db2 3937 if (BYTES_BIG_ENDIAN)
79e68feb 3938 {
f76b9db2
ILT
3939 /* On big-endian machine, take the most significant bits
3940 first (of the bits that are significant)
3941 and put them into bytes from the most significant end. */
3942 shift = end_offset - next_offset - this_time;
85f3d674 3943
f76b9db2 3944 /* Don't try to take a bunch of bits that cross
dfb2c079
HB
3945 the word boundary in the INTEGER_CST. We can
3946 only select bits from the LOW or HIGH part
3947 not from both. */
f76b9db2
ILT
3948 if (shift < HOST_BITS_PER_WIDE_INT
3949 && shift + this_time > HOST_BITS_PER_WIDE_INT)
3950 {
8b1cb95b
GK
3951 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
3952 shift = HOST_BITS_PER_WIDE_INT;
f76b9db2
ILT
3953 }
3954
3955 /* Now get the bits from the appropriate constant word. */
3956 if (shift < HOST_BITS_PER_WIDE_INT)
85f3d674 3957 value = TREE_INT_CST_LOW (val);
f76b9db2
ILT
3958 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
3959 {
3960 value = TREE_INT_CST_HIGH (val);
3961 shift -= HOST_BITS_PER_WIDE_INT;
3962 }
3963 else
3964 abort ();
85f3d674 3965
dfb2c079
HB
3966 /* Get the result. This works only when:
3967 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
f76b9db2 3968 byte |= (((value >> shift)
dfb2c079 3969 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
f76b9db2 3970 << (BITS_PER_UNIT - this_time - next_bit));
79e68feb
RS
3971 }
3972 else
79e68feb 3973 {
f76b9db2
ILT
3974 /* On little-endian machines,
3975 take first the least significant bits of the value
3976 and pack them starting at the least significant
3977 bits of the bytes. */
770ae6cc
RK
3978 shift = next_offset - int_bit_position (field);
3979
f76b9db2 3980 /* Don't try to take a bunch of bits that cross
dfb2c079
HB
3981 the word boundary in the INTEGER_CST. We can
3982 only select bits from the LOW or HIGH part
3983 not from both. */
f76b9db2
ILT
3984 if (shift < HOST_BITS_PER_WIDE_INT
3985 && shift + this_time > HOST_BITS_PER_WIDE_INT)
770ae6cc 3986 this_time = (HOST_BITS_PER_WIDE_INT - shift);
f76b9db2
ILT
3987
3988 /* Now get the bits from the appropriate constant word. */
e9a25f70 3989 if (shift < HOST_BITS_PER_WIDE_INT)
f76b9db2
ILT
3990 value = TREE_INT_CST_LOW (val);
3991 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
3992 {
3993 value = TREE_INT_CST_HIGH (val);
3994 shift -= HOST_BITS_PER_WIDE_INT;
3995 }
3996 else
3997 abort ();
770ae6cc 3998
dfb2c079
HB
3999 /* Get the result. This works only when:
4000 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
f76b9db2 4001 byte |= (((value >> shift)
dfb2c079 4002 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
f76b9db2 4003 << next_bit);
79e68feb 4004 }
85f3d674 4005
79e68feb
RS
4006 next_offset += this_time;
4007 byte_buffer_in_use = 1;
4008 }
4009 }
4010 }
85f3d674 4011
79e68feb
RS
4012 if (byte_buffer_in_use)
4013 {
eac50d7a 4014 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4015 total_bytes++;
4016 }
85f3d674 4017
58e15542 4018 if ((unsigned HOST_WIDE_INT)total_bytes < size)
79e68feb
RS
4019 assemble_zeros (size - total_bytes);
4020}
ca695ac9 4021
ecb0eece 4022/* This TREE_LIST contains any weak symbol declarations waiting
46f9491e 4023 to be emitted. */
e2500fed 4024static GTY(()) tree weak_decls;
0e9264a2 4025
f90bf7ca
MM
4026/* Mark DECL as weak. */
4027
4028static void
2e1eedd6 4029mark_weak (tree decl)
f90bf7ca
MM
4030{
4031 DECL_WEAK (decl) = 1;
4032
4033 if (DECL_RTL_SET_P (decl)
3c0cb5de 4034 && MEM_P (DECL_RTL (decl))
f90bf7ca
MM
4035 && XEXP (DECL_RTL (decl), 0)
4036 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4037 SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4038}
41077ce4 4039
45806a3f
FS
4040/* Merge weak status between NEWDECL and OLDDECL. */
4041
4042void
2e1eedd6 4043merge_weak (tree newdecl, tree olddecl)
45806a3f 4044{
45806a3f
FS
4045 if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
4046 return;
4047
f90bf7ca
MM
4048 if (DECL_WEAK (newdecl))
4049 {
4050 tree wd;
41077ce4 4051
f90bf7ca
MM
4052 /* NEWDECL is weak, but OLDDECL is not. */
4053
4054 /* If we already output the OLDDECL, we're in trouble; we can't
4055 go back and make it weak. This error cannot caught in
4056 declare_weak because the NEWDECL and OLDDECL was not yet
4057 been merged; therefore, TREE_ASM_WRITTEN was not set. */
14285ace 4058 if (TREE_ASM_WRITTEN (olddecl))
ddd2d57e
RH
4059 error ("%Jweak declaration of '%D' must precede definition",
4060 newdecl, newdecl);
14285ace
RH
4061
4062 /* If we've already generated rtl referencing OLDDECL, we may
4063 have done so in a way that will not function properly with
4064 a weak symbol. */
4065 else if (TREE_USED (olddecl)
34fb9ba5 4066 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
ddd2d57e
RH
4067 warning ("%Jweak declaration of '%D' after first use results "
4068 "in unspecified behavior", newdecl, newdecl);
14285ace 4069
f90bf7ca
MM
4070 if (SUPPORTS_WEAK)
4071 {
4072 /* We put the NEWDECL on the weak_decls list at some point.
4073 Replace it with the OLDDECL. */
4074 for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4075 if (TREE_VALUE (wd) == newdecl)
4076 {
4077 TREE_VALUE (wd) = olddecl;
4078 break;
4079 }
4080 /* We may not find the entry on the list. If NEWDECL is a
4081 weak alias, then we will have already called
4082 globalize_decl to remove the entry; in that case, we do
4083 not need to do anything. */
4084 }
45806a3f 4085
f90bf7ca
MM
4086 /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */
4087 mark_weak (olddecl);
4088 }
4089 else
4090 /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4091 weak. Just update NEWDECL to indicate that it's weak too. */
4092 mark_weak (newdecl);
45806a3f
FS
4093}
4094
4b8af8d9
JM
4095/* Declare DECL to be a weak symbol. */
4096
4097void
2e1eedd6 4098declare_weak (tree decl)
4b8af8d9
JM
4099{
4100 if (! TREE_PUBLIC (decl))
ddd2d57e 4101 error ("%Jweak declaration of '%D' must be public", decl, decl);
45806a3f 4102 else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
ddd2d57e 4103 error ("%Jweak declaration of '%D' must precede definition", decl, decl);
daefd78b 4104 else if (SUPPORTS_WEAK)
ecb0eece
RH
4105 {
4106 if (! DECL_WEAK (decl))
4107 weak_decls = tree_cons (NULL, decl, weak_decls);
4108 }
4ae08f95 4109 else
ddd2d57e 4110 warning ("%Jweak declaration of '%D' not supported", decl, decl);
4ae08f95 4111
f90bf7ca 4112 mark_weak (decl);
4b8af8d9
JM
4113}
4114
4115/* Emit any pending weak declarations. */
4116
4117void
2e1eedd6 4118weak_finish (void)
4b8af8d9 4119{
ecb0eece
RH
4120 tree t;
4121
c26fbbca 4122 for (t = weak_decls; t; t = TREE_CHAIN (t))
4b8af8d9 4123 {
ecb0eece 4124 tree decl = TREE_VALUE (t);
4977bab6
ZW
4125#if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4126 const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4127#endif
ecb0eece
RH
4128
4129 if (! TREE_USED (decl))
4130 continue;
4131
79c4e63f 4132#ifdef ASM_WEAKEN_DECL
ecb0eece 4133 ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4ae08f95
JM
4134#else
4135#ifdef ASM_WEAKEN_LABEL
ecb0eece
RH
4136 ASM_WEAKEN_LABEL (asm_out_file, name);
4137#else
4138#ifdef ASM_OUTPUT_WEAK_ALIAS
4139 warning ("only weak aliases are supported in this configuration");
4140 return;
4ae08f95 4141#endif
79c4e63f 4142#endif
4ae08f95 4143#endif
4b8af8d9 4144 }
4b8af8d9 4145}
4ae08f95 4146
19c5b1cf
JM
4147/* Emit the assembly bits to indicate that DECL is globally visible. */
4148
4149static void
2e1eedd6 4150globalize_decl (tree decl)
19c5b1cf 4151{
f9d09ae5 4152 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
19c5b1cf
JM
4153
4154#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4155 if (DECL_WEAK (decl))
4156 {
ecb0eece
RH
4157 tree *p, t;
4158
19c5b1cf
JM
4159#ifdef ASM_WEAKEN_DECL
4160 ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
4161#else
4162 ASM_WEAKEN_LABEL (asm_out_file, name);
4163#endif
ecb0eece 4164
19c5b1cf
JM
4165 /* Remove this function from the pending weak list so that
4166 we do not emit multiple .weak directives for it. */
a81eed10
FS
4167 for (p = &weak_decls; (t = *p) ; )
4168 {
4169 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
ecb0eece 4170 *p = TREE_CHAIN (t);
a81eed10
FS
4171 else
4172 p = &TREE_CHAIN (t);
4173 }
19c5b1cf
JM
4174 return;
4175 }
4746cf84
MA
4176#elif defined(ASM_MAKE_LABEL_LINKONCE)
4177 if (DECL_ONE_ONLY (decl))
4178 ASM_MAKE_LABEL_LINKONCE (asm_out_file, name);
19c5b1cf 4179#endif
ecb0eece 4180
5fd9b178 4181 targetm.asm_out.globalize_label (asm_out_file, name);
19c5b1cf
JM
4182}
4183
4ae08f95
JM
4184/* Emit an assembler directive to make the symbol for DECL an alias to
4185 the symbol for TARGET. */
4b8af8d9
JM
4186
4187void
2e1eedd6 4188assemble_alias (tree decl, tree target ATTRIBUTE_UNUSED)
4b8af8d9 4189{
3cce094d 4190 const char *name;
4b8af8d9 4191
9ea07fd0
JW
4192 /* We must force creation of DECL_RTL for debug info generation, even though
4193 we don't use it here. */
6496a589 4194 make_decl_rtl (decl, NULL);
9ea07fd0 4195
19e7881c 4196 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4b8af8d9 4197
4927276d 4198#ifdef ASM_OUTPUT_DEF
4b8af8d9
JM
4199 /* Make name accessible from other files, if appropriate. */
4200
4201 if (TREE_PUBLIC (decl))
4202 {
19c5b1cf 4203 globalize_decl (decl);
b14707c3 4204 maybe_assemble_visibility (decl);
4b8af8d9
JM
4205 }
4206
e4faf1eb
NC
4207#ifdef ASM_OUTPUT_DEF_FROM_DECLS
4208 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4209#else
4b8af8d9 4210 ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
e4faf1eb 4211#endif
79c4e63f
AM
4212#else /* !ASM_OUTPUT_DEF */
4213#if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
06e4eab5
RS
4214 if (DECL_WEAK (decl))
4215 {
4216 tree *p, t;
79c4e63f 4217#ifdef ASM_WEAKEN_DECL
06e4eab5 4218 ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
79c4e63f 4219#else
06e4eab5 4220 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
79c4e63f 4221#endif
06e4eab5
RS
4222 /* Remove this function from the pending weak list so that
4223 we do not emit multiple .weak directives for it. */
4224 for (p = &weak_decls; (t = *p) ; )
4225 if (DECL_ASSEMBLER_NAME (decl)
4226 == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4227 *p = TREE_CHAIN (t);
4228 else
4229 p = &TREE_CHAIN (t);
4230 }
4231 else
4232 warning ("only weak aliases are supported in this configuration");
4233
4927276d
JM
4234#else
4235 warning ("alias definitions not supported in this configuration; ignored");
4236#endif
4b8af8d9 4237#endif
14285ace
RH
4238
4239 TREE_USED (decl) = 1;
4240 TREE_ASM_WRITTEN (decl) = 1;
4241 TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
4b8af8d9 4242}
f796d997 4243
47bd70b5 4244/* Emit an assembler directive to set symbol for DECL visibility to
25fdb4dc 4245 the visibility type VIS, which must not be VISIBILITY_DEFAULT. */
47bd70b5
JJ
4246
4247void
2e1eedd6 4248default_assemble_visibility (tree decl, int vis)
47bd70b5 4249{
25fdb4dc
RH
4250 static const char * const visibility_types[] = {
4251 NULL, "internal", "hidden", "protected"
4252 };
4253
4254 const char *name, *type;
47bd70b5 4255
267594f3 4256 name = (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
25fdb4dc 4257 type = visibility_types[vis];
47bd70b5
JJ
4258
4259#ifdef HAVE_GAS_HIDDEN
267594f3
R
4260 fprintf (asm_out_file, "\t.%s\t", type);
4261 assemble_name (asm_out_file, name);
4262 fprintf (asm_out_file, "\n");
47bd70b5
JJ
4263#else
4264 warning ("visibility attribute not supported in this configuration; ignored");
4265#endif
4266}
4267
b14707c3
RH
4268/* A helper function to call assemble_visibility when needed for a decl. */
4269
4270static void
2e1eedd6 4271maybe_assemble_visibility (tree decl)
b14707c3 4272{
968b41a1 4273 enum symbol_visibility vis = DECL_VISIBILITY (decl);
25fdb4dc
RH
4274
4275 if (vis != VISIBILITY_DEFAULT)
245f1bfa 4276 targetm.asm_out.visibility (decl, vis);
b14707c3
RH
4277}
4278
f796d997
JM
4279/* Returns 1 if the target configuration supports defining public symbols
4280 so that one of them will be chosen at link time instead of generating a
4281 multiply-defined symbol error, whether through the use of weak symbols or
4282 a target-specific mechanism for having duplicates discarded. */
4283
4284int
2e1eedd6 4285supports_one_only (void)
f796d997
JM
4286{
4287 if (SUPPORTS_ONE_ONLY)
4288 return 1;
4289 return SUPPORTS_WEAK;
4290}
4291
4292/* Set up DECL as a public symbol that can be defined in multiple
4293 translation units without generating a linker error. */
4294
4295void
2e1eedd6 4296make_decl_one_only (tree decl)
f796d997
JM
4297{
4298 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
4299 abort ();
4300
4301 TREE_PUBLIC (decl) = 1;
4302
4746cf84 4303 if (SUPPORTS_ONE_ONLY)
f796d997
JM
4304 {
4305#ifdef MAKE_DECL_ONE_ONLY
4306 MAKE_DECL_ONE_ONLY (decl);
4307#endif
4308 DECL_ONE_ONLY (decl) = 1;
4309 }
4746cf84
MA
4310 else if (TREE_CODE (decl) == VAR_DECL
4311 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4312 DECL_COMMON (decl) = 1;
f796d997 4313 else if (SUPPORTS_WEAK)
7d4444ea 4314 DECL_WEAK (decl) = 1;
f796d997
JM
4315 else
4316 abort ();
4317}
76095e2f
RH
4318
4319void
2e1eedd6 4320init_varasm_once (void)
76095e2f 4321{
17211ab5
GK
4322 in_named_htab = htab_create_ggc (31, in_named_entry_hash,
4323 in_named_entry_eq, NULL);
10b6a274
ZW
4324 const_desc_htab = htab_create_ggc (1009, const_desc_hash,
4325 const_desc_eq, NULL);
715bdd29 4326
a79e3a45 4327 const_alias_set = new_alias_set ();
76095e2f 4328}
7c262518 4329
dce81a1a 4330enum tls_model
2e1eedd6 4331decl_tls_model (tree decl)
dce81a1a
JJ
4332{
4333 enum tls_model kind;
4334 tree attr = lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl));
4335 bool is_local;
4336
4337 if (attr)
4338 {
4339 attr = TREE_VALUE (TREE_VALUE (attr));
4340 if (TREE_CODE (attr) != STRING_CST)
4341 abort ();
4342 if (!strcmp (TREE_STRING_POINTER (attr), "local-exec"))
4343 kind = TLS_MODEL_LOCAL_EXEC;
4344 else if (!strcmp (TREE_STRING_POINTER (attr), "initial-exec"))
4345 kind = TLS_MODEL_INITIAL_EXEC;
4346 else if (!strcmp (TREE_STRING_POINTER (attr), "local-dynamic"))
4347 kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
4348 else if (!strcmp (TREE_STRING_POINTER (attr), "global-dynamic"))
4349 kind = TLS_MODEL_GLOBAL_DYNAMIC;
4350 else
4351 abort ();
4352 return kind;
4353 }
4354
5fd9b178 4355 is_local = targetm.binds_local_p (decl);
dce81a1a
JJ
4356 if (!flag_pic)
4357 {
4358 if (is_local)
4359 kind = TLS_MODEL_LOCAL_EXEC;
4360 else
4361 kind = TLS_MODEL_INITIAL_EXEC;
4362 }
4363 /* Local dynamic is inefficient when we're not combining the
4364 parts of the address. */
4365 else if (optimize && is_local)
4366 kind = TLS_MODEL_LOCAL_DYNAMIC;
4367 else
4368 kind = TLS_MODEL_GLOBAL_DYNAMIC;
4369 if (kind < flag_tls_default)
4370 kind = flag_tls_default;
4371
4372 return kind;
4373}
4374
7c262518
RH
4375/* Select a set of attributes for section NAME based on the properties
4376 of DECL and whether or not RELOC indicates that DECL's initializer
4377 might contain runtime relocations.
4378
4379 We make the section read-only and executable for a function decl,
715bdd29 4380 read-only for a const data decl, and writable for a non-const data decl. */
7c262518
RH
4381
4382unsigned int
2e1eedd6 4383default_section_type_flags (tree decl, const char *name, int reloc)
2cc9fb4c
DE
4384{
4385 return default_section_type_flags_1 (decl, name, reloc, flag_pic);
4386}
4387
4388unsigned int
2e1eedd6
AJ
4389default_section_type_flags_1 (tree decl, const char *name, int reloc,
4390 int shlib)
7c262518 4391{
7c262518 4392 unsigned int flags;
7c262518
RH
4393
4394 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4395 flags = SECTION_CODE;
2cc9fb4c 4396 else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
7c262518 4397 flags = 0;
750054a2
CT
4398 else if (strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
4399 flags = SECTION_CODE;
7c262518
RH
4400 else
4401 flags = SECTION_WRITE;
4402
4403 if (decl && DECL_ONE_ONLY (decl))
4404 flags |= SECTION_LINKONCE;
4405
6f001fdf 4406 if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
c711ba8e
RH
4407 flags |= SECTION_TLS | SECTION_WRITE;
4408
7c262518
RH
4409 if (strcmp (name, ".bss") == 0
4410 || strncmp (name, ".bss.", 5) == 0
4411 || strncmp (name, ".gnu.linkonce.b.", 16) == 0
4412 || strcmp (name, ".sbss") == 0
4413 || strncmp (name, ".sbss.", 6) == 0
3d78f2e9 4414 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0
c711ba8e
RH
4415 || strcmp (name, ".tbss") == 0
4416 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
7c262518
RH
4417 flags |= SECTION_BSS;
4418
3d78f2e9 4419 if (strcmp (name, ".tdata") == 0
c711ba8e
RH
4420 || strcmp (name, ".tbss") == 0
4421 || strncmp (name, ".gnu.linkonce.td.", 17) == 0
4422 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
3d78f2e9
RH
4423 flags |= SECTION_TLS;
4424
6a0a6ac4
AM
4425 /* These three sections have special ELF types. They are neither
4426 SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
4427 want to print a section type (@progbits or @nobits). If someone
4428 is silly enough to emit code or TLS variables to one of these
4429 sections, then don't handle them specially. */
4430 if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
4431 && (strcmp (name, ".init_array") == 0
4432 || strcmp (name, ".fini_array") == 0
4433 || strcmp (name, ".preinit_array") == 0))
4434 flags |= SECTION_NOTYPE;
4435
7c262518
RH
4436 return flags;
4437}
4438
4439/* Output assembly to switch to section NAME with attribute FLAGS.
4440 Four variants for common object file formats. */
4441
4442void
2e1eedd6
AJ
4443default_no_named_section (const char *name ATTRIBUTE_UNUSED,
4444 unsigned int flags ATTRIBUTE_UNUSED)
7c262518
RH
4445{
4446 /* Some object formats don't support named sections at all. The
4447 front-end should already have flagged this as an error. */
4448 abort ();
4449}
4450
4451void
2e1eedd6 4452default_elf_asm_named_section (const char *name, unsigned int flags)
7c262518 4453{
201556f0 4454 char flagchars[10], *f = flagchars;
7c262518 4455
a8c01a59
RL
4456 if (! named_section_first_declaration (name))
4457 {
4458 fprintf (asm_out_file, "\t.section\t%s\n", name);
4459 return;
4460 }
4461
7c262518
RH
4462 if (!(flags & SECTION_DEBUG))
4463 *f++ = 'a';
4464 if (flags & SECTION_WRITE)
4465 *f++ = 'w';
4466 if (flags & SECTION_CODE)
4467 *f++ = 'x';
4468 if (flags & SECTION_SMALL)
4469 *f++ = 's';
201556f0
JJ
4470 if (flags & SECTION_MERGE)
4471 *f++ = 'M';
4472 if (flags & SECTION_STRINGS)
4473 *f++ = 'S';
3d78f2e9
RH
4474 if (flags & SECTION_TLS)
4475 *f++ = 'T';
7c262518
RH
4476 *f = '\0';
4477
6a0a6ac4 4478 fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
7c262518 4479
6a0a6ac4
AM
4480 if (!(flags & SECTION_NOTYPE))
4481 {
4482 const char *type;
4483
4484 if (flags & SECTION_BSS)
4485 type = "nobits";
4486 else
4487 type = "progbits";
4488
4489 fprintf (asm_out_file, ",@%s", type);
4490
4491 if (flags & SECTION_ENTSIZE)
4492 fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
4493 }
4494
4495 putc ('\n', asm_out_file);
7c262518
RH
4496}
4497
4498void
2e1eedd6 4499default_coff_asm_named_section (const char *name, unsigned int flags)
7c262518
RH
4500{
4501 char flagchars[8], *f = flagchars;
4502
4503 if (flags & SECTION_WRITE)
4504 *f++ = 'w';
4505 if (flags & SECTION_CODE)
4506 *f++ = 'x';
4507 *f = '\0';
4508
4509 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
4510}
4511
4512void
2e1eedd6 4513default_pe_asm_named_section (const char *name, unsigned int flags)
7c262518 4514{
715bdd29 4515 default_coff_asm_named_section (name, flags);
7c262518
RH
4516
4517 if (flags & SECTION_LINKONCE)
4518 {
4519 /* Functions may have been compiled at various levels of
4520 optimization so we can't use `same_size' here.
4521 Instead, have the linker pick one. */
4522 fprintf (asm_out_file, "\t.linkonce %s\n",
4523 (flags & SECTION_CODE ? "discard" : "same_size"));
4524 }
4525}
4a8d0c9c 4526\f
ae46c4e0
RH
4527/* The lame default section selector. */
4528
4529void
2e1eedd6
AJ
4530default_select_section (tree decl, int reloc,
4531 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
ae46c4e0
RH
4532{
4533 bool readonly = false;
4534
4535 if (DECL_P (decl))
4536 {
4e4d733e 4537 if (decl_readonly_section (decl, reloc))
ae46c4e0
RH
4538 readonly = true;
4539 }
4540 else if (TREE_CODE (decl) == CONSTRUCTOR)
4541 {
4542 if (! ((flag_pic && reloc)
4543 || !TREE_READONLY (decl)
4544 || TREE_SIDE_EFFECTS (decl)
4545 || !TREE_CONSTANT (decl)))
4546 readonly = true;
4547 }
4548 else if (TREE_CODE (decl) == STRING_CST)
3521b33c 4549 readonly = true;
ae46c4e0
RH
4550 else if (! (flag_pic && reloc))
4551 readonly = true;
4552
4553 if (readonly)
4554 readonly_data_section ();
4555 else
4556 data_section ();
4557}
4558
4559/* A helper function for default_elf_select_section and
4560 default_elf_unique_section. Categorizes the DECL. */
4561
4562enum section_category
4563{
4564 SECCAT_TEXT,
4565
4566 SECCAT_RODATA,
4567 SECCAT_RODATA_MERGE_STR,
4568 SECCAT_RODATA_MERGE_STR_INIT,
4569 SECCAT_RODATA_MERGE_CONST,
275b6d80 4570 SECCAT_SRODATA,
ae46c4e0
RH
4571
4572 SECCAT_DATA,
4573
4574 /* To optimize loading of shared programs, define following subsections
4575 of data section:
4576 _REL Contains data that has relocations, so they get grouped
4577 together and dynamic linker will visit fewer pages in memory.
4578 _RO Contains data that is otherwise read-only. This is useful
4579 with prelinking as most relocations won't be dynamically
4580 linked and thus stay read only.
4581 _LOCAL Marks data containing relocations only to local objects.
4582 These relocations will get fully resolved by prelinking. */
4583 SECCAT_DATA_REL,
4584 SECCAT_DATA_REL_LOCAL,
4585 SECCAT_DATA_REL_RO,
4586 SECCAT_DATA_REL_RO_LOCAL,
4587
4588 SECCAT_SDATA,
4589 SECCAT_TDATA,
4590
4591 SECCAT_BSS,
4592 SECCAT_SBSS,
4593 SECCAT_TBSS
4594};
4595
2cc9fb4c 4596static enum section_category
2e1eedd6 4597categorize_decl_for_section (tree, int, int);
ae46c4e0
RH
4598
4599static enum section_category
2e1eedd6 4600categorize_decl_for_section (tree decl, int reloc, int shlib)
ae46c4e0
RH
4601{
4602 enum section_category ret;
4603
4604 if (TREE_CODE (decl) == FUNCTION_DECL)
4605 return SECCAT_TEXT;
4606 else if (TREE_CODE (decl) == STRING_CST)
6de9cd9a
DN
4607 {
4608 if (flag_mudflap) /* or !flag_merge_constants */
4609 return SECCAT_RODATA;
4610 else
4611 return SECCAT_RODATA_MERGE_STR;
4612 }
ae46c4e0
RH
4613 else if (TREE_CODE (decl) == VAR_DECL)
4614 {
4615 if (DECL_INITIAL (decl) == NULL
08a8c6b6
JB
4616 || DECL_INITIAL (decl) == error_mark_node
4617 || (flag_zero_initialized_in_bss
4618 /* Leave constant zeroes in .rodata so they can be shared. */
4619 && !TREE_READONLY (decl)
4620 && initializer_zerop (DECL_INITIAL (decl))))
ae46c4e0
RH
4621 ret = SECCAT_BSS;
4622 else if (! TREE_READONLY (decl)
4623 || TREE_SIDE_EFFECTS (decl)
4624 || ! TREE_CONSTANT (DECL_INITIAL (decl)))
4625 {
2cc9fb4c 4626 if (shlib && (reloc & 2))
ae46c4e0 4627 ret = SECCAT_DATA_REL;
2cc9fb4c 4628 else if (shlib && reloc)
ae46c4e0
RH
4629 ret = SECCAT_DATA_REL_LOCAL;
4630 else
4631 ret = SECCAT_DATA;
4632 }
2cc9fb4c 4633 else if (shlib && (reloc & 2))
ae46c4e0 4634 ret = SECCAT_DATA_REL_RO;
2cc9fb4c 4635 else if (shlib && reloc)
ae46c4e0 4636 ret = SECCAT_DATA_REL_RO_LOCAL;
7eca317a 4637 else if (reloc || flag_merge_constants < 2)
ae46c4e0
RH
4638 /* C and C++ don't allow different variables to share the same
4639 location. -fmerge-all-constants allows even that (at the
4640 expense of not conforming). */
4641 ret = SECCAT_RODATA;
4642 else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
4643 ret = SECCAT_RODATA_MERGE_STR_INIT;
4644 else
4645 ret = SECCAT_RODATA_MERGE_CONST;
4646 }
4647 else if (TREE_CODE (decl) == CONSTRUCTOR)
4648 {
2cc9fb4c 4649 if ((shlib && reloc)
ae46c4e0
RH
4650 || TREE_SIDE_EFFECTS (decl)
4651 || ! TREE_CONSTANT (decl))
4652 ret = SECCAT_DATA;
4653 else
4654 ret = SECCAT_RODATA;
4655 }
4656 else
4657 ret = SECCAT_RODATA;
4658
3d78f2e9
RH
4659 /* There are no read-only thread-local sections. */
4660 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4661 {
08a8c6b6
JB
4662 /* Note that this would be *just* SECCAT_BSS, except that there's
4663 no concept of a read-only thread-local-data section. */
4664 if (ret == SECCAT_BSS
4665 || (flag_zero_initialized_in_bss
4666 && initializer_zerop (DECL_INITIAL (decl))))
3d78f2e9
RH
4667 ret = SECCAT_TBSS;
4668 else
4669 ret = SECCAT_TDATA;
4670 }
4671
ae46c4e0 4672 /* If the target uses small data sections, select it. */
5fd9b178 4673 else if (targetm.in_small_data_p (decl))
ae46c4e0
RH
4674 {
4675 if (ret == SECCAT_BSS)
4676 ret = SECCAT_SBSS;
275b6d80
DE
4677 else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
4678 ret = SECCAT_SRODATA;
ae46c4e0
RH
4679 else
4680 ret = SECCAT_SDATA;
4681 }
4682
4683 return ret;
4684}
4685
4e4d733e 4686bool
2e1eedd6 4687decl_readonly_section (tree decl, int reloc)
4e4d733e 4688{
2cc9fb4c
DE
4689 return decl_readonly_section_1 (decl, reloc, flag_pic);
4690}
4691
4692bool
2e1eedd6 4693decl_readonly_section_1 (tree decl, int reloc, int shlib)
2cc9fb4c
DE
4694{
4695 switch (categorize_decl_for_section (decl, reloc, shlib))
4e4d733e
L
4696 {
4697 case SECCAT_RODATA:
4698 case SECCAT_RODATA_MERGE_STR:
4699 case SECCAT_RODATA_MERGE_STR_INIT:
4700 case SECCAT_RODATA_MERGE_CONST:
275b6d80 4701 case SECCAT_SRODATA:
4e4d733e
L
4702 return true;
4703 break;
4704 default:
4705 return false;
4706 break;
4707 }
4708}
4709
ae46c4e0
RH
4710/* Select a section based on the above categorization. */
4711
4712void
2e1eedd6
AJ
4713default_elf_select_section (tree decl, int reloc,
4714 unsigned HOST_WIDE_INT align)
ae46c4e0 4715{
2cc9fb4c
DE
4716 default_elf_select_section_1 (decl, reloc, align, flag_pic);
4717}
4718
4719void
2e1eedd6
AJ
4720default_elf_select_section_1 (tree decl, int reloc,
4721 unsigned HOST_WIDE_INT align, int shlib)
2cc9fb4c
DE
4722{
4723 switch (categorize_decl_for_section (decl, reloc, shlib))
ae46c4e0
RH
4724 {
4725 case SECCAT_TEXT:
4726 /* We're not supposed to be called on FUNCTION_DECLs. */
4727 abort ();
4728 case SECCAT_RODATA:
4729 readonly_data_section ();
4730 break;
4731 case SECCAT_RODATA_MERGE_STR:
4732 mergeable_string_section (decl, align, 0);
4733 break;
4734 case SECCAT_RODATA_MERGE_STR_INIT:
4735 mergeable_string_section (DECL_INITIAL (decl), align, 0);
4736 break;
4737 case SECCAT_RODATA_MERGE_CONST:
4738 mergeable_constant_section (DECL_MODE (decl), align, 0);
4739 break;
275b6d80
DE
4740 case SECCAT_SRODATA:
4741 named_section (NULL_TREE, ".sdata2", reloc);
4742 break;
ae46c4e0
RH
4743 case SECCAT_DATA:
4744 data_section ();
4745 break;
4746 case SECCAT_DATA_REL:
4747 named_section (NULL_TREE, ".data.rel", reloc);
4748 break;
4749 case SECCAT_DATA_REL_LOCAL:
4750 named_section (NULL_TREE, ".data.rel.local", reloc);
4751 break;
4752 case SECCAT_DATA_REL_RO:
4753 named_section (NULL_TREE, ".data.rel.ro", reloc);
4754 break;
4755 case SECCAT_DATA_REL_RO_LOCAL:
4756 named_section (NULL_TREE, ".data.rel.ro.local", reloc);
4757 break;
4758 case SECCAT_SDATA:
4759 named_section (NULL_TREE, ".sdata", reloc);
4760 break;
4761 case SECCAT_TDATA:
4762 named_section (NULL_TREE, ".tdata", reloc);
4763 break;
4764 case SECCAT_BSS:
4765#ifdef BSS_SECTION_ASM_OP
4766 bss_section ();
4767#else
4768 named_section (NULL_TREE, ".bss", reloc);
4769#endif
4770 break;
4771 case SECCAT_SBSS:
4772 named_section (NULL_TREE, ".sbss", reloc);
4773 break;
4774 case SECCAT_TBSS:
4775 named_section (NULL_TREE, ".tbss", reloc);
4776 break;
4777 default:
4778 abort ();
4779 }
4780}
4781
41077ce4 4782/* Construct a unique section name based on the decl name and the
ae46c4e0
RH
4783 categorization performed above. */
4784
4785void
2e1eedd6 4786default_unique_section (tree decl, int reloc)
2cc9fb4c
DE
4787{
4788 default_unique_section_1 (decl, reloc, flag_pic);
4789}
4790
4791void
2e1eedd6 4792default_unique_section_1 (tree decl, int reloc, int shlib)
ae46c4e0
RH
4793{
4794 bool one_only = DECL_ONE_ONLY (decl);
4795 const char *prefix, *name;
4796 size_t nlen, plen;
4797 char *string;
4798
2cc9fb4c 4799 switch (categorize_decl_for_section (decl, reloc, shlib))
ae46c4e0
RH
4800 {
4801 case SECCAT_TEXT:
4802 prefix = one_only ? ".gnu.linkonce.t." : ".text.";
4803 break;
4804 case SECCAT_RODATA:
4805 case SECCAT_RODATA_MERGE_STR:
4806 case SECCAT_RODATA_MERGE_STR_INIT:
4807 case SECCAT_RODATA_MERGE_CONST:
4808 prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
4809 break;
275b6d80
DE
4810 case SECCAT_SRODATA:
4811 prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
4812 break;
ae46c4e0
RH
4813 case SECCAT_DATA:
4814 case SECCAT_DATA_REL:
4815 case SECCAT_DATA_REL_LOCAL:
4816 case SECCAT_DATA_REL_RO:
4817 case SECCAT_DATA_REL_RO_LOCAL:
4818 prefix = one_only ? ".gnu.linkonce.d." : ".data.";
4819 break;
4820 case SECCAT_SDATA:
4821 prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
4822 break;
4823 case SECCAT_BSS:
4824 prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
4825 break;
4826 case SECCAT_SBSS:
4827 prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
4828 break;
4829 case SECCAT_TDATA:
c711ba8e
RH
4830 prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
4831 break;
ae46c4e0 4832 case SECCAT_TBSS:
c711ba8e
RH
4833 prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
4834 break;
ae46c4e0
RH
4835 default:
4836 abort ();
4837 }
4838 plen = strlen (prefix);
4839
4840 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
245f1bfa 4841 name = targetm.strip_name_encoding (name);
ae46c4e0
RH
4842 nlen = strlen (name);
4843
4844 string = alloca (nlen + plen + 1);
4845 memcpy (string, prefix, plen);
4846 memcpy (string + plen, name, nlen + 1);
4847
4848 DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
4849}
b64a1b53
RH
4850
4851void
2e1eedd6
AJ
4852default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
4853 rtx x,
4854 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
b64a1b53
RH
4855{
4856 if (flag_pic)
4857 switch (GET_CODE (x))
4858 {
4859 case CONST:
4860 case SYMBOL_REF:
4861 case LABEL_REF:
4862 data_section ();
4863 return;
4864
4865 default:
4866 break;
4867 }
4868
4869 readonly_data_section ();
4870}
4871
4872void
2e1eedd6
AJ
4873default_elf_select_rtx_section (enum machine_mode mode, rtx x,
4874 unsigned HOST_WIDE_INT align)
b64a1b53
RH
4875{
4876 /* ??? Handle small data here somehow. */
4877
4878 if (flag_pic)
4879 switch (GET_CODE (x))
4880 {
4881 case CONST:
4882 case SYMBOL_REF:
4883 named_section (NULL_TREE, ".data.rel.ro", 3);
4884 return;
4885
4886 case LABEL_REF:
4887 named_section (NULL_TREE, ".data.rel.ro.local", 1);
4888 return;
4889
4890 default:
4891 break;
4892 }
4893
4894 mergeable_constant_section (mode, align, 0);
4895}
772c5265 4896
52859c77
RH
4897/* Set the generally applicable flags on the SYMBOL_REF for EXP. */
4898
4899void
2e1eedd6 4900default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
52859c77 4901{
c6a2438a 4902 rtx symbol;
52859c77
RH
4903 int flags;
4904
52859c77 4905 /* Careful not to prod global register variables. */
3c0cb5de 4906 if (!MEM_P (rtl))
52859c77
RH
4907 return;
4908 symbol = XEXP (rtl, 0);
4909 if (GET_CODE (symbol) != SYMBOL_REF)
4910 return;
4911
4912 flags = 0;
4913 if (TREE_CODE (decl) == FUNCTION_DECL)
4914 flags |= SYMBOL_FLAG_FUNCTION;
5fd9b178 4915 if (targetm.binds_local_p (decl))
52859c77 4916 flags |= SYMBOL_FLAG_LOCAL;
5fd9b178 4917 if (targetm.in_small_data_p (decl))
52859c77
RH
4918 flags |= SYMBOL_FLAG_SMALL;
4919 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4920 flags |= decl_tls_model (decl) << SYMBOL_FLAG_TLS_SHIFT;
1b8135a4
RH
4921 /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without
4922 being PUBLIC, the thing *must* be defined in this translation unit.
4923 Prevent this buglet from being propagated into rtl code as well. */
4924 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
52859c77
RH
4925 flags |= SYMBOL_FLAG_EXTERNAL;
4926
4927 SYMBOL_REF_FLAGS (symbol) = flags;
4928}
4929
772c5265
RH
4930/* By default, we do nothing for encode_section_info, so we need not
4931 do anything but discard the '*' marker. */
4932
4933const char *
2e1eedd6 4934default_strip_name_encoding (const char *str)
772c5265
RH
4935{
4936 return str + (*str == '*');
4937}
47754fd5
RH
4938
4939/* Assume ELF-ish defaults, since that's pretty much the most liberal
4940 wrt cross-module name binding. */
4941
4942bool
2e1eedd6 4943default_binds_local_p (tree exp)
2cc9fb4c 4944{
24a4dd31 4945 return default_binds_local_p_1 (exp, flag_shlib);
2cc9fb4c
DE
4946}
4947
4948bool
2e1eedd6 4949default_binds_local_p_1 (tree exp, int shlib)
47754fd5
RH
4950{
4951 bool local_p;
4952
4953 /* A non-decl is an entry in the constant pool. */
4954 if (!DECL_P (exp))
4955 local_p = true;
923c7cdf
RH
4956 /* Static variables are always local. */
4957 else if (! TREE_PUBLIC (exp))
4958 local_p = true;
4959 /* A variable is local if the user tells us so. */
968b41a1 4960 else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
47754fd5
RH
4961 local_p = true;
4962 /* Otherwise, variables defined outside this object may not be local. */
4963 else if (DECL_EXTERNAL (exp))
4964 local_p = false;
4965 /* Linkonce and weak data are never local. */
4966 else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
4967 local_p = false;
47754fd5
RH
4968 /* If PIC, then assume that any global name can be overridden by
4969 symbols resolved from other modules. */
2cc9fb4c 4970 else if (shlib)
47754fd5
RH
4971 local_p = false;
4972 /* Uninitialized COMMON variable may be unified with symbols
4973 resolved from other modules. */
4974 else if (DECL_COMMON (exp)
4975 && (DECL_INITIAL (exp) == NULL
4976 || DECL_INITIAL (exp) == error_mark_node))
4977 local_p = false;
4978 /* Otherwise we're left with initialized (or non-common) global data
4979 which is of necessity defined locally. */
4980 else
4981 local_p = true;
4982
4983 return local_p;
4984}
e2500fed 4985
4977bab6 4986/* Determine whether or not a pointer mode is valid. Assume defaults
5bdc5878 4987 of ptr_mode or Pmode - can be overridden. */
4977bab6 4988bool
2e1eedd6 4989default_valid_pointer_mode (enum machine_mode mode)
4977bab6
ZW
4990{
4991 return (mode == ptr_mode || mode == Pmode);
4992}
4993
5eb99654
KG
4994/* Default function to output code that will globalize a label. A
4995 target must define GLOBAL_ASM_OP or provide it's own function to
4996 globalize a label. */
4997#ifdef GLOBAL_ASM_OP
4998void
2e1eedd6 4999default_globalize_label (FILE * stream, const char *name)
5eb99654
KG
5000{
5001 fputs (GLOBAL_ASM_OP, stream);
5002 assemble_name (stream, name);
5003 putc ('\n', stream);
5004}
5005#endif /* GLOBAL_ASM_OP */
2e1eedd6 5006
4746cf84
MA
5007/* Default function to output a label for unwind information. The
5008 default is to do nothing. A target that needs nonlocal labels for
9cf737f8 5009 unwind information must provide its own function to do this. */
4746cf84
MA
5010void
5011default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
5012 tree decl ATTRIBUTE_UNUSED,
eeab4d81 5013 int for_eh ATTRIBUTE_UNUSED,
4746cf84
MA
5014 int empty ATTRIBUTE_UNUSED)
5015{
5016}
5017
4977bab6
ZW
5018/* This is how to output an internal numbered label where PREFIX is
5019 the class of label and LABELNO is the number within the class. */
5020
5021void
2e1eedd6
AJ
5022default_internal_label (FILE *stream, const char *prefix,
5023 unsigned long labelno)
4977bab6
ZW
5024{
5025 char *const buf = alloca (40 + strlen (prefix));
5026 ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
5027 ASM_OUTPUT_LABEL (stream, buf);
5028}
5029
1bc7c5b6
ZW
5030/* This is the default behavior at the beginning of a file. It's
5031 controlled by two other target-hook toggles. */
5032void
2e1eedd6 5033default_file_start (void)
1bc7c5b6
ZW
5034{
5035 if (targetm.file_start_app_off && !flag_verbose_asm)
5036 fputs (ASM_APP_OFF, asm_out_file);
5037
5038 if (targetm.file_start_file_directive)
5039 output_file_directive (asm_out_file, main_input_filename);
5040}
5041
a5fe455b
ZW
5042/* This is a generic routine suitable for use as TARGET_ASM_FILE_END
5043 which emits a special section directive used to indicate whether or
5044 not this object file needs an executable stack. This is primarily
5045 a GNU extension to ELF but could be used on other targets. */
6de9cd9a
DN
5046
5047int trampolines_created;
5048
a5fe455b 5049void
2e1eedd6 5050file_end_indicate_exec_stack (void)
a5fe455b
ZW
5051{
5052 unsigned int flags = SECTION_DEBUG;
5053 if (trampolines_created)
5054 flags |= SECTION_CODE;
5055
5056 named_section_flags (".note.GNU-stack", flags);
5057}
5058
e2500fed 5059#include "gt-varasm.h"