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