]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/varasm.c
* MAINTAINERS: Update my email address.
[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,
8893239d 3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
abb8b19a 4 Free Software Foundation, Inc.
79e68feb 5
1322177d 6This file is part of GCC.
79e68feb 7
1322177d
LB
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
9dcd6f09 10Software Foundation; either version 3, or (at your option) any later
1322177d 11version.
79e68feb 12
1322177d
LB
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
79e68feb
RS
17
18You should have received a copy of the GNU General Public License
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
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"
87c8b4be 54#include "basic-block.h"
8893239d 55#include "tree-iterator.h"
79e68feb 56
440aabf8
NB
57#ifdef XCOFF_DEBUGGING_INFO
58#include "xcoffout.h" /* Needed for external data
59 declarations for e.g. AIX 4.x. */
60#endif
61
79e68feb 62/* The (assembler) name of the first globally-visible object output. */
9881e3e5
MM
63extern GTY(()) const char *first_global_object_name;
64extern GTY(()) const char *weak_global_object_name;
65
3b304f5b
ZW
66const char *first_global_object_name;
67const char *weak_global_object_name;
79e68feb 68
36edd3cc 69struct addr_const;
e2500fed 70struct constant_descriptor_rtx;
3234b52d 71struct rtx_constant_pool;
36edd3cc 72
e2500fed 73struct varasm_status GTY(())
36edd3cc 74{
3234b52d
RH
75 /* If we're using a per-function constant pool, this is it. */
76 struct rtx_constant_pool *pool;
10b6a274
ZW
77
78 /* Number of tree-constants deferred during the expansion of this
79 function. */
80 unsigned int deferred_constants;
36edd3cc
BS
81};
82
10b6a274 83#define n_deferred_constants (cfun->varasm->deferred_constants)
36edd3cc 84
79e68feb
RS
85/* Number for making the label on the next
86 constant that is stored in memory. */
87
17211ab5 88static GTY(()) int const_labelno;
79e68feb 89
dcc8e5e6
RS
90/* Carry information from ASM_DECLARE_OBJECT_NAME
91 to ASM_FINISH_DECLARE_OBJECT. */
92
93int size_directive_output;
94
cbed4565
RS
95/* The last decl for which assemble_variable was called,
96 if it did ASM_DECLARE_OBJECT_NAME.
97 If the last call to assemble_variable didn't do that,
98 this holds 0. */
99
100tree last_assemble_variable_decl;
101
87c8b4be
CT
102/* The following global variable indicates if the first basic block
103 in a function belongs to the cold partition or not. */
750054a2 104
87c8b4be 105bool first_function_block_is_cold;
750054a2 106
389fdba0
RH
107/* We give all constants their own alias set. Perhaps redundant with
108 MEM_READONLY_P, but pre-dates it. */
a79e3a45 109
4862826d 110static alias_set_type const_alias_set;
a79e3a45 111
2e1eedd6
AJ
112static const char *strip_reg_name (const char *);
113static int contains_pointers_p (tree);
9be6533a
RS
114#ifdef ASM_OUTPUT_EXTERNAL
115static bool incorporeal_function_p (tree);
116#endif
2e1eedd6
AJ
117static void decode_addr_const (tree, struct addr_const *);
118static hashval_t const_desc_hash (const void *);
119static int const_desc_eq (const void *, const void *);
120static hashval_t const_hash_1 (const tree);
121static int compare_constant (const tree, const tree);
122static tree copy_constant (tree);
123static void output_constant_def_contents (rtx);
b2218cc1 124static void output_addressed_constants (tree);
2e1eedd6
AJ
125static unsigned HOST_WIDE_INT array_size_for_constructor (tree);
126static unsigned min_align (unsigned, unsigned);
127static void output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int);
128static void globalize_decl (tree);
78a47b1d 129#ifdef BSS_SECTION_ASM_OP
0e05e8ea 130#ifdef ASM_OUTPUT_BSS
2e1eedd6
AJ
131static void asm_output_bss (FILE *, tree, const char *,
132 unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
0e05e8ea
JL
133#endif
134#ifdef ASM_OUTPUT_ALIGNED_BSS
2e1eedd6
AJ
135static void asm_output_aligned_bss (FILE *, tree, const char *,
136 unsigned HOST_WIDE_INT, int)
137 ATTRIBUTE_UNUSED;
0e05e8ea 138#endif
cab634f2 139#endif /* BSS_SECTION_ASM_OP */
2e1eedd6 140static void mark_weak (tree);
c16ba1d5 141static void output_constant_pool (const char *, tree);
79e68feb 142\f
d6b5193b
RS
143/* Well-known sections, each one associated with some sort of *_ASM_OP. */
144section *text_section;
145section *data_section;
146section *readonly_data_section;
147section *sdata_section;
148section *ctors_section;
149section *dtors_section;
150section *bss_section;
151section *sbss_section;
d6b5193b 152
434aeebb
RS
153/* Various forms of common section. All are guaranteed to be nonnull. */
154section *tls_comm_section;
155section *comm_section;
156section *lcomm_section;
157
158/* A SECTION_NOSWITCH section used for declaring global BSS variables.
159 May be null. */
160section *bss_noswitch_section;
161
0f67af1c
RS
162/* The section that holds the main exception table, when known. The section
163 is set either by the target's init_sections hook or by the first call to
164 switch_to_exception_section. */
d6b5193b
RS
165section *exception_section;
166
0f67af1c
RS
167/* The section that holds the DWARF2 frame unwind information, when known.
168 The section is set either by the target's init_sections hook or by the
169 first call to switch_to_eh_frame_section. */
d6b5193b
RS
170section *eh_frame_section;
171
172/* asm_out_file's current section. This is NULL if no section has yet
173 been selected or if we lose track of what the current section is. */
174section *in_section;
175
c543ca49
RS
176/* True if code for the current function is currently being directed
177 at the cold section. */
178bool in_cold_section_p;
d6b5193b
RS
179
180/* A linked list of all the unnamed sections. */
181static GTY(()) section *unnamed_sections;
79e68feb 182
0e9e1e0a 183/* Return a nonzero value if DECL has a section attribute. */
a56e7c08 184#ifndef IN_NAMED_SECTION
8a425a05
DE
185#define IN_NAMED_SECTION(DECL) \
186 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
187 && DECL_SECTION_NAME (DECL) != NULL_TREE)
a56e7c08 188#endif
46f9491e 189
d6b5193b
RS
190/* Hash table of named sections. */
191static GTY((param_is (section))) htab_t section_htab;
8a425a05 192
aacd3885
RS
193/* A table of object_blocks, indexed by section. */
194static GTY((param_is (struct object_block))) htab_t object_block_htab;
195
196/* The next number to use for internal anchor labels. */
197static GTY(()) int anchor_labelno;
198
1d3dbd99
RS
199/* A pool of constants that can be shared between functions. */
200static GTY(()) struct rtx_constant_pool *shared_constant_pool;
201
8893239d
RH
202/* TLS emulation. */
203
204static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
205 htab_t emutls_htab;
206static GTY (()) tree emutls_object_type;
207
208#ifndef NO_DOT_IN_LABEL
209# define EMUTLS_VAR_PREFIX "__emutls_v."
210# define EMUTLS_TMPL_PREFIX "__emutls_t."
211#elif !defined NO_DOLLAR_IN_LABEL
212# define EMUTLS_VAR_PREFIX "__emutls_v$"
213# define EMUTLS_TMPL_PREFIX "__emutls_t$"
214#else
215# define EMUTLS_VAR_PREFIX "__emutls_v_"
216# define EMUTLS_TMPL_PREFIX "__emutls_t_"
217#endif
218
219/* Create an identifier for the struct __emutls_object, given an identifier
220 of the DECL_ASSEMBLY_NAME of the original object. */
221
222static tree
223get_emutls_object_name (tree name)
224{
225 char *toname = alloca (strlen (IDENTIFIER_POINTER (name))
226 + sizeof (EMUTLS_VAR_PREFIX));
227 strcpy (toname, EMUTLS_VAR_PREFIX);
228 strcpy (toname + sizeof (EMUTLS_VAR_PREFIX) - 1, IDENTIFIER_POINTER (name));
229
230 return get_identifier (toname);
231}
232
233/* Create the structure for struct __emutls_object. This should match the
234 structure at the top of emutls.c, modulo the union there. */
235
236static tree
237get_emutls_object_type (void)
238{
239 tree type, type_name, field, next_field, word_type_node;
240
241 type = emutls_object_type;
242 if (type)
243 return type;
244
245 emutls_object_type = type = lang_hooks.types.make_type (RECORD_TYPE);
246 type_name = get_identifier ("__emutls_object");
247 type_name = build_decl (TYPE_DECL, type_name, type);
248 TYPE_NAME (type) = type_name;
249
250 field = build_decl (FIELD_DECL, get_identifier ("__templ"), ptr_type_node);
251 DECL_CONTEXT (field) = type;
252 next_field = field;
253
254 field = build_decl (FIELD_DECL, get_identifier ("__offset"), ptr_type_node);
255 DECL_CONTEXT (field) = type;
256 TREE_CHAIN (field) = next_field;
257 next_field = field;
258
259 word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
260 field = build_decl (FIELD_DECL, get_identifier ("__align"), word_type_node);
261 DECL_CONTEXT (field) = type;
262 TREE_CHAIN (field) = next_field;
263 next_field = field;
264
265 field = build_decl (FIELD_DECL, get_identifier ("__size"), word_type_node);
266 DECL_CONTEXT (field) = type;
267 TREE_CHAIN (field) = next_field;
268
269 TYPE_FIELDS (type) = field;
270 layout_type (type);
271
272 return type;
273}
274
275/* Create a read-only variable like DECL, with the same DECL_INITIAL.
276 This will be used for initializing the emulated tls data area. */
277
278static tree
279get_emutls_init_templ_addr (tree decl)
280{
281 tree name, to;
282 char *toname;
283
284 if (!DECL_INITIAL (decl))
285 return null_pointer_node;
286
287 name = DECL_ASSEMBLER_NAME (decl);
288 toname = alloca (strlen (IDENTIFIER_POINTER (name))
289 + sizeof (EMUTLS_TMPL_PREFIX));
290 strcpy (toname, EMUTLS_TMPL_PREFIX);
291 strcpy (toname + sizeof (EMUTLS_TMPL_PREFIX) - 1, IDENTIFIER_POINTER (name));
292 name = get_identifier (toname);
293
294 to = build_decl (VAR_DECL, name, TREE_TYPE (decl));
295 SET_DECL_ASSEMBLER_NAME (to, DECL_NAME (to));
296
297 DECL_ARTIFICIAL (to) = 1;
298 TREE_USED (to) = TREE_USED (decl);
299 TREE_READONLY (to) = 1;
300 DECL_IGNORED_P (to) = 1;
301 DECL_CONTEXT (to) = DECL_CONTEXT (decl);
302 DECL_WEAK (to) = DECL_WEAK (decl);
303 if (DECL_ONE_ONLY (decl))
304 {
305 make_decl_one_only (to);
306 TREE_STATIC (to) = TREE_STATIC (decl);
307 TREE_PUBLIC (to) = TREE_PUBLIC (decl);
308 DECL_VISIBILITY (to) = DECL_VISIBILITY (decl);
309 }
310 else
311 TREE_STATIC (to) = 1;
312
313 DECL_INITIAL (to) = DECL_INITIAL (decl);
314 DECL_INITIAL (decl) = NULL;
315
316 varpool_finalize_decl (to);
317 return build_fold_addr_expr (to);
318}
319
320/* When emulating tls, we use a control structure for use by the runtime.
321 Create and return this structure. */
322
323tree
324emutls_decl (tree decl)
325{
326 tree name, to;
327 struct tree_map *h, in;
328 void **loc;
329
330 if (targetm.have_tls || decl == NULL || decl == error_mark_node
331 || TREE_CODE (decl) != VAR_DECL || ! DECL_THREAD_LOCAL_P (decl))
332 return decl;
333
334 /* Look up the object in the hash; return the control structure if
335 it has already been created. */
336 if (! emutls_htab)
337 emutls_htab = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0);
338
339 name = DECL_ASSEMBLER_NAME (decl);
340
341 /* Note that we use the hash of the decl's name, rather than a hash
342 of the decl's pointer. In emutls_finish we iterate through the
343 hash table, and we want this traversal to be predictable. */
344 in.hash = htab_hash_string (IDENTIFIER_POINTER (name));
fc8600f9 345 in.base.from = decl;
8893239d
RH
346 loc = htab_find_slot_with_hash (emutls_htab, &in, in.hash, INSERT);
347 h = *loc;
348 if (h != NULL)
349 to = h->to;
350 else
351 {
352 to = build_decl (VAR_DECL, get_emutls_object_name (name),
353 get_emutls_object_type ());
354
355 h = ggc_alloc (sizeof (struct tree_map));
356 h->hash = in.hash;
fc8600f9 357 h->base.from = decl;
8893239d
RH
358 h->to = to;
359 *(struct tree_map **) loc = h;
360
361 DECL_ARTIFICIAL (to) = 1;
362 DECL_IGNORED_P (to) = 1;
363 TREE_READONLY (to) = 0;
364
365 SET_DECL_ASSEMBLER_NAME (to, DECL_NAME (to));
366 if (DECL_ONE_ONLY (decl))
367 make_decl_one_only (to);
368 DECL_CONTEXT (to) = DECL_CONTEXT (decl);
369 }
370
371 /* Note that these fields may need to be updated from time to time from
372 the original decl. Consider:
373 extern __thread int i;
374 int foo() { return i; }
375 __thread int i = 1;
376 in which I goes from external to locally defined and initialized. */
377
378 TREE_STATIC (to) = TREE_STATIC (decl);
379 TREE_USED (to) = TREE_USED (decl);
380 TREE_PUBLIC (to) = TREE_PUBLIC (decl);
381 DECL_EXTERNAL (to) = DECL_EXTERNAL (decl);
382 DECL_COMMON (to) = DECL_COMMON (decl);
383 DECL_WEAK (to) = DECL_WEAK (decl);
384 DECL_VISIBILITY (to) = DECL_VISIBILITY (decl);
385
386 return to;
387}
388
389static int
390emutls_common_1 (void **loc, void *xstmts)
391{
392 struct tree_map *h = *(struct tree_map **) loc;
393 tree args, x, *pstmts = (tree *) xstmts;
394 tree word_type_node;
395
fc8600f9
MM
396 if (! DECL_COMMON (h->base.from)
397 || (DECL_INITIAL (h->base.from)
398 && DECL_INITIAL (h->base.from) != error_mark_node))
8893239d
RH
399 return 1;
400
401 word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
402
403 /* The idea was to call get_emutls_init_templ_addr here, but if we
404 do this and there is an initializer, -fanchor_section loses,
405 because it would be too late to ensure the template is
406 output. */
407 x = null_pointer_node;
408 args = tree_cons (NULL, x, NULL);
fc8600f9 409 x = build_int_cst (word_type_node, DECL_ALIGN_UNIT (h->base.from));
8893239d 410 args = tree_cons (NULL, x, args);
fc8600f9 411 x = fold_convert (word_type_node, DECL_SIZE_UNIT (h->base.from));
8893239d
RH
412 args = tree_cons (NULL, x, args);
413 x = build_fold_addr_expr (h->to);
414 args = tree_cons (NULL, x, args);
415
416 x = built_in_decls[BUILT_IN_EMUTLS_REGISTER_COMMON];
417 x = build_function_call_expr (x, args);
418
419 append_to_statement_list (x, pstmts);
420 return 1;
421}
422
423void
424emutls_finish (void)
425{
426 tree body = NULL_TREE;
427
428 if (emutls_htab == NULL)
429 return;
430
431 htab_traverse_noresize (emutls_htab, emutls_common_1, &body);
432 if (body == NULL_TREE)
433 return;
434
435 cgraph_build_static_cdtor ('I', body, DEFAULT_INIT_PRIORITY);
436}
437
d6b5193b 438/* Helper routines for maintaining section_htab. */
715bdd29 439
d6b5193b
RS
440static int
441section_entry_eq (const void *p1, const void *p2)
715bdd29 442{
d6b5193b
RS
443 const section *old = p1;
444 const char *new = p2;
715bdd29 445
d6b5193b
RS
446 return strcmp (old->named.name, new) == 0;
447}
715bdd29 448
d6b5193b
RS
449static hashval_t
450section_entry_hash (const void *p)
451{
452 const section *old = p;
453 return htab_hash_string (old->named.name);
454}
455
aacd3885
RS
456/* Return a hash value for section SECT. */
457
458static hashval_t
459hash_section (section *sect)
460{
461 if (sect->common.flags & SECTION_NAMED)
462 return htab_hash_string (sect->named.name);
463 return sect->common.flags;
464}
465
466/* Helper routines for maintaining object_block_htab. */
467
468static int
469object_block_entry_eq (const void *p1, const void *p2)
470{
471 const struct object_block *old = p1;
472 const section *new = p2;
473
474 return old->sect == new;
475}
476
477static hashval_t
478object_block_entry_hash (const void *p)
479{
480 const struct object_block *old = p;
481 return hash_section (old->sect);
482}
483
d6b5193b
RS
484/* Return a new unnamed section with the given fields. */
485
486section *
487get_unnamed_section (unsigned int flags, void (*callback) (const void *),
488 const void *data)
489{
490 section *sect;
491
492 sect = ggc_alloc (sizeof (struct unnamed_section));
434aeebb 493 sect->unnamed.common.flags = flags | SECTION_UNNAMED;
d6b5193b
RS
494 sect->unnamed.callback = callback;
495 sect->unnamed.data = data;
496 sect->unnamed.next = unnamed_sections;
497
498 unnamed_sections = sect;
499 return sect;
500}
501
434aeebb
RS
502/* Return a SECTION_NOSWITCH section with the given fields. */
503
504static section *
505get_noswitch_section (unsigned int flags, noswitch_section_callback callback)
506{
507 section *sect;
508
509 sect = ggc_alloc (sizeof (struct unnamed_section));
510 sect->noswitch.common.flags = flags | SECTION_NOSWITCH;
511 sect->noswitch.callback = callback;
512
513 return sect;
514}
515
d6b5193b
RS
516/* Return the named section structure associated with NAME. Create
517 a new section with the given fields if no such structure exists. */
518
519section *
520get_section (const char *name, unsigned int flags, tree decl)
521{
522 section *sect, **slot;
523
524 slot = (section **)
525 htab_find_slot_with_hash (section_htab, name,
526 htab_hash_string (name), INSERT);
0f67af1c 527 flags |= SECTION_NAMED;
d6b5193b
RS
528 if (*slot == NULL)
529 {
530 sect = ggc_alloc (sizeof (struct named_section));
0f67af1c 531 sect->named.common.flags = flags;
d6b5193b
RS
532 sect->named.name = ggc_strdup (name);
533 sect->named.decl = decl;
534 *slot = sect;
535 }
536 else
537 {
538 sect = *slot;
0f67af1c 539 if ((sect->common.flags & ~SECTION_DECLARED) != flags
d6b5193b
RS
540 && ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0)
541 {
542 /* Sanity check user variables for flag changes. */
543 if (decl == 0)
544 decl = sect->named.decl;
bf2f234e
NS
545 gcc_assert (decl);
546 error ("%+D causes a section type conflict", decl);
d6b5193b
RS
547 }
548 }
549 return sect;
550}
79e68feb 551
aacd3885
RS
552/* Return true if the current compilation mode benefits from having
553 objects grouped into blocks. */
554
555static bool
556use_object_blocks_p (void)
557{
558 return flag_section_anchors;
559}
560
561/* Return the object_block structure for section SECT. Create a new
434aeebb
RS
562 structure if we haven't created one already. Return null if SECT
563 itself is null. */
aacd3885
RS
564
565static struct object_block *
566get_block_for_section (section *sect)
567{
568 struct object_block *block;
569 void **slot;
570
434aeebb
RS
571 if (sect == NULL)
572 return NULL;
573
aacd3885
RS
574 slot = htab_find_slot_with_hash (object_block_htab, sect,
575 hash_section (sect), INSERT);
576 block = (struct object_block *) *slot;
577 if (block == NULL)
578 {
579 block = (struct object_block *)
580 ggc_alloc_cleared (sizeof (struct object_block));
581 block->sect = sect;
582 *slot = block;
583 }
584 return block;
585}
586
587/* Create a symbol with label LABEL and place it at byte offset
588 OFFSET in BLOCK. OFFSET can be negative if the symbol's offset
589 is not yet known. LABEL must be a garbage-collected string. */
590
591static rtx
592create_block_symbol (const char *label, struct object_block *block,
593 HOST_WIDE_INT offset)
594{
595 rtx symbol;
596 unsigned int size;
597
598 /* Create the extended SYMBOL_REF. */
599 size = RTX_HDR_SIZE + sizeof (struct block_symbol);
600 symbol = ggc_alloc_zone (size, &rtl_zone);
601
602 /* Initialize the normal SYMBOL_REF fields. */
603 memset (symbol, 0, size);
604 PUT_CODE (symbol, SYMBOL_REF);
605 PUT_MODE (symbol, Pmode);
606 XSTR (symbol, 0) = label;
3fa9c136 607 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_HAS_BLOCK_INFO;
aacd3885
RS
608
609 /* Initialize the block_symbol stuff. */
610 SYMBOL_REF_BLOCK (symbol) = block;
611 SYMBOL_REF_BLOCK_OFFSET (symbol) = offset;
612
613 return symbol;
614}
615
87c8b4be
CT
616static void
617initialize_cold_section_name (void)
750054a2 618{
c7466dee 619 const char *stripped_name;
60ff97f4
RH
620 char *name, *buffer;
621 tree dsn;
9fb32434 622
1ad435a5
CT
623 gcc_assert (cfun && current_function_decl);
624 if (cfun->unlikely_text_section_name)
625 return;
626
60ff97f4
RH
627 dsn = DECL_SECTION_NAME (current_function_decl);
628 if (flag_function_sections && dsn)
750054a2 629 {
60ff97f4
RH
630 name = alloca (TREE_STRING_LENGTH (dsn) + 1);
631 memcpy (name, TREE_STRING_POINTER (dsn), TREE_STRING_LENGTH (dsn) + 1);
632
1ad435a5 633 stripped_name = targetm.strip_name_encoding (name);
60ff97f4 634
1ad435a5
CT
635 buffer = ACONCAT ((stripped_name, "_unlikely", NULL));
636 cfun->unlikely_text_section_name = ggc_strdup (buffer);
87c8b4be 637 }
c7466dee 638 else
1ad435a5 639 cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
87c8b4be
CT
640}
641
87c8b4be
CT
642/* Tell assembler to switch to unlikely-to-be-executed text section. */
643
d6b5193b 644section *
87c8b4be
CT
645unlikely_text_section (void)
646{
c7466dee
CT
647 if (cfun)
648 {
649 if (!cfun->unlikely_text_section_name)
650 initialize_cold_section_name ();
9fb32434 651
d6b5193b 652 return get_named_section (NULL, cfun->unlikely_text_section_name, 0);
c7466dee
CT
653 }
654 else
d6b5193b 655 return get_named_section (NULL, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0);
274351ba 656}
6f2f3db7 657
d6b5193b
RS
658/* When called within a function context, return true if the function
659 has been assigned a cold text section and if SECT is that section.
660 When called outside a function context, return true if SECT is the
661 default cold section. */
a8c01a59
RL
662
663bool
d6b5193b 664unlikely_text_section_p (section *sect)
a8c01a59 665{
d6b5193b 666 const char *name;
a8c01a59 667
d6b5193b
RS
668 if (cfun)
669 name = cfun->unlikely_text_section_name;
c26fbbca 670 else
d6b5193b 671 name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
715bdd29 672
d6b5193b
RS
673 return (name
674 && sect
434aeebb 675 && SECTION_STYLE (sect) == SECTION_NAMED
d6b5193b 676 && strcmp (name, sect->named.name) == 0);
715bdd29
RH
677}
678
d6b5193b
RS
679/* Return a section with a particular name and with whatever SECTION_*
680 flags section_type_flags deems appropriate. The name of the section
681 is taken from NAME if nonnull, otherwise it is taken from DECL's
682 DECL_SECTION_NAME. DECL is the decl associated with the section
683 (see the section comment for details) and RELOC is as for
684 section_type_flags. */
7c262518 685
d6b5193b
RS
686section *
687get_named_section (tree decl, const char *name, int reloc)
8a425a05 688{
7c262518
RH
689 unsigned int flags;
690
fbc848cc 691 gcc_assert (!decl || DECL_P (decl));
2ffe831c
DE
692 if (name == NULL)
693 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
694
245f1bfa 695 flags = targetm.section_type_flags (decl, name, reloc);
715bdd29 696
d6b5193b 697 return get_section (name, flags, decl);
7c262518 698}
e9a25f70 699
7c262518
RH
700/* If required, set DECL_SECTION_NAME to a unique name. */
701
89ce1c8f 702void
2e1eedd6
AJ
703resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED,
704 int flag_function_or_data_sections)
7c262518
RH
705{
706 if (DECL_SECTION_NAME (decl) == NULL_TREE
ae46c4e0 707 && targetm.have_named_sections
1b18fc2c 708 && (flag_function_or_data_sections
ae46c4e0 709 || DECL_ONE_ONLY (decl)))
5fd9b178 710 targetm.asm_out.unique_section (decl, reloc);
8a425a05 711}
4d1065ed 712
e5887033
DE
713#ifdef BSS_SECTION_ASM_OP
714
e5887033
DE
715#ifdef ASM_OUTPUT_BSS
716
717/* Utility function for ASM_OUTPUT_BSS for targets to use if
718 they don't support alignments in .bss.
719 ??? It is believed that this function will work in most cases so such
720 support is localized here. */
721
722static void
2e1eedd6
AJ
723asm_output_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
724 const char *name,
725 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
726 unsigned HOST_WIDE_INT rounded)
e5887033 727{
812b587e
SE
728 gcc_assert (strcmp (XSTR (XEXP (DECL_RTL (decl), 0), 0), name) == 0);
729 targetm.asm_out.globalize_decl_name (file, decl);
d6b5193b 730 switch_to_section (bss_section);
91fddd7c
DE
731#ifdef ASM_DECLARE_OBJECT_NAME
732 last_assemble_variable_decl = decl;
733 ASM_DECLARE_OBJECT_NAME (file, name, decl);
734#else
735 /* Standard thing is just output label for the object. */
e5887033 736 ASM_OUTPUT_LABEL (file, name);
91fddd7c 737#endif /* ASM_DECLARE_OBJECT_NAME */
95bfe95f 738 ASM_OUTPUT_SKIP (file, rounded ? rounded : 1);
e5887033
DE
739}
740
741#endif
742
743#ifdef ASM_OUTPUT_ALIGNED_BSS
744
745/* Utility function for targets to use in implementing
746 ASM_OUTPUT_ALIGNED_BSS.
747 ??? It is believed that this function will work in most cases so such
748 support is localized here. */
749
750static void
2e1eedd6
AJ
751asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
752 const char *name, unsigned HOST_WIDE_INT size,
753 int align)
e5887033 754{
d6b5193b 755 switch_to_section (bss_section);
e5887033 756 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
91fddd7c
DE
757#ifdef ASM_DECLARE_OBJECT_NAME
758 last_assemble_variable_decl = decl;
759 ASM_DECLARE_OBJECT_NAME (file, name, decl);
760#else
761 /* Standard thing is just output label for the object. */
e5887033 762 ASM_OUTPUT_LABEL (file, name);
91fddd7c 763#endif /* ASM_DECLARE_OBJECT_NAME */
f8bc3367 764 ASM_OUTPUT_SKIP (file, size ? size : 1);
e5887033
DE
765}
766
767#endif
768
769#endif /* BSS_SECTION_ASM_OP */
770
c543ca49
RS
771#ifndef USE_SELECT_SECTION_FOR_FUNCTIONS
772/* Return the hot section for function DECL. Return text_section for
773 null DECLs. */
774
775static section *
776hot_function_section (tree decl)
777{
778 if (decl != NULL_TREE
779 && DECL_SECTION_NAME (decl) != NULL_TREE
780 && targetm.have_named_sections)
781 return get_named_section (decl, NULL, 0);
782 else
783 return text_section;
784}
785#endif
786
d6b5193b 787/* Return the section for function DECL.
4d1065ed 788
d6b5193b 789 If DECL is NULL_TREE, return the text section. We can be passed
40aea05c 790 NULL_TREE under some circumstances by dbxout.c at least. */
4d1065ed 791
d6b5193b 792section *
2e1eedd6 793function_section (tree decl)
4d1065ed 794{
c7466dee 795 int reloc = 0;
083cad55 796
87c8b4be 797 if (first_function_block_is_cold)
c7466dee 798 reloc = 1;
083cad55 799
87c8b4be 800#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
4c553323
JC
801 if (decl != NULL_TREE
802 && DECL_SECTION_NAME (decl) != NULL_TREE)
803 return reloc ? unlikely_text_section ()
804 : get_named_section (decl, NULL, 0);
805 else
806 return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
87c8b4be 807#else
4c553323 808 return reloc ? unlikely_text_section () : hot_function_section (decl);
87c8b4be
CT
809#endif
810}
40aea05c 811
d6b5193b
RS
812section *
813current_function_section (void)
87c8b4be 814{
f1a66265 815#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
4c553323
JC
816 if (current_function_decl != NULL_TREE
817 && DECL_SECTION_NAME (current_function_decl) != NULL_TREE)
818 return in_cold_section_p ? unlikely_text_section ()
819 : get_named_section (current_function_decl,
820 NULL, 0);
821 else
822 return targetm.asm_out.select_section (current_function_decl,
823 in_cold_section_p,
824 DECL_ALIGN (current_function_decl));
f1a66265 825#else
c543ca49
RS
826 return (in_cold_section_p
827 ? unlikely_text_section ()
828 : hot_function_section (current_function_decl));
f1a66265 829#endif
4d1065ed 830}
f9da1f35 831
d6b5193b 832/* Return the read-only data section associated with function DECL. */
ab5c8549 833
d6b5193b 834section *
ab5c8549
JJ
835default_function_rodata_section (tree decl)
836{
837 if (decl != NULL_TREE && DECL_SECTION_NAME (decl))
838 {
839 const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
840
11176d2a
JB
841 if (DECL_ONE_ONLY (decl) && HAVE_COMDAT_GROUP)
842 {
843 size_t len = strlen (name) + 3;
844 char* rname = alloca (len);
083cad55 845
11176d2a 846 strcpy (rname, ".rodata");
d6b5193b
RS
847 strcat (rname, name + 5);
848 return get_section (rname, SECTION_LINKONCE, decl);
11176d2a 849 }
ab5c8549 850 /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo. */
11176d2a
JB
851 else if (DECL_ONE_ONLY (decl)
852 && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
ab5c8549
JJ
853 {
854 size_t len = strlen (name) + 1;
855 char *rname = alloca (len);
856
857 memcpy (rname, name, len);
858 rname[14] = 'r';
d6b5193b 859 return get_section (rname, SECTION_LINKONCE, decl);
ab5c8549
JJ
860 }
861 /* For .text.foo we want to use .rodata.foo. */
862 else if (flag_function_sections && flag_data_sections
863 && strncmp (name, ".text.", 6) == 0)
864 {
865 size_t len = strlen (name) + 1;
866 char *rname = alloca (len + 2);
867
868 memcpy (rname, ".rodata", 7);
869 memcpy (rname + 7, name + 5, len - 5);
d6b5193b 870 return get_section (rname, 0, decl);
ab5c8549
JJ
871 }
872 }
873
d6b5193b 874 return readonly_data_section;
ab5c8549
JJ
875}
876
d6b5193b 877/* Return the read-only data section associated with function DECL
ab5c8549
JJ
878 for targets where that section should be always the single
879 readonly data section. */
880
d6b5193b 881section *
ab5c8549
JJ
882default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
883{
d6b5193b 884 return readonly_data_section;
ab5c8549
JJ
885}
886
d6b5193b 887/* Return the section to use for string merging. */
201556f0 888
d6b5193b 889static section *
2e1eedd6
AJ
890mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
891 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
892 unsigned int flags ATTRIBUTE_UNUSED)
201556f0 893{
0841534a
JJ
894 HOST_WIDE_INT len;
895
5d4856a0 896 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
201556f0
JJ
897 && TREE_CODE (decl) == STRING_CST
898 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
899 && align <= 256
0841534a
JJ
900 && (len = int_size_in_bytes (TREE_TYPE (decl))) > 0
901 && TREE_STRING_LENGTH (decl) >= len)
201556f0
JJ
902 {
903 enum machine_mode mode;
904 unsigned int modesize;
905 const char *str;
0841534a
JJ
906 HOST_WIDE_INT i;
907 int j, unit;
201556f0
JJ
908 char name[30];
909
910 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
911 modesize = GET_MODE_BITSIZE (mode);
912 if (modesize >= 8 && modesize <= 256
913 && (modesize & (modesize - 1)) == 0)
914 {
915 if (align < modesize)
916 align = modesize;
917
918 str = TREE_STRING_POINTER (decl);
201556f0
JJ
919 unit = GET_MODE_SIZE (mode);
920
921 /* Check for embedded NUL characters. */
922 for (i = 0; i < len; i += unit)
923 {
924 for (j = 0; j < unit; j++)
c26fbbca 925 if (str[i + j] != '\0')
201556f0
JJ
926 break;
927 if (j == unit)
928 break;
929 }
930 if (i == len - unit)
931 {
932 sprintf (name, ".rodata.str%d.%d", modesize / 8,
933 (int) (align / 8));
934 flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
d6b5193b 935 return get_section (name, flags, NULL);
201556f0
JJ
936 }
937 }
938 }
5d4856a0 939
d6b5193b 940 return readonly_data_section;
c26fbbca 941}
201556f0 942
d6b5193b 943/* Return the section to use for constant merging. */
201556f0 944
d6b5193b 945section *
2e1eedd6
AJ
946mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
947 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
948 unsigned int flags ATTRIBUTE_UNUSED)
201556f0 949{
201556f0
JJ
950 unsigned int modesize = GET_MODE_BITSIZE (mode);
951
5d4856a0 952 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
201556f0
JJ
953 && mode != VOIDmode
954 && mode != BLKmode
955 && modesize <= align
956 && align >= 8
957 && align <= 256
958 && (align & (align - 1)) == 0)
959 {
960 char name[24];
961
962 sprintf (name, ".rodata.cst%d", (int) (align / 8));
963 flags |= (align / 8) | SECTION_MERGE;
d6b5193b 964 return get_section (name, flags, NULL);
c26fbbca 965 }
d6b5193b 966 return readonly_data_section;
201556f0 967}
79e68feb 968\f
b4ac57ab
RS
969/* Given NAME, a putative register name, discard any customary prefixes. */
970
87e11268 971static const char *
2e1eedd6 972strip_reg_name (const char *name)
b4ac57ab
RS
973{
974#ifdef REGISTER_PREFIX
975 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
976 name += strlen (REGISTER_PREFIX);
977#endif
978 if (name[0] == '%' || name[0] == '#')
979 name++;
980 return name;
981}
dcfedcd0 982\f
0e6df31e
GK
983/* The user has asked for a DECL to have a particular name. Set (or
984 change) it in such a way that we don't prefix an underscore to
985 it. */
986void
987set_user_assembler_name (tree decl, const char *name)
988{
989 char *starred = alloca (strlen (name) + 2);
990 starred[0] = '*';
991 strcpy (starred + 1, name);
992 change_decl_assembler_name (decl, get_identifier (starred));
993 SET_DECL_RTL (decl, NULL_RTX);
994}
995\f
79e68feb
RS
996/* Decode an `asm' spec for a declaration as a register name.
997 Return the register number, or -1 if nothing specified,
c09e6498
RS
998 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
999 or -3 if ASMSPEC is `cc' and is not recognized,
1000 or -4 if ASMSPEC is `memory' and is not recognized.
dcfedcd0
RK
1001 Accept an exact spelling or a decimal number.
1002 Prefixes such as % are optional. */
79e68feb
RS
1003
1004int
2e1eedd6 1005decode_reg_name (const char *asmspec)
79e68feb 1006{
30513cf6 1007 if (asmspec != 0)
79e68feb
RS
1008 {
1009 int i;
1010
b4ac57ab
RS
1011 /* Get rid of confusing prefixes. */
1012 asmspec = strip_reg_name (asmspec);
46f9491e 1013
fff9e713
MT
1014 /* Allow a decimal number as a "register name". */
1015 for (i = strlen (asmspec) - 1; i >= 0; i--)
0df6c2c7 1016 if (! ISDIGIT (asmspec[i]))
fff9e713
MT
1017 break;
1018 if (asmspec[0] != 0 && i < 0)
1019 {
1020 i = atoi (asmspec);
1021 if (i < FIRST_PSEUDO_REGISTER && i >= 0)
1022 return i;
1023 else
1024 return -2;
1025 }
1026
79e68feb 1027 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
b4ac57ab
RS
1028 if (reg_names[i][0]
1029 && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
79e68feb
RS
1030 return i;
1031
79e68feb
RS
1032#ifdef ADDITIONAL_REGISTER_NAMES
1033 {
83182544 1034 static const struct { const char *const name; const int number; } table[]
79e68feb
RS
1035 = ADDITIONAL_REGISTER_NAMES;
1036
b6a1cbae 1037 for (i = 0; i < (int) ARRAY_SIZE (table); i++)
dd0ae678
R
1038 if (table[i].name[0]
1039 && ! strcmp (asmspec, table[i].name))
79e68feb 1040 return table[i].number;
79e68feb
RS
1041 }
1042#endif /* ADDITIONAL_REGISTER_NAMES */
1043
c09e6498
RS
1044 if (!strcmp (asmspec, "memory"))
1045 return -4;
1046
dcfedcd0
RK
1047 if (!strcmp (asmspec, "cc"))
1048 return -3;
1049
79e68feb
RS
1050 return -2;
1051 }
1052
1053 return -1;
1054}
1055\f
434aeebb 1056/* Return true if DECL's initializer is suitable for a BSS section. */
aacd3885
RS
1057
1058static bool
3101faab 1059bss_initializer_p (const_tree decl)
aacd3885 1060{
434aeebb
RS
1061 return (DECL_INITIAL (decl) == NULL
1062 || DECL_INITIAL (decl) == error_mark_node
1063 || (flag_zero_initialized_in_bss
1064 /* Leave constant zeroes in .rodata so they
1065 can be shared. */
1066 && !TREE_READONLY (decl)
1067 && initializer_zerop (DECL_INITIAL (decl))));
1068}
1069
d5fa3ec8
DE
1070/* Compute the alignment of variable specified by DECL.
1071 DONT_OUTPUT_DATA is from assemble_variable. */
1072
88d03811 1073void
d5fa3ec8
DE
1074align_variable (tree decl, bool dont_output_data)
1075{
1076 unsigned int align = DECL_ALIGN (decl);
1077
1078 /* In the case for initialing an array whose length isn't specified,
1079 where we have not yet been able to do the layout,
1080 figure out the proper alignment now. */
1081 if (dont_output_data && DECL_SIZE (decl) == 0
1082 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1083 align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1084
1085 /* Some object file formats have a maximum alignment which they support.
1086 In particular, a.out format supports a maximum alignment of 4. */
1087 if (align > MAX_OFILE_ALIGNMENT)
1088 {
1089 warning (0, "alignment of %q+D is greater than maximum object "
1090 "file alignment. Using %d", decl,
1091 MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
1092 align = MAX_OFILE_ALIGNMENT;
1093 }
1094
1095 /* On some machines, it is good to increase alignment sometimes. */
1096 if (! DECL_USER_ALIGN (decl))
1097 {
1098#ifdef DATA_ALIGNMENT
52d53754
JJ
1099 unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1100 /* Don't increase alignment too much for TLS variables - TLS space
1101 is too precious. */
1102 if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD)
1103 align = data_align;
d5fa3ec8
DE
1104#endif
1105#ifdef CONSTANT_ALIGNMENT
1106 if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
52d53754
JJ
1107 {
1108 unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl),
1109 align);
1110 /* Don't increase alignment too much for TLS variables - TLS space
1111 is too precious. */
1112 if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)
1113 align = const_align;
1114 }
d5fa3ec8
DE
1115#endif
1116 }
1117
1118 /* Reset the alignment in case we have made it tighter, so we can benefit
1119 from it in get_pointer_alignment. */
1120 DECL_ALIGN (decl) = align;
1121}
1122
434aeebb
RS
1123/* Return the section into which the given VAR_DECL or CONST_DECL
1124 should be placed. PREFER_NOSWITCH_P is true if a noswitch
1125 section should be used wherever possible. */
1126
1127static section *
1128get_variable_section (tree decl, bool prefer_noswitch_p)
1129{
1130 int reloc;
1131
1132 /* If the decl has been given an explicit section name, then it
1133 isn't common, and shouldn't be handled as such. */
1134 if (DECL_COMMON (decl) && DECL_SECTION_NAME (decl) == NULL)
1135 {
1136 if (DECL_THREAD_LOCAL_P (decl))
1137 return tls_comm_section;
1138 if (TREE_PUBLIC (decl) && bss_initializer_p (decl))
1139 return comm_section;
1140 }
1141
1142 if (DECL_INITIAL (decl) == error_mark_node)
1143 reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;
1144 else if (DECL_INITIAL (decl))
1145 reloc = compute_reloc_for_constant (DECL_INITIAL (decl));
1146 else
1147 reloc = 0;
1148
1149 resolve_unique_section (decl, reloc, flag_data_sections);
1150 if (IN_NAMED_SECTION (decl))
1151 return get_named_section (decl, NULL, reloc);
1152
1153 if (!DECL_THREAD_LOCAL_P (decl)
1154 && !(prefer_noswitch_p && targetm.have_switchable_bss_sections)
1155 && bss_initializer_p (decl))
1156 {
1157 if (!TREE_PUBLIC (decl))
1158 return lcomm_section;
1159 if (bss_noswitch_section)
1160 return bss_noswitch_section;
1161 }
1162
1163 return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
1164}
1165
1166/* Return the block into which object_block DECL should be placed. */
1167
1168static struct object_block *
1169get_block_for_decl (tree decl)
1170{
1171 section *sect;
aacd3885
RS
1172
1173 if (TREE_CODE (decl) == VAR_DECL)
1174 {
1175 /* The object must be defined in this translation unit. */
1176 if (DECL_EXTERNAL (decl))
434aeebb 1177 return NULL;
aacd3885
RS
1178
1179 /* There's no point using object blocks for something that is
1180 isolated by definition. */
1181 if (DECL_ONE_ONLY (decl))
434aeebb 1182 return NULL;
aacd3885
RS
1183 }
1184
1185 /* We can only calculate block offsets if the decl has a known
1186 constant size. */
1187 if (DECL_SIZE_UNIT (decl) == NULL)
434aeebb 1188 return NULL;
aacd3885 1189 if (!host_integerp (DECL_SIZE_UNIT (decl), 1))
434aeebb 1190 return NULL;
aacd3885 1191
434aeebb
RS
1192 /* Find out which section should contain DECL. We cannot put it into
1193 an object block if it requires a standalone definition. */
d5fa3ec8
DE
1194 if (TREE_CODE (decl) == VAR_DECL)
1195 align_variable (decl, 0);
434aeebb
RS
1196 sect = get_variable_section (decl, true);
1197 if (SECTION_STYLE (sect) == SECTION_NOSWITCH)
1198 return NULL;
aacd3885 1199
434aeebb 1200 return get_block_for_section (sect);
aacd3885
RS
1201}
1202
434aeebb 1203/* Make sure block symbol SYMBOL is in block BLOCK. */
aacd3885
RS
1204
1205static void
434aeebb 1206change_symbol_block (rtx symbol, struct object_block *block)
aacd3885 1207{
434aeebb 1208 if (block != SYMBOL_REF_BLOCK (symbol))
aacd3885
RS
1209 {
1210 gcc_assert (SYMBOL_REF_BLOCK_OFFSET (symbol) < 0);
434aeebb 1211 SYMBOL_REF_BLOCK (symbol) = block;
aacd3885
RS
1212 }
1213}
1214
434aeebb 1215/* Return true if it is possible to put DECL in an object_block. */
aacd3885 1216
434aeebb
RS
1217static bool
1218use_blocks_for_decl_p (tree decl)
aacd3885 1219{
434aeebb
RS
1220 /* Only data DECLs can be placed into object blocks. */
1221 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != CONST_DECL)
1222 return false;
aacd3885 1223
434aeebb
RS
1224 /* Detect decls created by dw2_force_const_mem. Such decls are
1225 special because DECL_INITIAL doesn't specify the decl's true value.
1226 dw2_output_indirect_constants will instead call assemble_variable
1227 with dont_output_data set to 1 and then print the contents itself. */
1228 if (DECL_INITIAL (decl) == decl)
1229 return false;
aacd3885 1230
10daf677
AM
1231 /* If this decl is an alias, then we don't want to emit a definition. */
1232 if (lookup_attribute ("alias", DECL_ATTRIBUTES (decl)))
1233 return false;
1234
434aeebb 1235 return true;
aacd3885
RS
1236}
1237
19e7881c
MM
1238/* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should
1239 have static storage duration. In other words, it should not be an
1240 automatic variable, including PARM_DECLs.
1241
1242 There is, however, one exception: this function handles variables
1243 explicitly placed in a particular register by the user.
1244
79e68feb
RS
1245 This is never called for PARM_DECL nodes. */
1246
1247void
0e6df31e 1248make_decl_rtl (tree decl)
79e68feb 1249{
63ad61ed 1250 const char *name = 0;
ca695ac9 1251 int reg_number;
abde42f7 1252 rtx x;
ca695ac9 1253
19e7881c 1254 /* Check that we are not being given an automatic variable. */
fbc848cc
NS
1255 gcc_assert (TREE_CODE (decl) != PARM_DECL
1256 && TREE_CODE (decl) != RESULT_DECL);
1257
9ea07fd0 1258 /* A weak alias has TREE_PUBLIC set but not the other bits. */
fbc848cc
NS
1259 gcc_assert (TREE_CODE (decl) != VAR_DECL
1260 || TREE_STATIC (decl)
1261 || TREE_PUBLIC (decl)
1262 || DECL_EXTERNAL (decl)
1263 || DECL_REGISTER (decl));
083cad55 1264
19e7881c 1265 /* And that we were not given a type or a label. */
fbc848cc
NS
1266 gcc_assert (TREE_CODE (decl) != TYPE_DECL
1267 && TREE_CODE (decl) != LABEL_DECL);
19e7881c 1268
63ad61ed
ZW
1269 /* For a duplicate declaration, we can be called twice on the
1270 same DECL node. Don't discard the RTL already made. */
19e7881c 1271 if (DECL_RTL_SET_P (decl))
79e68feb 1272 {
63ad61ed 1273 /* If the old RTL had the wrong mode, fix the mode. */
aacd3885
RS
1274 x = DECL_RTL (decl);
1275 if (GET_MODE (x) != DECL_MODE (decl))
1276 SET_DECL_RTL (decl, adjust_address_nv (x, DECL_MODE (decl), 0));
76095e2f 1277
0e6df31e
GK
1278 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
1279 return;
1280
b2e2d0cc
EC
1281 /* ??? Another way to do this would be to maintain a hashed
1282 table of such critters. Instead of adding stuff to a DECL
1283 to give certain attributes to it, we could use an external
1284 hash map from DECL to set of attributes. */
1285
63ad61ed
ZW
1286 /* Let the target reassign the RTL if it wants.
1287 This is necessary, for example, when one machine specific
1288 decl attribute overrides another. */
245f1bfa 1289 targetm.encode_section_info (decl, DECL_RTL (decl), false);
6de9cd9a 1290
3fa9c136
RS
1291 /* If the symbol has a SYMBOL_REF_BLOCK field, update it based
1292 on the new decl information. */
aacd3885
RS
1293 if (MEM_P (x)
1294 && GET_CODE (XEXP (x, 0)) == SYMBOL_REF
3fa9c136 1295 && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (x, 0)))
434aeebb 1296 change_symbol_block (XEXP (x, 0), get_block_for_decl (decl));
aacd3885 1297
6de9cd9a
DN
1298 /* Make this function static known to the mudflap runtime. */
1299 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
1300 mudflap_enqueue_decl (decl);
1301
63ad61ed 1302 return;
79e68feb
RS
1303 }
1304
26e0dcb3 1305 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
083cad55 1306
11e3f4b6
AP
1307 if (name[0] != '*' && TREE_CODE (decl) != FUNCTION_DECL
1308 && DECL_REGISTER (decl))
1309 {
083cad55 1310 error ("register name not specified for %q+D", decl);
11e3f4b6
AP
1311 }
1312 else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
79e68feb 1313 {
11e3f4b6
AP
1314 const char *asmspec = name+1;
1315 reg_number = decode_reg_name (asmspec);
79e68feb 1316 /* First detect errors in declaring global registers. */
63ad61ed 1317 if (reg_number == -1)
dee15844 1318 error ("register name not specified for %q+D", decl);
63ad61ed 1319 else if (reg_number < 0)
dee15844 1320 error ("invalid register name for %q+D", decl);
63ad61ed 1321 else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
dee15844
JM
1322 error ("data type of %q+D isn%'t suitable for a register",
1323 decl);
63ad61ed 1324 else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl))))
dee15844
JM
1325 error ("register specified for %q+D isn%'t suitable for data type",
1326 decl);
79e68feb 1327 /* Now handle properly declared static register variables. */
63ad61ed 1328 else
79e68feb
RS
1329 {
1330 int nregs;
12266a61 1331
e3406b2a 1332 if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
79e68feb
RS
1333 {
1334 DECL_INITIAL (decl) = 0;
1335 error ("global register variable has initial value");
1336 }
79e68feb 1337 if (TREE_THIS_VOLATILE (decl))
d35a40fc
DE
1338 warning (OPT_Wvolatile_register_var,
1339 "optimization may eliminate reads and/or "
1340 "writes to register variables");
31e4b1c0
RK
1341
1342 /* If the user specified one of the eliminables registers here,
1343 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
3ada20ee
RH
1344 confused with that register and be eliminated. This usage is
1345 somewhat suspect... */
1346
1347 SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number));
1348 ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
79e68feb
RS
1349 REG_USERVAR_P (DECL_RTL (decl)) = 1;
1350
6c418184 1351 if (TREE_STATIC (decl))
79e68feb 1352 {
ad800eb1
RK
1353 /* Make this register global, so not usable for anything
1354 else. */
1cb36a98 1355#ifdef ASM_DECLARE_REGISTER_GLOBAL
360ca054 1356 name = IDENTIFIER_POINTER (DECL_NAME (decl));
1cb36a98
RH
1357 ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
1358#endif
66fd46b6 1359 nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)];
79e68feb 1360 while (nregs > 0)
ad800eb1 1361 globalize_reg (reg_number + --nregs);
79e68feb 1362 }
79e68feb 1363
63ad61ed
ZW
1364 /* As a register variable, it has no section. */
1365 return;
1366 }
1367 }
63ad61ed
ZW
1368 /* Now handle ordinary static variables and functions (in memory).
1369 Also handle vars declared register invalidly. */
30513cf6
AP
1370 else if (name[0] == '*')
1371 {
1372#ifdef REGISTER_PREFIX
1373 if (strlen (REGISTER_PREFIX) != 0)
1374 {
02676215 1375 reg_number = decode_reg_name (name);
30513cf6 1376 if (reg_number >= 0 || reg_number == -3)
dee15844 1377 error ("register name given for non-register variable %q+D", decl);
30513cf6
AP
1378 }
1379#endif
1380 }
63ad61ed
ZW
1381
1382 /* Specifying a section attribute on a variable forces it into a
2d76cb1a 1383 non-.bss section, and thus it cannot be common. */
63ad61ed
ZW
1384 if (TREE_CODE (decl) == VAR_DECL
1385 && DECL_SECTION_NAME (decl) != NULL_TREE
1386 && DECL_INITIAL (decl) == NULL_TREE
1387 && DECL_COMMON (decl))
1388 DECL_COMMON (decl) = 0;
1389
5ff225fc
MM
1390 /* Variables can't be both common and weak. */
1391 if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
1392 DECL_COMMON (decl) = 0;
1393
aacd3885 1394 if (use_object_blocks_p () && use_blocks_for_decl_p (decl))
434aeebb 1395 x = create_block_symbol (name, get_block_for_decl (decl), -1);
aacd3885
RS
1396 else
1397 x = gen_rtx_SYMBOL_REF (Pmode, name);
52859c77 1398 SYMBOL_REF_WEAK (x) = DECL_WEAK (decl);
929e5e5b 1399 SET_SYMBOL_REF_DECL (x, decl);
2e1eedd6 1400
52859c77 1401 x = gen_rtx_MEM (DECL_MODE (decl), x);
63ad61ed 1402 if (TREE_CODE (decl) != FUNCTION_DECL)
abde42f7
JH
1403 set_mem_attributes (x, decl, 1);
1404 SET_DECL_RTL (decl, x);
63ad61ed
ZW
1405
1406 /* Optionally set flags or add text to the name to record information
1407 such as that it is a function name.
1408 If the name is changed, the macro ASM_OUTPUT_LABELREF
1409 will have to know how to strip this information. */
245f1bfa 1410 targetm.encode_section_info (decl, DECL_RTL (decl), true);
6de9cd9a
DN
1411
1412 /* Make this function static known to the mudflap runtime. */
1413 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
1414 mudflap_enqueue_decl (decl);
79e68feb
RS
1415}
1416\f
1417/* Output a string of literal assembler code
1418 for an `asm' keyword used between functions. */
1419
1420void
2e1eedd6 1421assemble_asm (tree string)
79e68feb
RS
1422{
1423 app_enable ();
1424
1425 if (TREE_CODE (string) == ADDR_EXPR)
1426 string = TREE_OPERAND (string, 0);
1427
1428 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
1429}
1430
2cc07db4
RH
1431/* Record an element in the table of global destructors. SYMBOL is
1432 a SYMBOL_REF of the function to be called; PRIORITY is a number
1433 between 0 and MAX_INIT_PRIORITY. */
79e68feb
RS
1434
1435void
bab208b4
AS
1436default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
1437 int priority ATTRIBUTE_UNUSED)
79e68feb 1438{
93a27b7b 1439#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
2cc07db4
RH
1440 /* Tell GNU LD that this is part of the static destructor set.
1441 This will work for any system that uses stabs, most usefully
1442 aout systems. */
93a27b7b
ZW
1443 dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */);
1444 dbxout_stab_value_label (XSTR (symbol, 0));
1445#else
1446 sorry ("global destructors not supported on this target");
1447#endif
2cc07db4 1448}
47907859 1449
b2f4bed8
MM
1450/* Write the address of the entity given by SYMBOL to SEC. */
1451void
1452assemble_addr_to_section (rtx symbol, section *sec)
1453{
1454 switch_to_section (sec);
1455 assemble_align (POINTER_SIZE);
1456 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1457}
1458
1459/* Return the numbered .ctors.N (if CONSTRUCTOR_P) or .dtors.N (if
1460 not) section for PRIORITY. */
1461section *
1462get_cdtor_priority_section (int priority, bool constructor_p)
2cc07db4 1463{
2cc07db4 1464 char buf[16];
47907859 1465
6d2f8887 1466 /* ??? This only works reliably with the GNU linker. */
b2f4bed8
MM
1467 sprintf (buf, "%s.%.5u",
1468 constructor_p ? ".ctors" : ".dtors",
1469 /* Invert the numbering so the linker puts us in the proper
1470 order; constructors are run from right to left, and the
1471 linker sorts in increasing order. */
1472 MAX_INIT_PRIORITY - priority);
1473 return get_section (buf, SECTION_WRITE, NULL);
1474}
1475
1476void
1477default_named_section_asm_out_destructor (rtx symbol, int priority)
1478{
1479 section *sec;
1480
2cc07db4 1481 if (priority != DEFAULT_INIT_PRIORITY)
b2f4bed8
MM
1482 sec = get_cdtor_priority_section (priority,
1483 /*constructor_p=*/false);
1484 else
1485 sec = get_section (".dtors", SECTION_WRITE, NULL);
47907859 1486
b2f4bed8 1487 assemble_addr_to_section (symbol, sec);
2cc07db4
RH
1488}
1489
1490#ifdef DTORS_SECTION_ASM_OP
2cc07db4 1491void
2e1eedd6
AJ
1492default_dtor_section_asm_out_destructor (rtx symbol,
1493 int priority ATTRIBUTE_UNUSED)
2cc07db4 1494{
b2f4bed8 1495 assemble_addr_to_section (symbol, dtors_section);
2cc07db4
RH
1496}
1497#endif
1498
79e68feb
RS
1499/* Likewise for global constructors. */
1500
1501void
bab208b4
AS
1502default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
1503 int priority ATTRIBUTE_UNUSED)
79e68feb 1504{
93a27b7b 1505#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
2cc07db4
RH
1506 /* Tell GNU LD that this is part of the static destructor set.
1507 This will work for any system that uses stabs, most usefully
1508 aout systems. */
93a27b7b
ZW
1509 dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */);
1510 dbxout_stab_value_label (XSTR (symbol, 0));
1511#else
1512 sorry ("global constructors not supported on this target");
1513#endif
2cc07db4 1514}
47907859 1515
2cc07db4 1516void
2e1eedd6 1517default_named_section_asm_out_constructor (rtx symbol, int priority)
2cc07db4 1518{
b2f4bed8 1519 section *sec;
47907859 1520
2cc07db4 1521 if (priority != DEFAULT_INIT_PRIORITY)
b2f4bed8
MM
1522 sec = get_cdtor_priority_section (priority,
1523 /*constructor_p=*/true);
1524 else
1525 sec = get_section (".ctors", SECTION_WRITE, NULL);
47907859 1526
b2f4bed8 1527 assemble_addr_to_section (symbol, sec);
2cc07db4
RH
1528}
1529
1530#ifdef CTORS_SECTION_ASM_OP
2cc07db4 1531void
2e1eedd6
AJ
1532default_ctor_section_asm_out_constructor (rtx symbol,
1533 int priority ATTRIBUTE_UNUSED)
2cc07db4 1534{
b2f4bed8 1535 assemble_addr_to_section (symbol, ctors_section);
2cc07db4
RH
1536}
1537#endif
79e68feb 1538\f
97adc6ed 1539/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
0e9e1e0a 1540 a nonzero value if the constant pool should be output before the
97adc6ed
ILT
1541 start of the function, or a zero value if the pool should output
1542 after the end of the function. The default is to put it before the
1543 start. */
1544
1545#ifndef CONSTANT_POOL_BEFORE_FUNCTION
1546#define CONSTANT_POOL_BEFORE_FUNCTION 1
1547#endif
1548
810db579
JH
1549/* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going
1550 to be output to assembler.
1551 Set first_global_object_name and weak_global_object_name as appropriate. */
1552
1553void
1554notice_global_symbol (tree decl)
1555{
8af11e80
JH
1556 const char **type = &first_global_object_name;
1557
1558 if (first_global_object_name
b5abd706
MS
1559 || !TREE_PUBLIC (decl)
1560 || DECL_EXTERNAL (decl)
8af11e80
JH
1561 || !DECL_NAME (decl)
1562 || (TREE_CODE (decl) != FUNCTION_DECL
1563 && (TREE_CODE (decl) != VAR_DECL
1564 || (DECL_COMMON (decl)
1565 && (DECL_INITIAL (decl) == 0
0f334035 1566 || DECL_INITIAL (decl) == error_mark_node))))
3c0cb5de 1567 || !MEM_P (DECL_RTL (decl)))
8af11e80
JH
1568 return;
1569
321440fd 1570 /* We win when global object is found, but it is useful to know about weak
8af11e80 1571 symbol as well so we can produce nicer unique names. */
2e3e8cea 1572 if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl) || flag_shlib)
8af11e80
JH
1573 type = &weak_global_object_name;
1574
1575 if (!*type)
810db579
JH
1576 {
1577 const char *p;
9881e3e5 1578 const char *name;
810db579
JH
1579 rtx decl_rtl = DECL_RTL (decl);
1580
245f1bfa 1581 p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0));
9881e3e5 1582 name = ggc_strdup (p);
810db579 1583
8af11e80 1584 *type = name;
810db579
JH
1585 }
1586}
1587
79e68feb
RS
1588/* Output assembler code for the constant pool of a function and associated
1589 with defining the name of the function. DECL describes the function.
1590 NAME is the function's name. For the constant pool, we use the current
1591 constant pool data. */
1592
1593void
2e1eedd6 1594assemble_start_function (tree decl, const char *fnname)
79e68feb
RS
1595{
1596 int align;
c7466dee 1597 char tmp_label[100];
87c8b4be 1598 bool hot_label_written = false;
79e68feb 1599
c7466dee 1600 cfun->unlikely_text_section_name = NULL;
083cad55 1601
87c8b4be 1602 first_function_block_is_cold = false;
c7466dee
CT
1603 if (flag_reorder_blocks_and_partition)
1604 {
affb0e06 1605 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno);
c7466dee 1606 cfun->hot_section_label = ggc_strdup (tmp_label);
affb0e06 1607 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno);
c7466dee 1608 cfun->cold_section_label = ggc_strdup (tmp_label);
affb0e06 1609 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno);
c7466dee 1610 cfun->hot_section_end_label = ggc_strdup (tmp_label);
affb0e06 1611 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno);
c7466dee
CT
1612 cfun->cold_section_end_label = ggc_strdup (tmp_label);
1613 const_labelno++;
1614 }
1615 else
1616 {
1617 cfun->hot_section_label = NULL;
1618 cfun->cold_section_label = NULL;
1619 cfun->hot_section_end_label = NULL;
1620 cfun->cold_section_end_label = NULL;
1621 }
87c8b4be 1622
79e68feb
RS
1623 /* The following code does not need preprocessing in the assembler. */
1624
1625 app_disable ();
1626
97adc6ed 1627 if (CONSTANT_POOL_BEFORE_FUNCTION)
c16ba1d5 1628 output_constant_pool (fnname, decl);
79e68feb 1629
1ad435a5
CT
1630 resolve_unique_section (decl, 0, flag_function_sections);
1631
87c8b4be
CT
1632 /* Make sure the not and cold text (code) sections are properly
1633 aligned. This is necessary here in the case where the function
1634 has both hot and cold sections, because we don't want to re-set
1635 the alignment when the section switch happens mid-function. */
c295317d
CT
1636
1637 if (flag_reorder_blocks_and_partition)
1638 {
c543ca49 1639 switch_to_section (unlikely_text_section ());
d872ada0 1640 assemble_align (DECL_ALIGN (decl));
c7466dee 1641 ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label);
e4598783
SB
1642
1643 /* When the function starts with a cold section, we need to explicitly
1644 align the hot section and write out the hot section label.
1645 But if the current function is a thunk, we do not have a CFG. */
1646 if (!current_function_is_thunk
1647 && BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION)
87c8b4be 1648 {
d6b5193b 1649 switch_to_section (text_section);
d872ada0 1650 assemble_align (DECL_ALIGN (decl));
c7466dee 1651 ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
87c8b4be
CT
1652 hot_label_written = true;
1653 first_function_block_is_cold = true;
1654 }
1655 }
1656 else if (DECL_SECTION_NAME (decl))
1657 {
1658 /* Calls to function_section rely on first_function_block_is_cold
1659 being accurate. The first block may be cold even if we aren't
1660 doing partitioning, if the entire function was decided by
1661 choose_function_section (predict.c) to be cold. */
1662
87c8b4be
CT
1663 initialize_cold_section_name ();
1664
083cad55 1665 if (cfun->unlikely_text_section_name
60ff97f4
RH
1666 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
1667 cfun->unlikely_text_section_name) == 0)
87c8b4be 1668 first_function_block_is_cold = true;
c295317d
CT
1669 }
1670
c543ca49 1671 in_cold_section_p = first_function_block_is_cold;
87c8b4be
CT
1672
1673 /* Switch to the correct text section for the start of the function. */
1674
d6b5193b 1675 switch_to_section (function_section (decl));
083cad55 1676 if (flag_reorder_blocks_and_partition
b3b51ded 1677 && !hot_label_written)
c7466dee 1678 ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
79e68feb
RS
1679
1680 /* Tell assembler to move to target machine's alignment for functions. */
837edd5f 1681 align = floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT);
79e68feb 1682 if (align > 0)
91ea4f8d
KG
1683 {
1684 ASM_OUTPUT_ALIGN (asm_out_file, align);
1685 }
79e68feb 1686
efa3896a 1687 /* Handle a user-specified function alignment.
837edd5f 1688 Note that we still need to align to DECL_ALIGN, as above,
efa3896a 1689 because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */
837edd5f
GK
1690 if (! DECL_USER_ALIGN (decl)
1691 && align_functions_log > align
194734e9 1692 && cfun->function_frequency != FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
efa3896a
GK
1693 {
1694#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
46f9491e 1695 ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
c26fbbca 1696 align_functions_log, align_functions - 1);
efa3896a
GK
1697#else
1698 ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1699#endif
1700 }
1701
79e68feb
RS
1702#ifdef ASM_OUTPUT_FUNCTION_PREFIX
1703 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1704#endif
1705
653e276c 1706 (*debug_hooks->begin_function) (decl);
79e68feb
RS
1707
1708 /* Make function name accessible from other files, if appropriate. */
1709
1710 if (TREE_PUBLIC (decl))
1711 {
810db579 1712 notice_global_symbol (decl);
06bb02f7 1713
19c5b1cf 1714 globalize_decl (decl);
b14707c3
RH
1715
1716 maybe_assemble_visibility (decl);
79e68feb
RS
1717 }
1718
8e3e233b
DP
1719 if (DECL_PRESERVE_P (decl))
1720 targetm.asm_out.mark_decl_preserved (fnname);
1721
6614fd40 1722 /* Do any machine/system dependent processing of the function name. */
8bd16853 1723#ifdef ASM_DECLARE_FUNCTION_NAME
b93a436e 1724 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
8bd16853 1725#else
b93a436e
JL
1726 /* Standard thing is just output label for the function. */
1727 ASM_OUTPUT_LABEL (asm_out_file, fnname);
79e68feb
RS
1728#endif /* ASM_DECLARE_FUNCTION_NAME */
1729}
1730
1731/* Output assembler code associated with defining the size of the
1732 function. DECL describes the function. NAME is the function's name. */
1733
1734void
cd554454 1735assemble_end_function (tree decl, const char *fnname ATTRIBUTE_UNUSED)
79e68feb
RS
1736{
1737#ifdef ASM_DECLARE_FUNCTION_SIZE
43f237b4
EB
1738 /* We could have switched section in the middle of the function. */
1739 if (flag_reorder_blocks_and_partition)
d6b5193b 1740 switch_to_section (function_section (decl));
79e68feb
RS
1741 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1742#endif
97adc6ed 1743 if (! CONSTANT_POOL_BEFORE_FUNCTION)
83488369 1744 {
c16ba1d5 1745 output_constant_pool (fnname, decl);
d6b5193b 1746 switch_to_section (function_section (decl)); /* need to switch back */
83488369 1747 }
87c8b4be
CT
1748 /* Output labels for end of hot/cold text sections (to be used by
1749 debug info.) */
b3b51ded
CT
1750 if (flag_reorder_blocks_and_partition)
1751 {
d6b5193b 1752 section *save_text_section;
c7466dee 1753
b3b51ded 1754 save_text_section = in_section;
c543ca49 1755 switch_to_section (unlikely_text_section ());
c7466dee 1756 ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label);
1ad435a5 1757 if (first_function_block_is_cold)
d6b5193b 1758 switch_to_section (text_section);
1ad435a5 1759 else
d6b5193b 1760 switch_to_section (function_section (decl));
c7466dee 1761 ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_end_label);
d6b5193b 1762 switch_to_section (save_text_section);
b3b51ded 1763 }
79e68feb
RS
1764}
1765\f
1766/* Assemble code to leave SIZE bytes of zeros. */
1767
1768void
2e1eedd6 1769assemble_zeros (unsigned HOST_WIDE_INT size)
79e68feb 1770{
3c350eb3
CB
1771 /* Do no output if -fsyntax-only. */
1772 if (flag_syntax_only)
1773 return;
1774
79e68feb
RS
1775#ifdef ASM_NO_SKIP_IN_TEXT
1776 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1777 so we must output 0s explicitly in the text section. */
d6b5193b 1778 if (ASM_NO_SKIP_IN_TEXT && (in_section->common.flags & SECTION_CODE) != 0)
79e68feb 1779 {
58e15542 1780 unsigned HOST_WIDE_INT i;
c8af3574
RH
1781 for (i = 0; i < size; i++)
1782 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
79e68feb
RS
1783 }
1784 else
1785#endif
41fe4d9e 1786 if (size > 0)
b93a436e 1787 ASM_OUTPUT_SKIP (asm_out_file, size);
79e68feb
RS
1788}
1789
a785e67e
RS
1790/* Assemble an alignment pseudo op for an ALIGN-bit boundary. */
1791
1792void
2e1eedd6 1793assemble_align (int align)
a785e67e
RS
1794{
1795 if (align > BITS_PER_UNIT)
91ea4f8d
KG
1796 {
1797 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1798 }
a785e67e
RS
1799}
1800
79e68feb
RS
1801/* Assemble a string constant with the specified C string as contents. */
1802
1803void
2e1eedd6 1804assemble_string (const char *p, int size)
79e68feb 1805{
79e68feb
RS
1806 int pos = 0;
1807 int maximum = 2000;
1808
1809 /* If the string is very long, split it up. */
1810
1811 while (pos < size)
1812 {
1813 int thissize = size - pos;
1814 if (thissize > maximum)
1815 thissize = maximum;
1816
b93a436e 1817 ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
79e68feb
RS
1818
1819 pos += thissize;
1820 p += thissize;
1821 }
1822}
69249c1b 1823
79e68feb 1824\f
434aeebb
RS
1825/* A noswitch_section_callback for lcomm_section. */
1826
1827static bool
1828emit_local (tree decl ATTRIBUTE_UNUSED,
1829 const char *name ATTRIBUTE_UNUSED,
1830 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1831 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1832{
1833#if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1834 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name,
1835 size, DECL_ALIGN (decl));
1836 return true;
1837#elif defined ASM_OUTPUT_ALIGNED_LOCAL
1838 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl));
1839 return true;
b8694195 1840#else
434aeebb
RS
1841 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1842 return false;
b8694195 1843#endif
434aeebb 1844}
b8694195 1845
434aeebb
RS
1846/* A noswitch_section_callback for bss_noswitch_section. */
1847
1848#if defined ASM_OUTPUT_ALIGNED_BSS || defined ASM_OUTPUT_BSS
1849static bool
1850emit_bss (tree decl ATTRIBUTE_UNUSED,
1851 const char *name ATTRIBUTE_UNUSED,
1852 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1853 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1854{
b8694195 1855#if defined ASM_OUTPUT_ALIGNED_BSS
434aeebb
RS
1856 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl));
1857 return true;
b8694195 1858#else
434aeebb
RS
1859 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded);
1860 return false;
b8694195 1861#endif
434aeebb 1862}
b8694195
NC
1863#endif
1864
434aeebb
RS
1865/* A noswitch_section_callback for comm_section. */
1866
1867static bool
1868emit_common (tree decl ATTRIBUTE_UNUSED,
1869 const char *name ATTRIBUTE_UNUSED,
1870 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1871 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1872{
b8694195 1873#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
434aeebb
RS
1874 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name,
1875 size, DECL_ALIGN (decl));
1876 return true;
1877#elif defined ASM_OUTPUT_ALIGNED_COMMON
1878 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl));
1879 return true;
b8694195 1880#else
434aeebb
RS
1881 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
1882 return false;
b8694195 1883#endif
434aeebb
RS
1884}
1885
1886/* A noswitch_section_callback for tls_comm_section. */
b8694195 1887
54fbf6a1 1888static bool
434aeebb
RS
1889emit_tls_common (tree decl ATTRIBUTE_UNUSED,
1890 const char *name ATTRIBUTE_UNUSED,
1891 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1892 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
b8694195 1893{
434aeebb
RS
1894#ifdef ASM_OUTPUT_TLS_COMMON
1895 ASM_OUTPUT_TLS_COMMON (asm_out_file, decl, name, size);
1896 return true;
54fbf6a1 1897#else
434aeebb
RS
1898 sorry ("thread-local COMMON data not implemented");
1899 return true;
46f9491e 1900#endif
434aeebb 1901}
b8694195 1902
434aeebb
RS
1903/* Assemble DECL given that it belongs in SECTION_NOSWITCH section SECT.
1904 NAME is the name of DECL's SYMBOL_REF. */
64270ab0 1905
434aeebb
RS
1906static void
1907assemble_noswitch_variable (tree decl, const char *name, section *sect)
1908{
1909 unsigned HOST_WIDE_INT size, rounded;
ecb0eece 1910
434aeebb
RS
1911 size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
1912 rounded = size;
b8694195 1913
434aeebb
RS
1914 /* Don't allocate zero bytes of common,
1915 since that means "undefined external" in the linker. */
1916 if (size == 0)
1917 rounded = 1;
1918
1919 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1920 so that each uninitialized object starts on such a boundary. */
1921 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1922 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1923 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1924
1925 if (!sect->noswitch.callback (decl, name, size, rounded)
1926 && (unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded)
1927 warning (0, "requested alignment for %q+D is greater than "
1928 "implemented alignment of %wu", decl, rounded);
b8694195
NC
1929}
1930
aacd3885
RS
1931/* A subroutine of assemble_variable. Output the label and contents of
1932 DECL, whose address is a SYMBOL_REF with name NAME. DONT_OUTPUT_DATA
1933 is as for assemble_variable. */
1934
1935static void
1936assemble_variable_contents (tree decl, const char *name,
1937 bool dont_output_data)
1938{
1939 /* Do any machine/system dependent processing of the object. */
1940#ifdef ASM_DECLARE_OBJECT_NAME
1941 last_assemble_variable_decl = decl;
1942 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
1943#else
1944 /* Standard thing is just output label for the object. */
1945 ASM_OUTPUT_LABEL (asm_out_file, name);
1946#endif /* ASM_DECLARE_OBJECT_NAME */
1947
1948 if (!dont_output_data)
1949 {
1950 if (DECL_INITIAL (decl)
1951 && DECL_INITIAL (decl) != error_mark_node
1952 && !initializer_zerop (DECL_INITIAL (decl)))
1953 /* Output the actual data. */
1954 output_constant (DECL_INITIAL (decl),
1955 tree_low_cst (DECL_SIZE_UNIT (decl), 1),
1956 DECL_ALIGN (decl));
1957 else
1958 /* Leave space for it. */
1959 assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
1960 }
1961}
1962
79e68feb
RS
1963/* Assemble everything that is needed for a variable or function declaration.
1964 Not used for automatic variables, and not used for function definitions.
1965 Should not be called for variables of incomplete structure type.
1966
1967 TOP_LEVEL is nonzero if this variable has file scope.
1968 AT_END is nonzero if this is the special handling, at end of compilation,
ff8f4401
RS
1969 to define things that have had only tentative definitions.
1970 DONT_OUTPUT_DATA if nonzero means don't actually output the
1971 initial value (that will be done by the caller). */
79e68feb
RS
1972
1973void
2e1eedd6
AJ
1974assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
1975 int at_end ATTRIBUTE_UNUSED, int dont_output_data)
79e68feb 1976{
b3694847 1977 const char *name;
434aeebb
RS
1978 rtx decl_rtl, symbol;
1979 section *sect;
79e68feb 1980
8893239d
RH
1981 if (! targetm.have_tls
1982 && TREE_CODE (decl) == VAR_DECL
1983 && DECL_THREAD_LOCAL_P (decl))
1984 {
1985 tree to = emutls_decl (decl);
1986
1987 /* If this variable is defined locally, then we need to initialize the
1988 control structure with size and alignment information. We do this
1989 at the last moment because tentative definitions can take a locally
1990 defined but uninitialized variable and initialize it later, which
1991 would result in incorrect contents. */
1992 if (! DECL_EXTERNAL (to)
1993 && (! DECL_COMMON (to)
1994 || (DECL_INITIAL (decl)
1995 && DECL_INITIAL (decl) != error_mark_node)))
1996 {
1997 VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 4);
1998 constructor_elt *elt;
1999 tree type = TREE_TYPE (to);
2000 tree field = TYPE_FIELDS (type);
2001
2002 elt = VEC_quick_push (constructor_elt, v, NULL);
2003 elt->index = field;
2004 elt->value = fold_convert (TREE_TYPE (field), DECL_SIZE_UNIT (decl));
2005
2006 elt = VEC_quick_push (constructor_elt, v, NULL);
2007 field = TREE_CHAIN (field);
2008 elt->index = field;
2009 elt->value = build_int_cst (TREE_TYPE (field),
2010 DECL_ALIGN_UNIT (decl));
2011
2012 elt = VEC_quick_push (constructor_elt, v, NULL);
2013 field = TREE_CHAIN (field);
2014 elt->index = field;
2015 elt->value = null_pointer_node;
2016
2017 elt = VEC_quick_push (constructor_elt, v, NULL);
2018 field = TREE_CHAIN (field);
2019 elt->index = field;
2020 elt->value = get_emutls_init_templ_addr (decl);
2021
2022 DECL_INITIAL (to) = build_constructor (type, v);
2023
2024 /* Make sure the template is marked as needed early enough.
2025 Without this, if the variable is placed in a
2026 section-anchored block, the template will only be marked
2027 when it's too late. */
2028 record_references_in_initializer (to);
2029 }
2030
2031 decl = to;
2032 }
2033
cbed4565
RS
2034 last_assemble_variable_decl = 0;
2035
d36d70cc 2036 /* Normally no need to say anything here for external references,
9faa82d8 2037 since assemble_external is called by the language-specific code
d36d70cc 2038 when a declaration is first seen. */
79e68feb 2039
44fe2e80 2040 if (DECL_EXTERNAL (decl))
79e68feb
RS
2041 return;
2042
2043 /* Output no assembler code for a function declaration.
2044 Only definitions of functions output anything. */
2045
2046 if (TREE_CODE (decl) == FUNCTION_DECL)
2047 return;
2048
3914abb4 2049 /* Do nothing for global register variables. */
f8cfc6aa 2050 if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl)))
3914abb4
NB
2051 {
2052 TREE_ASM_WRITTEN (decl) = 1;
2053 return;
2054 }
2055
79e68feb
RS
2056 /* If type was incomplete when the variable was declared,
2057 see if it is complete now. */
2058
2059 if (DECL_SIZE (decl) == 0)
2060 layout_decl (decl, 0);
2061
2062 /* Still incomplete => don't allocate it; treat the tentative defn
2063 (which is what it must have been) as an `extern' reference. */
2064
ff8f4401 2065 if (!dont_output_data && DECL_SIZE (decl) == 0)
79e68feb 2066 {
dee15844 2067 error ("storage size of %q+D isn%'t known", decl);
1c1a7ba4 2068 TREE_ASM_WRITTEN (decl) = 1;
79e68feb
RS
2069 return;
2070 }
2071
2072 /* The first declaration of a variable that comes through this function
2073 decides whether it is global (in C, has external linkage)
2074 or local (in C, has internal linkage). So do nothing more
2075 if this function has already run. */
2076
2077 if (TREE_ASM_WRITTEN (decl))
2078 return;
2079
fb49053f
RH
2080 /* Make sure targetm.encode_section_info is invoked before we set
2081 ASM_WRITTEN. */
17eee61c 2082 decl_rtl = DECL_RTL (decl);
46f9491e 2083
79e68feb
RS
2084 TREE_ASM_WRITTEN (decl) = 1;
2085
3c350eb3
CB
2086 /* Do no output if -fsyntax-only. */
2087 if (flag_syntax_only)
2088 return;
2089
809d6575 2090 app_disable ();
79e68feb 2091
770ae6cc
RK
2092 if (! dont_output_data
2093 && ! host_integerp (DECL_SIZE_UNIT (decl), 1))
ff8f4401 2094 {
dee15844 2095 error ("size of variable %q+D is too large", decl);
544f03b4 2096 return;
79e68feb
RS
2097 }
2098
aacd3885
RS
2099 gcc_assert (MEM_P (decl_rtl));
2100 gcc_assert (GET_CODE (XEXP (decl_rtl, 0)) == SYMBOL_REF);
434aeebb
RS
2101 symbol = XEXP (decl_rtl, 0);
2102 name = XSTR (symbol, 0);
810db579
JH
2103 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
2104 notice_global_symbol (decl);
f796d997 2105
8a198bd2
JW
2106 /* Compute the alignment of this data. */
2107
d5fa3ec8
DE
2108 align_variable (decl, dont_output_data);
2109 set_mem_align (decl_rtl, DECL_ALIGN (decl));
8a198bd2 2110
b14707c3
RH
2111 if (TREE_PUBLIC (decl))
2112 maybe_assemble_visibility (decl);
2113
8e3e233b
DP
2114 if (DECL_PRESERVE_P (decl))
2115 targetm.asm_out.mark_decl_preserved (name);
2116
79e68feb 2117 /* First make the assembler name(s) global if appropriate. */
434aeebb
RS
2118 sect = get_variable_section (decl, false);
2119 if (TREE_PUBLIC (decl)
2120 && DECL_NAME (decl)
2121 && (sect->common.flags & SECTION_COMMON) == 0)
19c5b1cf 2122 globalize_decl (decl);
79e68feb 2123
64270ab0 2124 /* Output any data that we will need to use the address of. */
aacd3885
RS
2125 if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node)
2126 output_addressed_constants (DECL_INITIAL (decl));
79e68feb 2127
a8e2f179 2128 /* dbxout.c needs to know this. */
6410fb81 2129 if (sect && (sect->common.flags & SECTION_CODE) != 0)
a8e2f179
RS
2130 DECL_IN_TEXT_SECTION (decl) = 1;
2131
aacd3885
RS
2132 /* If the decl is part of an object_block, make sure that the decl
2133 has been positioned within its block, but do not write out its
2134 definition yet. output_object_blocks will do that later. */
3fa9c136 2135 if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol))
79e68feb 2136 {
aacd3885 2137 gcc_assert (!dont_output_data);
434aeebb 2138 place_block_symbol (symbol);
aacd3885 2139 }
434aeebb
RS
2140 else if (SECTION_STYLE (sect) == SECTION_NOSWITCH)
2141 assemble_noswitch_variable (decl, name, sect);
aacd3885
RS
2142 else
2143 {
434aeebb 2144 switch_to_section (sect);
d5fa3ec8 2145 if (DECL_ALIGN (decl) > BITS_PER_UNIT)
aacd3885
RS
2146 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl)));
2147 assemble_variable_contents (decl, name, dont_output_data);
79e68feb 2148 }
79e68feb
RS
2149}
2150
2e9effae
RS
2151/* Return 1 if type TYPE contains any pointers. */
2152
2153static int
2e1eedd6 2154contains_pointers_p (tree type)
2e9effae
RS
2155{
2156 switch (TREE_CODE (type))
2157 {
2158 case POINTER_TYPE:
2159 case REFERENCE_TYPE:
2160 /* I'm not sure whether OFFSET_TYPE needs this treatment,
2161 so I'll play safe and return 1. */
2162 case OFFSET_TYPE:
2163 return 1;
2164
2165 case RECORD_TYPE:
2166 case UNION_TYPE:
2167 case QUAL_UNION_TYPE:
2168 {
2169 tree fields;
2170 /* For a type that has fields, see if the fields have pointers. */
2171 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
ce49ea8a
JM
2172 if (TREE_CODE (fields) == FIELD_DECL
2173 && contains_pointers_p (TREE_TYPE (fields)))
2e9effae
RS
2174 return 1;
2175 return 0;
2176 }
2177
2178 case ARRAY_TYPE:
2179 /* An array type contains pointers if its element type does. */
2180 return contains_pointers_p (TREE_TYPE (type));
2181
2182 default:
2183 return 0;
2184 }
2185}
2186
857e7259
ZW
2187/* In unit-at-a-time mode, we delay assemble_external processing until
2188 the compilation unit is finalized. This is the best we can do for
2189 right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay
2190 it all the way to final. See PR 17982 for further discussion. */
2191static GTY(()) tree pending_assemble_externals;
2192
9be6533a
RS
2193#ifdef ASM_OUTPUT_EXTERNAL
2194/* True if DECL is a function decl for which no out-of-line copy exists.
2195 It is assumed that DECL's assembler name has been set. */
2196
2197static bool
2198incorporeal_function_p (tree decl)
2199{
2200 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
2201 {
2202 const char *name;
2203
2204 if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
2205 && DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA)
2206 return true;
2207
2208 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
2209 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
2210 return true;
2211 }
2212 return false;
2213}
857e7259
ZW
2214
2215/* Actually do the tests to determine if this is necessary, and invoke
2216 ASM_OUTPUT_EXTERNAL. */
2217static void
2218assemble_external_real (tree decl)
2219{
2220 rtx rtl = DECL_RTL (decl);
2221
2222 if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
2223 && !SYMBOL_REF_USED (XEXP (rtl, 0))
2224 && !incorporeal_function_p (decl))
2225 {
2226 /* Some systems do require some output. */
2227 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
2228 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
2229 }
2230}
2231#endif
2232
2233void
2234process_pending_assemble_externals (void)
2235{
2236#ifdef ASM_OUTPUT_EXTERNAL
2237 tree list;
2238 for (list = pending_assemble_externals; list; list = TREE_CHAIN (list))
2239 assemble_external_real (TREE_VALUE (list));
2240
2241 pending_assemble_externals = 0;
9be6533a 2242#endif
857e7259 2243}
9be6533a 2244
79e68feb 2245/* Output something to declare an external symbol to the assembler.
fff9e713
MT
2246 (Most assemblers don't need this, so we normally output nothing.)
2247 Do nothing if DECL is not external. */
79e68feb
RS
2248
2249void
2e1eedd6 2250assemble_external (tree decl ATTRIBUTE_UNUSED)
79e68feb 2251{
e6855a2d
MM
2252 /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
2253 main body of this code is only rarely exercised. To provide some
2254 testing, on all platforms, we make sure that the ASM_OUT_FILE is
2255 open. If it's not, we should not be calling this function. */
857e7259 2256 gcc_assert (asm_out_file);
e6855a2d 2257
79e68feb 2258#ifdef ASM_OUTPUT_EXTERNAL
857e7259
ZW
2259 if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl))
2260 return;
fff9e713 2261
c47c29c8
L
2262 /* We want to output external symbols at very last to check if they
2263 are references or not. */
2264 pending_assemble_externals = tree_cons (0, decl,
2265 pending_assemble_externals);
79e68feb
RS
2266#endif
2267}
2268
2269/* Similar, for calling a library function FUN. */
2270
2271void
6773a41c 2272assemble_external_libcall (rtx fun)
79e68feb 2273{
b93a436e
JL
2274 /* Declare library function name external when first used, if nec. */
2275 if (! SYMBOL_REF_USED (fun))
79e68feb 2276 {
b93a436e 2277 SYMBOL_REF_USED (fun) = 1;
5fd9b178 2278 targetm.asm_out.external_libcall (fun);
79e68feb 2279 }
79e68feb
RS
2280}
2281
79e68feb
RS
2282/* Assemble a label named NAME. */
2283
2284void
2e1eedd6 2285assemble_label (const char *name)
79e68feb 2286{
b93a436e 2287 ASM_OUTPUT_LABEL (asm_out_file, name);
79e68feb
RS
2288}
2289
bb9a388d 2290/* Set the symbol_referenced flag for ID. */
4d7d0451 2291void
2e1eedd6 2292mark_referenced (tree id)
4d7d0451 2293{
4d7d0451
JH
2294 TREE_SYMBOL_REFERENCED (id) = 1;
2295}
2296
bb9a388d
ZW
2297/* Set the symbol_referenced flag for DECL and notify callgraph. */
2298void
2299mark_decl_referenced (tree decl)
2300{
2301 if (TREE_CODE (decl) == FUNCTION_DECL)
5c55c2e8 2302 {
8634c649
JJ
2303 /* Extern inline functions don't become needed when referenced.
2304 If we know a method will be emitted in other TU and no new
2305 functions can be marked reachable, just use the external
2306 definition. */
2307 struct cgraph_node *node = cgraph_node (decl);
2308 if (!DECL_EXTERNAL (decl)
2309 && (!node->local.vtable_method || !cgraph_global_info_ready
2310 || !node->local.finalized))
2311 cgraph_mark_needed_node (node);
5c55c2e8 2312 }
bb9a388d 2313 else if (TREE_CODE (decl) == VAR_DECL)
cd9c7bd2 2314 {
8a4a83ed
JH
2315 struct varpool_node *node = varpool_node (decl);
2316 varpool_mark_needed_node (node);
cd9c7bd2
JH
2317 /* C++ frontend use mark_decl_references to force COMDAT variables
2318 to be output that might appear dead otherwise. */
2319 node->force_output = true;
2320 }
bb9a388d
ZW
2321 /* else do nothing - we can get various sorts of CST nodes here,
2322 which do not need to be marked. */
2323}
2324
2979bcca
AO
2325
2326/* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS
2327 until we find an identifier that is not itself a transparent alias.
2328 Modify the alias passed to it by reference (and all aliases on the
2329 way to the ultimate target), such that they do not have to be
2330 followed again, and return the ultimate target of the alias
2331 chain. */
2332
a0203ca7
AO
2333static inline tree
2334ultimate_transparent_alias_target (tree *alias)
2335{
2336 tree target = *alias;
2337
2338 if (IDENTIFIER_TRANSPARENT_ALIAS (target))
2339 {
2340 gcc_assert (TREE_CHAIN (target));
2341 target = ultimate_transparent_alias_target (&TREE_CHAIN (target));
2342 gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
2343 && ! TREE_CHAIN (target));
2344 *alias = target;
2345 }
2346
2347 return target;
2348}
2349
57829bc4
MM
2350/* Output to FILE (an assembly file) a reference to NAME. If NAME
2351 starts with a *, the rest of NAME is output verbatim. Otherwise
2352 NAME is transformed in a target-specific way (usually by the
2353 addition of an underscore). */
2354
2355void
2356assemble_name_raw (FILE *file, const char *name)
2357{
2358 if (name[0] == '*')
2359 fputs (&name[1], file);
2360 else
2361 ASM_OUTPUT_LABELREF (file, name);
2362}
2363
2364/* Like assemble_name_raw, but should be used when NAME might refer to
2365 an entity that is also represented as a tree (like a function or
2366 variable). If NAME does refer to such an entity, that entity will
2367 be marked as referenced. */
79e68feb
RS
2368
2369void
2e1eedd6 2370assemble_name (FILE *file, const char *name)
79e68feb 2371{
ec940faa 2372 const char *real_name;
a94dbf2c 2373 tree id;
648fb7cf 2374
245f1bfa 2375 real_name = targetm.strip_name_encoding (name);
87907387 2376
a94dbf2c
JM
2377 id = maybe_get_identifier (real_name);
2378 if (id)
a0203ca7 2379 {
a114b455
AO
2380 tree id_orig = id;
2381
a0203ca7
AO
2382 mark_referenced (id);
2383 ultimate_transparent_alias_target (&id);
a114b455
AO
2384 if (id != id_orig)
2385 name = IDENTIFIER_POINTER (id);
a0203ca7
AO
2386 gcc_assert (! TREE_CHAIN (id));
2387 }
03e42132 2388
57829bc4 2389 assemble_name_raw (file, name);
79e68feb
RS
2390}
2391
2392/* Allocate SIZE bytes writable static space with a gensym name
2393 and return an RTX to refer to its address. */
2394
2395rtx
2e1eedd6 2396assemble_static_space (unsigned HOST_WIDE_INT size)
79e68feb
RS
2397{
2398 char name[12];
520a57c8 2399 const char *namestring;
79e68feb 2400 rtx x;
79e68feb 2401
79e68feb
RS
2402 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
2403 ++const_labelno;
a8a05998 2404 namestring = ggc_strdup (name);
79e68feb 2405
b93a436e 2406 x = gen_rtx_SYMBOL_REF (Pmode, namestring);
52859c77 2407 SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
ca695ac9 2408
e9a25f70 2409#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
b93a436e
JL
2410 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
2411 BIGGEST_ALIGNMENT);
e9a25f70 2412#else
79e68feb 2413#ifdef ASM_OUTPUT_ALIGNED_LOCAL
b93a436e 2414 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
79e68feb 2415#else
e016950d
KG
2416 {
2417 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
2418 so that each uninitialized object starts on such a boundary. */
2d76cb1a 2419 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */
58e15542 2420 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
47c3ed98
KG
2421 = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
2422 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2423 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
e016950d
KG
2424 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
2425 }
e9a25f70 2426#endif
79e68feb
RS
2427#endif
2428 return x;
2429}
2430
2431/* Assemble the static constant template for function entry trampolines.
2432 This is done at most once per compilation.
2433 Returns an RTX for the address of the template. */
2434
6de9cd9a
DN
2435static GTY(()) rtx initial_trampoline;
2436
f0e969bd 2437#ifdef TRAMPOLINE_TEMPLATE
79e68feb 2438rtx
2e1eedd6 2439assemble_trampoline_template (void)
79e68feb
RS
2440{
2441 char label[256];
fc608b03 2442 const char *name;
79e68feb 2443 int align;
52859c77 2444 rtx symbol;
79e68feb 2445
6de9cd9a
DN
2446 if (initial_trampoline)
2447 return initial_trampoline;
2448
37552631 2449 /* By default, put trampoline templates in read-only data section. */
f49acdb4 2450
37552631 2451#ifdef TRAMPOLINE_SECTION
d6b5193b 2452 switch_to_section (TRAMPOLINE_SECTION);
37552631 2453#else
d6b5193b 2454 switch_to_section (readonly_data_section);
37552631 2455#endif
f49acdb4 2456
79e68feb 2457 /* Write the assembler code to define one. */
073b0524 2458 align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
79e68feb 2459 if (align > 0)
91ea4f8d
KG
2460 {
2461 ASM_OUTPUT_ALIGN (asm_out_file, align);
2462 }
79e68feb 2463
5fd9b178 2464 targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
79e68feb
RS
2465 TRAMPOLINE_TEMPLATE (asm_out_file);
2466
2467 /* Record the rtl to refer to it. */
2468 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
a8a05998 2469 name = ggc_strdup (label);
52859c77
RH
2470 symbol = gen_rtx_SYMBOL_REF (Pmode, name);
2471 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2472
6de9cd9a
DN
2473 initial_trampoline = gen_rtx_MEM (BLKmode, symbol);
2474 set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
2475
2476 return initial_trampoline;
79e68feb 2477}
f0e969bd 2478#endif
79e68feb 2479\f
c8af3574
RH
2480/* A and B are either alignments or offsets. Return the minimum alignment
2481 that may be assumed after adding the two together. */
2482
2483static inline unsigned
2e1eedd6 2484min_align (unsigned int a, unsigned int b)
c8af3574
RH
2485{
2486 return (a | b) & -(a | b);
2487}
79e68feb 2488
301d03af
RS
2489/* Return the assembler directive for creating a given kind of integer
2490 object. SIZE is the number of bytes in the object and ALIGNED_P
2491 indicates whether it is known to be aligned. Return NULL if the
2492 assembly dialect has no such directive.
79e68feb 2493
301d03af
RS
2494 The returned string should be printed at the start of a new line and
2495 be followed immediately by the object's initial value. */
2496
2497const char *
2e1eedd6 2498integer_asm_op (int size, int aligned_p)
79e68feb 2499{
301d03af 2500 struct asm_int_op *ops;
79e68feb 2501
301d03af
RS
2502 if (aligned_p)
2503 ops = &targetm.asm_out.aligned_op;
c8af3574 2504 else
301d03af
RS
2505 ops = &targetm.asm_out.unaligned_op;
2506
2507 switch (size)
c8af3574 2508 {
301d03af
RS
2509 case 1:
2510 return targetm.asm_out.byte_op;
2511 case 2:
2512 return ops->hi;
2513 case 4:
2514 return ops->si;
2515 case 8:
2516 return ops->di;
2517 case 16:
2518 return ops->ti;
2519 default:
2520 return NULL;
2521 }
2522}
c8af3574 2523
301d03af
RS
2524/* Use directive OP to assemble an integer object X. Print OP at the
2525 start of the line, followed immediately by the value of X. */
c8af3574 2526
301d03af 2527void
2e1eedd6 2528assemble_integer_with_op (const char *op, rtx x)
301d03af
RS
2529{
2530 fputs (op, asm_out_file);
2531 output_addr_const (asm_out_file, x);
2532 fputc ('\n', asm_out_file);
2533}
79e68feb 2534
301d03af 2535/* The default implementation of the asm_out.integer target hook. */
79e68feb 2536
301d03af 2537bool
2e1eedd6
AJ
2538default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
2539 unsigned int size ATTRIBUTE_UNUSED,
2540 int aligned_p ATTRIBUTE_UNUSED)
301d03af
RS
2541{
2542 const char *op = integer_asm_op (size, aligned_p);
d31f3604
PB
2543 /* Avoid GAS bugs for large values. Specifically negative values whose
2544 absolute value fits in a bfd_vma, but not in a bfd_signed_vma. */
2545 if (size > UNITS_PER_WORD && size > POINTER_SIZE / BITS_PER_UNIT)
a13fd905 2546 return false;
301d03af
RS
2547 return op && (assemble_integer_with_op (op, x), true);
2548}
79e68feb 2549
301d03af
RS
2550/* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
2551 the alignment of the integer in bits. Return 1 if we were able to output
41806d92
NS
2552 the constant, otherwise 0. We must be able to output the constant,
2553 if FORCE is nonzero. */
79e68feb 2554
301d03af 2555bool
2e1eedd6 2556assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
301d03af
RS
2557{
2558 int aligned_p;
79e68feb 2559
301d03af 2560 aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
79e68feb 2561
301d03af 2562 /* See if the target hook can handle this kind of object. */
5fd9b178 2563 if (targetm.asm_out.integer (x, size, aligned_p))
301d03af 2564 return true;
79e68feb 2565
301d03af
RS
2566 /* If the object is a multi-byte one, try splitting it up. Split
2567 it into words it if is multi-word, otherwise split it into bytes. */
2568 if (size > 1)
c8af3574
RH
2569 {
2570 enum machine_mode omode, imode;
301d03af
RS
2571 unsigned int subalign;
2572 unsigned int subsize, i;
091a3ac7 2573 unsigned char mclass;
46f9491e 2574
301d03af
RS
2575 subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
2576 subalign = MIN (align, subsize * BITS_PER_UNIT);
091a3ac7
CF
2577 if (GET_CODE (x) == CONST_FIXED)
2578 mclass = GET_MODE_CLASS (GET_MODE (x));
2579 else
2580 mclass = MODE_INT;
2581
2582 omode = mode_for_size (subsize * BITS_PER_UNIT, mclass, 0);
2583 imode = mode_for_size (size * BITS_PER_UNIT, mclass, 0);
c8af3574 2584
301d03af 2585 for (i = 0; i < size; i += subsize)
c8af3574 2586 {
301d03af
RS
2587 rtx partial = simplify_subreg (omode, x, imode, i);
2588 if (!partial || !assemble_integer (partial, subsize, subalign, 0))
c8af3574
RH
2589 break;
2590 }
c8af3574 2591 if (i == size)
301d03af
RS
2592 return true;
2593
2594 /* If we've printed some of it, but not all of it, there's no going
2595 back now. */
fbc848cc 2596 gcc_assert (!i);
c8af3574
RH
2597 }
2598
fbc848cc 2599 gcc_assert (!force);
083cad55 2600
301d03af 2601 return false;
79e68feb
RS
2602}
2603\f
82af613f 2604void
2e1eedd6 2605assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align)
94aca342 2606{
5e5cf1ee 2607 long data[4] = {0, 0, 0, 0};
b409761a
ZW
2608 int i;
2609 int bitsize, nelts, nunits, units_per;
2610
02befdf4 2611 /* This is hairy. We have a quantity of known size. real_to_target
b409761a
ZW
2612 will put it into an array of *host* longs, 32 bits per element
2613 (even if long is more than 32 bits). We need to determine the
2614 number of array elements that are occupied (nelts) and the number
2615 of *target* min-addressable units that will be occupied in the
02befdf4
ZW
2616 object file (nunits). We cannot assume that 32 divides the
2617 mode's bitsize (size * BITS_PER_UNIT) evenly.
2618
2619 size * BITS_PER_UNIT is used here to make sure that padding bits
2620 (which might appear at either end of the value; real_to_target
2621 will include the padding bits in its output array) are included. */
2622
2623 nunits = GET_MODE_SIZE (mode);
2624 bitsize = nunits * BITS_PER_UNIT;
b409761a
ZW
2625 nelts = CEIL (bitsize, 32);
2626 units_per = 32 / BITS_PER_UNIT;
2627
2628 real_to_target (data, &d, mode);
2629
2630 /* Put out the first word with the specified alignment. */
2631 assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1);
2632 nunits -= units_per;
2633
2634 /* Subsequent words need only 32-bit alignment. */
2635 align = min_align (align, 32);
2636
2637 for (i = 1; i < nelts; i++)
79e68feb 2638 {
b409761a
ZW
2639 assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1);
2640 nunits -= units_per;
79e68feb 2641 }
94aca342 2642}
79e68feb 2643\f
79e68feb
RS
2644/* Given an expression EXP with a constant value,
2645 reduce it to the sum of an assembler symbol and an integer.
2646 Store them both in the structure *VALUE.
04c7ae48 2647 EXP must be reducible. */
79e68feb 2648
e2500fed 2649struct addr_const GTY(())
79e68feb
RS
2650{
2651 rtx base;
fb351073 2652 HOST_WIDE_INT offset;
79e68feb
RS
2653};
2654
2655static void
2e1eedd6 2656decode_addr_const (tree exp, struct addr_const *value)
79e68feb 2657{
b3694847
SS
2658 tree target = TREE_OPERAND (exp, 0);
2659 int offset = 0;
2660 rtx x;
79e68feb
RS
2661
2662 while (1)
2663 {
2664 if (TREE_CODE (target) == COMPONENT_REF
770ae6cc 2665 && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
665f2503 2666
79e68feb 2667 {
770ae6cc 2668 offset += int_byte_position (TREE_OPERAND (target, 1));
79e68feb
RS
2669 target = TREE_OPERAND (target, 0);
2670 }
b4e3fabb
RK
2671 else if (TREE_CODE (target) == ARRAY_REF
2672 || TREE_CODE (target) == ARRAY_RANGE_REF)
79e68feb 2673 {
770ae6cc
RK
2674 offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2675 * tree_low_cst (TREE_OPERAND (target, 1), 0));
79e68feb
RS
2676 target = TREE_OPERAND (target, 0);
2677 }
2678 else
2679 break;
2680 }
2681
2682 switch (TREE_CODE (target))
2683 {
2684 case VAR_DECL:
2685 case FUNCTION_DECL:
2686 x = DECL_RTL (target);
2687 break;
2688
2689 case LABEL_DECL:
b93a436e 2690 x = gen_rtx_MEM (FUNCTION_MODE,
4c33cb26 2691 gen_rtx_LABEL_REF (Pmode, force_label_rtx (target)));
79e68feb
RS
2692 break;
2693
2694 case REAL_CST:
091a3ac7 2695 case FIXED_CST:
79e68feb
RS
2696 case STRING_CST:
2697 case COMPLEX_CST:
2698 case CONSTRUCTOR:
2cf55b55 2699 case INTEGER_CST:
44e3910a 2700 x = output_constant_def (target, 1);
79e68feb
RS
2701 break;
2702
2703 default:
fbc848cc 2704 gcc_unreachable ();
79e68feb
RS
2705 }
2706
fbc848cc 2707 gcc_assert (MEM_P (x));
b93a436e 2708 x = XEXP (x, 0);
79e68feb
RS
2709
2710 value->base = x;
2711 value->offset = offset;
2712}
2713\f
2714/* Uniquize all constants that appear in memory.
2715 Each constant in memory thus far output is recorded
5e9295fa 2716 in `const_desc_table'. */
79e68feb 2717
e2500fed 2718struct constant_descriptor_tree GTY(())
79e68feb 2719{
e2500fed 2720 /* A MEM for the constant. */
14a774a9 2721 rtx rtl;
e2500fed
GK
2722
2723 /* The value of the constant. */
2724 tree value;
b96917bf
JJ
2725
2726 /* Hash of value. Computing the hash from value each time
2727 hashfn is called can't work properly, as that means recursive
2728 use of the hash table during hash table expansion. */
2729 hashval_t hash;
79e68feb
RS
2730};
2731
10b6a274
ZW
2732static GTY((param_is (struct constant_descriptor_tree)))
2733 htab_t const_desc_htab;
79e68feb 2734
2e1eedd6
AJ
2735static struct constant_descriptor_tree * build_constant_desc (tree);
2736static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
bd7cf17e 2737
79e68feb
RS
2738/* Compute a hash code for a constant expression. */
2739
10b6a274 2740static hashval_t
2e1eedd6 2741const_desc_hash (const void *ptr)
46b33600 2742{
741ac903 2743 return ((const struct constant_descriptor_tree *)ptr)->hash;
46b33600
RH
2744}
2745
10b6a274 2746static hashval_t
2e1eedd6 2747const_hash_1 (const tree exp)
79e68feb 2748{
b3694847 2749 const char *p;
10b6a274 2750 hashval_t hi;
46b33600 2751 int len, i;
b3694847 2752 enum tree_code code = TREE_CODE (exp);
79e68feb 2753
a9d07d6e
RK
2754 /* Either set P and LEN to the address and len of something to hash and
2755 exit the switch or return a value. */
2756
2757 switch (code)
79e68feb 2758 {
a9d07d6e 2759 case INTEGER_CST:
2afaa41c
GM
2760 p = (char *) &TREE_INT_CST (exp);
2761 len = sizeof TREE_INT_CST (exp);
a9d07d6e
RK
2762 break;
2763
2764 case REAL_CST:
46b33600 2765 return real_hash (TREE_REAL_CST_PTR (exp));
79e68feb 2766
091a3ac7
CF
2767 case FIXED_CST:
2768 return fixed_hash (TREE_FIXED_CST_PTR (exp));
2769
a9d07d6e 2770 case STRING_CST:
3521b33c
ZW
2771 p = TREE_STRING_POINTER (exp);
2772 len = TREE_STRING_LENGTH (exp);
a9d07d6e 2773 break;
5e9295fa 2774
a9d07d6e 2775 case COMPLEX_CST:
46b33600
RH
2776 return (const_hash_1 (TREE_REALPART (exp)) * 5
2777 + const_hash_1 (TREE_IMAGPART (exp)));
a9d07d6e
RK
2778
2779 case CONSTRUCTOR:
08f2586c 2780 {
4038c495
GB
2781 unsigned HOST_WIDE_INT idx;
2782 tree value;
083cad55 2783
08f2586c 2784 hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
083cad55 2785
4038c495
GB
2786 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
2787 if (value)
2788 hi = hi * 603 + const_hash_1 (value);
083cad55 2789
08f2586c
NS
2790 return hi;
2791 }
79e68feb 2792
a9d07d6e 2793 case ADDR_EXPR:
5d056e9b 2794 case FDESC_EXPR:
a9d07d6e
RK
2795 {
2796 struct addr_const value;
2797
2798 decode_addr_const (exp, &value);
fbc848cc 2799 switch (GET_CODE (value.base))
a9d07d6e 2800 {
fbc848cc 2801 case SYMBOL_REF:
a9d07d6e
RK
2802 /* Don't hash the address of the SYMBOL_REF;
2803 only use the offset and the symbol name. */
2804 hi = value.offset;
2805 p = XSTR (value.base, 0);
2806 for (i = 0; p[i] != 0; i++)
2807 hi = ((hi * 613) + (unsigned) (p[i]));
fbc848cc
NS
2808 break;
2809
2810 case LABEL_REF:
2811 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2812 break;
2813
2814 default:
2815 gcc_unreachable ();
a9d07d6e 2816 }
a9d07d6e 2817 }
79e68feb 2818 return hi;
a9d07d6e
RK
2819
2820 case PLUS_EXPR:
5be014d5 2821 case POINTER_PLUS_EXPR:
a9d07d6e 2822 case MINUS_EXPR:
46b33600
RH
2823 return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
2824 + const_hash_1 (TREE_OPERAND (exp, 1)));
a9d07d6e
RK
2825
2826 case NOP_EXPR:
2827 case CONVERT_EXPR:
2828 case NON_LVALUE_EXPR:
46b33600 2829 return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
46f9491e 2830
e9a25f70 2831 default:
2d76cb1a 2832 /* A language specific constant. Just hash the code. */
46b33600 2833 return code;
79e68feb 2834 }
79e68feb 2835
f9da5064 2836 /* Compute hashing function. */
79e68feb
RS
2837 hi = len;
2838 for (i = 0; i < len; i++)
0f41302f 2839 hi = ((hi * 613) + (unsigned) (p[i]));
79e68feb 2840
79e68feb
RS
2841 return hi;
2842}
79e68feb 2843
10b6a274
ZW
2844/* Wrapper of compare_constant, for the htab interface. */
2845static int
2e1eedd6 2846const_desc_eq (const void *p1, const void *p2)
10b6a274 2847{
b96917bf
JJ
2848 const struct constant_descriptor_tree *c1 = p1;
2849 const struct constant_descriptor_tree *c2 = p2;
2850 if (c1->hash != c2->hash)
2851 return 0;
2852 return compare_constant (c1->value, c2->value);
10b6a274
ZW
2853}
2854
e2500fed
GK
2855/* Compare t1 and t2, and return 1 only if they are known to result in
2856 the same bit pattern on output. */
79e68feb 2857
e2500fed 2858static int
2e1eedd6 2859compare_constant (const tree t1, const tree t2)
79e68feb 2860{
e2500fed 2861 enum tree_code typecode;
79e68feb 2862
e2500fed
GK
2863 if (t1 == NULL_TREE)
2864 return t2 == NULL_TREE;
2865 if (t2 == NULL_TREE)
79e68feb
RS
2866 return 0;
2867
e2500fed
GK
2868 if (TREE_CODE (t1) != TREE_CODE (t2))
2869 return 0;
a9d07d6e 2870
e2500fed 2871 switch (TREE_CODE (t1))
79e68feb 2872 {
a9d07d6e 2873 case INTEGER_CST:
79e68feb 2874 /* Integer constants are the same only if the same width of type. */
e2500fed 2875 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
79e68feb 2876 return 0;
6a34c788
RS
2877 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2878 return 0;
e2500fed 2879 return tree_int_cst_equal (t1, t2);
a9d07d6e
RK
2880
2881 case REAL_CST:
79e68feb 2882 /* Real constants are the same only if the same width of type. */
e2500fed 2883 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
79e68feb 2884 return 0;
a9d07d6e 2885
e2500fed 2886 return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
a9d07d6e 2887
091a3ac7
CF
2888 case FIXED_CST:
2889 /* Fixed constants are the same only if the same width of type. */
2890 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2891 return 0;
2892
2893 return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1), TREE_FIXED_CST (t2));
2894
a9d07d6e 2895 case STRING_CST:
e2500fed 2896 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
79e68feb 2897 return 0;
a9d07d6e 2898
e2500fed
GK
2899 return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2900 && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2901 TREE_STRING_LENGTH (t1)));
79e68feb 2902
a9d07d6e 2903 case COMPLEX_CST:
e2500fed
GK
2904 return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2905 && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
79e68feb 2906
a9d07d6e 2907 case CONSTRUCTOR:
08f2586c 2908 {
4038c495
GB
2909 VEC(constructor_elt, gc) *v1, *v2;
2910 unsigned HOST_WIDE_INT idx;
083cad55 2911
08f2586c
NS
2912 typecode = TREE_CODE (TREE_TYPE (t1));
2913 if (typecode != TREE_CODE (TREE_TYPE (t2)))
2914 return 0;
a9d07d6e 2915
08f2586c
NS
2916 if (typecode == ARRAY_TYPE)
2917 {
2918 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2919 /* For arrays, check that the sizes all match. */
2920 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2921 || size_1 == -1
2922 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
2923 return 0;
2924 }
2925 else
2926 {
2927 /* For record and union constructors, require exact type
2928 equality. */
2929 if (TREE_TYPE (t1) != TREE_TYPE (t2))
2930 return 0;
2931 }
b2e2d0cc 2932
4038c495
GB
2933 v1 = CONSTRUCTOR_ELTS (t1);
2934 v2 = CONSTRUCTOR_ELTS (t2);
2935 if (VEC_length (constructor_elt, v1)
2936 != VEC_length (constructor_elt, v2))
2937 return 0;
2938
2939 for (idx = 0; idx < VEC_length (constructor_elt, v1); ++idx)
08f2586c 2940 {
4038c495
GB
2941 constructor_elt *c1 = VEC_index (constructor_elt, v1, idx);
2942 constructor_elt *c2 = VEC_index (constructor_elt, v2, idx);
2943
08f2586c 2944 /* Check that each value is the same... */
4038c495 2945 if (!compare_constant (c1->value, c2->value))
08f2586c
NS
2946 return 0;
2947 /* ... and that they apply to the same fields! */
2948 if (typecode == ARRAY_TYPE)
2949 {
4038c495 2950 if (!compare_constant (c1->index, c2->index))
08f2586c
NS
2951 return 0;
2952 }
2953 else
2954 {
4038c495 2955 if (c1->index != c2->index)
08f2586c
NS
2956 return 0;
2957 }
2958 }
083cad55 2959
4038c495 2960 return 1;
08f2586c 2961 }
77fa0940 2962
a9d07d6e 2963 case ADDR_EXPR:
5d056e9b 2964 case FDESC_EXPR:
a9d07d6e 2965 {
e2500fed 2966 struct addr_const value1, value2;
a9d07d6e 2967
e2500fed
GK
2968 decode_addr_const (t1, &value1);
2969 decode_addr_const (t2, &value2);
2970 return (value1.offset == value2.offset
2971 && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
a9d07d6e 2972 }
a9d07d6e
RK
2973
2974 case PLUS_EXPR:
5be014d5 2975 case POINTER_PLUS_EXPR:
a9d07d6e 2976 case MINUS_EXPR:
fa212801 2977 case RANGE_EXPR:
e2500fed
GK
2978 return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2979 && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
a9d07d6e
RK
2980
2981 case NOP_EXPR:
2982 case CONVERT_EXPR:
2983 case NON_LVALUE_EXPR:
a3d71605 2984 case VIEW_CONVERT_EXPR:
e2500fed 2985 return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
e9a25f70
JL
2986
2987 default:
6524147c 2988 return 0;
79e68feb
RS
2989 }
2990
fbc848cc 2991 gcc_unreachable ();
79e68feb
RS
2992}
2993\f
e2500fed
GK
2994/* Make a copy of the whole tree structure for a constant. This
2995 handles the same types of nodes that compare_constant handles. */
d12516f1
RS
2996
2997static tree
2e1eedd6 2998copy_constant (tree exp)
d12516f1
RS
2999{
3000 switch (TREE_CODE (exp))
3001 {
310bbbf4
JW
3002 case ADDR_EXPR:
3003 /* For ADDR_EXPR, we do not want to copy the decl whose address
3004 is requested. We do want to copy constants though. */
6615c446 3005 if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
310bbbf4
JW
3006 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
3007 copy_constant (TREE_OPERAND (exp, 0)));
3008 else
3009 return copy_node (exp);
3010
d12516f1
RS
3011 case INTEGER_CST:
3012 case REAL_CST:
091a3ac7 3013 case FIXED_CST:
d12516f1 3014 case STRING_CST:
d12516f1
RS
3015 return copy_node (exp);
3016
3017 case COMPLEX_CST:
28eb1cb8
RK
3018 return build_complex (TREE_TYPE (exp),
3019 copy_constant (TREE_REALPART (exp)),
d12516f1
RS
3020 copy_constant (TREE_IMAGPART (exp)));
3021
3022 case PLUS_EXPR:
5be014d5 3023 case POINTER_PLUS_EXPR:
d12516f1 3024 case MINUS_EXPR:
3244e67d
RS
3025 return build2 (TREE_CODE (exp), TREE_TYPE (exp),
3026 copy_constant (TREE_OPERAND (exp, 0)),
3027 copy_constant (TREE_OPERAND (exp, 1)));
d12516f1
RS
3028
3029 case NOP_EXPR:
3030 case CONVERT_EXPR:
a9d07d6e 3031 case NON_LVALUE_EXPR:
a71c8ddc 3032 case VIEW_CONVERT_EXPR:
d12516f1
RS
3033 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
3034 copy_constant (TREE_OPERAND (exp, 0)));
3035
3036 case CONSTRUCTOR:
3037 {
3038 tree copy = copy_node (exp);
4038c495
GB
3039 VEC(constructor_elt, gc) *v;
3040 unsigned HOST_WIDE_INT idx;
3041 tree purpose, value;
083cad55 3042
4038c495
GB
3043 v = VEC_alloc(constructor_elt, gc, VEC_length(constructor_elt,
3044 CONSTRUCTOR_ELTS (exp)));
3045 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value)
3046 {
3047 constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL);
3048 ce->index = purpose;
3049 ce->value = copy_constant (value);
3050 }
3051 CONSTRUCTOR_ELTS (copy) = v;
d12516f1
RS
3052 return copy;
3053 }
3054
3055 default:
6524147c 3056 gcc_unreachable ();
d12516f1
RS
3057 }
3058}
ff8f4401 3059\f
aacd3885
RS
3060/* Return the alignment of constant EXP in bits. */
3061
3062static unsigned int
3063get_constant_alignment (tree exp)
3064{
3065 unsigned int align;
3066
3067 align = TYPE_ALIGN (TREE_TYPE (exp));
3068#ifdef CONSTANT_ALIGNMENT
3069 align = CONSTANT_ALIGNMENT (exp, align);
3070#endif
3071 return align;
3072}
3073
3074/* Return the section into which constant EXP should be placed. */
3075
3076static section *
3077get_constant_section (tree exp)
3078{
3079 if (IN_NAMED_SECTION (exp))
3080 return get_named_section (exp, NULL, compute_reloc_for_constant (exp));
3081 else
3082 return targetm.asm_out.select_section (exp,
3083 compute_reloc_for_constant (exp),
3084 get_constant_alignment (exp));
3085}
3086
3087/* Return the size of constant EXP in bytes. */
3088
3089static HOST_WIDE_INT
3090get_constant_size (tree exp)
3091{
3092 HOST_WIDE_INT size;
3093
3094 size = int_size_in_bytes (TREE_TYPE (exp));
3095 if (TREE_CODE (exp) == STRING_CST)
3096 size = MAX (TREE_STRING_LENGTH (exp), size);
3097 return size;
3098}
3099
293107d1
ZW
3100/* Subroutine of output_constant_def:
3101 No constant equal to EXP is known to have been output.
3102 Make a constant descriptor to enter EXP in the hash table.
3103 Assign the label number and construct RTL to refer to the
3104 constant's location in memory.
3105 Caller is responsible for updating the hash table. */
3106
3107static struct constant_descriptor_tree *
2e1eedd6 3108build_constant_desc (tree exp)
293107d1
ZW
3109{
3110 rtx symbol;
3111 rtx rtl;
3112 char label[256];
3113 int labelno;
3114 struct constant_descriptor_tree *desc;
3115
3116 desc = ggc_alloc (sizeof (*desc));
3521b33c 3117 desc->value = copy_constant (exp);
293107d1 3118
9cf737f8 3119 /* Propagate marked-ness to copied constant. */
6de9cd9a
DN
3120 if (flag_mudflap && mf_marked_p (exp))
3121 mf_mark (desc->value);
3122
293107d1
ZW
3123 /* Create a string containing the label name, in LABEL. */
3124 labelno = const_labelno++;
3125 ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
3126
3127 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
aacd3885
RS
3128 if (use_object_blocks_p ())
3129 {
3130 section *sect = get_constant_section (exp);
3131 symbol = create_block_symbol (ggc_strdup (label),
3132 get_block_for_section (sect), -1);
3133 }
3134 else
3135 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3136 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
929e5e5b 3137 SET_SYMBOL_REF_DECL (symbol, desc->value);
2adb9af1 3138 TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
293107d1
ZW
3139
3140 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
3141 set_mem_attributes (rtl, exp, 1);
3142 set_mem_alias_set (rtl, 0);
3143 set_mem_alias_set (rtl, const_alias_set);
3144
3145 /* Set flags or add text to the name to record information, such as
3146 that it is a local symbol. If the name is changed, the macro
3147 ASM_OUTPUT_LABELREF will have to know how to strip this
10b6a274
ZW
3148 information. This call might invalidate our local variable
3149 SYMBOL; we can't use it afterward. */
3150
5fd9b178 3151 targetm.encode_section_info (exp, rtl, true);
293107d1
ZW
3152
3153 desc->rtl = rtl;
293107d1
ZW
3154
3155 return desc;
3156}
3157
79e68feb
RS
3158/* Return an rtx representing a reference to constant data in memory
3159 for the constant expression EXP.
ff8f4401 3160
79e68feb
RS
3161 If assembler code for such a constant has already been output,
3162 return an rtx to refer to it.
b20cbca2 3163 Otherwise, output such a constant in memory
ff8f4401
RS
3164 and generate an rtx for it.
3165
10b6a274
ZW
3166 If DEFER is nonzero, this constant can be deferred and output only
3167 if referenced in the function after all optimizations.
bd7cf17e 3168
5e9295fa 3169 `const_desc_table' records which constants already have label strings. */
79e68feb
RS
3170
3171rtx
2e1eedd6 3172output_constant_def (tree exp, int defer)
79e68feb 3173{
e2500fed 3174 struct constant_descriptor_tree *desc;
10b6a274
ZW
3175 struct constant_descriptor_tree key;
3176 void **loc;
79e68feb 3177
10b6a274
ZW
3178 /* Look up EXP in the table of constant descriptors. If we didn't find
3179 it, create a new one. */
3180 key.value = exp;
b96917bf
JJ
3181 key.hash = const_hash_1 (exp);
3182 loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT);
46f9491e 3183
10b6a274 3184 desc = *loc;
14a774a9 3185 if (desc == 0)
00f07fb9 3186 {
293107d1 3187 desc = build_constant_desc (exp);
b96917bf 3188 desc->hash = key.hash;
10b6a274 3189 *loc = desc;
14a774a9
RK
3190 }
3191
10b6a274 3192 maybe_output_constant_def_contents (desc, defer);
293107d1
ZW
3193 return desc->rtl;
3194}
79e68feb 3195
10b6a274
ZW
3196/* Subroutine of output_constant_def: Decide whether or not we need to
3197 output the constant DESC now, and if so, do it. */
293107d1 3198static void
2e1eedd6
AJ
3199maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
3200 int defer)
293107d1 3201{
10b6a274 3202 rtx symbol = XEXP (desc->rtl, 0);
2adb9af1 3203 tree exp = desc->value;
10b6a274 3204
293107d1
ZW
3205 if (flag_syntax_only)
3206 return;
79e68feb 3207
2adb9af1 3208 if (TREE_ASM_WRITTEN (exp))
10b6a274
ZW
3209 /* Already output; don't do it again. */
3210 return;
3211
3521b33c
ZW
3212 /* We can always defer constants as long as the context allows
3213 doing so. */
3214 if (defer)
bd7cf17e 3215 {
2adb9af1
RH
3216 /* Increment n_deferred_constants if it exists. It needs to be at
3217 least as large as the number of constants actually referred to
3218 by the function. If it's too small we'll stop looking too early
3219 and fail to emit constants; if it's too large we'll only look
3220 through the entire function when we could have stopped earlier. */
10b6a274
ZW
3221 if (cfun)
3222 n_deferred_constants++;
32a61907 3223 return;
ff8f4401
RS
3224 }
3225
10b6a274 3226 output_constant_def_contents (symbol);
ff8f4401
RS
3227}
3228
aacd3885
RS
3229/* Subroutine of output_constant_def_contents. Output the definition
3230 of constant EXP, which is pointed to by label LABEL. ALIGN is the
3231 constant's alignment in bits. */
3232
3233static void
3234assemble_constant_contents (tree exp, const char *label, unsigned int align)
3235{
3236 HOST_WIDE_INT size;
3237
3238 size = get_constant_size (exp);
3239
3240 /* Do any machine/system dependent processing of the constant. */
3241#ifdef ASM_DECLARE_CONSTANT_NAME
3242 ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
3243#else
3244 /* Standard thing is just output label for the constant. */
3245 ASM_OUTPUT_LABEL (asm_out_file, label);
3246#endif /* ASM_DECLARE_CONSTANT_NAME */
3247
3248 /* Output the value of EXP. */
3249 output_constant (exp, size, align);
3250}
3251
10b6a274 3252/* We must output the constant data referred to by SYMBOL; do so. */
79e68feb 3253
ff8f4401 3254static void
2e1eedd6 3255output_constant_def_contents (rtx symbol)
ff8f4401 3256{
10b6a274 3257 tree exp = SYMBOL_REF_DECL (symbol);
aacd3885 3258 unsigned int align;
10b6a274 3259
293107d1
ZW
3260 /* Make sure any other constants whose addresses appear in EXP
3261 are assigned label numbers. */
b2218cc1
AO
3262 output_addressed_constants (exp);
3263
10b6a274 3264 /* We are no longer deferring this constant. */
2adb9af1 3265 TREE_ASM_WRITTEN (exp) = 1;
10b6a274 3266
aacd3885
RS
3267 /* If the constant is part of an object block, make sure that the
3268 decl has been positioned within its block, but do not write out
3269 its definition yet. output_object_blocks will do that later. */
3fa9c136 3270 if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol))
aacd3885 3271 place_block_symbol (symbol);
8a425a05 3272 else
91ea4f8d 3273 {
aacd3885
RS
3274 switch_to_section (get_constant_section (exp));
3275 align = get_constant_alignment (exp);
3276 if (align > BITS_PER_UNIT)
3277 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
3278 assemble_constant_contents (exp, XSTR (symbol, 0), align);
91ea4f8d 3279 }
6de9cd9a
DN
3280 if (flag_mudflap)
3281 mudflap_enqueue_constant (exp);
a2a6a79b 3282}
75c20980
RH
3283
3284/* Look up EXP in the table of constant descriptors. Return the rtl
3285 if it has been emitted, else null. */
3286
3287rtx
3288lookup_constant_def (tree exp)
3289{
3290 struct constant_descriptor_tree *desc;
3291 struct constant_descriptor_tree key;
3292
3293 key.value = exp;
b96917bf
JJ
3294 key.hash = const_hash_1 (exp);
3295 desc = htab_find_with_hash (const_desc_htab, &key, key.hash);
75c20980
RH
3296
3297 return (desc ? desc->rtl : NULL_RTX);
3298}
79e68feb 3299\f
e2500fed
GK
3300/* Used in the hash tables to avoid outputting the same constant
3301 twice. Unlike 'struct constant_descriptor_tree', RTX constants
3234b52d
RH
3302 are output once per function, not once per file. */
3303/* ??? Only a few targets need per-function constant pools. Most
3304 can use one per-file pool. Should add a targetm bit to tell the
3305 difference. */
3306
3307struct rtx_constant_pool GTY(())
3308{
3309 /* Pointers to first and last constant in pool, as ordered by offset. */
3310 struct constant_descriptor_rtx *first;
3311 struct constant_descriptor_rtx *last;
3312
3313 /* Hash facility for making memory-constants from constant rtl-expressions.
3314 It is used on RISC machines where immediate integer arguments and
3315 constant addresses are restricted so that such constants must be stored
3316 in memory. */
3317 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
3234b52d
RH
3318
3319 /* Current offset in constant pool (does not include any
3320 machine-specific header). */
3321 HOST_WIDE_INT offset;
e2500fed
GK
3322};
3323
3234b52d 3324struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
79e68feb 3325{
3234b52d
RH
3326 struct constant_descriptor_rtx *next;
3327 rtx mem;
3328 rtx sym;
79e68feb 3329 rtx constant;
3234b52d
RH
3330 HOST_WIDE_INT offset;
3331 hashval_t hash;
94b01be3 3332 enum machine_mode mode;
a79e3a45 3333 unsigned int align;
3234b52d 3334 int labelno;
91674c37 3335 int mark;
79e68feb
RS
3336};
3337
3234b52d 3338/* Hash and compare functions for const_rtx_htab. */
79e68feb 3339
3234b52d
RH
3340static hashval_t
3341const_desc_rtx_hash (const void *ptr)
3342{
3343 const struct constant_descriptor_rtx *desc = ptr;
3344 return desc->hash;
3345}
79e68feb 3346
3234b52d
RH
3347static int
3348const_desc_rtx_eq (const void *a, const void *b)
79e68feb 3349{
3234b52d
RH
3350 const struct constant_descriptor_rtx *x = a;
3351 const struct constant_descriptor_rtx *y = b;
3352
3353 if (x->mode != y->mode)
3354 return 0;
3355 return rtx_equal_p (x->constant, y->constant);
57632c51 3356}
79e68feb 3357
3234b52d 3358/* This is the worker function for const_rtx_hash, called via for_each_rtx. */
46b33600 3359
3234b52d
RH
3360static int
3361const_rtx_hash_1 (rtx *xp, void *data)
3362{
3363 unsigned HOST_WIDE_INT hwi;
3364 enum machine_mode mode;
3365 enum rtx_code code;
3366 hashval_t h, *hp;
3367 rtx x;
46b33600 3368
3234b52d
RH
3369 x = *xp;
3370 code = GET_CODE (x);
3371 mode = GET_MODE (x);
3372 h = (hashval_t) code * 1048573 + mode;
79e68feb 3373
3234b52d
RH
3374 switch (code)
3375 {
3376 case CONST_INT:
3377 hwi = INTVAL (x);
3378 fold_hwi:
69ef87e2 3379 {
3234b52d
RH
3380 const int shift = sizeof (hashval_t) * CHAR_BIT;
3381 const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
3382 int i;
69ef87e2 3383
3234b52d
RH
3384 h ^= (hashval_t) hwi;
3385 for (i = 1; i < n; ++i)
46b33600 3386 {
3234b52d
RH
3387 hwi >>= shift;
3388 h ^= (hashval_t) hwi;
69ef87e2
AH
3389 }
3390 }
3391 break;
3392
3234b52d
RH
3393 case CONST_DOUBLE:
3394 if (mode == VOIDmode)
3395 {
3396 hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
3397 goto fold_hwi;
3398 }
3399 else
3400 h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
79e68feb
RS
3401 break;
3402
091a3ac7
CF
3403 case CONST_FIXED:
3404 h ^= fixed_hash (CONST_FIXED_VALUE (x));
3405 break;
3406
237f420b
RH
3407 case CONST_VECTOR:
3408 {
3409 int i;
3410 for (i = XVECLEN (x, 0); i-- > 0; )
3411 h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data);
3412 }
3413 break;
3414
79e68feb 3415 case SYMBOL_REF:
3234b52d
RH
3416 h ^= htab_hash_string (XSTR (x, 0));
3417 break;
3418
79e68feb 3419 case LABEL_REF:
3234b52d 3420 h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
79e68feb
RS
3421 break;
3422
3234b52d
RH
3423 case UNSPEC:
3424 case UNSPEC_VOLATILE:
3425 h = h * 251 + XINT (x, 1);
79e68feb
RS
3426 break;
3427
3428 default:
fdf473ae 3429 break;
79e68feb
RS
3430 }
3431
3234b52d
RH
3432 hp = data;
3433 *hp = *hp * 509 + h;
3434 return 0;
79e68feb
RS
3435}
3436
3234b52d 3437/* Compute a hash value for X, which should be a constant. */
57632c51 3438
3234b52d
RH
3439static hashval_t
3440const_rtx_hash (rtx x)
57632c51 3441{
3234b52d
RH
3442 hashval_t h = 0;
3443 for_each_rtx (&x, const_rtx_hash_1, &h);
3444 return h;
57632c51
RS
3445}
3446
3234b52d 3447\f
1d3dbd99
RS
3448/* Create and return a new rtx constant pool. */
3449
3450static struct rtx_constant_pool *
3451create_constant_pool (void)
3452{
3453 struct rtx_constant_pool *pool;
3454
3455 pool = ggc_alloc (sizeof (struct rtx_constant_pool));
3456 pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
3457 const_desc_rtx_eq, NULL);
3458 pool->first = NULL;
3459 pool->last = NULL;
3460 pool->offset = 0;
3461 return pool;
3462}
3463
3234b52d 3464/* Initialize constant pool hashing for a new function. */
79e68feb 3465
3234b52d
RH
3466void
3467init_varasm_status (struct function *f)
79e68feb 3468{
3234b52d 3469 struct varasm_status *p;
79e68feb 3470
3234b52d
RH
3471 p = ggc_alloc (sizeof (struct varasm_status));
3472 f->varasm = p;
79e68feb 3473
1d3dbd99 3474 p->pool = create_constant_pool ();
3234b52d 3475 p->deferred_constants = 0;
79e68feb 3476}
3234b52d
RH
3477\f
3478/* Given a MINUS expression, simplify it if both sides
3479 include the same symbol. */
79e68feb 3480
3234b52d
RH
3481rtx
3482simplify_subtraction (rtx x)
79e68feb 3483{
3234b52d
RH
3484 rtx r = simplify_rtx (x);
3485 return r ? r : x;
79e68feb
RS
3486}
3487\f
3488/* Given a constant rtx X, make (or find) a memory constant for its value
3489 and return a MEM rtx to refer to it in memory. */
3490
3491rtx
2e1eedd6 3492force_const_mem (enum machine_mode mode, rtx x)
79e68feb 3493{
3234b52d 3494 struct constant_descriptor_rtx *desc, tmp;
1d3dbd99 3495 struct rtx_constant_pool *pool;
79e68feb 3496 char label[256];
52859c77 3497 rtx def, symbol;
3234b52d 3498 hashval_t hash;
a79e3a45 3499 unsigned int align;
3234b52d 3500 void **slot;
79e68feb 3501
3a04ff64 3502 /* If we're not allowed to drop X into the constant pool, don't. */
5fd9b178 3503 if (targetm.cannot_force_const_mem (x))
3a04ff64
RH
3504 return NULL_RTX;
3505
1d3dbd99
RS
3506 /* Record that this function has used a constant pool entry. */
3507 current_function_uses_const_pool = 1;
3508
3509 /* Decide which pool to use. */
3510 pool = (targetm.use_blocks_for_constant_p (mode, x)
3511 ? shared_constant_pool
3512 : cfun->varasm->pool);
3513
3234b52d
RH
3514 /* Lookup the value in the hashtable. */
3515 tmp.constant = x;
3516 tmp.mode = mode;
3517 hash = const_rtx_hash (x);
3518 slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
3519 desc = *slot;
083cad55 3520
3234b52d
RH
3521 /* If the constant was already present, return its memory. */
3522 if (desc)
3523 return copy_rtx (desc->mem);
3524
3525 /* Otherwise, create a new descriptor. */
3526 desc = ggc_alloc (sizeof (*desc));
3527 *slot = desc;
c26fbbca 3528
a79e3a45
RK
3529 /* Align the location counter as required by EXP's data type. */
3530 align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
e5e8a8bf 3531#ifdef CONSTANT_ALIGNMENT
1063147c 3532 {
ae2bcd98 3533 tree type = lang_hooks.types.type_for_mode (mode, 0);
1063147c
RS
3534 if (type != NULL_TREE)
3535 align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
3536 }
e5e8a8bf 3537#endif
79e68feb 3538
3234b52d
RH
3539 pool->offset += (align / BITS_PER_UNIT) - 1;
3540 pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3541
3542 desc->next = NULL;
3543 desc->constant = tmp.constant;
3544 desc->offset = pool->offset;
3545 desc->hash = hash;
3546 desc->mode = mode;
3547 desc->align = align;
3548 desc->labelno = const_labelno;
3549 desc->mark = 0;
3550
3551 pool->offset += GET_MODE_SIZE (mode);
3552 if (pool->last)
3553 pool->last->next = desc;
a79e3a45 3554 else
3234b52d
RH
3555 pool->first = pool->last = desc;
3556 pool->last = desc;
79e68feb 3557
a79e3a45
RK
3558 /* Create a string containing the label name, in LABEL. */
3559 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
a79e3a45 3560 ++const_labelno;
79e68feb 3561
3234b52d
RH
3562 /* Construct the SYMBOL_REF. Make sure to mark it as belonging to
3563 the constants pool. */
aacd3885
RS
3564 if (use_object_blocks_p () && targetm.use_blocks_for_constant_p (mode, x))
3565 {
3566 section *sect = targetm.asm_out.select_rtx_section (mode, x, align);
3567 symbol = create_block_symbol (ggc_strdup (label),
3568 get_block_for_section (sect), -1);
3569 }
3570 else
3571 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3572 desc->sym = symbol;
3573 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
3234b52d 3574 CONSTANT_POOL_ADDRESS_P (symbol) = 1;
929e5e5b 3575 SET_SYMBOL_REF_CONSTANT (symbol, desc);
3234b52d 3576
3234b52d 3577 /* Construct the MEM. */
542a8afa 3578 desc->mem = def = gen_const_mem (mode, symbol);
ae2bcd98 3579 set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
d5606ec9 3580 set_mem_align (def, align);
289c5b45 3581
3234b52d
RH
3582 /* If we're dropping a label to the constant pool, make sure we
3583 don't delete it. */
3584 if (GET_CODE (x) == LABEL_REF)
3585 LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
79e68feb 3586
21e9fc47 3587 return copy_rtx (def);
79e68feb
RS
3588}
3589\f
79e68feb
RS
3590/* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3591
3592rtx
2e1eedd6 3593get_pool_constant (rtx addr)
79e68feb 3594{
c185c797 3595 return SYMBOL_REF_CONSTANT (addr)->constant;
36edd3cc
BS
3596}
3597
149d6f9e
JJ
3598/* Given a constant pool SYMBOL_REF, return the corresponding constant
3599 and whether it has been output or not. */
3600
3601rtx
2e1eedd6 3602get_pool_constant_mark (rtx addr, bool *pmarked)
149d6f9e 3603{
3234b52d
RH
3604 struct constant_descriptor_rtx *desc;
3605
c185c797 3606 desc = SYMBOL_REF_CONSTANT (addr);
3234b52d
RH
3607 *pmarked = (desc->mark != 0);
3608 return desc->constant;
149d6f9e
JJ
3609}
3610
79e68feb
RS
3611/* Similar, return the mode. */
3612
3613enum machine_mode
f7d504c2 3614get_pool_mode (const_rtx addr)
79e68feb 3615{
c185c797 3616 return SYMBOL_REF_CONSTANT (addr)->mode;
36edd3cc
BS
3617}
3618
79e68feb
RS
3619/* Return the size of the constant pool. */
3620
3621int
2e1eedd6 3622get_pool_size (void)
79e68feb 3623{
3234b52d 3624 return cfun->varasm->pool->offset;
79e68feb
RS
3625}
3626\f
3234b52d
RH
3627/* Worker function for output_constant_pool_1. Emit assembly for X
3628 in MODE with known alignment ALIGN. */
79e68feb 3629
3234b52d
RH
3630static void
3631output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
79e68feb 3632{
3234b52d 3633 switch (GET_MODE_CLASS (mode))
79e68feb 3634 {
3234b52d 3635 case MODE_FLOAT:
15ed7b52 3636 case MODE_DECIMAL_FLOAT:
fbc848cc
NS
3637 {
3638 REAL_VALUE_TYPE r;
083cad55 3639
fbc848cc
NS
3640 gcc_assert (GET_CODE (x) == CONST_DOUBLE);
3641 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3642 assemble_real (r, mode, align);
3643 break;
3644 }
083cad55 3645
3234b52d
RH
3646 case MODE_INT:
3647 case MODE_PARTIAL_INT:
091a3ac7
CF
3648 case MODE_FRACT:
3649 case MODE_UFRACT:
3650 case MODE_ACCUM:
3651 case MODE_UACCUM:
3234b52d
RH
3652 assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3653 break;
79e68feb 3654
3234b52d
RH
3655 case MODE_VECTOR_FLOAT:
3656 case MODE_VECTOR_INT:
091a3ac7
CF
3657 case MODE_VECTOR_FRACT:
3658 case MODE_VECTOR_UFRACT:
3659 case MODE_VECTOR_ACCUM:
3660 case MODE_VECTOR_UACCUM:
3234b52d
RH
3661 {
3662 int i, units;
3663 enum machine_mode submode = GET_MODE_INNER (mode);
3664 unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
79e68feb 3665
fbc848cc 3666 gcc_assert (GET_CODE (x) == CONST_VECTOR);
3234b52d 3667 units = CONST_VECTOR_NUNITS (x);
79e68feb 3668
3234b52d 3669 for (i = 0; i < units; i++)
69ef87e2 3670 {
3234b52d
RH
3671 rtx elt = CONST_VECTOR_ELT (x, i);
3672 output_constant_pool_2 (submode, elt, i ? subalign : align);
69ef87e2 3673 }
3234b52d
RH
3674 }
3675 break;
69ef87e2 3676
3234b52d 3677 default:
fbc848cc 3678 gcc_unreachable ();
3234b52d
RH
3679 }
3680}
69ef87e2 3681
aacd3885
RS
3682/* Worker function for output_constant_pool. Emit constant DESC,
3683 giving it ALIGN bits of alignment. */
69ef87e2 3684
3234b52d 3685static void
aacd3885
RS
3686output_constant_pool_1 (struct constant_descriptor_rtx *desc,
3687 unsigned int align)
3234b52d
RH
3688{
3689 rtx x, tmp;
69ef87e2 3690
3234b52d
RH
3691 x = desc->constant;
3692
3693 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3694 whose CODE_LABEL has been deleted. This can occur if a jump table
3695 is eliminated by optimization. If so, write a constant of zero
3696 instead. Note that this can also happen by turning the
3697 CODE_LABEL into a NOTE. */
3698 /* ??? This seems completely and utterly wrong. Certainly it's
3699 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3700 functioning even with INSN_DELETED_P and friends. */
3701
3702 tmp = x;
3703 switch (GET_CODE (x))
3704 {
3705 case CONST:
3706 if (GET_CODE (XEXP (x, 0)) != PLUS
3707 || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3708 break;
3709 tmp = XEXP (XEXP (x, 0), 0);
3710 /* FALLTHRU */
69ef87e2 3711
3234b52d
RH
3712 case LABEL_REF:
3713 tmp = XEXP (x, 0);
fbc848cc
NS
3714 gcc_assert (!INSN_DELETED_P (tmp));
3715 gcc_assert (!NOTE_P (tmp)
a38e7aa5 3716 || NOTE_KIND (tmp) != NOTE_INSN_DELETED);
3234b52d 3717 break;
79e68feb 3718
3234b52d
RH
3719 default:
3720 break;
3721 }
3722
29a82058 3723#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3234b52d 3724 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
aacd3885 3725 align, desc->labelno, done);
29a82058 3726#endif
7f83c0e7 3727
aacd3885 3728 assemble_align (align);
5c8c0abd 3729
3234b52d 3730 /* Output the label. */
5fd9b178 3731 targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
91674c37 3732
3234b52d 3733 /* Output the data. */
aacd3885 3734 output_constant_pool_2 (desc->mode, x, align);
91674c37 3735
3234b52d
RH
3736 /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3737 sections have proper size. */
aacd3885 3738 if (align > GET_MODE_BITSIZE (desc->mode)
d6b5193b
RS
3739 && in_section
3740 && (in_section->common.flags & SECTION_MERGE))
aacd3885 3741 assemble_align (align);
91674c37 3742
3234b52d
RH
3743#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3744 done:
3745#endif
3746 return;
3747}
91674c37 3748
3234b52d
RH
3749/* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3750 to as used. Emit referenced deferred strings. This function can
3751 be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */
d2ce9169 3752
3234b52d 3753static int
1d3dbd99 3754mark_constant (rtx *current_rtx, void *data ATTRIBUTE_UNUSED)
3234b52d 3755{
3234b52d 3756 rtx x = *current_rtx;
91674c37 3757
3234b52d
RH
3758 if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3759 return 0;
afdfb380 3760
3234b52d
RH
3761 if (CONSTANT_POOL_ADDRESS_P (x))
3762 {
c185c797 3763 struct constant_descriptor_rtx *desc = SYMBOL_REF_CONSTANT (x);
3234b52d
RH
3764 if (desc->mark == 0)
3765 {
3766 desc->mark = 1;
1d3dbd99 3767 for_each_rtx (&desc->constant, mark_constant, NULL);
3234b52d 3768 }
afdfb380 3769 }
3234b52d
RH
3770 else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3771 {
3772 tree exp = SYMBOL_REF_DECL (x);
3773 if (!TREE_ASM_WRITTEN (exp))
3774 {
3775 n_deferred_constants--;
3776 output_constant_def_contents (x);
3777 }
3778 }
3779
3780 return -1;
083cad55 3781}
91674c37 3782
3234b52d 3783/* Look through appropriate parts of INSN, marking all entries in the
fcbd8ef2
JO
3784 constant pool which are actually being used. Entries that are only
3785 referenced by other constants are also marked as used. Emit
3786 deferred strings that are used. */
3787
91674c37 3788static void
1d3dbd99 3789mark_constants (rtx insn)
91674c37 3790{
3234b52d 3791 if (!INSN_P (insn))
91674c37
ILT
3792 return;
3793
91674c37
ILT
3794 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3795 insns, not any notes that may be attached. We don't want to mark
3796 a constant just because it happens to appear in a REG_EQUIV note. */
3234b52d 3797 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
91674c37 3798 {
3234b52d
RH
3799 rtx seq = PATTERN (insn);
3800 int i, n = XVECLEN (seq, 0);
3801 for (i = 0; i < n; ++i)
3802 {
3803 rtx subinsn = XVECEXP (seq, 0, i);
3804 if (INSN_P (subinsn))
1d3dbd99 3805 for_each_rtx (&PATTERN (subinsn), mark_constant, NULL);
3234b52d 3806 }
91674c37 3807 }
3234b52d 3808 else
1d3dbd99 3809 for_each_rtx (&PATTERN (insn), mark_constant, NULL);
3234b52d 3810}
91674c37 3811
3234b52d
RH
3812/* Look through the instructions for this function, and mark all the
3813 entries in POOL which are actually being used. Emit deferred constants
3814 which have indeed been used. */
91674c37 3815
3234b52d 3816static void
1d3dbd99 3817mark_constant_pool (void)
3234b52d
RH
3818{
3819 rtx insn, link;
91674c37 3820
1d3dbd99 3821 if (!current_function_uses_const_pool && n_deferred_constants == 0)
3234b52d 3822 return;
91674c37 3823
3234b52d 3824 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1d3dbd99 3825 mark_constants (insn);
91674c37 3826
3234b52d
RH
3827 for (link = current_function_epilogue_delay_list;
3828 link;
3829 link = XEXP (link, 1))
1d3dbd99 3830 mark_constants (XEXP (link, 0));
91674c37 3831}
fcbd8ef2 3832
1d3dbd99 3833/* Write all the constants in POOL. */
fcbd8ef2 3834
1d3dbd99
RS
3835static void
3836output_constant_pool_contents (struct rtx_constant_pool *pool)
fcbd8ef2 3837{
3234b52d 3838 struct constant_descriptor_rtx *desc;
fcbd8ef2 3839
3234b52d 3840 for (desc = pool->first; desc ; desc = desc->next)
aacd3885
RS
3841 if (desc->mark)
3842 {
3843 /* If the constant is part of an object_block, make sure that
3844 the constant has been positioned within its block, but do not
3845 write out its definition yet. output_object_blocks will do
3846 that later. */
3fa9c136
RS
3847 if (SYMBOL_REF_HAS_BLOCK_INFO_P (desc->sym)
3848 && SYMBOL_REF_BLOCK (desc->sym))
aacd3885
RS
3849 place_block_symbol (desc->sym);
3850 else
3851 {
3852 switch_to_section (targetm.asm_out.select_rtx_section
3853 (desc->mode, desc->constant, desc->align));
3854 output_constant_pool_1 (desc, desc->align);
3855 }
3856 }
1d3dbd99
RS
3857}
3858
3859/* Mark all constants that are used in the current function, then write
3860 out the function's private constant pool. */
3861
3862static void
c16ba1d5
RS
3863output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3864 tree fndecl ATTRIBUTE_UNUSED)
1d3dbd99
RS
3865{
3866 struct rtx_constant_pool *pool = cfun->varasm->pool;
3867
3868 /* It is possible for gcc to call force_const_mem and then to later
3869 discard the instructions which refer to the constant. In such a
3870 case we do not need to output the constant. */
3871 mark_constant_pool ();
3872
3873#ifdef ASM_OUTPUT_POOL_PROLOGUE
3874 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3875#endif
3876
3877 output_constant_pool_contents (pool);
3234b52d
RH
3878
3879#ifdef ASM_OUTPUT_POOL_EPILOGUE
3880 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3881#endif
fcbd8ef2 3882}
79e68feb 3883\f
1d3dbd99
RS
3884/* Write the contents of the shared constant pool. */
3885
3886void
3887output_shared_constant_pool (void)
3888{
3889 output_constant_pool_contents (shared_constant_pool);
3890}
3891\f
b2218cc1 3892/* Determine what kind of relocations EXP may need. */
79e68feb 3893
b2218cc1
AO
3894int
3895compute_reloc_for_constant (tree exp)
79e68feb 3896{
7eca317a 3897 int reloc = 0, reloc2;
ac79cd5a 3898 tree tem;
79e68feb
RS
3899
3900 switch (TREE_CODE (exp))
3901 {
3902 case ADDR_EXPR:
5d056e9b 3903 case FDESC_EXPR:
ac79cd5a
RK
3904 /* Go inside any operations that get_inner_reference can handle and see
3905 if what's inside is a constant: no need to do anything here for
3906 addresses of variables or functions. */
3907 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3908 tem = TREE_OPERAND (tem, 0))
3909 ;
79e68feb 3910
d2c35e67
JH
3911 if (TREE_PUBLIC (tem))
3912 reloc |= 2;
3913 else
3914 reloc |= 1;
79e68feb
RS
3915 break;
3916
3917 case PLUS_EXPR:
5be014d5 3918 case POINTER_PLUS_EXPR:
b2218cc1
AO
3919 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3920 reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
79e68feb
RS
3921 break;
3922
7eca317a 3923 case MINUS_EXPR:
b2218cc1
AO
3924 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3925 reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
7eca317a
JJ
3926 /* The difference of two local labels is computable at link time. */
3927 if (reloc == 1 && reloc2 == 1)
3928 reloc = 0;
3929 else
3930 reloc |= reloc2;
3931 break;
3932
79e68feb
RS
3933 case NOP_EXPR:
3934 case CONVERT_EXPR:
37a52112 3935 case NON_LVALUE_EXPR:
0d26b2ff 3936 case VIEW_CONVERT_EXPR:
b2218cc1 3937 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
79e68feb
RS
3938 break;
3939
3940 case CONSTRUCTOR:
4038c495
GB
3941 {
3942 unsigned HOST_WIDE_INT idx;
3943 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
3944 if (tem != 0)
3945 reloc |= compute_reloc_for_constant (tem);
3946 }
79e68feb
RS
3947 break;
3948
e9a25f70 3949 default:
79e68feb
RS
3950 break;
3951 }
3952 return reloc;
3953}
b2218cc1
AO
3954
3955/* Find all the constants whose addresses are referenced inside of EXP,
3956 and make sure assembler code with a label has been output for each one.
3957 Indicate whether an ADDR_EXPR has been encountered. */
3958
3959static void
3960output_addressed_constants (tree exp)
3961{
3962 tree tem;
3963
b2218cc1
AO
3964 switch (TREE_CODE (exp))
3965 {
3966 case ADDR_EXPR:
3967 case FDESC_EXPR:
3968 /* Go inside any operations that get_inner_reference can handle and see
3969 if what's inside is a constant: no need to do anything here for
3970 addresses of variables or functions. */
3971 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3972 tem = TREE_OPERAND (tem, 0))
3973 ;
3974
2256aa1c
ZL
3975 /* If we have an initialized CONST_DECL, retrieve the initializer. */
3976 if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem))
3977 tem = DECL_INITIAL (tem);
3978
6615c446 3979 if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
b2218cc1
AO
3980 output_constant_def (tem, 0);
3981 break;
3982
3983 case PLUS_EXPR:
5be014d5 3984 case POINTER_PLUS_EXPR:
b2218cc1
AO
3985 case MINUS_EXPR:
3986 output_addressed_constants (TREE_OPERAND (exp, 1));
3987 /* Fall through. */
3988
3989 case NOP_EXPR:
3990 case CONVERT_EXPR:
3991 case NON_LVALUE_EXPR:
0d26b2ff 3992 case VIEW_CONVERT_EXPR:
b2218cc1
AO
3993 output_addressed_constants (TREE_OPERAND (exp, 0));
3994 break;
3995
3996 case CONSTRUCTOR:
4038c495
GB
3997 {
3998 unsigned HOST_WIDE_INT idx;
3999 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
4000 if (tem != 0)
4001 output_addressed_constants (tem);
4002 }
b2218cc1
AO
4003 break;
4004
4005 default:
4006 break;
4007 }
4008}
79e68feb 4009\f
fe24d485
OH
4010/* Whether a constructor CTOR is a valid static constant initializer if all
4011 its elements are. This used to be internal to initializer_constant_valid_p
4012 and has been exposed to let other functions like categorize_ctor_elements
4013 evaluate the property while walking a constructor for other purposes. */
4014
4015bool
fa233e34 4016constructor_static_from_elts_p (const_tree ctor)
fe24d485
OH
4017{
4018 return (TREE_CONSTANT (ctor)
4019 && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE
4020 || TREE_CODE (TREE_TYPE (ctor)) == RECORD_TYPE)
4021 && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor)));
4022}
4023
14a774a9
RK
4024/* Return nonzero if VALUE is a valid constant-valued expression
4025 for use in initializing a static variable; one that can be an
4026 element of a "constant" initializer.
4027
4028 Return null_pointer_node if the value is absolute;
4029 if it is relocatable, return the variable that determines the relocation.
4030 We assume that VALUE has been folded as much as possible;
4031 therefore, we do not need to check for such things as
4032 arithmetic-combinations of integers. */
4033
4034tree
2e1eedd6 4035initializer_constant_valid_p (tree value, tree endtype)
14a774a9
RK
4036{
4037 switch (TREE_CODE (value))
4038 {
4039 case CONSTRUCTOR:
fe24d485 4040 if (constructor_static_from_elts_p (value))
cf9ad9a7 4041 {
4038c495 4042 unsigned HOST_WIDE_INT idx;
cf9ad9a7
MM
4043 tree elt;
4044 bool absolute = true;
4045
4038c495 4046 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
cf9ad9a7
MM
4047 {
4048 tree reloc;
4038c495 4049 reloc = initializer_constant_valid_p (elt, TREE_TYPE (elt));
cf9ad9a7
MM
4050 if (!reloc)
4051 return NULL_TREE;
4052 if (reloc != null_pointer_node)
4053 absolute = false;
4054 }
4055 /* For a non-absolute relocation, there is no single
4056 variable that can be "the variable that determines the
4057 relocation." */
4058 return absolute ? null_pointer_node : error_mark_node;
4059 }
46f9491e 4060
cf9ad9a7 4061 return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
14a774a9
RK
4062
4063 case INTEGER_CST:
69ef87e2 4064 case VECTOR_CST:
14a774a9 4065 case REAL_CST:
091a3ac7 4066 case FIXED_CST:
14a774a9
RK
4067 case STRING_CST:
4068 case COMPLEX_CST:
4069 return null_pointer_node;
4070
4071 case ADDR_EXPR:
67231816 4072 case FDESC_EXPR:
5cc200fc 4073 value = staticp (TREE_OPERAND (value, 0));
125f2a50
MM
4074 if (value)
4075 {
4076 /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to
4077 be a constant, this is old-skool offsetof-like nonsense. */
4078 if (TREE_CODE (value) == INDIRECT_REF
4079 && TREE_CONSTANT (TREE_OPERAND (value, 0)))
4080 return null_pointer_node;
4081 /* Taking the address of a nested function involves a trampoline. */
4082 if (TREE_CODE (value) == FUNCTION_DECL
da489f73
RH
4083 && decl_function_context (value)
4084 && !DECL_NO_STATIC_CHAIN (value))
125f2a50
MM
4085 return NULL_TREE;
4086 /* "&{...}" requires a temporary to hold the constructed
4087 object. */
4088 if (TREE_CODE (value) == CONSTRUCTOR)
4089 return NULL_TREE;
4090 }
5cc200fc 4091 return value;
14a774a9 4092
ed239f5a 4093 case VIEW_CONVERT_EXPR:
14a774a9
RK
4094 case NON_LVALUE_EXPR:
4095 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4096
4097 case CONVERT_EXPR:
4098 case NOP_EXPR:
9560cbde
MM
4099 {
4100 tree src;
4101 tree src_type;
4102 tree dest_type;
4103
4104 src = TREE_OPERAND (value, 0);
4105 src_type = TREE_TYPE (src);
4106 dest_type = TREE_TYPE (value);
4107
4108 /* Allow conversions between pointer types, floating-point
4109 types, and offset types. */
4110 if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type))
4111 || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type))
4112 || (TREE_CODE (dest_type) == OFFSET_TYPE
4113 && TREE_CODE (src_type) == OFFSET_TYPE))
4114 return initializer_constant_valid_p (src, endtype);
4115
4116 /* Allow length-preserving conversions between integer types. */
4117 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)
4118 && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type)))
4119 return initializer_constant_valid_p (src, endtype);
4120
4121 /* Allow conversions between other integer types only if
4122 explicit value. */
4123 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
4124 {
4125 tree inner = initializer_constant_valid_p (src, endtype);
4126 if (inner == null_pointer_node)
4127 return null_pointer_node;
4128 break;
4129 }
14a774a9 4130
9560cbde
MM
4131 /* Allow (int) &foo provided int is as wide as a pointer. */
4132 if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)
4133 && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)))
4134 return initializer_constant_valid_p (src, endtype);
4135
4136 /* Likewise conversions from int to pointers, but also allow
4137 conversions from 0. */
4138 if ((POINTER_TYPE_P (dest_type)
4139 || TREE_CODE (dest_type) == OFFSET_TYPE)
4140 && INTEGRAL_TYPE_P (src_type))
4141 {
971dfb9b
DD
4142 if (TREE_CODE (src) == INTEGER_CST
4143 && TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type))
4144 return null_pointer_node;
9560cbde
MM
4145 if (integer_zerop (src))
4146 return null_pointer_node;
4147 else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type))
4148 return initializer_constant_valid_p (src, endtype);
4149 }
14a774a9 4150
9560cbde
MM
4151 /* Allow conversions to struct or union types if the value
4152 inside is okay. */
4153 if (TREE_CODE (dest_type) == RECORD_TYPE
4154 || TREE_CODE (dest_type) == UNION_TYPE)
4155 return initializer_constant_valid_p (src, endtype);
4156 }
14a774a9
RK
4157 break;
4158
5be014d5 4159 case POINTER_PLUS_EXPR:
14a774a9
RK
4160 case PLUS_EXPR:
4161 if (! INTEGRAL_TYPE_P (endtype)
4162 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
c26fbbca 4163 {
14a774a9
RK
4164 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4165 endtype);
4166 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4167 endtype);
ff539210 4168 /* If either term is absolute, use the other term's relocation. */
14a774a9
RK
4169 if (valid0 == null_pointer_node)
4170 return valid1;
4171 if (valid1 == null_pointer_node)
4172 return valid0;
c26fbbca 4173 }
14a774a9
RK
4174 break;
4175
4176 case MINUS_EXPR:
4177 if (! INTEGRAL_TYPE_P (endtype)
4178 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
4179 {
4180 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4181 endtype);
4182 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4183 endtype);
4184 /* Win if second argument is absolute. */
4185 if (valid1 == null_pointer_node)
4186 return valid0;
4187 /* Win if both arguments have the same relocation.
4188 Then the value is absolute. */
4189 if (valid0 == valid1 && valid0 != 0)
4190 return null_pointer_node;
212addfa
JO
4191
4192 /* Since GCC guarantees that string constants are unique in the
4193 generated code, a subtraction between two copies of the same
4194 constant string is absolute. */
5cc200fc
RH
4195 if (valid0 && TREE_CODE (valid0) == STRING_CST
4196 && valid1 && TREE_CODE (valid1) == STRING_CST
4197 && operand_equal_p (valid0, valid1, 1))
212addfa 4198 return null_pointer_node;
14a774a9
RK
4199 }
4200
5cc200fc 4201 /* Support narrowing differences. */
14a774a9
RK
4202 if (INTEGRAL_TYPE_P (endtype))
4203 {
4204 tree op0, op1;
5cc200fc 4205
14a774a9
RK
4206 op0 = TREE_OPERAND (value, 0);
4207 op1 = TREE_OPERAND (value, 1);
fdf473ae
RH
4208
4209 /* Like STRIP_NOPS except allow the operand mode to widen.
14b493d6 4210 This works around a feature of fold that simplifies
fdf473ae
RH
4211 (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
4212 that the narrower operation is cheaper. */
4213
4214 while (TREE_CODE (op0) == NOP_EXPR
4215 || TREE_CODE (op0) == CONVERT_EXPR
4216 || TREE_CODE (op0) == NON_LVALUE_EXPR)
4217 {
4218 tree inner = TREE_OPERAND (op0, 0);
4219 if (inner == error_mark_node
4220 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4221 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
4222 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4223 break;
4224 op0 = inner;
4225 }
4226
4227 while (TREE_CODE (op1) == NOP_EXPR
4228 || TREE_CODE (op1) == CONVERT_EXPR
4229 || TREE_CODE (op1) == NON_LVALUE_EXPR)
4230 {
4231 tree inner = TREE_OPERAND (op1, 0);
4232 if (inner == error_mark_node
4233 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4234 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
4235 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4236 break;
4237 op1 = inner;
4238 }
14a774a9 4239
5cc200fc
RH
4240 op0 = initializer_constant_valid_p (op0, endtype);
4241 op1 = initializer_constant_valid_p (op1, endtype);
4242
4243 /* Both initializers must be known. */
4244 if (op0 && op1)
4245 {
4246 if (op0 == op1)
4247 return null_pointer_node;
4248
4249 /* Support differences between labels. */
4250 if (TREE_CODE (op0) == LABEL_DECL
4251 && TREE_CODE (op1) == LABEL_DECL)
4252 return null_pointer_node;
4253
4254 if (TREE_CODE (op0) == STRING_CST
4255 && TREE_CODE (op1) == STRING_CST
4256 && operand_equal_p (op0, op1, 1))
4257 return null_pointer_node;
4258 }
14a774a9
RK
4259 }
4260 break;
4261
4262 default:
4263 break;
4264 }
4265
4266 return 0;
4267}
4268\f
79e68feb
RS
4269/* Output assembler code for constant EXP to FILE, with no label.
4270 This includes the pseudo-op such as ".int" or ".byte", and a newline.
4271 Assumes output_addressed_constants has been done on EXP already.
4272
4273 Generate exactly SIZE bytes of assembler data, padding at the end
4274 with zeros if necessary. SIZE must always be specified.
4275
4276 SIZE is important for structure constructors,
4277 since trailing members may have been omitted from the constructor.
4278 It is also important for initialization of arrays from string constants
4279 since the full length of the string constant might not be wanted.
4280 It is also needed for initialization of unions, where the initializer's
4281 type is just one member, and that may not be as long as the union.
4282
4283 There a case in which we would fail to output exactly SIZE bytes:
4284 for a structure constructor that wants to produce more than SIZE bytes.
c8af3574
RH
4285 But such constructors will never be generated for any possible input.
4286
4287 ALIGN is the alignment of the data in bits. */
79e68feb
RS
4288
4289void
2e1eedd6 4290output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
79e68feb 4291{
ac79cd5a 4292 enum tree_code code;
58e15542 4293 unsigned HOST_WIDE_INT thissize;
79e68feb 4294
e9996db7 4295 if (size == 0 || flag_syntax_only)
79e68feb
RS
4296 return;
4297
57b51d4d 4298 /* See if we're trying to initialize a pointer in a non-default mode
056061d8
DD
4299 to the address of some declaration somewhere. If the target says
4300 the mode is valid for pointers, assume the target has a way of
4301 resolving it. */
4302 if (TREE_CODE (exp) == NOP_EXPR
4303 && POINTER_TYPE_P (TREE_TYPE (exp))
4304 && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
4305 {
4306 tree saved_type = TREE_TYPE (exp);
4307
4308 /* Peel off any intermediate conversions-to-pointer for valid
4309 pointer modes. */
4310 while (TREE_CODE (exp) == NOP_EXPR
4311 && POINTER_TYPE_P (TREE_TYPE (exp))
4312 && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
4313 exp = TREE_OPERAND (exp, 0);
4314
4315 /* If what we're left with is the address of something, we can
4316 convert the address to the final type and output it that
4317 way. */
4318 if (TREE_CODE (exp) == ADDR_EXPR)
4319 exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0));
971dfb9b
DD
4320 /* Likewise for constant ints. */
4321 else if (TREE_CODE (exp) == INTEGER_CST)
4322 exp = build_int_cst_wide (saved_type, TREE_INT_CST_LOW (exp),
4323 TREE_INT_CST_HIGH (exp));
4324
056061d8
DD
4325 }
4326
ac79cd5a
RK
4327 /* Eliminate any conversions since we'll be outputting the underlying
4328 constant. */
4329 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
ed239f5a
RK
4330 || TREE_CODE (exp) == NON_LVALUE_EXPR
4331 || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
056061d8
DD
4332 {
4333 HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp));
4334 HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0)));
4335
69fcfd68 4336 /* Make sure eliminating the conversion is really a no-op, except with
f7952e0a
EB
4337 VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and
4338 union types to allow for Ada unchecked unions. */
e2953e41 4339 if (type_size > op_size
f7952e0a
EB
4340 && TREE_CODE (exp) != VIEW_CONVERT_EXPR
4341 && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE)
df20ea24
JM
4342 /* Keep the conversion. */
4343 break;
4344 else
4345 exp = TREE_OPERAND (exp, 0);
056061d8 4346 }
ac79cd5a
RK
4347
4348 code = TREE_CODE (TREE_TYPE (exp));
4349 thissize = int_size_in_bytes (TREE_TYPE (exp));
be1ad04c 4350
fff9e713
MT
4351 /* Allow a constructor with no elements for any data type.
4352 This means to fill the space with zeros. */
4038c495
GB
4353 if (TREE_CODE (exp) == CONSTRUCTOR
4354 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (exp)))
fff9e713 4355 {
b93a436e 4356 assemble_zeros (size);
fff9e713
MT
4357 return;
4358 }
4359
67231816
RH
4360 if (TREE_CODE (exp) == FDESC_EXPR)
4361 {
f42f3c2d 4362#ifdef ASM_OUTPUT_FDESC
67231816
RH
4363 HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
4364 tree decl = TREE_OPERAND (exp, 0);
67231816
RH
4365 ASM_OUTPUT_FDESC (asm_out_file, decl, part);
4366#else
fbc848cc 4367 gcc_unreachable ();
67231816
RH
4368#endif
4369 return;
4370 }
4371
ac79cd5a 4372 /* Now output the underlying data. If we've handling the padding, return.
42048866 4373 Otherwise, break and ensure SIZE is the size written. */
79e68feb
RS
4374 switch (code)
4375 {
644ea577 4376 case BOOLEAN_TYPE:
79e68feb
RS
4377 case INTEGER_TYPE:
4378 case ENUMERAL_TYPE:
4379 case POINTER_TYPE:
4380 case REFERENCE_TYPE:
a5ac359a 4381 case OFFSET_TYPE:
091a3ac7 4382 case FIXED_POINT_TYPE:
37366632 4383 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
79e68feb 4384 EXPAND_INITIALIZER),
42048866 4385 MIN (size, thissize), align, 0))
091a3ac7 4386 error ("initializer for integer/fixed-point value is too complicated");
79e68feb
RS
4387 break;
4388
4389 case REAL_TYPE:
4390 if (TREE_CODE (exp) != REAL_CST)
4391 error ("initializer for floating value is not a floating constant");
4392
02befdf4 4393 assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
79e68feb
RS
4394 break;
4395
4396 case COMPLEX_TYPE:
ac79cd5a
RK
4397 output_constant (TREE_REALPART (exp), thissize / 2, align);
4398 output_constant (TREE_IMAGPART (exp), thissize / 2,
4399 min_align (align, BITS_PER_UNIT * (thissize / 2)));
79e68feb
RS
4400 break;
4401
4402 case ARRAY_TYPE:
e6834654 4403 case VECTOR_TYPE:
fbc848cc 4404 switch (TREE_CODE (exp))
79e68feb 4405 {
fbc848cc 4406 case CONSTRUCTOR:
c8af3574 4407 output_constructor (exp, size, align);
79e68feb 4408 return;
fbc848cc 4409 case STRING_CST:
58e15542
JH
4410 thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
4411 size);
ac79cd5a 4412 assemble_string (TREE_STRING_POINTER (exp), thissize);
fbc848cc 4413 break;
d744e06e 4414
fbc848cc
NS
4415 case VECTOR_CST:
4416 {
4417 int elt_size;
4418 tree link;
4419 unsigned int nalign;
4420 enum machine_mode inner;
083cad55 4421
fbc848cc
NS
4422 inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
4423 nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
083cad55 4424
fbc848cc 4425 elt_size = GET_MODE_SIZE (inner);
083cad55 4426
fbc848cc
NS
4427 link = TREE_VECTOR_CST_ELTS (exp);
4428 output_constant (TREE_VALUE (link), elt_size, align);
86a0f642 4429 thissize = elt_size;
fbc848cc 4430 while ((link = TREE_CHAIN (link)) != NULL)
86a0f642
JJ
4431 {
4432 output_constant (TREE_VALUE (link), elt_size, nalign);
4433 thissize += elt_size;
4434 }
fbc848cc
NS
4435 break;
4436 }
4437 default:
4438 gcc_unreachable ();
d744e06e 4439 }
79e68feb
RS
4440 break;
4441
4442 case RECORD_TYPE:
4443 case UNION_TYPE:
fbc848cc
NS
4444 gcc_assert (TREE_CODE (exp) == CONSTRUCTOR);
4445 output_constructor (exp, size, align);
79e68feb 4446 return;
474bda6c 4447
0974a3b8
RK
4448 case ERROR_MARK:
4449 return;
4450
e9a25f70 4451 default:
fbc848cc 4452 gcc_unreachable ();
79e68feb
RS
4453 }
4454
d3e0dffb
JH
4455 if (size > thissize)
4456 assemble_zeros (size - thissize);
79e68feb 4457}
ca695ac9 4458
79e68feb 4459\f
a25f1211
RH
4460/* Subroutine of output_constructor, used for computing the size of
4461 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
4462 type with an unspecified upper bound. */
4463
ffc5c6a9 4464static unsigned HOST_WIDE_INT
2e1eedd6 4465array_size_for_constructor (tree val)
a25f1211
RH
4466{
4467 tree max_index, i;
4038c495 4468 unsigned HOST_WIDE_INT cnt;
b6f65e3c 4469 tree index, value, tmp;
a25f1211 4470
ac79cd5a
RK
4471 /* This code used to attempt to handle string constants that are not
4472 arrays of single-bytes, but nothing else does, so there's no point in
4473 doing it here. */
b6fc7110 4474 if (TREE_CODE (val) == STRING_CST)
ac79cd5a
RK
4475 return TREE_STRING_LENGTH (val);
4476
a25f1211 4477 max_index = NULL_TREE;
4038c495 4478 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value)
a25f1211 4479 {
a25f1211
RH
4480 if (TREE_CODE (index) == RANGE_EXPR)
4481 index = TREE_OPERAND (index, 1);
4482 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4483 max_index = index;
4484 }
4485
a25f1211 4486 if (max_index == NULL_TREE)
ffc5c6a9 4487 return 0;
a25f1211
RH
4488
4489 /* Compute the total number of array elements. */
b6f65e3c
RS
4490 tmp = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)));
4491 i = size_binop (MINUS_EXPR, fold_convert (sizetype, max_index),
4492 fold_convert (sizetype, tmp));
57decb7e 4493 i = size_binop (PLUS_EXPR, i, build_int_cst (sizetype, 1));
a25f1211
RH
4494
4495 /* Multiply by the array element unit size to find number of bytes. */
ffc5c6a9 4496 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
a25f1211
RH
4497
4498 return tree_low_cst (i, 1);
4499}
4500
4501/* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
79e68feb
RS
4502 Generate at least SIZE bytes, padding if necessary. */
4503
5a13eaa4 4504static void
2e1eedd6
AJ
4505output_constructor (tree exp, unsigned HOST_WIDE_INT size,
4506 unsigned int align)
79e68feb 4507{
85f3d674 4508 tree type = TREE_TYPE (exp);
4038c495 4509 tree field = 0;
85f3d674 4510 tree min_index = 0;
79e68feb
RS
4511 /* Number of bytes output or skipped so far.
4512 In other words, current position within the constructor. */
85f3d674 4513 HOST_WIDE_INT total_bytes = 0;
272d0bee 4514 /* Nonzero means BYTE contains part of a byte, to be output. */
79e68feb 4515 int byte_buffer_in_use = 0;
b3694847 4516 int byte = 0;
4038c495
GB
4517 unsigned HOST_WIDE_INT cnt;
4518 constructor_elt *ce;
79e68feb 4519
fbc848cc 4520 gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT);
79e68feb 4521
85f3d674
RK
4522 if (TREE_CODE (type) == RECORD_TYPE)
4523 field = TYPE_FIELDS (type);
79e68feb 4524
85f3d674
RK
4525 if (TREE_CODE (type) == ARRAY_TYPE
4526 && TYPE_DOMAIN (type) != 0)
4527 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
13b457e7 4528
79e68feb
RS
4529 /* As LINK goes through the elements of the constant,
4530 FIELD goes through the structure fields, if the constant is a structure.
4531 if the constant is a union, then we override this,
4532 by getting the field from the TREE_LIST element.
43f7bed5
VM
4533 But the constant could also be an array. Then FIELD is zero.
4534
4535 There is always a maximum of one element in the chain LINK for unions
4536 (even if the initializer in a source program incorrectly contains
2d76cb1a 4537 more one). */
4038c495
GB
4538 for (cnt = 0;
4539 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), cnt, ce);
4540 cnt++, field = field ? TREE_CHAIN (field) : 0)
79e68feb 4541 {
4038c495 4542 tree val = ce->value;
3181cbfd
RS
4543 tree index = 0;
4544
85f3d674
RK
4545 /* The element in a union constructor specifies the proper field
4546 or index. */
4547 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
4548 || TREE_CODE (type) == QUAL_UNION_TYPE)
4038c495
GB
4549 && ce->index != 0)
4550 field = ce->index;
3181cbfd 4551
85f3d674 4552 else if (TREE_CODE (type) == ARRAY_TYPE)
4038c495 4553 index = ce->index;
3181cbfd 4554
907393db 4555#ifdef ASM_COMMENT_START
bce988a2
AH
4556 if (field && flag_verbose_asm)
4557 fprintf (asm_out_file, "%s %s:\n",
083cad55
EC
4558 ASM_COMMENT_START,
4559 DECL_NAME (field)
bce988a2
AH
4560 ? IDENTIFIER_POINTER (DECL_NAME (field))
4561 : "<anonymous>");
907393db 4562#endif
bce988a2 4563
79e68feb 4564 /* Eliminate the marker that makes a cast not be an lvalue. */
d964285c
CH
4565 if (val != 0)
4566 STRIP_NOPS (val);
79e68feb 4567
8311a11f
PB
4568 if (index && TREE_CODE (index) == RANGE_EXPR)
4569 {
bf1aaf0a 4570 unsigned HOST_WIDE_INT fieldsize
85f3d674
RK
4571 = int_size_in_bytes (TREE_TYPE (type));
4572 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
4573 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
8311a11f 4574 HOST_WIDE_INT index;
c8af3574 4575 unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
85f3d674 4576
8311a11f
PB
4577 for (index = lo_index; index <= hi_index; index++)
4578 {
4579 /* Output the element's initial value. */
4580 if (val == 0)
4581 assemble_zeros (fieldsize);
4582 else
c8af3574 4583 output_constant (val, fieldsize, align2);
8311a11f
PB
4584
4585 /* Count its size. */
4586 total_bytes += fieldsize;
4587 }
4588 }
4589 else if (field == 0 || !DECL_BIT_FIELD (field))
79e68feb 4590 {
3181cbfd
RS
4591 /* An element that is not a bit-field. */
4592
bf1aaf0a 4593 unsigned HOST_WIDE_INT fieldsize;
79e68feb
RS
4594 /* Since this structure is static,
4595 we know the positions are constant. */
85f3d674 4596 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
c8af3574 4597 unsigned int align2;
770ae6cc 4598
3181cbfd 4599 if (index != 0)
85f3d674
RK
4600 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4601 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
79e68feb 4602
3181cbfd 4603 /* Output any buffered-up bit-fields preceding this element. */
79e68feb
RS
4604 if (byte_buffer_in_use)
4605 {
eac50d7a 4606 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4607 total_bytes++;
4608 byte_buffer_in_use = 0;
4609 }
4610
4611 /* Advance to offset of this element.
4612 Note no alignment needed in an array, since that is guaranteed
4613 if each element has the proper size. */
85f3d674 4614 if ((field != 0 || index != 0) && pos != total_bytes)
79e68feb 4615 {
4038c495 4616 gcc_assert (pos >= total_bytes);
85f3d674
RK
4617 assemble_zeros (pos - total_bytes);
4618 total_bytes = pos;
79e68feb 4619 }
ca2eed21 4620
c8af3574
RH
4621 /* Find the alignment of this element. */
4622 align2 = min_align (align, BITS_PER_UNIT * pos);
46f9491e 4623
79e68feb
RS
4624 /* Determine size this element should occupy. */
4625 if (field)
a25f1211 4626 {
ffc5c6a9
RH
4627 fieldsize = 0;
4628
4629 /* If this is an array with an unspecified upper bound,
4630 the initializer determines the size. */
4631 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4632 but we cannot do this until the deprecated support for
4633 initializing zero-length array members is removed. */
4634 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4635 && TYPE_DOMAIN (TREE_TYPE (field))
4636 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4637 {
a25f1211 4638 fieldsize = array_size_for_constructor (val);
ffc5c6a9
RH
4639 /* Given a non-empty initialization, this field had
4640 better be last. */
fbc848cc 4641 gcc_assert (!fieldsize || !TREE_CHAIN (field));
ffc5c6a9
RH
4642 }
4643 else if (DECL_SIZE_UNIT (field))
4644 {
4645 /* ??? This can't be right. If the decl size overflows
4646 a host integer we will silently emit no data. */
4647 if (host_integerp (DECL_SIZE_UNIT (field), 1))
4648 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4649 }
a25f1211 4650 }
79e68feb 4651 else
85f3d674 4652 fieldsize = int_size_in_bytes (TREE_TYPE (type));
79e68feb
RS
4653
4654 /* Output the element's initial value. */
4655 if (val == 0)
4656 assemble_zeros (fieldsize);
4657 else
c8af3574 4658 output_constant (val, fieldsize, align2);
79e68feb
RS
4659
4660 /* Count its size. */
4661 total_bytes += fieldsize;
4662 }
4663 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
971801ff 4664 error ("invalid initial value for member %qs",
79e68feb
RS
4665 IDENTIFIER_POINTER (DECL_NAME (field)));
4666 else
4667 {
4668 /* Element that is a bit-field. */
4669
770ae6cc
RK
4670 HOST_WIDE_INT next_offset = int_bit_position (field);
4671 HOST_WIDE_INT end_offset
4672 = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
79e68feb
RS
4673
4674 if (val == 0)
4675 val = integer_zero_node;
4676
4677 /* If this field does not start in this (or, next) byte,
4678 skip some bytes. */
4679 if (next_offset / BITS_PER_UNIT != total_bytes)
4680 {
4681 /* Output remnant of any bit field in previous bytes. */
4682 if (byte_buffer_in_use)
4683 {
eac50d7a 4684 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4685 total_bytes++;
4686 byte_buffer_in_use = 0;
4687 }
4688
4689 /* If still not at proper byte, advance to there. */
4690 if (next_offset / BITS_PER_UNIT != total_bytes)
4691 {
4038c495 4692 gcc_assert (next_offset / BITS_PER_UNIT >= total_bytes);
79e68feb
RS
4693 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4694 total_bytes = next_offset / BITS_PER_UNIT;
4695 }
4696 }
4697
4698 if (! byte_buffer_in_use)
4699 byte = 0;
4700
4701 /* We must split the element into pieces that fall within
4702 separate bytes, and combine each byte with previous or
4703 following bit-fields. */
4704
b4ac57ab 4705 /* next_offset is the offset n fbits from the beginning of
79e68feb
RS
4706 the structure to the next bit of this element to be processed.
4707 end_offset is the offset of the first bit past the end of
4708 this element. */
4709 while (next_offset < end_offset)
4710 {
4711 int this_time;
e7105755
JW
4712 int shift;
4713 HOST_WIDE_INT value;
85f3d674
RK
4714 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4715 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
79e68feb
RS
4716
4717 /* Advance from byte to byte
4718 within this element when necessary. */
4719 while (next_byte != total_bytes)
4720 {
eac50d7a 4721 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4722 total_bytes++;
4723 byte = 0;
4724 }
4725
4726 /* Number of bits we can process at once
4727 (all part of the same byte). */
4728 this_time = MIN (end_offset - next_offset,
4729 BITS_PER_UNIT - next_bit);
f76b9db2 4730 if (BYTES_BIG_ENDIAN)
79e68feb 4731 {
f76b9db2
ILT
4732 /* On big-endian machine, take the most significant bits
4733 first (of the bits that are significant)
4734 and put them into bytes from the most significant end. */
4735 shift = end_offset - next_offset - this_time;
85f3d674 4736
f76b9db2 4737 /* Don't try to take a bunch of bits that cross
dfb2c079
HB
4738 the word boundary in the INTEGER_CST. We can
4739 only select bits from the LOW or HIGH part
4740 not from both. */
f76b9db2
ILT
4741 if (shift < HOST_BITS_PER_WIDE_INT
4742 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4743 {
8b1cb95b
GK
4744 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4745 shift = HOST_BITS_PER_WIDE_INT;
f76b9db2
ILT
4746 }
4747
4748 /* Now get the bits from the appropriate constant word. */
4749 if (shift < HOST_BITS_PER_WIDE_INT)
85f3d674 4750 value = TREE_INT_CST_LOW (val);
fbc848cc 4751 else
f76b9db2 4752 {
fbc848cc 4753 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
f76b9db2
ILT
4754 value = TREE_INT_CST_HIGH (val);
4755 shift -= HOST_BITS_PER_WIDE_INT;
4756 }
85f3d674 4757
dfb2c079
HB
4758 /* Get the result. This works only when:
4759 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
f76b9db2 4760 byte |= (((value >> shift)
dfb2c079 4761 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
f76b9db2 4762 << (BITS_PER_UNIT - this_time - next_bit));
79e68feb
RS
4763 }
4764 else
79e68feb 4765 {
f76b9db2
ILT
4766 /* On little-endian machines,
4767 take first the least significant bits of the value
4768 and pack them starting at the least significant
4769 bits of the bytes. */
770ae6cc
RK
4770 shift = next_offset - int_bit_position (field);
4771
f76b9db2 4772 /* Don't try to take a bunch of bits that cross
dfb2c079
HB
4773 the word boundary in the INTEGER_CST. We can
4774 only select bits from the LOW or HIGH part
4775 not from both. */
f76b9db2
ILT
4776 if (shift < HOST_BITS_PER_WIDE_INT
4777 && shift + this_time > HOST_BITS_PER_WIDE_INT)
770ae6cc 4778 this_time = (HOST_BITS_PER_WIDE_INT - shift);
f76b9db2
ILT
4779
4780 /* Now get the bits from the appropriate constant word. */
e9a25f70 4781 if (shift < HOST_BITS_PER_WIDE_INT)
f76b9db2 4782 value = TREE_INT_CST_LOW (val);
fbc848cc 4783 else
f76b9db2 4784 {
fbc848cc 4785 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
f76b9db2
ILT
4786 value = TREE_INT_CST_HIGH (val);
4787 shift -= HOST_BITS_PER_WIDE_INT;
4788 }
770ae6cc 4789
dfb2c079
HB
4790 /* Get the result. This works only when:
4791 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
f76b9db2 4792 byte |= (((value >> shift)
dfb2c079 4793 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
f76b9db2 4794 << next_bit);
79e68feb 4795 }
85f3d674 4796
79e68feb
RS
4797 next_offset += this_time;
4798 byte_buffer_in_use = 1;
4799 }
4800 }
4801 }
85f3d674 4802
79e68feb
RS
4803 if (byte_buffer_in_use)
4804 {
eac50d7a 4805 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4806 total_bytes++;
4807 }
85f3d674 4808
58e15542 4809 if ((unsigned HOST_WIDE_INT)total_bytes < size)
79e68feb
RS
4810 assemble_zeros (size - total_bytes);
4811}
ca695ac9 4812
ecb0eece 4813/* This TREE_LIST contains any weak symbol declarations waiting
46f9491e 4814 to be emitted. */
e2500fed 4815static GTY(()) tree weak_decls;
0e9264a2 4816
f90bf7ca
MM
4817/* Mark DECL as weak. */
4818
4819static void
2e1eedd6 4820mark_weak (tree decl)
f90bf7ca
MM
4821{
4822 DECL_WEAK (decl) = 1;
4823
4824 if (DECL_RTL_SET_P (decl)
3c0cb5de 4825 && MEM_P (DECL_RTL (decl))
f90bf7ca
MM
4826 && XEXP (DECL_RTL (decl), 0)
4827 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4828 SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4829}
41077ce4 4830
45806a3f
FS
4831/* Merge weak status between NEWDECL and OLDDECL. */
4832
4833void
2e1eedd6 4834merge_weak (tree newdecl, tree olddecl)
45806a3f 4835{
45806a3f 4836 if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
46fb43a7
JJ
4837 {
4838 if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
4839 {
4840 tree *pwd;
4841 /* We put the NEWDECL on the weak_decls list at some point
4842 and OLDDECL as well. Keep just OLDDECL on the list. */
4843 for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
4844 if (TREE_VALUE (*pwd) == newdecl)
4845 {
4846 *pwd = TREE_CHAIN (*pwd);
4847 break;
4848 }
4849 }
4850 return;
4851 }
45806a3f 4852
f90bf7ca
MM
4853 if (DECL_WEAK (newdecl))
4854 {
4855 tree wd;
41077ce4 4856
f90bf7ca
MM
4857 /* NEWDECL is weak, but OLDDECL is not. */
4858
4859 /* If we already output the OLDDECL, we're in trouble; we can't
ca97730d 4860 go back and make it weak. This error cannot be caught in
f90bf7ca
MM
4861 declare_weak because the NEWDECL and OLDDECL was not yet
4862 been merged; therefore, TREE_ASM_WRITTEN was not set. */
14285ace 4863 if (TREE_ASM_WRITTEN (olddecl))
dee15844
JM
4864 error ("weak declaration of %q+D must precede definition",
4865 newdecl);
14285ace
RH
4866
4867 /* If we've already generated rtl referencing OLDDECL, we may
4868 have done so in a way that will not function properly with
4869 a weak symbol. */
4870 else if (TREE_USED (olddecl)
34fb9ba5 4871 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
dee15844
JM
4872 warning (0, "weak declaration of %q+D after first use results "
4873 "in unspecified behavior", newdecl);
14285ace 4874
f90bf7ca
MM
4875 if (SUPPORTS_WEAK)
4876 {
4877 /* We put the NEWDECL on the weak_decls list at some point.
4878 Replace it with the OLDDECL. */
4879 for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4880 if (TREE_VALUE (wd) == newdecl)
4881 {
4882 TREE_VALUE (wd) = olddecl;
4883 break;
4884 }
4885 /* We may not find the entry on the list. If NEWDECL is a
4886 weak alias, then we will have already called
4887 globalize_decl to remove the entry; in that case, we do
4888 not need to do anything. */
4889 }
45806a3f 4890
f90bf7ca
MM
4891 /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */
4892 mark_weak (olddecl);
4893 }
4894 else
4895 /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4896 weak. Just update NEWDECL to indicate that it's weak too. */
4897 mark_weak (newdecl);
45806a3f
FS
4898}
4899
4b8af8d9
JM
4900/* Declare DECL to be a weak symbol. */
4901
4902void
2e1eedd6 4903declare_weak (tree decl)
4b8af8d9
JM
4904{
4905 if (! TREE_PUBLIC (decl))
dee15844 4906 error ("weak declaration of %q+D must be public", decl);
45806a3f 4907 else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
dee15844 4908 error ("weak declaration of %q+D must precede definition", decl);
daefd78b 4909 else if (SUPPORTS_WEAK)
ecb0eece
RH
4910 {
4911 if (! DECL_WEAK (decl))
4912 weak_decls = tree_cons (NULL, decl, weak_decls);
4913 }
4ae08f95 4914 else
dee15844 4915 warning (0, "weak declaration of %q+D not supported", decl);
4ae08f95 4916
f90bf7ca 4917 mark_weak (decl);
4b8af8d9
JM
4918}
4919
a0203ca7
AO
4920static void
4921weak_finish_1 (tree decl)
4b8af8d9 4922{
4977bab6 4923#if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
a0203ca7 4924 const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4977bab6 4925#endif
ecb0eece 4926
a0203ca7
AO
4927 if (! TREE_USED (decl))
4928 return;
4929
79c4e63f 4930#ifdef ASM_WEAKEN_DECL
a0203ca7 4931 ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4ae08f95
JM
4932#else
4933#ifdef ASM_WEAKEN_LABEL
a0203ca7 4934 ASM_WEAKEN_LABEL (asm_out_file, name);
ecb0eece
RH
4935#else
4936#ifdef ASM_OUTPUT_WEAK_ALIAS
a0203ca7
AO
4937 {
4938 static bool warn_once = 0;
4939 if (! warn_once)
4940 {
4941 warning (0, "only weak aliases are supported in this configuration");
4942 warn_once = 1;
4943 }
4944 return;
4945 }
4946#endif
4ae08f95 4947#endif
79c4e63f 4948#endif
a0203ca7
AO
4949}
4950
4951/* This TREE_LIST contains weakref targets. */
4952
4953static GTY(()) tree weakref_targets;
4954
4955/* Forward declaration. */
4956static tree find_decl_and_mark_needed (tree decl, tree target);
4957
4958/* Emit any pending weak declarations. */
4959
4960void
4961weak_finish (void)
4962{
4963 tree t;
4964
4965 for (t = weakref_targets; t; t = TREE_CHAIN (t))
4966 {
4967 tree alias_decl = TREE_PURPOSE (t);
4968 tree target = ultimate_transparent_alias_target (&TREE_VALUE (t));
4969
4970 if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl)))
4971 /* Remove alias_decl from the weak list, but leave entries for
4972 the target alone. */
4973 target = NULL_TREE;
4974#ifndef ASM_OUTPUT_WEAKREF
4975 else if (! TREE_SYMBOL_REFERENCED (target))
4976 {
ff2d10c1 4977 /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not
ca97730d 4978 defined, otherwise we and weak_finish_1 would use
ff2d10c1
AO
4979 different macros. */
4980# if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL
a0203ca7
AO
4981 ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target));
4982# else
4983 tree decl = find_decl_and_mark_needed (alias_decl, target);
4984
4985 if (! decl)
4986 {
4987 decl = build_decl (TREE_CODE (alias_decl), target,
4988 TREE_TYPE (alias_decl));
4989
4990 DECL_EXTERNAL (decl) = 1;
4991 TREE_PUBLIC (decl) = 1;
4992 DECL_ARTIFICIAL (decl) = 1;
4993 TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl);
4994 TREE_USED (decl) = 1;
4995 }
4996
4997 weak_finish_1 (decl);
4998# endif
4999 }
4ae08f95 5000#endif
a0203ca7
AO
5001
5002 {
5003 tree *p;
5004 tree t2;
5005
5006 /* Remove the alias and the target from the pending weak list
5007 so that we do not emit any .weak directives for the former,
5008 nor multiple .weak directives for the latter. */
5009 for (p = &weak_decls; (t2 = *p) ; )
5010 {
5011 if (TREE_VALUE (t2) == alias_decl
5012 || target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2)))
5013 *p = TREE_CHAIN (t2);
5014 else
5015 p = &TREE_CHAIN (t2);
5016 }
5017
5018 /* Remove other weakrefs to the same target, to speed things up. */
5019 for (p = &TREE_CHAIN (t); (t2 = *p) ; )
5020 {
5021 if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2)))
5022 *p = TREE_CHAIN (t2);
5023 else
5024 p = &TREE_CHAIN (t2);
5025 }
5026 }
5027 }
5028
5029 for (t = weak_decls; t; t = TREE_CHAIN (t))
5030 {
5031 tree decl = TREE_VALUE (t);
5032
5033 weak_finish_1 (decl);
4b8af8d9 5034 }
4b8af8d9 5035}
4ae08f95 5036
19c5b1cf
JM
5037/* Emit the assembly bits to indicate that DECL is globally visible. */
5038
5039static void
2e1eedd6 5040globalize_decl (tree decl)
19c5b1cf 5041{
19c5b1cf
JM
5042
5043#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
5044 if (DECL_WEAK (decl))
5045 {
812b587e 5046 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
ecb0eece
RH
5047 tree *p, t;
5048
19c5b1cf
JM
5049#ifdef ASM_WEAKEN_DECL
5050 ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
5051#else
5052 ASM_WEAKEN_LABEL (asm_out_file, name);
5053#endif
ecb0eece 5054
19c5b1cf
JM
5055 /* Remove this function from the pending weak list so that
5056 we do not emit multiple .weak directives for it. */
a81eed10
FS
5057 for (p = &weak_decls; (t = *p) ; )
5058 {
5059 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
ecb0eece 5060 *p = TREE_CHAIN (t);
a81eed10
FS
5061 else
5062 p = &TREE_CHAIN (t);
5063 }
a0203ca7 5064
eb5fa773
KH
5065 /* Remove weakrefs to the same target from the pending weakref
5066 list, for the same reason. */
5067 for (p = &weakref_targets; (t = *p) ; )
5068 {
5069 if (DECL_ASSEMBLER_NAME (decl)
5070 == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5071 *p = TREE_CHAIN (t);
5072 else
5073 p = &TREE_CHAIN (t);
5074 }
a0203ca7 5075
19c5b1cf
JM
5076 return;
5077 }
19c5b1cf 5078#endif
ecb0eece 5079
812b587e 5080 targetm.asm_out.globalize_decl_name (asm_out_file, decl);
19c5b1cf
JM
5081}
5082
e4d5432a
RH
5083/* We have to be able to tell cgraph about the needed-ness of the target
5084 of an alias. This requires that the decl have been defined. Aliases
aabcd309 5085 that precede their definition have to be queued for later processing. */
e4d5432a 5086
d4e6fecb 5087typedef struct alias_pair GTY(())
083b6717
JDA
5088{
5089 tree decl;
5090 tree target;
d4e6fecb 5091} alias_pair;
083b6717
JDA
5092
5093/* Define gc'd vector type. */
d4e6fecb
NS
5094DEF_VEC_O(alias_pair);
5095DEF_VEC_ALLOC_O(alias_pair,gc);
083b6717 5096
d4e6fecb 5097static GTY(()) VEC(alias_pair,gc) *alias_pairs;
083b6717 5098
e4d5432a
RH
5099/* Given an assembly name, find the decl it is associated with. At the
5100 same time, mark it needed for cgraph. */
5101
5102static tree
5103find_decl_and_mark_needed (tree decl, tree target)
5104{
5105 struct cgraph_node *fnode = NULL;
8a4a83ed 5106 struct varpool_node *vnode = NULL;
e4d5432a 5107
cdcba1ea 5108 if (TREE_CODE (decl) == FUNCTION_DECL)
e4d5432a 5109 {
cdcba1ea
AO
5110 fnode = cgraph_node_for_asm (target);
5111 if (fnode == NULL)
8a4a83ed 5112 vnode = varpool_node_for_asm (target);
cdcba1ea
AO
5113 }
5114 else
5115 {
8a4a83ed 5116 vnode = varpool_node_for_asm (target);
cdcba1ea
AO
5117 if (vnode == NULL)
5118 fnode = cgraph_node_for_asm (target);
e4d5432a
RH
5119 }
5120
5121 if (fnode)
5122 {
cdcba1ea
AO
5123 /* We can't mark function nodes as used after cgraph global info
5124 is finished. This wouldn't generally be necessary, but C++
5125 virtual table thunks are introduced late in the game and
5126 might seem like they need marking, although in fact they
5127 don't. */
5128 if (! cgraph_global_info_ready)
5129 cgraph_mark_needed_node (fnode);
e4d5432a
RH
5130 return fnode->decl;
5131 }
5132 else if (vnode)
5133 {
8a4a83ed 5134 varpool_mark_needed_node (vnode);
e4d5432a
RH
5135 return vnode->decl;
5136 }
083cad55 5137 else
e4d5432a
RH
5138 return NULL_TREE;
5139}
083b6717 5140
749053f5
RS
5141/* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
5142 or ASM_OUTPUT_DEF_FROM_DECLS. The function defines the symbol whose
5143 tree node is DECL to have the value of the tree node TARGET. */
5144
083b6717 5145static void
a0203ca7 5146do_assemble_alias (tree decl, tree target)
083b6717 5147{
ebccb65d
JM
5148 if (TREE_ASM_WRITTEN (decl))
5149 return;
5150
e4d5432a
RH
5151 TREE_ASM_WRITTEN (decl) = 1;
5152 TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
5153
a0203ca7
AO
5154 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5155 {
5156 ultimate_transparent_alias_target (&target);
5157
8893239d
RH
5158 if (!targetm.have_tls
5159 && TREE_CODE (decl) == VAR_DECL
5160 && DECL_THREAD_LOCAL_P (decl))
5161 {
5162 decl = emutls_decl (decl);
5163 target = get_emutls_object_name (target);
5164 }
5165
a0203ca7
AO
5166 if (!TREE_SYMBOL_REFERENCED (target))
5167 weakref_targets = tree_cons (decl, target, weakref_targets);
5168
5169#ifdef ASM_OUTPUT_WEAKREF
ff2d10c1 5170 ASM_OUTPUT_WEAKREF (asm_out_file, decl,
a0203ca7
AO
5171 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
5172 IDENTIFIER_POINTER (target));
5173#else
5174 if (!SUPPORTS_WEAK)
5175 {
5176 error ("%Jweakref is not supported in this configuration", decl);
5177 return;
5178 }
5179#endif
5180 return;
5181 }
5182
8893239d
RH
5183 if (!targetm.have_tls
5184 && TREE_CODE (decl) == VAR_DECL
5185 && DECL_THREAD_LOCAL_P (decl))
5186 {
5187 decl = emutls_decl (decl);
5188 target = get_emutls_object_name (target);
5189 }
5190
e4d5432a
RH
5191#ifdef ASM_OUTPUT_DEF
5192 /* Make name accessible from other files, if appropriate. */
5193
5194 if (TREE_PUBLIC (decl))
5195 {
5196 globalize_decl (decl);
5197 maybe_assemble_visibility (decl);
5198 }
5199
5200# ifdef ASM_OUTPUT_DEF_FROM_DECLS
083b6717 5201 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
e4d5432a 5202# else
083b6717
JDA
5203 ASM_OUTPUT_DEF (asm_out_file,
5204 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
5205 IDENTIFIER_POINTER (target));
e4d5432a
RH
5206# endif
5207#elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
5208 {
5209 const char *name;
5210 tree *p, t;
5211
5212 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5213# ifdef ASM_WEAKEN_DECL
5214 ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
5215# else
5216 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
5217# endif
5218 /* Remove this function from the pending weak list so that
5219 we do not emit multiple .weak directives for it. */
5220 for (p = &weak_decls; (t = *p) ; )
5221 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
5222 *p = TREE_CHAIN (t);
5223 else
5224 p = &TREE_CHAIN (t);
a0203ca7
AO
5225
5226 /* Remove weakrefs to the same target from the pending weakref
5227 list, for the same reason. */
5228 for (p = &weakref_targets; (t = *p) ; )
5229 {
5230 if (DECL_ASSEMBLER_NAME (decl)
5231 == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5232 *p = TREE_CHAIN (t);
5233 else
5234 p = &TREE_CHAIN (t);
5235 }
e4d5432a 5236 }
083b6717
JDA
5237#endif
5238}
083b6717 5239
e4d5432a
RH
5240/* First pass of completing pending aliases. Make sure that cgraph knows
5241 which symbols will be required. */
083b6717
JDA
5242
5243void
e4d5432a 5244finish_aliases_1 (void)
083b6717 5245{
083b6717 5246 unsigned i;
d4e6fecb 5247 alias_pair *p;
083b6717 5248
e4d5432a
RH
5249 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
5250 {
5251 tree target_decl;
5252
5253 target_decl = find_decl_and_mark_needed (p->decl, p->target);
5254 if (target_decl == NULL)
a0203ca7
AO
5255 {
5256 if (! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
5257 error ("%q+D aliased to undefined symbol %qs",
5258 p->decl, IDENTIFIER_POINTER (p->target));
5259 }
5260 else if (DECL_EXTERNAL (target_decl)
5261 && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
ea40ba9c
JM
5262 error ("%q+D aliased to external symbol %qs",
5263 p->decl, IDENTIFIER_POINTER (p->target));
e4d5432a
RH
5264 }
5265}
083b6717 5266
e4d5432a
RH
5267/* Second pass of completing pending aliases. Emit the actual assembly.
5268 This happens at the end of compilation and thus it is assured that the
5269 target symbol has been emitted. */
5270
5271void
5272finish_aliases_2 (void)
5273{
5274 unsigned i;
d4e6fecb 5275 alias_pair *p;
e4d5432a
RH
5276
5277 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
5278 do_assemble_alias (p->decl, p->target);
5279
d4e6fecb 5280 VEC_truncate (alias_pair, alias_pairs, 0);
083b6717
JDA
5281}
5282
4ae08f95
JM
5283/* Emit an assembler directive to make the symbol for DECL an alias to
5284 the symbol for TARGET. */
4b8af8d9
JM
5285
5286void
bedb9fc0 5287assemble_alias (tree decl, tree target)
4b8af8d9 5288{
e4d5432a 5289 tree target_decl;
a0203ca7 5290 bool is_weakref = false;
4b8af8d9 5291
a0203ca7
AO
5292 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5293 {
5294 tree alias = DECL_ASSEMBLER_NAME (decl);
5295
5296 is_weakref = true;
5297
5298 ultimate_transparent_alias_target (&target);
5299
5300 if (alias == target)
6d3e3e6a 5301 error ("weakref %q+D ultimately targets itself", decl);
a0203ca7
AO
5302 else
5303 {
5304#ifndef ASM_OUTPUT_WEAKREF
5305 IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1;
5306 TREE_CHAIN (alias) = target;
5307#endif
5308 }
a9b0b825
GK
5309 if (TREE_PUBLIC (decl))
5310 error ("weakref %q+D must have static linkage", decl);
a0203ca7
AO
5311 }
5312 else
5313 {
e4d5432a
RH
5314#if !defined (ASM_OUTPUT_DEF)
5315# if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
a0203ca7 5316 error ("%Jalias definitions not supported in this configuration", decl);
e4d5432a 5317 return;
a0203ca7
AO
5318# else
5319 if (!DECL_WEAK (decl))
5320 {
5321 error ("%Jonly weak aliases are supported in this configuration", decl);
5322 return;
5323 }
e4d5432a
RH
5324# endif
5325#endif
a0203ca7 5326 }
4b8af8d9 5327
e4d5432a
RH
5328 /* We must force creation of DECL_RTL for debug info generation, even though
5329 we don't use it here. */
5330 make_decl_rtl (decl);
5331 TREE_USED (decl) = 1;
083b6717 5332
e4d5432a
RH
5333 /* A quirk of the initial implementation of aliases required that the user
5334 add "extern" to all of them. Which is silly, but now historical. Do
5335 note that the symbol is in fact locally defined. */
a0203ca7
AO
5336 if (! is_weakref)
5337 DECL_EXTERNAL (decl) = 0;
083b6717 5338
e4d5432a
RH
5339 /* Allow aliases to aliases. */
5340 if (TREE_CODE (decl) == FUNCTION_DECL)
12527dce 5341 cgraph_node (decl)->alias = true;
06e4eab5 5342 else
8a4a83ed 5343 varpool_node (decl)->alias = true;
06e4eab5 5344
e4d5432a 5345 /* If the target has already been emitted, we don't have to queue the
ca97730d 5346 alias. This saves a tad of memory. */
e4d5432a
RH
5347 target_decl = find_decl_and_mark_needed (decl, target);
5348 if (target_decl && TREE_ASM_WRITTEN (target_decl))
5349 do_assemble_alias (decl, target);
5350 else
bedb9fc0 5351 {
d4e6fecb 5352 alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL);
e4d5432a
RH
5353 p->decl = decl;
5354 p->target = target;
bedb9fc0 5355 }
4b8af8d9 5356}
f796d997 5357
47bd70b5 5358/* Emit an assembler directive to set symbol for DECL visibility to
25fdb4dc 5359 the visibility type VIS, which must not be VISIBILITY_DEFAULT. */
47bd70b5
JJ
5360
5361void
2e1eedd6 5362default_assemble_visibility (tree decl, int vis)
47bd70b5 5363{
25fdb4dc 5364 static const char * const visibility_types[] = {
b9e75696 5365 NULL, "protected", "hidden", "internal"
25fdb4dc
RH
5366 };
5367
5368 const char *name, *type;
47bd70b5 5369
b0250067 5370 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
25fdb4dc 5371 type = visibility_types[vis];
47bd70b5
JJ
5372
5373#ifdef HAVE_GAS_HIDDEN
267594f3
R
5374 fprintf (asm_out_file, "\t.%s\t", type);
5375 assemble_name (asm_out_file, name);
5376 fprintf (asm_out_file, "\n");
47bd70b5 5377#else
5c498b10
DD
5378 warning (OPT_Wattributes, "visibility attribute not supported "
5379 "in this configuration; ignored");
47bd70b5
JJ
5380#endif
5381}
5382
b14707c3
RH
5383/* A helper function to call assemble_visibility when needed for a decl. */
5384
c47c29c8 5385int
2e1eedd6 5386maybe_assemble_visibility (tree decl)
b14707c3 5387{
968b41a1 5388 enum symbol_visibility vis = DECL_VISIBILITY (decl);
25fdb4dc
RH
5389
5390 if (vis != VISIBILITY_DEFAULT)
c47c29c8
L
5391 {
5392 targetm.asm_out.visibility (decl, vis);
5393 return 1;
5394 }
5395 else
5396 return 0;
b14707c3
RH
5397}
5398
f796d997
JM
5399/* Returns 1 if the target configuration supports defining public symbols
5400 so that one of them will be chosen at link time instead of generating a
5401 multiply-defined symbol error, whether through the use of weak symbols or
5402 a target-specific mechanism for having duplicates discarded. */
5403
5404int
2e1eedd6 5405supports_one_only (void)
f796d997
JM
5406{
5407 if (SUPPORTS_ONE_ONLY)
5408 return 1;
5409 return SUPPORTS_WEAK;
5410}
5411
5412/* Set up DECL as a public symbol that can be defined in multiple
5413 translation units without generating a linker error. */
5414
5415void
2e1eedd6 5416make_decl_one_only (tree decl)
f796d997 5417{
fbc848cc
NS
5418 gcc_assert (TREE_CODE (decl) == VAR_DECL
5419 || TREE_CODE (decl) == FUNCTION_DECL);
f796d997
JM
5420
5421 TREE_PUBLIC (decl) = 1;
5422
4746cf84 5423 if (SUPPORTS_ONE_ONLY)
f796d997
JM
5424 {
5425#ifdef MAKE_DECL_ONE_ONLY
5426 MAKE_DECL_ONE_ONLY (decl);
5427#endif
5428 DECL_ONE_ONLY (decl) = 1;
5429 }
4746cf84
MA
5430 else if (TREE_CODE (decl) == VAR_DECL
5431 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
5432 DECL_COMMON (decl) = 1;
f796d997 5433 else
fbc848cc
NS
5434 {
5435 gcc_assert (SUPPORTS_WEAK);
5436 DECL_WEAK (decl) = 1;
5437 }
f796d997 5438}
76095e2f
RH
5439
5440void
2e1eedd6 5441init_varasm_once (void)
76095e2f 5442{
d6b5193b
RS
5443 section_htab = htab_create_ggc (31, section_entry_hash,
5444 section_entry_eq, NULL);
aacd3885
RS
5445 object_block_htab = htab_create_ggc (31, object_block_entry_hash,
5446 object_block_entry_eq, NULL);
10b6a274
ZW
5447 const_desc_htab = htab_create_ggc (1009, const_desc_hash,
5448 const_desc_eq, NULL);
715bdd29 5449
a79e3a45 5450 const_alias_set = new_alias_set ();
1d3dbd99 5451 shared_constant_pool = create_constant_pool ();
d6b5193b
RS
5452
5453#ifdef TEXT_SECTION_ASM_OP
5454 text_section = get_unnamed_section (SECTION_CODE, output_section_asm_op,
5455 TEXT_SECTION_ASM_OP);
5456#endif
5457
5458#ifdef DATA_SECTION_ASM_OP
5459 data_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
5460 DATA_SECTION_ASM_OP);
5461#endif
5462
5463#ifdef SDATA_SECTION_ASM_OP
5464 sdata_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
5465 SDATA_SECTION_ASM_OP);
5466#endif
5467
5468#ifdef READONLY_DATA_SECTION_ASM_OP
5469 readonly_data_section = get_unnamed_section (0, output_section_asm_op,
5470 READONLY_DATA_SECTION_ASM_OP);
5471#endif
5472
5473#ifdef CTORS_SECTION_ASM_OP
5474 ctors_section = get_unnamed_section (0, output_section_asm_op,
5475 CTORS_SECTION_ASM_OP);
5476#endif
5477
5478#ifdef DTORS_SECTION_ASM_OP
5479 dtors_section = get_unnamed_section (0, output_section_asm_op,
5480 DTORS_SECTION_ASM_OP);
5481#endif
5482
5483#ifdef BSS_SECTION_ASM_OP
5484 bss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
5485 output_section_asm_op,
5486 BSS_SECTION_ASM_OP);
5487#endif
5488
5489#ifdef SBSS_SECTION_ASM_OP
5490 sbss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
5491 output_section_asm_op,
5492 SBSS_SECTION_ASM_OP);
5493#endif
5494
434aeebb
RS
5495 tls_comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
5496 | SECTION_COMMON, emit_tls_common);
5497 lcomm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
5498 | SECTION_COMMON, emit_local);
5499 comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
5500 | SECTION_COMMON, emit_common);
5501
5502#if defined ASM_OUTPUT_ALIGNED_BSS || defined ASM_OUTPUT_BSS
5503 bss_noswitch_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS,
5504 emit_bss);
5505#endif
5506
d6b5193b
RS
5507 targetm.asm_out.init_sections ();
5508
5509 if (readonly_data_section == NULL)
5510 readonly_data_section = text_section;
76095e2f 5511}
7c262518 5512
c2f7fa15 5513enum tls_model
3101faab 5514decl_default_tls_model (const_tree decl)
dce81a1a
JJ
5515{
5516 enum tls_model kind;
dce81a1a
JJ
5517 bool is_local;
5518
5fd9b178 5519 is_local = targetm.binds_local_p (decl);
0bfb33e5 5520 if (!flag_shlib)
dce81a1a
JJ
5521 {
5522 if (is_local)
5523 kind = TLS_MODEL_LOCAL_EXEC;
5524 else
5525 kind = TLS_MODEL_INITIAL_EXEC;
5526 }
c2f7fa15 5527
dce81a1a
JJ
5528 /* Local dynamic is inefficient when we're not combining the
5529 parts of the address. */
5530 else if (optimize && is_local)
5531 kind = TLS_MODEL_LOCAL_DYNAMIC;
5532 else
5533 kind = TLS_MODEL_GLOBAL_DYNAMIC;
5534 if (kind < flag_tls_default)
5535 kind = flag_tls_default;
5536
5537 return kind;
5538}
5539
7c262518
RH
5540/* Select a set of attributes for section NAME based on the properties
5541 of DECL and whether or not RELOC indicates that DECL's initializer
5542 might contain runtime relocations.
5543
5544 We make the section read-only and executable for a function decl,
715bdd29 5545 read-only for a const data decl, and writable for a non-const data decl. */
7c262518
RH
5546
5547unsigned int
2e1eedd6 5548default_section_type_flags (tree decl, const char *name, int reloc)
7c262518 5549{
7c262518 5550 unsigned int flags;
7c262518
RH
5551
5552 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
5553 flags = SECTION_CODE;
9b580a0b 5554 else if (decl && decl_readonly_section (decl, reloc))
7c262518 5555 flags = 0;
c7466dee
CT
5556 else if (current_function_decl
5557 && cfun
5558 && cfun->unlikely_text_section_name
5559 && strcmp (name, cfun->unlikely_text_section_name) == 0)
750054a2 5560 flags = SECTION_CODE;
083cad55 5561 else if (!decl
c7466dee
CT
5562 && (!current_function_decl || !cfun)
5563 && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
083cad55 5564 flags = SECTION_CODE;
7c262518
RH
5565 else
5566 flags = SECTION_WRITE;
5567
5568 if (decl && DECL_ONE_ONLY (decl))
5569 flags |= SECTION_LINKONCE;
5570
c2f7fa15 5571 if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
c711ba8e
RH
5572 flags |= SECTION_TLS | SECTION_WRITE;
5573
7c262518
RH
5574 if (strcmp (name, ".bss") == 0
5575 || strncmp (name, ".bss.", 5) == 0
abb8b19a
AM
5576 || strncmp (name, ".gnu.linkonce.b.", 16) == 0
5577 || strcmp (name, ".sbss") == 0
826eb7ed
JB
5578 || strncmp (name, ".sbss.", 6) == 0
5579 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
abb8b19a 5580 flags |= SECTION_BSS;
826eb7ed 5581
3d78f2e9 5582 if (strcmp (name, ".tdata") == 0
826eb7ed
JB
5583 || strncmp (name, ".tdata.", 7) == 0
5584 || strncmp (name, ".gnu.linkonce.td.", 17) == 0)
3d78f2e9
RH
5585 flags |= SECTION_TLS;
5586
826eb7ed
JB
5587 if (strcmp (name, ".tbss") == 0
5588 || strncmp (name, ".tbss.", 6) == 0
5589 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
5590 flags |= SECTION_TLS | SECTION_BSS;
5591
6a0a6ac4
AM
5592 /* These three sections have special ELF types. They are neither
5593 SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
5594 want to print a section type (@progbits or @nobits). If someone
5595 is silly enough to emit code or TLS variables to one of these
5596 sections, then don't handle them specially. */
5597 if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
5598 && (strcmp (name, ".init_array") == 0
5599 || strcmp (name, ".fini_array") == 0
5600 || strcmp (name, ".preinit_array") == 0))
5601 flags |= SECTION_NOTYPE;
5602
7c262518
RH
5603 return flags;
5604}
5605
434aeebb
RS
5606/* Return true if the target supports some form of global BSS,
5607 either through bss_noswitch_section, or by selecting a BSS
5608 section in TARGET_ASM_SELECT_SECTION. */
5609
5610bool
5611have_global_bss_p (void)
5612{
5613 return bss_noswitch_section || targetm.have_switchable_bss_sections;
5614}
5615
7c262518
RH
5616/* Output assembly to switch to section NAME with attribute FLAGS.
5617 Four variants for common object file formats. */
5618
5619void
2e1eedd6 5620default_no_named_section (const char *name ATTRIBUTE_UNUSED,
c18a5b6c
MM
5621 unsigned int flags ATTRIBUTE_UNUSED,
5622 tree decl ATTRIBUTE_UNUSED)
7c262518
RH
5623{
5624 /* Some object formats don't support named sections at all. The
5625 front-end should already have flagged this as an error. */
fbc848cc 5626 gcc_unreachable ();
7c262518
RH
5627}
5628
5629void
c18a5b6c
MM
5630default_elf_asm_named_section (const char *name, unsigned int flags,
5631 tree decl ATTRIBUTE_UNUSED)
7c262518 5632{
201556f0 5633 char flagchars[10], *f = flagchars;
7c262518 5634
c18a5b6c
MM
5635 /* If we have already declared this section, we can use an
5636 abbreviated form to switch back to it -- unless this section is
5637 part of a COMDAT groups, in which case GAS requires the full
5638 declaration every time. */
11176d2a 5639 if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
d6b5193b 5640 && (flags & SECTION_DECLARED))
a8c01a59
RL
5641 {
5642 fprintf (asm_out_file, "\t.section\t%s\n", name);
5643 return;
5644 }
5645
7c262518
RH
5646 if (!(flags & SECTION_DEBUG))
5647 *f++ = 'a';
5648 if (flags & SECTION_WRITE)
5649 *f++ = 'w';
5650 if (flags & SECTION_CODE)
5651 *f++ = 'x';
5652 if (flags & SECTION_SMALL)
5653 *f++ = 's';
201556f0
JJ
5654 if (flags & SECTION_MERGE)
5655 *f++ = 'M';
5656 if (flags & SECTION_STRINGS)
5657 *f++ = 'S';
3d78f2e9
RH
5658 if (flags & SECTION_TLS)
5659 *f++ = 'T';
11176d2a 5660 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
c18a5b6c 5661 *f++ = 'G';
7c262518
RH
5662 *f = '\0';
5663
6a0a6ac4 5664 fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
7c262518 5665
6a0a6ac4
AM
5666 if (!(flags & SECTION_NOTYPE))
5667 {
5668 const char *type;
c18a5b6c 5669 const char *format;
6a0a6ac4
AM
5670
5671 if (flags & SECTION_BSS)
5672 type = "nobits";
5673 else
5674 type = "progbits";
5675
c18a5b6c
MM
5676 format = ",@%s";
5677#ifdef ASM_COMMENT_START
5678 /* On platforms that use "@" as the assembly comment character,
5679 use "%" instead. */
5680 if (strcmp (ASM_COMMENT_START, "@") == 0)
5681 format = ",%%%s";
5682#endif
5683 fprintf (asm_out_file, format, type);
6a0a6ac4
AM
5684
5685 if (flags & SECTION_ENTSIZE)
5686 fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
11176d2a 5687 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
083cad55 5688 fprintf (asm_out_file, ",%s,comdat",
c18a5b6c 5689 lang_hooks.decls.comdat_group (decl));
6a0a6ac4
AM
5690 }
5691
5692 putc ('\n', asm_out_file);
7c262518
RH
5693}
5694
5695void
083cad55 5696default_coff_asm_named_section (const char *name, unsigned int flags,
c18a5b6c 5697 tree decl ATTRIBUTE_UNUSED)
7c262518
RH
5698{
5699 char flagchars[8], *f = flagchars;
5700
5701 if (flags & SECTION_WRITE)
5702 *f++ = 'w';
5703 if (flags & SECTION_CODE)
5704 *f++ = 'x';
5705 *f = '\0';
5706
5707 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
5708}
5709
5710void
c18a5b6c
MM
5711default_pe_asm_named_section (const char *name, unsigned int flags,
5712 tree decl)
7c262518 5713{
c18a5b6c 5714 default_coff_asm_named_section (name, flags, decl);
7c262518
RH
5715
5716 if (flags & SECTION_LINKONCE)
5717 {
5718 /* Functions may have been compiled at various levels of
5719 optimization so we can't use `same_size' here.
5720 Instead, have the linker pick one. */
5721 fprintf (asm_out_file, "\t.linkonce %s\n",
5722 (flags & SECTION_CODE ? "discard" : "same_size"));
5723 }
5724}
4a8d0c9c 5725\f
ae46c4e0
RH
5726/* The lame default section selector. */
5727
d6b5193b 5728section *
2e1eedd6
AJ
5729default_select_section (tree decl, int reloc,
5730 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
ae46c4e0 5731{
ae46c4e0
RH
5732 if (DECL_P (decl))
5733 {
4e4d733e 5734 if (decl_readonly_section (decl, reloc))
d6b5193b 5735 return readonly_data_section;
ae46c4e0
RH
5736 }
5737 else if (TREE_CODE (decl) == CONSTRUCTOR)
5738 {
5739 if (! ((flag_pic && reloc)
5740 || !TREE_READONLY (decl)
5741 || TREE_SIDE_EFFECTS (decl)
5742 || !TREE_CONSTANT (decl)))
d6b5193b 5743 return readonly_data_section;
ae46c4e0
RH
5744 }
5745 else if (TREE_CODE (decl) == STRING_CST)
d6b5193b 5746 return readonly_data_section;
ae46c4e0 5747 else if (! (flag_pic && reloc))
d6b5193b 5748 return readonly_data_section;
ae46c4e0 5749
d6b5193b 5750 return data_section;
ae46c4e0
RH
5751}
5752
ae46c4e0 5753enum section_category
3101faab 5754categorize_decl_for_section (const_tree decl, int reloc)
ae46c4e0
RH
5755{
5756 enum section_category ret;
5757
5758 if (TREE_CODE (decl) == FUNCTION_DECL)
5759 return SECCAT_TEXT;
5760 else if (TREE_CODE (decl) == STRING_CST)
6de9cd9a
DN
5761 {
5762 if (flag_mudflap) /* or !flag_merge_constants */
5763 return SECCAT_RODATA;
5764 else
5765 return SECCAT_RODATA_MERGE_STR;
5766 }
ae46c4e0
RH
5767 else if (TREE_CODE (decl) == VAR_DECL)
5768 {
434aeebb 5769 if (bss_initializer_p (decl))
ae46c4e0
RH
5770 ret = SECCAT_BSS;
5771 else if (! TREE_READONLY (decl)
5772 || TREE_SIDE_EFFECTS (decl)
5773 || ! TREE_CONSTANT (DECL_INITIAL (decl)))
5774 {
9b580a0b
RH
5775 /* Here the reloc_rw_mask is not testing whether the section should
5776 be read-only or not, but whether the dynamic link will have to
5777 do something. If so, we wish to segregate the data in order to
5778 minimize cache misses inside the dynamic linker. */
5779 if (reloc & targetm.asm_out.reloc_rw_mask ())
5780 ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL;
ae46c4e0
RH
5781 else
5782 ret = SECCAT_DATA;
5783 }
9b580a0b
RH
5784 else if (reloc & targetm.asm_out.reloc_rw_mask ())
5785 ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO;
7eca317a 5786 else if (reloc || flag_merge_constants < 2)
ae46c4e0
RH
5787 /* C and C++ don't allow different variables to share the same
5788 location. -fmerge-all-constants allows even that (at the
5789 expense of not conforming). */
5790 ret = SECCAT_RODATA;
5791 else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
5792 ret = SECCAT_RODATA_MERGE_STR_INIT;
5793 else
5794 ret = SECCAT_RODATA_MERGE_CONST;
5795 }
5796 else if (TREE_CODE (decl) == CONSTRUCTOR)
5797 {
9b580a0b 5798 if ((reloc & targetm.asm_out.reloc_rw_mask ())
ae46c4e0
RH
5799 || TREE_SIDE_EFFECTS (decl)
5800 || ! TREE_CONSTANT (decl))
5801 ret = SECCAT_DATA;
5802 else
5803 ret = SECCAT_RODATA;
5804 }
5805 else
5806 ret = SECCAT_RODATA;
5807
3d78f2e9 5808 /* There are no read-only thread-local sections. */
c2f7fa15 5809 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
3d78f2e9 5810 {
08a8c6b6
JB
5811 /* Note that this would be *just* SECCAT_BSS, except that there's
5812 no concept of a read-only thread-local-data section. */
5813 if (ret == SECCAT_BSS
5814 || (flag_zero_initialized_in_bss
5815 && initializer_zerop (DECL_INITIAL (decl))))
3d78f2e9
RH
5816 ret = SECCAT_TBSS;
5817 else
5818 ret = SECCAT_TDATA;
5819 }
5820
ae46c4e0 5821 /* If the target uses small data sections, select it. */
5fd9b178 5822 else if (targetm.in_small_data_p (decl))
ae46c4e0
RH
5823 {
5824 if (ret == SECCAT_BSS)
5825 ret = SECCAT_SBSS;
275b6d80
DE
5826 else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
5827 ret = SECCAT_SRODATA;
ae46c4e0
RH
5828 else
5829 ret = SECCAT_SDATA;
5830 }
5831
5832 return ret;
5833}
5834
4e4d733e 5835bool
3101faab 5836decl_readonly_section (const_tree decl, int reloc)
4e4d733e 5837{
9b580a0b 5838 switch (categorize_decl_for_section (decl, reloc))
4e4d733e
L
5839 {
5840 case SECCAT_RODATA:
5841 case SECCAT_RODATA_MERGE_STR:
5842 case SECCAT_RODATA_MERGE_STR_INIT:
5843 case SECCAT_RODATA_MERGE_CONST:
275b6d80 5844 case SECCAT_SRODATA:
4e4d733e
L
5845 return true;
5846 break;
5847 default:
5848 return false;
5849 break;
5850 }
5851}
5852
ae46c4e0
RH
5853/* Select a section based on the above categorization. */
5854
d6b5193b 5855section *
2e1eedd6
AJ
5856default_elf_select_section (tree decl, int reloc,
5857 unsigned HOST_WIDE_INT align)
2cc9fb4c 5858{
e13971e0 5859 const char *sname;
9b580a0b 5860 switch (categorize_decl_for_section (decl, reloc))
ae46c4e0
RH
5861 {
5862 case SECCAT_TEXT:
5863 /* We're not supposed to be called on FUNCTION_DECLs. */
fbc848cc 5864 gcc_unreachable ();
ae46c4e0 5865 case SECCAT_RODATA:
d6b5193b 5866 return readonly_data_section;
ae46c4e0 5867 case SECCAT_RODATA_MERGE_STR:
d6b5193b 5868 return mergeable_string_section (decl, align, 0);
ae46c4e0 5869 case SECCAT_RODATA_MERGE_STR_INIT:
d6b5193b 5870 return mergeable_string_section (DECL_INITIAL (decl), align, 0);
ae46c4e0 5871 case SECCAT_RODATA_MERGE_CONST:
d6b5193b 5872 return mergeable_constant_section (DECL_MODE (decl), align, 0);
275b6d80 5873 case SECCAT_SRODATA:
e13971e0 5874 sname = ".sdata2";
275b6d80 5875 break;
ae46c4e0 5876 case SECCAT_DATA:
d6b5193b 5877 return data_section;
ae46c4e0 5878 case SECCAT_DATA_REL:
e13971e0 5879 sname = ".data.rel";
ae46c4e0
RH
5880 break;
5881 case SECCAT_DATA_REL_LOCAL:
e13971e0 5882 sname = ".data.rel.local";
ae46c4e0
RH
5883 break;
5884 case SECCAT_DATA_REL_RO:
e13971e0 5885 sname = ".data.rel.ro";
ae46c4e0
RH
5886 break;
5887 case SECCAT_DATA_REL_RO_LOCAL:
e13971e0 5888 sname = ".data.rel.ro.local";
ae46c4e0
RH
5889 break;
5890 case SECCAT_SDATA:
e13971e0 5891 sname = ".sdata";
ae46c4e0
RH
5892 break;
5893 case SECCAT_TDATA:
e13971e0 5894 sname = ".tdata";
ae46c4e0
RH
5895 break;
5896 case SECCAT_BSS:
d6b5193b
RS
5897 if (bss_section)
5898 return bss_section;
e13971e0 5899 sname = ".bss";
ae46c4e0
RH
5900 break;
5901 case SECCAT_SBSS:
e13971e0 5902 sname = ".sbss";
ae46c4e0
RH
5903 break;
5904 case SECCAT_TBSS:
e13971e0 5905 sname = ".tbss";
ae46c4e0
RH
5906 break;
5907 default:
fbc848cc 5908 gcc_unreachable ();
ae46c4e0 5909 }
e13971e0
AM
5910
5911 if (!DECL_P (decl))
5912 decl = NULL_TREE;
d6b5193b 5913 return get_named_section (decl, sname, reloc);
ae46c4e0
RH
5914}
5915
41077ce4 5916/* Construct a unique section name based on the decl name and the
ae46c4e0
RH
5917 categorization performed above. */
5918
5919void
2e1eedd6 5920default_unique_section (tree decl, int reloc)
ae46c4e0 5921{
11176d2a
JB
5922 /* We only need to use .gnu.linkonce if we don't have COMDAT groups. */
5923 bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
ae46c4e0
RH
5924 const char *prefix, *name;
5925 size_t nlen, plen;
5926 char *string;
5927
9b580a0b 5928 switch (categorize_decl_for_section (decl, reloc))
ae46c4e0
RH
5929 {
5930 case SECCAT_TEXT:
5931 prefix = one_only ? ".gnu.linkonce.t." : ".text.";
5932 break;
5933 case SECCAT_RODATA:
5934 case SECCAT_RODATA_MERGE_STR:
5935 case SECCAT_RODATA_MERGE_STR_INIT:
5936 case SECCAT_RODATA_MERGE_CONST:
5937 prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
5938 break;
275b6d80
DE
5939 case SECCAT_SRODATA:
5940 prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
5941 break;
ae46c4e0 5942 case SECCAT_DATA:
0a942fea
JJ
5943 prefix = one_only ? ".gnu.linkonce.d." : ".data.";
5944 break;
ae46c4e0 5945 case SECCAT_DATA_REL:
0a942fea
JJ
5946 prefix = one_only ? ".gnu.linkonce.d.rel." : ".data.rel.";
5947 break;
ae46c4e0 5948 case SECCAT_DATA_REL_LOCAL:
0a942fea
JJ
5949 prefix = one_only ? ".gnu.linkonce.d.rel.local." : ".data.rel.local.";
5950 break;
ae46c4e0 5951 case SECCAT_DATA_REL_RO:
0a942fea
JJ
5952 prefix = one_only ? ".gnu.linkonce.d.rel.ro." : ".data.rel.ro.";
5953 break;
ae46c4e0 5954 case SECCAT_DATA_REL_RO_LOCAL:
0a942fea
JJ
5955 prefix = one_only ? ".gnu.linkonce.d.rel.ro.local."
5956 : ".data.rel.ro.local.";
ae46c4e0
RH
5957 break;
5958 case SECCAT_SDATA:
5959 prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
5960 break;
5961 case SECCAT_BSS:
5962 prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
5963 break;
5964 case SECCAT_SBSS:
5965 prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
5966 break;
5967 case SECCAT_TDATA:
c711ba8e
RH
5968 prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
5969 break;
ae46c4e0 5970 case SECCAT_TBSS:
c711ba8e
RH
5971 prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
5972 break;
ae46c4e0 5973 default:
fbc848cc 5974 gcc_unreachable ();
ae46c4e0
RH
5975 }
5976 plen = strlen (prefix);
5977
5978 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
245f1bfa 5979 name = targetm.strip_name_encoding (name);
ae46c4e0
RH
5980 nlen = strlen (name);
5981
5982 string = alloca (nlen + plen + 1);
5983 memcpy (string, prefix, plen);
5984 memcpy (string + plen, name, nlen + 1);
5985
5986 DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
5987}
b64a1b53 5988
9b580a0b
RH
5989/* Like compute_reloc_for_constant, except for an RTX. The return value
5990 is a mask for which bit 1 indicates a global relocation, and bit 0
5991 indicates a local relocation. */
5992
5993static int
5994compute_reloc_for_rtx_1 (rtx *xp, void *data)
5995{
5996 int *preloc = data;
5997 rtx x = *xp;
5998
5999 switch (GET_CODE (x))
6000 {
6001 case SYMBOL_REF:
6002 *preloc |= SYMBOL_REF_LOCAL_P (x) ? 1 : 2;
6003 break;
6004 case LABEL_REF:
6005 *preloc |= 1;
6006 break;
6007 default:
6008 break;
6009 }
6010
6011 return 0;
6012}
6013
6014static int
6015compute_reloc_for_rtx (rtx x)
6016{
6017 int reloc;
6018
6019 switch (GET_CODE (x))
6020 {
6021 case CONST:
6022 case SYMBOL_REF:
6023 case LABEL_REF:
6024 reloc = 0;
6025 for_each_rtx (&x, compute_reloc_for_rtx_1, &reloc);
6026 return reloc;
6027
6028 default:
6029 return 0;
6030 }
6031}
6032
d6b5193b 6033section *
2e1eedd6
AJ
6034default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
6035 rtx x,
6036 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
b64a1b53 6037{
9b580a0b
RH
6038 if (compute_reloc_for_rtx (x) & targetm.asm_out.reloc_rw_mask ())
6039 return data_section;
6040 else
6041 return readonly_data_section;
b64a1b53
RH
6042}
6043
d6b5193b 6044section *
2e1eedd6
AJ
6045default_elf_select_rtx_section (enum machine_mode mode, rtx x,
6046 unsigned HOST_WIDE_INT align)
b64a1b53 6047{
9b580a0b 6048 int reloc = compute_reloc_for_rtx (x);
b64a1b53 6049
9b580a0b 6050 /* ??? Handle small data here somehow. */
b64a1b53 6051
9b580a0b
RH
6052 if (reloc & targetm.asm_out.reloc_rw_mask ())
6053 {
6054 if (reloc == 1)
d6b5193b 6055 return get_named_section (NULL, ".data.rel.ro.local", 1);
9b580a0b
RH
6056 else
6057 return get_named_section (NULL, ".data.rel.ro", 3);
6058 }
b64a1b53 6059
d6b5193b 6060 return mergeable_constant_section (mode, align, 0);
b64a1b53 6061}
772c5265 6062
52859c77
RH
6063/* Set the generally applicable flags on the SYMBOL_REF for EXP. */
6064
6065void
2e1eedd6 6066default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
52859c77 6067{
c6a2438a 6068 rtx symbol;
52859c77
RH
6069 int flags;
6070
52859c77 6071 /* Careful not to prod global register variables. */
3c0cb5de 6072 if (!MEM_P (rtl))
52859c77
RH
6073 return;
6074 symbol = XEXP (rtl, 0);
6075 if (GET_CODE (symbol) != SYMBOL_REF)
6076 return;
6077
3fa9c136 6078 flags = SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_HAS_BLOCK_INFO;
52859c77
RH
6079 if (TREE_CODE (decl) == FUNCTION_DECL)
6080 flags |= SYMBOL_FLAG_FUNCTION;
5fd9b178 6081 if (targetm.binds_local_p (decl))
52859c77 6082 flags |= SYMBOL_FLAG_LOCAL;
8893239d
RH
6083 if (targetm.have_tls && TREE_CODE (decl) == VAR_DECL
6084 && DECL_THREAD_LOCAL_P (decl))
c2f7fa15 6085 flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT;
0050e862
AM
6086 else if (targetm.in_small_data_p (decl))
6087 flags |= SYMBOL_FLAG_SMALL;
1b8135a4
RH
6088 /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without
6089 being PUBLIC, the thing *must* be defined in this translation unit.
6090 Prevent this buglet from being propagated into rtl code as well. */
6091 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
52859c77
RH
6092 flags |= SYMBOL_FLAG_EXTERNAL;
6093
6094 SYMBOL_REF_FLAGS (symbol) = flags;
6095}
6096
772c5265
RH
6097/* By default, we do nothing for encode_section_info, so we need not
6098 do anything but discard the '*' marker. */
6099
6100const char *
2e1eedd6 6101default_strip_name_encoding (const char *str)
772c5265
RH
6102{
6103 return str + (*str == '*');
6104}
47754fd5 6105
aacd3885
RS
6106#ifdef ASM_OUTPUT_DEF
6107/* The default implementation of TARGET_ASM_OUTPUT_ANCHOR. Define the
6108 anchor relative to ".", the current section position. */
6109
6110void
6111default_asm_output_anchor (rtx symbol)
6112{
6113 char buffer[100];
6114
c1a1cc5f 6115 sprintf (buffer, "*. + " HOST_WIDE_INT_PRINT_DEC,
aacd3885
RS
6116 SYMBOL_REF_BLOCK_OFFSET (symbol));
6117 ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
6118}
6119#endif
6120
6121/* The default implementation of TARGET_USE_ANCHORS_FOR_SYMBOL_P. */
6122
6123bool
3101faab 6124default_use_anchors_for_symbol_p (const_rtx symbol)
aacd3885
RS
6125{
6126 section *sect;
6127 tree decl;
6128
6129 /* Don't use anchors for mergeable sections. The linker might move
6130 the objects around. */
6131 sect = SYMBOL_REF_BLOCK (symbol)->sect;
6132 if (sect->common.flags & SECTION_MERGE)
6133 return false;
6134
6135 /* Don't use anchors for small data sections. The small data register
6136 acts as an anchor for such sections. */
6137 if (sect->common.flags & SECTION_SMALL)
6138 return false;
6139
6140 decl = SYMBOL_REF_DECL (symbol);
6141 if (decl && DECL_P (decl))
6142 {
6143 /* Don't use section anchors for decls that might be defined by
6144 other modules. */
6145 if (!targetm.binds_local_p (decl))
6146 return false;
6147
6148 /* Don't use section anchors for decls that will be placed in a
6149 small data section. */
6150 /* ??? Ideally, this check would be redundant with the SECTION_SMALL
6151 one above. The problem is that we only use SECTION_SMALL for
6152 sections that should be marked as small in the section directive. */
6153 if (targetm.in_small_data_p (decl))
6154 return false;
6155 }
6156 return true;
6157}
6158
47754fd5
RH
6159/* Assume ELF-ish defaults, since that's pretty much the most liberal
6160 wrt cross-module name binding. */
6161
6162bool
3101faab 6163default_binds_local_p (const_tree exp)
2cc9fb4c 6164{
24a4dd31 6165 return default_binds_local_p_1 (exp, flag_shlib);
2cc9fb4c
DE
6166}
6167
6168bool
3101faab 6169default_binds_local_p_1 (const_tree exp, int shlib)
47754fd5
RH
6170{
6171 bool local_p;
6172
6173 /* A non-decl is an entry in the constant pool. */
6174 if (!DECL_P (exp))
6175 local_p = true;
a9b0b825
GK
6176 /* Weakrefs may not bind locally, even though the weakref itself is
6177 always static and therefore local. */
6178 else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp)))
6179 local_p = false;
923c7cdf
RH
6180 /* Static variables are always local. */
6181 else if (! TREE_PUBLIC (exp))
6182 local_p = true;
a9b0b825
GK
6183 /* A variable is local if the user has said explicitly that it will
6184 be. */
083cad55 6185 else if (DECL_VISIBILITY_SPECIFIED (exp)
a9b0b825 6186 && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
47754fd5 6187 local_p = true;
a9b0b825 6188 /* Variables defined outside this object might not be local. */
47754fd5
RH
6189 else if (DECL_EXTERNAL (exp))
6190 local_p = false;
a9b0b825
GK
6191 /* If defined in this object and visibility is not default, must be
6192 local. */
d7afec4b
ND
6193 else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
6194 local_p = true;
a9b0b825
GK
6195 /* Default visibility weak data can be overridden by a strong symbol
6196 in another module and so are not local. */
6197 else if (DECL_WEAK (exp))
6198 local_p = false;
47754fd5 6199 /* If PIC, then assume that any global name can be overridden by
d236f595
NF
6200 symbols resolved from other modules, unless we are compiling with
6201 -fwhole-program, which assumes that names are local. */
2cc9fb4c 6202 else if (shlib)
d236f595 6203 local_p = flag_whole_program;
47754fd5
RH
6204 /* Uninitialized COMMON variable may be unified with symbols
6205 resolved from other modules. */
6206 else if (DECL_COMMON (exp)
6207 && (DECL_INITIAL (exp) == NULL
6208 || DECL_INITIAL (exp) == error_mark_node))
6209 local_p = false;
6210 /* Otherwise we're left with initialized (or non-common) global data
6211 which is of necessity defined locally. */
6212 else
6213 local_p = true;
6214
6215 return local_p;
6216}
e2500fed 6217
4977bab6 6218/* Determine whether or not a pointer mode is valid. Assume defaults
5bdc5878 6219 of ptr_mode or Pmode - can be overridden. */
4977bab6 6220bool
2e1eedd6 6221default_valid_pointer_mode (enum machine_mode mode)
4977bab6
ZW
6222{
6223 return (mode == ptr_mode || mode == Pmode);
6224}
6225
5eb99654 6226/* Default function to output code that will globalize a label. A
f3b569ca 6227 target must define GLOBAL_ASM_OP or provide its own function to
5eb99654
KG
6228 globalize a label. */
6229#ifdef GLOBAL_ASM_OP
6230void
2e1eedd6 6231default_globalize_label (FILE * stream, const char *name)
5eb99654
KG
6232{
6233 fputs (GLOBAL_ASM_OP, stream);
6234 assemble_name (stream, name);
6235 putc ('\n', stream);
6236}
6237#endif /* GLOBAL_ASM_OP */
2e1eedd6 6238
812b587e
SE
6239/* Default function to output code that will globalize a declaration. */
6240void
6241default_globalize_decl_name (FILE * stream, tree decl)
6242{
6243 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
6244 targetm.asm_out.globalize_label (stream, name);
6245}
6246
4746cf84
MA
6247/* Default function to output a label for unwind information. The
6248 default is to do nothing. A target that needs nonlocal labels for
9cf737f8 6249 unwind information must provide its own function to do this. */
4746cf84
MA
6250void
6251default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
6252 tree decl ATTRIBUTE_UNUSED,
eeab4d81 6253 int for_eh ATTRIBUTE_UNUSED,
4746cf84 6254 int empty ATTRIBUTE_UNUSED)
083cad55
EC
6255{
6256}
6257
6258/* Default function to output a label to divide up the exception table.
6259 The default is to do nothing. A target that needs/wants to divide
6260 up the table must provide it's own function to do this. */
6261void
6262default_emit_except_table_label (FILE * stream ATTRIBUTE_UNUSED)
6263{
4746cf84
MA
6264}
6265
4977bab6
ZW
6266/* This is how to output an internal numbered label where PREFIX is
6267 the class of label and LABELNO is the number within the class. */
6268
6269void
2e1eedd6
AJ
6270default_internal_label (FILE *stream, const char *prefix,
6271 unsigned long labelno)
4977bab6
ZW
6272{
6273 char *const buf = alloca (40 + strlen (prefix));
6274 ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
57829bc4 6275 ASM_OUTPUT_INTERNAL_LABEL (stream, buf);
4977bab6
ZW
6276}
6277
1bc7c5b6
ZW
6278/* This is the default behavior at the beginning of a file. It's
6279 controlled by two other target-hook toggles. */
6280void
2e1eedd6 6281default_file_start (void)
1bc7c5b6
ZW
6282{
6283 if (targetm.file_start_app_off && !flag_verbose_asm)
6284 fputs (ASM_APP_OFF, asm_out_file);
6285
6286 if (targetm.file_start_file_directive)
6287 output_file_directive (asm_out_file, main_input_filename);
6288}
6289
a5fe455b
ZW
6290/* This is a generic routine suitable for use as TARGET_ASM_FILE_END
6291 which emits a special section directive used to indicate whether or
6292 not this object file needs an executable stack. This is primarily
6293 a GNU extension to ELF but could be used on other targets. */
6de9cd9a
DN
6294
6295int trampolines_created;
6296
a5fe455b 6297void
2e1eedd6 6298file_end_indicate_exec_stack (void)
a5fe455b
ZW
6299{
6300 unsigned int flags = SECTION_DEBUG;
6301 if (trampolines_created)
6302 flags |= SECTION_CODE;
6303
d6b5193b
RS
6304 switch_to_section (get_section (".note.GNU-stack", flags, NULL));
6305}
6306
6307/* Output DIRECTIVE (a C string) followed by a newline. This is used as
6308 a get_unnamed_section callback. */
6309
6310void
6311output_section_asm_op (const void *directive)
6312{
6313 fprintf (asm_out_file, "%s\n", (const char *) directive);
6314}
6315
6316/* Emit assembly code to switch to section NEW_SECTION. Do nothing if
6317 the current section is NEW_SECTION. */
6318
6319void
6320switch_to_section (section *new_section)
6321{
6322 if (in_section == new_section)
6323 return;
6324
6325 if (new_section->common.flags & SECTION_FORGET)
6326 in_section = NULL;
6327 else
c543ca49 6328 in_section = new_section;
d6b5193b 6329
434aeebb 6330 switch (SECTION_STYLE (new_section))
d6b5193b 6331 {
434aeebb 6332 case SECTION_NAMED:
d6b5193b
RS
6333 if (cfun
6334 && !cfun->unlikely_text_section_name
6335 && strcmp (new_section->named.name,
6336 UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
6337 cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
6338
6339 targetm.asm_out.named_section (new_section->named.name,
6340 new_section->named.common.flags,
6341 new_section->named.decl);
434aeebb
RS
6342 break;
6343
6344 case SECTION_UNNAMED:
6345 new_section->unnamed.callback (new_section->unnamed.data);
6346 break;
6347
6348 case SECTION_NOSWITCH:
6349 gcc_unreachable ();
6350 break;
d6b5193b 6351 }
d6b5193b
RS
6352
6353 new_section->common.flags |= SECTION_DECLARED;
a5fe455b
ZW
6354}
6355
aacd3885
RS
6356/* If block symbol SYMBOL has not yet been assigned an offset, place
6357 it at the end of its block. */
6358
6359void
6360place_block_symbol (rtx symbol)
6361{
6362 unsigned HOST_WIDE_INT size, mask, offset;
6363 struct constant_descriptor_rtx *desc;
6364 unsigned int alignment;
6365 struct object_block *block;
6366 tree decl;
6367
434aeebb 6368 gcc_assert (SYMBOL_REF_BLOCK (symbol));
aacd3885
RS
6369 if (SYMBOL_REF_BLOCK_OFFSET (symbol) >= 0)
6370 return;
6371
6372 /* Work out the symbol's size and alignment. */
6373 if (CONSTANT_POOL_ADDRESS_P (symbol))
6374 {
6375 desc = SYMBOL_REF_CONSTANT (symbol);
6376 alignment = desc->align;
6377 size = GET_MODE_SIZE (desc->mode);
6378 }
6379 else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
6380 {
6381 decl = SYMBOL_REF_DECL (symbol);
6382 alignment = get_constant_alignment (decl);
6383 size = get_constant_size (decl);
6384 }
6385 else
6386 {
6387 decl = SYMBOL_REF_DECL (symbol);
6388 alignment = DECL_ALIGN (decl);
6389 size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
6390 }
6391
6392 /* Calculate the object's offset from the start of the block. */
6393 block = SYMBOL_REF_BLOCK (symbol);
6394 mask = alignment / BITS_PER_UNIT - 1;
6395 offset = (block->size + mask) & ~mask;
6396 SYMBOL_REF_BLOCK_OFFSET (symbol) = offset;
6397
6398 /* Record the block's new alignment and size. */
6399 block->alignment = MAX (block->alignment, alignment);
6400 block->size = offset + size;
6401
6402 VEC_safe_push (rtx, gc, block->objects, symbol);
6403}
6404
6405/* Return the anchor that should be used to address byte offset OFFSET
6406 from the first object in BLOCK. MODEL is the TLS model used
6407 to access it. */
6408
6409rtx
6410get_section_anchor (struct object_block *block, HOST_WIDE_INT offset,
6411 enum tls_model model)
6412{
6413 char label[100];
6414 unsigned int begin, middle, end;
6415 unsigned HOST_WIDE_INT min_offset, max_offset, range, bias, delta;
6416 rtx anchor;
6417
6418 /* Work out the anchor's offset. Use an offset of 0 for the first
6419 anchor so that we don't pessimize the case where we take the address
6420 of a variable at the beginning of the block. This is particularly
6421 useful when a block has only one variable assigned to it.
6422
6423 We try to place anchors RANGE bytes apart, so there can then be
6424 anchors at +/-RANGE, +/-2 * RANGE, and so on, up to the limits of
6425 a ptr_mode offset. With some target settings, the lowest such
6426 anchor might be out of range for the lowest ptr_mode offset;
6427 likewise the highest anchor for the highest offset. Use anchors
6428 at the extreme ends of the ptr_mode range in such cases.
6429
6430 All arithmetic uses unsigned integers in order to avoid
6431 signed overflow. */
6432 max_offset = (unsigned HOST_WIDE_INT) targetm.max_anchor_offset;
6433 min_offset = (unsigned HOST_WIDE_INT) targetm.min_anchor_offset;
6434 range = max_offset - min_offset + 1;
6435 if (range == 0)
6436 offset = 0;
6437 else
6438 {
6439 bias = 1 << (GET_MODE_BITSIZE (ptr_mode) - 1);
6440 if (offset < 0)
6441 {
6442 delta = -(unsigned HOST_WIDE_INT) offset + max_offset;
6443 delta -= delta % range;
6444 if (delta > bias)
6445 delta = bias;
6446 offset = (HOST_WIDE_INT) (-delta);
6447 }
6448 else
6449 {
6450 delta = (unsigned HOST_WIDE_INT) offset - min_offset;
6451 delta -= delta % range;
6452 if (delta > bias - 1)
6453 delta = bias - 1;
6454 offset = (HOST_WIDE_INT) delta;
6455 }
6456 }
6457
6458 /* Do a binary search to see if there's already an anchor we can use.
6459 Set BEGIN to the new anchor's index if not. */
6460 begin = 0;
6461 end = VEC_length (rtx, block->anchors);
6462 while (begin != end)
6463 {
6464 middle = (end + begin) / 2;
6465 anchor = VEC_index (rtx, block->anchors, middle);
6466 if (SYMBOL_REF_BLOCK_OFFSET (anchor) > offset)
6467 end = middle;
6468 else if (SYMBOL_REF_BLOCK_OFFSET (anchor) < offset)
6469 begin = middle + 1;
6470 else if (SYMBOL_REF_TLS_MODEL (anchor) > model)
6471 end = middle;
6472 else if (SYMBOL_REF_TLS_MODEL (anchor) < model)
6473 begin = middle + 1;
6474 else
6475 return anchor;
6476 }
6477
6478 /* Create a new anchor with a unique label. */
6479 ASM_GENERATE_INTERNAL_LABEL (label, "LANCHOR", anchor_labelno++);
6480 anchor = create_block_symbol (ggc_strdup (label), block, offset);
6481 SYMBOL_REF_FLAGS (anchor) |= SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_ANCHOR;
6482 SYMBOL_REF_FLAGS (anchor) |= model << SYMBOL_FLAG_TLS_SHIFT;
6483
6484 /* Insert it at index BEGIN. */
6485 VEC_safe_insert (rtx, gc, block->anchors, begin, anchor);
6486 return anchor;
6487}
6488
6489/* Output the objects in BLOCK. */
6490
6491static void
6492output_object_block (struct object_block *block)
6493{
6494 struct constant_descriptor_rtx *desc;
6495 unsigned int i;
6496 HOST_WIDE_INT offset;
6497 tree decl;
6498 rtx symbol;
6499
6500 if (block->objects == NULL)
6501 return;
6502
6503 /* Switch to the section and make sure that the first byte is
6504 suitably aligned. */
6505 switch_to_section (block->sect);
6506 assemble_align (block->alignment);
6507
6508 /* Define the values of all anchors relative to the current section
6509 position. */
6510 for (i = 0; VEC_iterate (rtx, block->anchors, i, symbol); i++)
6511 targetm.asm_out.output_anchor (symbol);
6512
6513 /* Output the objects themselves. */
6514 offset = 0;
6515 for (i = 0; VEC_iterate (rtx, block->objects, i, symbol); i++)
6516 {
6517 /* Move to the object's offset, padding with zeros if necessary. */
6518 assemble_zeros (SYMBOL_REF_BLOCK_OFFSET (symbol) - offset);
6519 offset = SYMBOL_REF_BLOCK_OFFSET (symbol);
6520 if (CONSTANT_POOL_ADDRESS_P (symbol))
6521 {
6522 desc = SYMBOL_REF_CONSTANT (symbol);
6523 output_constant_pool_1 (desc, 1);
6524 offset += GET_MODE_SIZE (desc->mode);
6525 }
6526 else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
6527 {
6528 decl = SYMBOL_REF_DECL (symbol);
6529 assemble_constant_contents (decl, XSTR (symbol, 0),
6530 get_constant_alignment (decl));
6531 offset += get_constant_size (decl);
6532 }
6533 else
6534 {
6535 decl = SYMBOL_REF_DECL (symbol);
6536 assemble_variable_contents (decl, XSTR (symbol, 0), false);
6537 offset += tree_low_cst (DECL_SIZE_UNIT (decl), 1);
6538 }
6539 }
6540}
6541
6542/* A htab_traverse callback used to call output_object_block for
6543 each member of object_block_htab. */
6544
6545static int
6546output_object_block_htab (void **slot, void *data ATTRIBUTE_UNUSED)
6547{
6548 output_object_block ((struct object_block *) (*slot));
6549 return 1;
6550}
6551
6552/* Output the definitions of all object_blocks. */
6553
6554void
6555output_object_blocks (void)
6556{
6557 htab_traverse (object_block_htab, output_object_block_htab, NULL);
6558}
6559
e0d9d0dd
NC
6560/* This function provides a possible implementation of the
6561 TARGET_ASM_RECORD_GCC_SWITCHES target hook for ELF targets. When triggered
6562 by -frecord-gcc-switches it creates a new mergeable, string section in the
6563 assembler output file called TARGET_ASM_RECORD_GCC_SWITCHES_SECTION which
6564 contains the switches in ASCII format.
6565
6566 FIXME: This code does not correctly handle double quote characters
6567 that appear inside strings, (it strips them rather than preserving them).
6568 FIXME: ASM_OUTPUT_ASCII, as defined in config/elfos.h will not emit NUL
6569 characters - instead it treats them as sub-string separators. Since
6570 we want to emit NUL strings terminators into the object file we have to use
6571 ASM_OUTPUT_SKIP. */
6572
6573int
6574elf_record_gcc_switches (print_switch_type type, const char * name)
6575{
6576 static char buffer[1024];
6577
6578 /* This variable is used as part of a simplistic heuristic to detect
6579 command line switches which take an argument:
6580
6581 "If a command line option does not start with a dash then
6582 it is an argument for the previous command line option."
6583
6584 This fails in the case of the command line option which is the name
6585 of the file to compile, but otherwise it is pretty reasonable. */
6586 static bool previous_name_held_back = FALSE;
6587
6588 switch (type)
6589 {
6590 case SWITCH_TYPE_PASSED:
6591 if (* name != '-')
6592 {
6593 if (previous_name_held_back)
6594 {
6595 unsigned int len = strlen (buffer);
6596
6597 snprintf (buffer + len, sizeof buffer - len, " %s", name);
6598 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6599 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6600 previous_name_held_back = FALSE;
6601 }
6602 else
6603 {
6604 strncpy (buffer, name, sizeof buffer);
6605 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6606 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6607 }
6608 }
6609 else
6610 {
6611 if (previous_name_held_back)
6612 {
6613 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6614 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6615 }
6616
6617 strncpy (buffer, name, sizeof buffer);
6618 previous_name_held_back = TRUE;
6619 }
6620 break;
6621
6622 case SWITCH_TYPE_DESCRIPTIVE:
6623 if (name == NULL)
6624 {
6625 /* Distinguish between invocations where name is NULL. */
6626 static bool started = false;
6627
6628 if (started)
6629 {
6630 if (previous_name_held_back)
6631 {
6632 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6633 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6634 }
6635 }
6636 else
6637 {
6638 section * sec;
6639
6640 sec = get_section (targetm.asm_out.record_gcc_switches_section,
6641 SECTION_DEBUG
6642 | SECTION_MERGE
6643 | SECTION_STRINGS
6644 | (SECTION_ENTSIZE & 1),
6645 NULL);
6646 switch_to_section (sec);
6647 started = true;
6648 }
6649 }
6650
6651 default:
6652 break;
6653 }
6654
6655 /* The return value is currently ignored by the caller, but must be 0.
6656 For -fverbose-asm the return value would be the number of characters
6657 emitted into the assembler file. */
6658 return 0;
6659}
6660
c47c29c8
L
6661/* Emit text to declare externally defined symbols. It is needed to
6662 properly support non-default visibility. */
6663void
6664default_elf_asm_output_external (FILE *file ATTRIBUTE_UNUSED,
6665 tree decl,
6666 const char *name ATTRIBUTE_UNUSED)
6667{
6668 /* We output the name if and only if TREE_SYMBOL_REFERENCED is
6669 set in order to avoid putting out names that are never really
6670 used. */
6671 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
6672 && targetm.binds_local_p (decl))
6673 maybe_assemble_visibility (decl);
6674}
6675
e2500fed 6676#include "gt-varasm.h"