]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/varasm.c
alpha.c (alpha_mangle_type, [...]): Constify.
[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:
ac79cd5a 2988 {
e2500fed 2989 tree nt1, nt2;
ae2bcd98
RS
2990 nt1 = lang_hooks.expand_constant (t1);
2991 nt2 = lang_hooks.expand_constant (t2);
e2500fed
GK
2992 if (nt1 != t1 || nt2 != t2)
2993 return compare_constant (nt1, nt2);
ac79cd5a
RK
2994 else
2995 return 0;
2996 }
79e68feb
RS
2997 }
2998
fbc848cc 2999 gcc_unreachable ();
79e68feb
RS
3000}
3001\f
e2500fed
GK
3002/* Make a copy of the whole tree structure for a constant. This
3003 handles the same types of nodes that compare_constant handles. */
d12516f1
RS
3004
3005static tree
2e1eedd6 3006copy_constant (tree exp)
d12516f1
RS
3007{
3008 switch (TREE_CODE (exp))
3009 {
310bbbf4
JW
3010 case ADDR_EXPR:
3011 /* For ADDR_EXPR, we do not want to copy the decl whose address
3012 is requested. We do want to copy constants though. */
6615c446 3013 if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
310bbbf4
JW
3014 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
3015 copy_constant (TREE_OPERAND (exp, 0)));
3016 else
3017 return copy_node (exp);
3018
d12516f1
RS
3019 case INTEGER_CST:
3020 case REAL_CST:
091a3ac7 3021 case FIXED_CST:
d12516f1 3022 case STRING_CST:
d12516f1
RS
3023 return copy_node (exp);
3024
3025 case COMPLEX_CST:
28eb1cb8
RK
3026 return build_complex (TREE_TYPE (exp),
3027 copy_constant (TREE_REALPART (exp)),
d12516f1
RS
3028 copy_constant (TREE_IMAGPART (exp)));
3029
3030 case PLUS_EXPR:
5be014d5 3031 case POINTER_PLUS_EXPR:
d12516f1 3032 case MINUS_EXPR:
3244e67d
RS
3033 return build2 (TREE_CODE (exp), TREE_TYPE (exp),
3034 copy_constant (TREE_OPERAND (exp, 0)),
3035 copy_constant (TREE_OPERAND (exp, 1)));
d12516f1
RS
3036
3037 case NOP_EXPR:
3038 case CONVERT_EXPR:
a9d07d6e 3039 case NON_LVALUE_EXPR:
a71c8ddc 3040 case VIEW_CONVERT_EXPR:
d12516f1
RS
3041 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
3042 copy_constant (TREE_OPERAND (exp, 0)));
3043
3044 case CONSTRUCTOR:
3045 {
3046 tree copy = copy_node (exp);
4038c495
GB
3047 VEC(constructor_elt, gc) *v;
3048 unsigned HOST_WIDE_INT idx;
3049 tree purpose, value;
083cad55 3050
4038c495
GB
3051 v = VEC_alloc(constructor_elt, gc, VEC_length(constructor_elt,
3052 CONSTRUCTOR_ELTS (exp)));
3053 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value)
3054 {
3055 constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL);
3056 ce->index = purpose;
3057 ce->value = copy_constant (value);
3058 }
3059 CONSTRUCTOR_ELTS (copy) = v;
d12516f1
RS
3060 return copy;
3061 }
3062
3063 default:
e2500fed 3064 {
fbc848cc 3065 tree t = lang_hooks.expand_constant (exp);
083cad55 3066
2801ed8e 3067 gcc_assert (t != exp);
fbc848cc 3068 return copy_constant (t);
e2500fed 3069 }
d12516f1
RS
3070 }
3071}
ff8f4401 3072\f
aacd3885
RS
3073/* Return the alignment of constant EXP in bits. */
3074
3075static unsigned int
3076get_constant_alignment (tree exp)
3077{
3078 unsigned int align;
3079
3080 align = TYPE_ALIGN (TREE_TYPE (exp));
3081#ifdef CONSTANT_ALIGNMENT
3082 align = CONSTANT_ALIGNMENT (exp, align);
3083#endif
3084 return align;
3085}
3086
3087/* Return the section into which constant EXP should be placed. */
3088
3089static section *
3090get_constant_section (tree exp)
3091{
3092 if (IN_NAMED_SECTION (exp))
3093 return get_named_section (exp, NULL, compute_reloc_for_constant (exp));
3094 else
3095 return targetm.asm_out.select_section (exp,
3096 compute_reloc_for_constant (exp),
3097 get_constant_alignment (exp));
3098}
3099
3100/* Return the size of constant EXP in bytes. */
3101
3102static HOST_WIDE_INT
3103get_constant_size (tree exp)
3104{
3105 HOST_WIDE_INT size;
3106
3107 size = int_size_in_bytes (TREE_TYPE (exp));
3108 if (TREE_CODE (exp) == STRING_CST)
3109 size = MAX (TREE_STRING_LENGTH (exp), size);
3110 return size;
3111}
3112
293107d1
ZW
3113/* Subroutine of output_constant_def:
3114 No constant equal to EXP is known to have been output.
3115 Make a constant descriptor to enter EXP in the hash table.
3116 Assign the label number and construct RTL to refer to the
3117 constant's location in memory.
3118 Caller is responsible for updating the hash table. */
3119
3120static struct constant_descriptor_tree *
2e1eedd6 3121build_constant_desc (tree exp)
293107d1
ZW
3122{
3123 rtx symbol;
3124 rtx rtl;
3125 char label[256];
3126 int labelno;
3127 struct constant_descriptor_tree *desc;
3128
3129 desc = ggc_alloc (sizeof (*desc));
3521b33c 3130 desc->value = copy_constant (exp);
293107d1 3131
9cf737f8 3132 /* Propagate marked-ness to copied constant. */
6de9cd9a
DN
3133 if (flag_mudflap && mf_marked_p (exp))
3134 mf_mark (desc->value);
3135
293107d1
ZW
3136 /* Create a string containing the label name, in LABEL. */
3137 labelno = const_labelno++;
3138 ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
3139
3140 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
aacd3885
RS
3141 if (use_object_blocks_p ())
3142 {
3143 section *sect = get_constant_section (exp);
3144 symbol = create_block_symbol (ggc_strdup (label),
3145 get_block_for_section (sect), -1);
3146 }
3147 else
3148 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3149 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
929e5e5b 3150 SET_SYMBOL_REF_DECL (symbol, desc->value);
2adb9af1 3151 TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
293107d1
ZW
3152
3153 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
3154 set_mem_attributes (rtl, exp, 1);
3155 set_mem_alias_set (rtl, 0);
3156 set_mem_alias_set (rtl, const_alias_set);
3157
3158 /* Set flags or add text to the name to record information, such as
3159 that it is a local symbol. If the name is changed, the macro
3160 ASM_OUTPUT_LABELREF will have to know how to strip this
10b6a274
ZW
3161 information. This call might invalidate our local variable
3162 SYMBOL; we can't use it afterward. */
3163
5fd9b178 3164 targetm.encode_section_info (exp, rtl, true);
293107d1
ZW
3165
3166 desc->rtl = rtl;
293107d1
ZW
3167
3168 return desc;
3169}
3170
79e68feb
RS
3171/* Return an rtx representing a reference to constant data in memory
3172 for the constant expression EXP.
ff8f4401 3173
79e68feb
RS
3174 If assembler code for such a constant has already been output,
3175 return an rtx to refer to it.
b20cbca2 3176 Otherwise, output such a constant in memory
ff8f4401
RS
3177 and generate an rtx for it.
3178
10b6a274
ZW
3179 If DEFER is nonzero, this constant can be deferred and output only
3180 if referenced in the function after all optimizations.
bd7cf17e 3181
5e9295fa 3182 `const_desc_table' records which constants already have label strings. */
79e68feb
RS
3183
3184rtx
2e1eedd6 3185output_constant_def (tree exp, int defer)
79e68feb 3186{
e2500fed 3187 struct constant_descriptor_tree *desc;
10b6a274
ZW
3188 struct constant_descriptor_tree key;
3189 void **loc;
79e68feb 3190
10b6a274
ZW
3191 /* Look up EXP in the table of constant descriptors. If we didn't find
3192 it, create a new one. */
3193 key.value = exp;
b96917bf
JJ
3194 key.hash = const_hash_1 (exp);
3195 loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT);
46f9491e 3196
10b6a274 3197 desc = *loc;
14a774a9 3198 if (desc == 0)
00f07fb9 3199 {
293107d1 3200 desc = build_constant_desc (exp);
b96917bf 3201 desc->hash = key.hash;
10b6a274 3202 *loc = desc;
14a774a9
RK
3203 }
3204
10b6a274 3205 maybe_output_constant_def_contents (desc, defer);
293107d1
ZW
3206 return desc->rtl;
3207}
79e68feb 3208
10b6a274
ZW
3209/* Subroutine of output_constant_def: Decide whether or not we need to
3210 output the constant DESC now, and if so, do it. */
293107d1 3211static void
2e1eedd6
AJ
3212maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
3213 int defer)
293107d1 3214{
10b6a274 3215 rtx symbol = XEXP (desc->rtl, 0);
2adb9af1 3216 tree exp = desc->value;
10b6a274 3217
293107d1
ZW
3218 if (flag_syntax_only)
3219 return;
79e68feb 3220
2adb9af1 3221 if (TREE_ASM_WRITTEN (exp))
10b6a274
ZW
3222 /* Already output; don't do it again. */
3223 return;
3224
3521b33c
ZW
3225 /* We can always defer constants as long as the context allows
3226 doing so. */
3227 if (defer)
bd7cf17e 3228 {
2adb9af1
RH
3229 /* Increment n_deferred_constants if it exists. It needs to be at
3230 least as large as the number of constants actually referred to
3231 by the function. If it's too small we'll stop looking too early
3232 and fail to emit constants; if it's too large we'll only look
3233 through the entire function when we could have stopped earlier. */
10b6a274
ZW
3234 if (cfun)
3235 n_deferred_constants++;
32a61907 3236 return;
ff8f4401
RS
3237 }
3238
10b6a274 3239 output_constant_def_contents (symbol);
ff8f4401
RS
3240}
3241
aacd3885
RS
3242/* Subroutine of output_constant_def_contents. Output the definition
3243 of constant EXP, which is pointed to by label LABEL. ALIGN is the
3244 constant's alignment in bits. */
3245
3246static void
3247assemble_constant_contents (tree exp, const char *label, unsigned int align)
3248{
3249 HOST_WIDE_INT size;
3250
3251 size = get_constant_size (exp);
3252
3253 /* Do any machine/system dependent processing of the constant. */
3254#ifdef ASM_DECLARE_CONSTANT_NAME
3255 ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
3256#else
3257 /* Standard thing is just output label for the constant. */
3258 ASM_OUTPUT_LABEL (asm_out_file, label);
3259#endif /* ASM_DECLARE_CONSTANT_NAME */
3260
3261 /* Output the value of EXP. */
3262 output_constant (exp, size, align);
3263}
3264
10b6a274 3265/* We must output the constant data referred to by SYMBOL; do so. */
79e68feb 3266
ff8f4401 3267static void
2e1eedd6 3268output_constant_def_contents (rtx symbol)
ff8f4401 3269{
10b6a274 3270 tree exp = SYMBOL_REF_DECL (symbol);
aacd3885 3271 unsigned int align;
10b6a274 3272
293107d1
ZW
3273 /* Make sure any other constants whose addresses appear in EXP
3274 are assigned label numbers. */
b2218cc1
AO
3275 output_addressed_constants (exp);
3276
10b6a274 3277 /* We are no longer deferring this constant. */
2adb9af1 3278 TREE_ASM_WRITTEN (exp) = 1;
10b6a274 3279
aacd3885
RS
3280 /* If the constant is part of an object block, make sure that the
3281 decl has been positioned within its block, but do not write out
3282 its definition yet. output_object_blocks will do that later. */
3fa9c136 3283 if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol))
aacd3885 3284 place_block_symbol (symbol);
8a425a05 3285 else
91ea4f8d 3286 {
aacd3885
RS
3287 switch_to_section (get_constant_section (exp));
3288 align = get_constant_alignment (exp);
3289 if (align > BITS_PER_UNIT)
3290 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
3291 assemble_constant_contents (exp, XSTR (symbol, 0), align);
91ea4f8d 3292 }
6de9cd9a
DN
3293 if (flag_mudflap)
3294 mudflap_enqueue_constant (exp);
a2a6a79b 3295}
75c20980
RH
3296
3297/* Look up EXP in the table of constant descriptors. Return the rtl
3298 if it has been emitted, else null. */
3299
3300rtx
3301lookup_constant_def (tree exp)
3302{
3303 struct constant_descriptor_tree *desc;
3304 struct constant_descriptor_tree key;
3305
3306 key.value = exp;
b96917bf
JJ
3307 key.hash = const_hash_1 (exp);
3308 desc = htab_find_with_hash (const_desc_htab, &key, key.hash);
75c20980
RH
3309
3310 return (desc ? desc->rtl : NULL_RTX);
3311}
79e68feb 3312\f
e2500fed
GK
3313/* Used in the hash tables to avoid outputting the same constant
3314 twice. Unlike 'struct constant_descriptor_tree', RTX constants
3234b52d
RH
3315 are output once per function, not once per file. */
3316/* ??? Only a few targets need per-function constant pools. Most
3317 can use one per-file pool. Should add a targetm bit to tell the
3318 difference. */
3319
3320struct rtx_constant_pool GTY(())
3321{
3322 /* Pointers to first and last constant in pool, as ordered by offset. */
3323 struct constant_descriptor_rtx *first;
3324 struct constant_descriptor_rtx *last;
3325
3326 /* Hash facility for making memory-constants from constant rtl-expressions.
3327 It is used on RISC machines where immediate integer arguments and
3328 constant addresses are restricted so that such constants must be stored
3329 in memory. */
3330 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
3234b52d
RH
3331
3332 /* Current offset in constant pool (does not include any
3333 machine-specific header). */
3334 HOST_WIDE_INT offset;
e2500fed
GK
3335};
3336
3234b52d 3337struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
79e68feb 3338{
3234b52d
RH
3339 struct constant_descriptor_rtx *next;
3340 rtx mem;
3341 rtx sym;
79e68feb 3342 rtx constant;
3234b52d
RH
3343 HOST_WIDE_INT offset;
3344 hashval_t hash;
94b01be3 3345 enum machine_mode mode;
a79e3a45 3346 unsigned int align;
3234b52d 3347 int labelno;
91674c37 3348 int mark;
79e68feb
RS
3349};
3350
3234b52d 3351/* Hash and compare functions for const_rtx_htab. */
79e68feb 3352
3234b52d
RH
3353static hashval_t
3354const_desc_rtx_hash (const void *ptr)
3355{
3356 const struct constant_descriptor_rtx *desc = ptr;
3357 return desc->hash;
3358}
79e68feb 3359
3234b52d
RH
3360static int
3361const_desc_rtx_eq (const void *a, const void *b)
79e68feb 3362{
3234b52d
RH
3363 const struct constant_descriptor_rtx *x = a;
3364 const struct constant_descriptor_rtx *y = b;
3365
3366 if (x->mode != y->mode)
3367 return 0;
3368 return rtx_equal_p (x->constant, y->constant);
57632c51 3369}
79e68feb 3370
3234b52d 3371/* This is the worker function for const_rtx_hash, called via for_each_rtx. */
46b33600 3372
3234b52d
RH
3373static int
3374const_rtx_hash_1 (rtx *xp, void *data)
3375{
3376 unsigned HOST_WIDE_INT hwi;
3377 enum machine_mode mode;
3378 enum rtx_code code;
3379 hashval_t h, *hp;
3380 rtx x;
46b33600 3381
3234b52d
RH
3382 x = *xp;
3383 code = GET_CODE (x);
3384 mode = GET_MODE (x);
3385 h = (hashval_t) code * 1048573 + mode;
79e68feb 3386
3234b52d
RH
3387 switch (code)
3388 {
3389 case CONST_INT:
3390 hwi = INTVAL (x);
3391 fold_hwi:
69ef87e2 3392 {
3234b52d
RH
3393 const int shift = sizeof (hashval_t) * CHAR_BIT;
3394 const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
3395 int i;
69ef87e2 3396
3234b52d
RH
3397 h ^= (hashval_t) hwi;
3398 for (i = 1; i < n; ++i)
46b33600 3399 {
3234b52d
RH
3400 hwi >>= shift;
3401 h ^= (hashval_t) hwi;
69ef87e2
AH
3402 }
3403 }
3404 break;
3405
3234b52d
RH
3406 case CONST_DOUBLE:
3407 if (mode == VOIDmode)
3408 {
3409 hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
3410 goto fold_hwi;
3411 }
3412 else
3413 h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
79e68feb
RS
3414 break;
3415
091a3ac7
CF
3416 case CONST_FIXED:
3417 h ^= fixed_hash (CONST_FIXED_VALUE (x));
3418 break;
3419
237f420b
RH
3420 case CONST_VECTOR:
3421 {
3422 int i;
3423 for (i = XVECLEN (x, 0); i-- > 0; )
3424 h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data);
3425 }
3426 break;
3427
79e68feb 3428 case SYMBOL_REF:
3234b52d
RH
3429 h ^= htab_hash_string (XSTR (x, 0));
3430 break;
3431
79e68feb 3432 case LABEL_REF:
3234b52d 3433 h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
79e68feb
RS
3434 break;
3435
3234b52d
RH
3436 case UNSPEC:
3437 case UNSPEC_VOLATILE:
3438 h = h * 251 + XINT (x, 1);
79e68feb
RS
3439 break;
3440
3441 default:
fdf473ae 3442 break;
79e68feb
RS
3443 }
3444
3234b52d
RH
3445 hp = data;
3446 *hp = *hp * 509 + h;
3447 return 0;
79e68feb
RS
3448}
3449
3234b52d 3450/* Compute a hash value for X, which should be a constant. */
57632c51 3451
3234b52d
RH
3452static hashval_t
3453const_rtx_hash (rtx x)
57632c51 3454{
3234b52d
RH
3455 hashval_t h = 0;
3456 for_each_rtx (&x, const_rtx_hash_1, &h);
3457 return h;
57632c51
RS
3458}
3459
3234b52d 3460\f
1d3dbd99
RS
3461/* Create and return a new rtx constant pool. */
3462
3463static struct rtx_constant_pool *
3464create_constant_pool (void)
3465{
3466 struct rtx_constant_pool *pool;
3467
3468 pool = ggc_alloc (sizeof (struct rtx_constant_pool));
3469 pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
3470 const_desc_rtx_eq, NULL);
3471 pool->first = NULL;
3472 pool->last = NULL;
3473 pool->offset = 0;
3474 return pool;
3475}
3476
3234b52d 3477/* Initialize constant pool hashing for a new function. */
79e68feb 3478
3234b52d
RH
3479void
3480init_varasm_status (struct function *f)
79e68feb 3481{
3234b52d 3482 struct varasm_status *p;
79e68feb 3483
3234b52d
RH
3484 p = ggc_alloc (sizeof (struct varasm_status));
3485 f->varasm = p;
79e68feb 3486
1d3dbd99 3487 p->pool = create_constant_pool ();
3234b52d 3488 p->deferred_constants = 0;
79e68feb 3489}
3234b52d
RH
3490\f
3491/* Given a MINUS expression, simplify it if both sides
3492 include the same symbol. */
79e68feb 3493
3234b52d
RH
3494rtx
3495simplify_subtraction (rtx x)
79e68feb 3496{
3234b52d
RH
3497 rtx r = simplify_rtx (x);
3498 return r ? r : x;
79e68feb
RS
3499}
3500\f
3501/* Given a constant rtx X, make (or find) a memory constant for its value
3502 and return a MEM rtx to refer to it in memory. */
3503
3504rtx
2e1eedd6 3505force_const_mem (enum machine_mode mode, rtx x)
79e68feb 3506{
3234b52d 3507 struct constant_descriptor_rtx *desc, tmp;
1d3dbd99 3508 struct rtx_constant_pool *pool;
79e68feb 3509 char label[256];
52859c77 3510 rtx def, symbol;
3234b52d 3511 hashval_t hash;
a79e3a45 3512 unsigned int align;
3234b52d 3513 void **slot;
79e68feb 3514
3a04ff64 3515 /* If we're not allowed to drop X into the constant pool, don't. */
5fd9b178 3516 if (targetm.cannot_force_const_mem (x))
3a04ff64
RH
3517 return NULL_RTX;
3518
1d3dbd99
RS
3519 /* Record that this function has used a constant pool entry. */
3520 current_function_uses_const_pool = 1;
3521
3522 /* Decide which pool to use. */
3523 pool = (targetm.use_blocks_for_constant_p (mode, x)
3524 ? shared_constant_pool
3525 : cfun->varasm->pool);
3526
3234b52d
RH
3527 /* Lookup the value in the hashtable. */
3528 tmp.constant = x;
3529 tmp.mode = mode;
3530 hash = const_rtx_hash (x);
3531 slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
3532 desc = *slot;
083cad55 3533
3234b52d
RH
3534 /* If the constant was already present, return its memory. */
3535 if (desc)
3536 return copy_rtx (desc->mem);
3537
3538 /* Otherwise, create a new descriptor. */
3539 desc = ggc_alloc (sizeof (*desc));
3540 *slot = desc;
c26fbbca 3541
a79e3a45
RK
3542 /* Align the location counter as required by EXP's data type. */
3543 align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
e5e8a8bf 3544#ifdef CONSTANT_ALIGNMENT
1063147c 3545 {
ae2bcd98 3546 tree type = lang_hooks.types.type_for_mode (mode, 0);
1063147c
RS
3547 if (type != NULL_TREE)
3548 align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
3549 }
e5e8a8bf 3550#endif
79e68feb 3551
3234b52d
RH
3552 pool->offset += (align / BITS_PER_UNIT) - 1;
3553 pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3554
3555 desc->next = NULL;
3556 desc->constant = tmp.constant;
3557 desc->offset = pool->offset;
3558 desc->hash = hash;
3559 desc->mode = mode;
3560 desc->align = align;
3561 desc->labelno = const_labelno;
3562 desc->mark = 0;
3563
3564 pool->offset += GET_MODE_SIZE (mode);
3565 if (pool->last)
3566 pool->last->next = desc;
a79e3a45 3567 else
3234b52d
RH
3568 pool->first = pool->last = desc;
3569 pool->last = desc;
79e68feb 3570
a79e3a45
RK
3571 /* Create a string containing the label name, in LABEL. */
3572 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
a79e3a45 3573 ++const_labelno;
79e68feb 3574
3234b52d
RH
3575 /* Construct the SYMBOL_REF. Make sure to mark it as belonging to
3576 the constants pool. */
aacd3885
RS
3577 if (use_object_blocks_p () && targetm.use_blocks_for_constant_p (mode, x))
3578 {
3579 section *sect = targetm.asm_out.select_rtx_section (mode, x, align);
3580 symbol = create_block_symbol (ggc_strdup (label),
3581 get_block_for_section (sect), -1);
3582 }
3583 else
3584 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3585 desc->sym = symbol;
3586 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
3234b52d 3587 CONSTANT_POOL_ADDRESS_P (symbol) = 1;
929e5e5b 3588 SET_SYMBOL_REF_CONSTANT (symbol, desc);
3234b52d 3589
3234b52d 3590 /* Construct the MEM. */
542a8afa 3591 desc->mem = def = gen_const_mem (mode, symbol);
ae2bcd98 3592 set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
d5606ec9 3593 set_mem_align (def, align);
289c5b45 3594
3234b52d
RH
3595 /* If we're dropping a label to the constant pool, make sure we
3596 don't delete it. */
3597 if (GET_CODE (x) == LABEL_REF)
3598 LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
79e68feb 3599
21e9fc47 3600 return copy_rtx (def);
79e68feb
RS
3601}
3602\f
79e68feb
RS
3603/* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3604
3605rtx
2e1eedd6 3606get_pool_constant (rtx addr)
79e68feb 3607{
c185c797 3608 return SYMBOL_REF_CONSTANT (addr)->constant;
36edd3cc
BS
3609}
3610
149d6f9e
JJ
3611/* Given a constant pool SYMBOL_REF, return the corresponding constant
3612 and whether it has been output or not. */
3613
3614rtx
2e1eedd6 3615get_pool_constant_mark (rtx addr, bool *pmarked)
149d6f9e 3616{
3234b52d
RH
3617 struct constant_descriptor_rtx *desc;
3618
c185c797 3619 desc = SYMBOL_REF_CONSTANT (addr);
3234b52d
RH
3620 *pmarked = (desc->mark != 0);
3621 return desc->constant;
149d6f9e
JJ
3622}
3623
79e68feb
RS
3624/* Similar, return the mode. */
3625
3626enum machine_mode
f7d504c2 3627get_pool_mode (const_rtx addr)
79e68feb 3628{
c185c797 3629 return SYMBOL_REF_CONSTANT (addr)->mode;
36edd3cc
BS
3630}
3631
79e68feb
RS
3632/* Return the size of the constant pool. */
3633
3634int
2e1eedd6 3635get_pool_size (void)
79e68feb 3636{
3234b52d 3637 return cfun->varasm->pool->offset;
79e68feb
RS
3638}
3639\f
3234b52d
RH
3640/* Worker function for output_constant_pool_1. Emit assembly for X
3641 in MODE with known alignment ALIGN. */
79e68feb 3642
3234b52d
RH
3643static void
3644output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
79e68feb 3645{
3234b52d 3646 switch (GET_MODE_CLASS (mode))
79e68feb 3647 {
3234b52d 3648 case MODE_FLOAT:
15ed7b52 3649 case MODE_DECIMAL_FLOAT:
fbc848cc
NS
3650 {
3651 REAL_VALUE_TYPE r;
083cad55 3652
fbc848cc
NS
3653 gcc_assert (GET_CODE (x) == CONST_DOUBLE);
3654 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3655 assemble_real (r, mode, align);
3656 break;
3657 }
083cad55 3658
3234b52d
RH
3659 case MODE_INT:
3660 case MODE_PARTIAL_INT:
091a3ac7
CF
3661 case MODE_FRACT:
3662 case MODE_UFRACT:
3663 case MODE_ACCUM:
3664 case MODE_UACCUM:
3234b52d
RH
3665 assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3666 break;
79e68feb 3667
3234b52d
RH
3668 case MODE_VECTOR_FLOAT:
3669 case MODE_VECTOR_INT:
091a3ac7
CF
3670 case MODE_VECTOR_FRACT:
3671 case MODE_VECTOR_UFRACT:
3672 case MODE_VECTOR_ACCUM:
3673 case MODE_VECTOR_UACCUM:
3234b52d
RH
3674 {
3675 int i, units;
3676 enum machine_mode submode = GET_MODE_INNER (mode);
3677 unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
79e68feb 3678
fbc848cc 3679 gcc_assert (GET_CODE (x) == CONST_VECTOR);
3234b52d 3680 units = CONST_VECTOR_NUNITS (x);
79e68feb 3681
3234b52d 3682 for (i = 0; i < units; i++)
69ef87e2 3683 {
3234b52d
RH
3684 rtx elt = CONST_VECTOR_ELT (x, i);
3685 output_constant_pool_2 (submode, elt, i ? subalign : align);
69ef87e2 3686 }
3234b52d
RH
3687 }
3688 break;
69ef87e2 3689
3234b52d 3690 default:
fbc848cc 3691 gcc_unreachable ();
3234b52d
RH
3692 }
3693}
69ef87e2 3694
aacd3885
RS
3695/* Worker function for output_constant_pool. Emit constant DESC,
3696 giving it ALIGN bits of alignment. */
69ef87e2 3697
3234b52d 3698static void
aacd3885
RS
3699output_constant_pool_1 (struct constant_descriptor_rtx *desc,
3700 unsigned int align)
3234b52d
RH
3701{
3702 rtx x, tmp;
69ef87e2 3703
3234b52d
RH
3704 x = desc->constant;
3705
3706 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3707 whose CODE_LABEL has been deleted. This can occur if a jump table
3708 is eliminated by optimization. If so, write a constant of zero
3709 instead. Note that this can also happen by turning the
3710 CODE_LABEL into a NOTE. */
3711 /* ??? This seems completely and utterly wrong. Certainly it's
3712 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3713 functioning even with INSN_DELETED_P and friends. */
3714
3715 tmp = x;
3716 switch (GET_CODE (x))
3717 {
3718 case CONST:
3719 if (GET_CODE (XEXP (x, 0)) != PLUS
3720 || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3721 break;
3722 tmp = XEXP (XEXP (x, 0), 0);
3723 /* FALLTHRU */
69ef87e2 3724
3234b52d
RH
3725 case LABEL_REF:
3726 tmp = XEXP (x, 0);
fbc848cc
NS
3727 gcc_assert (!INSN_DELETED_P (tmp));
3728 gcc_assert (!NOTE_P (tmp)
a38e7aa5 3729 || NOTE_KIND (tmp) != NOTE_INSN_DELETED);
3234b52d 3730 break;
79e68feb 3731
3234b52d
RH
3732 default:
3733 break;
3734 }
3735
29a82058 3736#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3234b52d 3737 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
aacd3885 3738 align, desc->labelno, done);
29a82058 3739#endif
7f83c0e7 3740
aacd3885 3741 assemble_align (align);
5c8c0abd 3742
3234b52d 3743 /* Output the label. */
5fd9b178 3744 targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
91674c37 3745
3234b52d 3746 /* Output the data. */
aacd3885 3747 output_constant_pool_2 (desc->mode, x, align);
91674c37 3748
3234b52d
RH
3749 /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3750 sections have proper size. */
aacd3885 3751 if (align > GET_MODE_BITSIZE (desc->mode)
d6b5193b
RS
3752 && in_section
3753 && (in_section->common.flags & SECTION_MERGE))
aacd3885 3754 assemble_align (align);
91674c37 3755
3234b52d
RH
3756#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3757 done:
3758#endif
3759 return;
3760}
91674c37 3761
3234b52d
RH
3762/* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3763 to as used. Emit referenced deferred strings. This function can
3764 be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */
d2ce9169 3765
3234b52d 3766static int
1d3dbd99 3767mark_constant (rtx *current_rtx, void *data ATTRIBUTE_UNUSED)
3234b52d 3768{
3234b52d 3769 rtx x = *current_rtx;
91674c37 3770
3234b52d
RH
3771 if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3772 return 0;
afdfb380 3773
3234b52d
RH
3774 if (CONSTANT_POOL_ADDRESS_P (x))
3775 {
c185c797 3776 struct constant_descriptor_rtx *desc = SYMBOL_REF_CONSTANT (x);
3234b52d
RH
3777 if (desc->mark == 0)
3778 {
3779 desc->mark = 1;
1d3dbd99 3780 for_each_rtx (&desc->constant, mark_constant, NULL);
3234b52d 3781 }
afdfb380 3782 }
3234b52d
RH
3783 else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3784 {
3785 tree exp = SYMBOL_REF_DECL (x);
3786 if (!TREE_ASM_WRITTEN (exp))
3787 {
3788 n_deferred_constants--;
3789 output_constant_def_contents (x);
3790 }
3791 }
3792
3793 return -1;
083cad55 3794}
91674c37 3795
3234b52d 3796/* Look through appropriate parts of INSN, marking all entries in the
fcbd8ef2
JO
3797 constant pool which are actually being used. Entries that are only
3798 referenced by other constants are also marked as used. Emit
3799 deferred strings that are used. */
3800
91674c37 3801static void
1d3dbd99 3802mark_constants (rtx insn)
91674c37 3803{
3234b52d 3804 if (!INSN_P (insn))
91674c37
ILT
3805 return;
3806
91674c37
ILT
3807 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3808 insns, not any notes that may be attached. We don't want to mark
3809 a constant just because it happens to appear in a REG_EQUIV note. */
3234b52d 3810 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
91674c37 3811 {
3234b52d
RH
3812 rtx seq = PATTERN (insn);
3813 int i, n = XVECLEN (seq, 0);
3814 for (i = 0; i < n; ++i)
3815 {
3816 rtx subinsn = XVECEXP (seq, 0, i);
3817 if (INSN_P (subinsn))
1d3dbd99 3818 for_each_rtx (&PATTERN (subinsn), mark_constant, NULL);
3234b52d 3819 }
91674c37 3820 }
3234b52d 3821 else
1d3dbd99 3822 for_each_rtx (&PATTERN (insn), mark_constant, NULL);
3234b52d 3823}
91674c37 3824
3234b52d
RH
3825/* Look through the instructions for this function, and mark all the
3826 entries in POOL which are actually being used. Emit deferred constants
3827 which have indeed been used. */
91674c37 3828
3234b52d 3829static void
1d3dbd99 3830mark_constant_pool (void)
3234b52d
RH
3831{
3832 rtx insn, link;
91674c37 3833
1d3dbd99 3834 if (!current_function_uses_const_pool && n_deferred_constants == 0)
3234b52d 3835 return;
91674c37 3836
3234b52d 3837 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1d3dbd99 3838 mark_constants (insn);
91674c37 3839
3234b52d
RH
3840 for (link = current_function_epilogue_delay_list;
3841 link;
3842 link = XEXP (link, 1))
1d3dbd99 3843 mark_constants (XEXP (link, 0));
91674c37 3844}
fcbd8ef2 3845
1d3dbd99 3846/* Write all the constants in POOL. */
fcbd8ef2 3847
1d3dbd99
RS
3848static void
3849output_constant_pool_contents (struct rtx_constant_pool *pool)
fcbd8ef2 3850{
3234b52d 3851 struct constant_descriptor_rtx *desc;
fcbd8ef2 3852
3234b52d 3853 for (desc = pool->first; desc ; desc = desc->next)
aacd3885
RS
3854 if (desc->mark)
3855 {
3856 /* If the constant is part of an object_block, make sure that
3857 the constant has been positioned within its block, but do not
3858 write out its definition yet. output_object_blocks will do
3859 that later. */
3fa9c136
RS
3860 if (SYMBOL_REF_HAS_BLOCK_INFO_P (desc->sym)
3861 && SYMBOL_REF_BLOCK (desc->sym))
aacd3885
RS
3862 place_block_symbol (desc->sym);
3863 else
3864 {
3865 switch_to_section (targetm.asm_out.select_rtx_section
3866 (desc->mode, desc->constant, desc->align));
3867 output_constant_pool_1 (desc, desc->align);
3868 }
3869 }
1d3dbd99
RS
3870}
3871
3872/* Mark all constants that are used in the current function, then write
3873 out the function's private constant pool. */
3874
3875static void
c16ba1d5
RS
3876output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3877 tree fndecl ATTRIBUTE_UNUSED)
1d3dbd99
RS
3878{
3879 struct rtx_constant_pool *pool = cfun->varasm->pool;
3880
3881 /* It is possible for gcc to call force_const_mem and then to later
3882 discard the instructions which refer to the constant. In such a
3883 case we do not need to output the constant. */
3884 mark_constant_pool ();
3885
3886#ifdef ASM_OUTPUT_POOL_PROLOGUE
3887 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3888#endif
3889
3890 output_constant_pool_contents (pool);
3234b52d
RH
3891
3892#ifdef ASM_OUTPUT_POOL_EPILOGUE
3893 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3894#endif
fcbd8ef2 3895}
79e68feb 3896\f
1d3dbd99
RS
3897/* Write the contents of the shared constant pool. */
3898
3899void
3900output_shared_constant_pool (void)
3901{
3902 output_constant_pool_contents (shared_constant_pool);
3903}
3904\f
b2218cc1 3905/* Determine what kind of relocations EXP may need. */
79e68feb 3906
b2218cc1
AO
3907int
3908compute_reloc_for_constant (tree exp)
79e68feb 3909{
7eca317a 3910 int reloc = 0, reloc2;
ac79cd5a 3911 tree tem;
79e68feb 3912
c165f94f
CC
3913 /* Give the front-end a chance to convert VALUE to something that
3914 looks more like a constant to the back-end. */
ae2bcd98 3915 exp = lang_hooks.expand_constant (exp);
c165f94f 3916
79e68feb
RS
3917 switch (TREE_CODE (exp))
3918 {
3919 case ADDR_EXPR:
5d056e9b 3920 case FDESC_EXPR:
ac79cd5a
RK
3921 /* Go inside any operations that get_inner_reference can handle and see
3922 if what's inside is a constant: no need to do anything here for
3923 addresses of variables or functions. */
3924 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3925 tem = TREE_OPERAND (tem, 0))
3926 ;
79e68feb 3927
d2c35e67
JH
3928 if (TREE_PUBLIC (tem))
3929 reloc |= 2;
3930 else
3931 reloc |= 1;
79e68feb
RS
3932 break;
3933
3934 case PLUS_EXPR:
5be014d5 3935 case POINTER_PLUS_EXPR:
b2218cc1
AO
3936 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3937 reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
79e68feb
RS
3938 break;
3939
7eca317a 3940 case MINUS_EXPR:
b2218cc1
AO
3941 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3942 reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
7eca317a
JJ
3943 /* The difference of two local labels is computable at link time. */
3944 if (reloc == 1 && reloc2 == 1)
3945 reloc = 0;
3946 else
3947 reloc |= reloc2;
3948 break;
3949
79e68feb
RS
3950 case NOP_EXPR:
3951 case CONVERT_EXPR:
37a52112 3952 case NON_LVALUE_EXPR:
0d26b2ff 3953 case VIEW_CONVERT_EXPR:
b2218cc1 3954 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
79e68feb
RS
3955 break;
3956
3957 case CONSTRUCTOR:
4038c495
GB
3958 {
3959 unsigned HOST_WIDE_INT idx;
3960 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
3961 if (tem != 0)
3962 reloc |= compute_reloc_for_constant (tem);
3963 }
79e68feb
RS
3964 break;
3965
e9a25f70 3966 default:
79e68feb
RS
3967 break;
3968 }
3969 return reloc;
3970}
b2218cc1
AO
3971
3972/* Find all the constants whose addresses are referenced inside of EXP,
3973 and make sure assembler code with a label has been output for each one.
3974 Indicate whether an ADDR_EXPR has been encountered. */
3975
3976static void
3977output_addressed_constants (tree exp)
3978{
3979 tree tem;
3980
3981 /* Give the front-end a chance to convert VALUE to something that
3982 looks more like a constant to the back-end. */
ae2bcd98 3983 exp = lang_hooks.expand_constant (exp);
b2218cc1
AO
3984
3985 switch (TREE_CODE (exp))
3986 {
3987 case ADDR_EXPR:
3988 case FDESC_EXPR:
3989 /* Go inside any operations that get_inner_reference can handle and see
3990 if what's inside is a constant: no need to do anything here for
3991 addresses of variables or functions. */
3992 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3993 tem = TREE_OPERAND (tem, 0))
3994 ;
3995
2256aa1c
ZL
3996 /* If we have an initialized CONST_DECL, retrieve the initializer. */
3997 if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem))
3998 tem = DECL_INITIAL (tem);
3999
6615c446 4000 if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
b2218cc1
AO
4001 output_constant_def (tem, 0);
4002 break;
4003
4004 case PLUS_EXPR:
5be014d5 4005 case POINTER_PLUS_EXPR:
b2218cc1
AO
4006 case MINUS_EXPR:
4007 output_addressed_constants (TREE_OPERAND (exp, 1));
4008 /* Fall through. */
4009
4010 case NOP_EXPR:
4011 case CONVERT_EXPR:
4012 case NON_LVALUE_EXPR:
0d26b2ff 4013 case VIEW_CONVERT_EXPR:
b2218cc1
AO
4014 output_addressed_constants (TREE_OPERAND (exp, 0));
4015 break;
4016
4017 case CONSTRUCTOR:
4038c495
GB
4018 {
4019 unsigned HOST_WIDE_INT idx;
4020 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
4021 if (tem != 0)
4022 output_addressed_constants (tem);
4023 }
b2218cc1
AO
4024 break;
4025
4026 default:
4027 break;
4028 }
4029}
79e68feb 4030\f
fe24d485
OH
4031/* Whether a constructor CTOR is a valid static constant initializer if all
4032 its elements are. This used to be internal to initializer_constant_valid_p
4033 and has been exposed to let other functions like categorize_ctor_elements
4034 evaluate the property while walking a constructor for other purposes. */
4035
4036bool
fa233e34 4037constructor_static_from_elts_p (const_tree ctor)
fe24d485
OH
4038{
4039 return (TREE_CONSTANT (ctor)
4040 && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE
4041 || TREE_CODE (TREE_TYPE (ctor)) == RECORD_TYPE)
4042 && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor)));
4043}
4044
14a774a9
RK
4045/* Return nonzero if VALUE is a valid constant-valued expression
4046 for use in initializing a static variable; one that can be an
4047 element of a "constant" initializer.
4048
4049 Return null_pointer_node if the value is absolute;
4050 if it is relocatable, return the variable that determines the relocation.
4051 We assume that VALUE has been folded as much as possible;
4052 therefore, we do not need to check for such things as
4053 arithmetic-combinations of integers. */
4054
4055tree
2e1eedd6 4056initializer_constant_valid_p (tree value, tree endtype)
14a774a9 4057{
99740276
MM
4058 /* Give the front-end a chance to convert VALUE to something that
4059 looks more like a constant to the back-end. */
ae2bcd98 4060 value = lang_hooks.expand_constant (value);
99740276 4061
14a774a9
RK
4062 switch (TREE_CODE (value))
4063 {
4064 case CONSTRUCTOR:
fe24d485 4065 if (constructor_static_from_elts_p (value))
cf9ad9a7 4066 {
4038c495 4067 unsigned HOST_WIDE_INT idx;
cf9ad9a7
MM
4068 tree elt;
4069 bool absolute = true;
4070
4038c495 4071 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
cf9ad9a7
MM
4072 {
4073 tree reloc;
4038c495 4074 reloc = initializer_constant_valid_p (elt, TREE_TYPE (elt));
cf9ad9a7
MM
4075 if (!reloc)
4076 return NULL_TREE;
4077 if (reloc != null_pointer_node)
4078 absolute = false;
4079 }
4080 /* For a non-absolute relocation, there is no single
4081 variable that can be "the variable that determines the
4082 relocation." */
4083 return absolute ? null_pointer_node : error_mark_node;
4084 }
46f9491e 4085
cf9ad9a7 4086 return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
14a774a9
RK
4087
4088 case INTEGER_CST:
69ef87e2 4089 case VECTOR_CST:
14a774a9 4090 case REAL_CST:
091a3ac7 4091 case FIXED_CST:
14a774a9
RK
4092 case STRING_CST:
4093 case COMPLEX_CST:
4094 return null_pointer_node;
4095
4096 case ADDR_EXPR:
67231816 4097 case FDESC_EXPR:
5cc200fc 4098 value = staticp (TREE_OPERAND (value, 0));
125f2a50
MM
4099 if (value)
4100 {
4101 /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to
4102 be a constant, this is old-skool offsetof-like nonsense. */
4103 if (TREE_CODE (value) == INDIRECT_REF
4104 && TREE_CONSTANT (TREE_OPERAND (value, 0)))
4105 return null_pointer_node;
4106 /* Taking the address of a nested function involves a trampoline. */
4107 if (TREE_CODE (value) == FUNCTION_DECL
da489f73
RH
4108 && decl_function_context (value)
4109 && !DECL_NO_STATIC_CHAIN (value))
125f2a50
MM
4110 return NULL_TREE;
4111 /* "&{...}" requires a temporary to hold the constructed
4112 object. */
4113 if (TREE_CODE (value) == CONSTRUCTOR)
4114 return NULL_TREE;
4115 }
5cc200fc 4116 return value;
14a774a9 4117
ed239f5a 4118 case VIEW_CONVERT_EXPR:
14a774a9
RK
4119 case NON_LVALUE_EXPR:
4120 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4121
4122 case CONVERT_EXPR:
4123 case NOP_EXPR:
9560cbde
MM
4124 {
4125 tree src;
4126 tree src_type;
4127 tree dest_type;
4128
4129 src = TREE_OPERAND (value, 0);
4130 src_type = TREE_TYPE (src);
4131 dest_type = TREE_TYPE (value);
4132
4133 /* Allow conversions between pointer types, floating-point
4134 types, and offset types. */
4135 if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type))
4136 || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type))
4137 || (TREE_CODE (dest_type) == OFFSET_TYPE
4138 && TREE_CODE (src_type) == OFFSET_TYPE))
4139 return initializer_constant_valid_p (src, endtype);
4140
4141 /* Allow length-preserving conversions between integer types. */
4142 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)
4143 && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type)))
4144 return initializer_constant_valid_p (src, endtype);
4145
4146 /* Allow conversions between other integer types only if
4147 explicit value. */
4148 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
4149 {
4150 tree inner = initializer_constant_valid_p (src, endtype);
4151 if (inner == null_pointer_node)
4152 return null_pointer_node;
4153 break;
4154 }
14a774a9 4155
9560cbde
MM
4156 /* Allow (int) &foo provided int is as wide as a pointer. */
4157 if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)
4158 && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)))
4159 return initializer_constant_valid_p (src, endtype);
4160
4161 /* Likewise conversions from int to pointers, but also allow
4162 conversions from 0. */
4163 if ((POINTER_TYPE_P (dest_type)
4164 || TREE_CODE (dest_type) == OFFSET_TYPE)
4165 && INTEGRAL_TYPE_P (src_type))
4166 {
971dfb9b
DD
4167 if (TREE_CODE (src) == INTEGER_CST
4168 && TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type))
4169 return null_pointer_node;
9560cbde
MM
4170 if (integer_zerop (src))
4171 return null_pointer_node;
4172 else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type))
4173 return initializer_constant_valid_p (src, endtype);
4174 }
14a774a9 4175
9560cbde
MM
4176 /* Allow conversions to struct or union types if the value
4177 inside is okay. */
4178 if (TREE_CODE (dest_type) == RECORD_TYPE
4179 || TREE_CODE (dest_type) == UNION_TYPE)
4180 return initializer_constant_valid_p (src, endtype);
4181 }
14a774a9
RK
4182 break;
4183
5be014d5 4184 case POINTER_PLUS_EXPR:
14a774a9
RK
4185 case PLUS_EXPR:
4186 if (! INTEGRAL_TYPE_P (endtype)
4187 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
c26fbbca 4188 {
14a774a9
RK
4189 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4190 endtype);
4191 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4192 endtype);
4193 /* If either term is absolute, use the other terms relocation. */
4194 if (valid0 == null_pointer_node)
4195 return valid1;
4196 if (valid1 == null_pointer_node)
4197 return valid0;
c26fbbca 4198 }
14a774a9
RK
4199 break;
4200
4201 case MINUS_EXPR:
4202 if (! INTEGRAL_TYPE_P (endtype)
4203 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
4204 {
4205 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4206 endtype);
4207 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4208 endtype);
4209 /* Win if second argument is absolute. */
4210 if (valid1 == null_pointer_node)
4211 return valid0;
4212 /* Win if both arguments have the same relocation.
4213 Then the value is absolute. */
4214 if (valid0 == valid1 && valid0 != 0)
4215 return null_pointer_node;
212addfa
JO
4216
4217 /* Since GCC guarantees that string constants are unique in the
4218 generated code, a subtraction between two copies of the same
4219 constant string is absolute. */
5cc200fc
RH
4220 if (valid0 && TREE_CODE (valid0) == STRING_CST
4221 && valid1 && TREE_CODE (valid1) == STRING_CST
4222 && operand_equal_p (valid0, valid1, 1))
212addfa 4223 return null_pointer_node;
14a774a9
RK
4224 }
4225
5cc200fc 4226 /* Support narrowing differences. */
14a774a9
RK
4227 if (INTEGRAL_TYPE_P (endtype))
4228 {
4229 tree op0, op1;
5cc200fc 4230
14a774a9
RK
4231 op0 = TREE_OPERAND (value, 0);
4232 op1 = TREE_OPERAND (value, 1);
fdf473ae
RH
4233
4234 /* Like STRIP_NOPS except allow the operand mode to widen.
14b493d6 4235 This works around a feature of fold that simplifies
fdf473ae
RH
4236 (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
4237 that the narrower operation is cheaper. */
4238
4239 while (TREE_CODE (op0) == NOP_EXPR
4240 || TREE_CODE (op0) == CONVERT_EXPR
4241 || TREE_CODE (op0) == NON_LVALUE_EXPR)
4242 {
4243 tree inner = TREE_OPERAND (op0, 0);
4244 if (inner == error_mark_node
4245 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4246 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
4247 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4248 break;
4249 op0 = inner;
4250 }
4251
4252 while (TREE_CODE (op1) == NOP_EXPR
4253 || TREE_CODE (op1) == CONVERT_EXPR
4254 || TREE_CODE (op1) == NON_LVALUE_EXPR)
4255 {
4256 tree inner = TREE_OPERAND (op1, 0);
4257 if (inner == error_mark_node
4258 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4259 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
4260 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4261 break;
4262 op1 = inner;
4263 }
14a774a9 4264
5cc200fc
RH
4265 op0 = initializer_constant_valid_p (op0, endtype);
4266 op1 = initializer_constant_valid_p (op1, endtype);
4267
4268 /* Both initializers must be known. */
4269 if (op0 && op1)
4270 {
4271 if (op0 == op1)
4272 return null_pointer_node;
4273
4274 /* Support differences between labels. */
4275 if (TREE_CODE (op0) == LABEL_DECL
4276 && TREE_CODE (op1) == LABEL_DECL)
4277 return null_pointer_node;
4278
4279 if (TREE_CODE (op0) == STRING_CST
4280 && TREE_CODE (op1) == STRING_CST
4281 && operand_equal_p (op0, op1, 1))
4282 return null_pointer_node;
4283 }
14a774a9
RK
4284 }
4285 break;
4286
4287 default:
4288 break;
4289 }
4290
4291 return 0;
4292}
4293\f
79e68feb
RS
4294/* Output assembler code for constant EXP to FILE, with no label.
4295 This includes the pseudo-op such as ".int" or ".byte", and a newline.
4296 Assumes output_addressed_constants has been done on EXP already.
4297
4298 Generate exactly SIZE bytes of assembler data, padding at the end
4299 with zeros if necessary. SIZE must always be specified.
4300
4301 SIZE is important for structure constructors,
4302 since trailing members may have been omitted from the constructor.
4303 It is also important for initialization of arrays from string constants
4304 since the full length of the string constant might not be wanted.
4305 It is also needed for initialization of unions, where the initializer's
4306 type is just one member, and that may not be as long as the union.
4307
4308 There a case in which we would fail to output exactly SIZE bytes:
4309 for a structure constructor that wants to produce more than SIZE bytes.
c8af3574
RH
4310 But such constructors will never be generated for any possible input.
4311
4312 ALIGN is the alignment of the data in bits. */
79e68feb
RS
4313
4314void
2e1eedd6 4315output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
79e68feb 4316{
ac79cd5a 4317 enum tree_code code;
58e15542 4318 unsigned HOST_WIDE_INT thissize;
79e68feb 4319
14b493d6 4320 /* Some front-ends use constants other than the standard language-independent
ed239f5a
RK
4321 varieties, but which may still be output directly. Give the front-end a
4322 chance to convert EXP to a language-independent representation. */
ae2bcd98 4323 exp = lang_hooks.expand_constant (exp);
e697e20a 4324
e9996db7 4325 if (size == 0 || flag_syntax_only)
79e68feb
RS
4326 return;
4327
57b51d4d 4328 /* See if we're trying to initialize a pointer in a non-default mode
056061d8
DD
4329 to the address of some declaration somewhere. If the target says
4330 the mode is valid for pointers, assume the target has a way of
4331 resolving it. */
4332 if (TREE_CODE (exp) == NOP_EXPR
4333 && POINTER_TYPE_P (TREE_TYPE (exp))
4334 && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
4335 {
4336 tree saved_type = TREE_TYPE (exp);
4337
4338 /* Peel off any intermediate conversions-to-pointer for valid
4339 pointer modes. */
4340 while (TREE_CODE (exp) == NOP_EXPR
4341 && POINTER_TYPE_P (TREE_TYPE (exp))
4342 && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
4343 exp = TREE_OPERAND (exp, 0);
4344
4345 /* If what we're left with is the address of something, we can
4346 convert the address to the final type and output it that
4347 way. */
4348 if (TREE_CODE (exp) == ADDR_EXPR)
4349 exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0));
971dfb9b
DD
4350 /* Likewise for constant ints. */
4351 else if (TREE_CODE (exp) == INTEGER_CST)
4352 exp = build_int_cst_wide (saved_type, TREE_INT_CST_LOW (exp),
4353 TREE_INT_CST_HIGH (exp));
4354
056061d8
DD
4355 }
4356
ac79cd5a
RK
4357 /* Eliminate any conversions since we'll be outputting the underlying
4358 constant. */
4359 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
ed239f5a
RK
4360 || TREE_CODE (exp) == NON_LVALUE_EXPR
4361 || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
056061d8
DD
4362 {
4363 HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp));
4364 HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0)));
4365
69fcfd68 4366 /* Make sure eliminating the conversion is really a no-op, except with
f7952e0a
EB
4367 VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and
4368 union types to allow for Ada unchecked unions. */
e2953e41 4369 if (type_size > op_size
f7952e0a
EB
4370 && TREE_CODE (exp) != VIEW_CONVERT_EXPR
4371 && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE)
df20ea24
JM
4372 /* Keep the conversion. */
4373 break;
4374 else
4375 exp = TREE_OPERAND (exp, 0);
056061d8 4376 }
ac79cd5a
RK
4377
4378 code = TREE_CODE (TREE_TYPE (exp));
4379 thissize = int_size_in_bytes (TREE_TYPE (exp));
be1ad04c 4380
f092a866
MM
4381 /* Give the front end another chance to expand constants. */
4382 exp = lang_hooks.expand_constant (exp);
4383
fff9e713
MT
4384 /* Allow a constructor with no elements for any data type.
4385 This means to fill the space with zeros. */
4038c495
GB
4386 if (TREE_CODE (exp) == CONSTRUCTOR
4387 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (exp)))
fff9e713 4388 {
b93a436e 4389 assemble_zeros (size);
fff9e713
MT
4390 return;
4391 }
4392
67231816
RH
4393 if (TREE_CODE (exp) == FDESC_EXPR)
4394 {
f42f3c2d 4395#ifdef ASM_OUTPUT_FDESC
67231816
RH
4396 HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
4397 tree decl = TREE_OPERAND (exp, 0);
67231816
RH
4398 ASM_OUTPUT_FDESC (asm_out_file, decl, part);
4399#else
fbc848cc 4400 gcc_unreachable ();
67231816
RH
4401#endif
4402 return;
4403 }
4404
ac79cd5a 4405 /* Now output the underlying data. If we've handling the padding, return.
42048866 4406 Otherwise, break and ensure SIZE is the size written. */
79e68feb
RS
4407 switch (code)
4408 {
644ea577 4409 case BOOLEAN_TYPE:
79e68feb
RS
4410 case INTEGER_TYPE:
4411 case ENUMERAL_TYPE:
4412 case POINTER_TYPE:
4413 case REFERENCE_TYPE:
a5ac359a 4414 case OFFSET_TYPE:
091a3ac7 4415 case FIXED_POINT_TYPE:
37366632 4416 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
79e68feb 4417 EXPAND_INITIALIZER),
42048866 4418 MIN (size, thissize), align, 0))
091a3ac7 4419 error ("initializer for integer/fixed-point value is too complicated");
79e68feb
RS
4420 break;
4421
4422 case REAL_TYPE:
4423 if (TREE_CODE (exp) != REAL_CST)
4424 error ("initializer for floating value is not a floating constant");
4425
02befdf4 4426 assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
79e68feb
RS
4427 break;
4428
4429 case COMPLEX_TYPE:
ac79cd5a
RK
4430 output_constant (TREE_REALPART (exp), thissize / 2, align);
4431 output_constant (TREE_IMAGPART (exp), thissize / 2,
4432 min_align (align, BITS_PER_UNIT * (thissize / 2)));
79e68feb
RS
4433 break;
4434
4435 case ARRAY_TYPE:
e6834654 4436 case VECTOR_TYPE:
fbc848cc 4437 switch (TREE_CODE (exp))
79e68feb 4438 {
fbc848cc 4439 case CONSTRUCTOR:
c8af3574 4440 output_constructor (exp, size, align);
79e68feb 4441 return;
fbc848cc 4442 case STRING_CST:
58e15542
JH
4443 thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
4444 size);
ac79cd5a 4445 assemble_string (TREE_STRING_POINTER (exp), thissize);
fbc848cc 4446 break;
d744e06e 4447
fbc848cc
NS
4448 case VECTOR_CST:
4449 {
4450 int elt_size;
4451 tree link;
4452 unsigned int nalign;
4453 enum machine_mode inner;
083cad55 4454
fbc848cc
NS
4455 inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
4456 nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
083cad55 4457
fbc848cc 4458 elt_size = GET_MODE_SIZE (inner);
083cad55 4459
fbc848cc
NS
4460 link = TREE_VECTOR_CST_ELTS (exp);
4461 output_constant (TREE_VALUE (link), elt_size, align);
86a0f642 4462 thissize = elt_size;
fbc848cc 4463 while ((link = TREE_CHAIN (link)) != NULL)
86a0f642
JJ
4464 {
4465 output_constant (TREE_VALUE (link), elt_size, nalign);
4466 thissize += elt_size;
4467 }
fbc848cc
NS
4468 break;
4469 }
4470 default:
4471 gcc_unreachable ();
d744e06e 4472 }
79e68feb
RS
4473 break;
4474
4475 case RECORD_TYPE:
4476 case UNION_TYPE:
fbc848cc
NS
4477 gcc_assert (TREE_CODE (exp) == CONSTRUCTOR);
4478 output_constructor (exp, size, align);
79e68feb 4479 return;
474bda6c 4480
0974a3b8
RK
4481 case ERROR_MARK:
4482 return;
4483
e9a25f70 4484 default:
fbc848cc 4485 gcc_unreachable ();
79e68feb
RS
4486 }
4487
d3e0dffb
JH
4488 if (size > thissize)
4489 assemble_zeros (size - thissize);
79e68feb 4490}
ca695ac9 4491
79e68feb 4492\f
a25f1211
RH
4493/* Subroutine of output_constructor, used for computing the size of
4494 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
4495 type with an unspecified upper bound. */
4496
ffc5c6a9 4497static unsigned HOST_WIDE_INT
2e1eedd6 4498array_size_for_constructor (tree val)
a25f1211
RH
4499{
4500 tree max_index, i;
4038c495 4501 unsigned HOST_WIDE_INT cnt;
b6f65e3c 4502 tree index, value, tmp;
a25f1211 4503
ac79cd5a
RK
4504 /* This code used to attempt to handle string constants that are not
4505 arrays of single-bytes, but nothing else does, so there's no point in
4506 doing it here. */
b6fc7110 4507 if (TREE_CODE (val) == STRING_CST)
ac79cd5a
RK
4508 return TREE_STRING_LENGTH (val);
4509
a25f1211 4510 max_index = NULL_TREE;
4038c495 4511 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value)
a25f1211 4512 {
a25f1211
RH
4513 if (TREE_CODE (index) == RANGE_EXPR)
4514 index = TREE_OPERAND (index, 1);
4515 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4516 max_index = index;
4517 }
4518
a25f1211 4519 if (max_index == NULL_TREE)
ffc5c6a9 4520 return 0;
a25f1211
RH
4521
4522 /* Compute the total number of array elements. */
b6f65e3c
RS
4523 tmp = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)));
4524 i = size_binop (MINUS_EXPR, fold_convert (sizetype, max_index),
4525 fold_convert (sizetype, tmp));
57decb7e 4526 i = size_binop (PLUS_EXPR, i, build_int_cst (sizetype, 1));
a25f1211
RH
4527
4528 /* Multiply by the array element unit size to find number of bytes. */
ffc5c6a9 4529 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
a25f1211
RH
4530
4531 return tree_low_cst (i, 1);
4532}
4533
4534/* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
79e68feb
RS
4535 Generate at least SIZE bytes, padding if necessary. */
4536
5a13eaa4 4537static void
2e1eedd6
AJ
4538output_constructor (tree exp, unsigned HOST_WIDE_INT size,
4539 unsigned int align)
79e68feb 4540{
85f3d674 4541 tree type = TREE_TYPE (exp);
4038c495 4542 tree field = 0;
85f3d674 4543 tree min_index = 0;
79e68feb
RS
4544 /* Number of bytes output or skipped so far.
4545 In other words, current position within the constructor. */
85f3d674 4546 HOST_WIDE_INT total_bytes = 0;
272d0bee 4547 /* Nonzero means BYTE contains part of a byte, to be output. */
79e68feb 4548 int byte_buffer_in_use = 0;
b3694847 4549 int byte = 0;
4038c495
GB
4550 unsigned HOST_WIDE_INT cnt;
4551 constructor_elt *ce;
79e68feb 4552
fbc848cc 4553 gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT);
79e68feb 4554
85f3d674
RK
4555 if (TREE_CODE (type) == RECORD_TYPE)
4556 field = TYPE_FIELDS (type);
79e68feb 4557
85f3d674
RK
4558 if (TREE_CODE (type) == ARRAY_TYPE
4559 && TYPE_DOMAIN (type) != 0)
4560 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
13b457e7 4561
79e68feb
RS
4562 /* As LINK goes through the elements of the constant,
4563 FIELD goes through the structure fields, if the constant is a structure.
4564 if the constant is a union, then we override this,
4565 by getting the field from the TREE_LIST element.
43f7bed5
VM
4566 But the constant could also be an array. Then FIELD is zero.
4567
4568 There is always a maximum of one element in the chain LINK for unions
4569 (even if the initializer in a source program incorrectly contains
2d76cb1a 4570 more one). */
4038c495
GB
4571 for (cnt = 0;
4572 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), cnt, ce);
4573 cnt++, field = field ? TREE_CHAIN (field) : 0)
79e68feb 4574 {
4038c495 4575 tree val = ce->value;
3181cbfd
RS
4576 tree index = 0;
4577
85f3d674
RK
4578 /* The element in a union constructor specifies the proper field
4579 or index. */
4580 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
4581 || TREE_CODE (type) == QUAL_UNION_TYPE)
4038c495
GB
4582 && ce->index != 0)
4583 field = ce->index;
3181cbfd 4584
85f3d674 4585 else if (TREE_CODE (type) == ARRAY_TYPE)
4038c495 4586 index = ce->index;
3181cbfd 4587
907393db 4588#ifdef ASM_COMMENT_START
bce988a2
AH
4589 if (field && flag_verbose_asm)
4590 fprintf (asm_out_file, "%s %s:\n",
083cad55
EC
4591 ASM_COMMENT_START,
4592 DECL_NAME (field)
bce988a2
AH
4593 ? IDENTIFIER_POINTER (DECL_NAME (field))
4594 : "<anonymous>");
907393db 4595#endif
bce988a2 4596
79e68feb 4597 /* Eliminate the marker that makes a cast not be an lvalue. */
d964285c
CH
4598 if (val != 0)
4599 STRIP_NOPS (val);
79e68feb 4600
8311a11f
PB
4601 if (index && TREE_CODE (index) == RANGE_EXPR)
4602 {
bf1aaf0a 4603 unsigned HOST_WIDE_INT fieldsize
85f3d674
RK
4604 = int_size_in_bytes (TREE_TYPE (type));
4605 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
4606 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
8311a11f 4607 HOST_WIDE_INT index;
c8af3574 4608 unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
85f3d674 4609
8311a11f
PB
4610 for (index = lo_index; index <= hi_index; index++)
4611 {
4612 /* Output the element's initial value. */
4613 if (val == 0)
4614 assemble_zeros (fieldsize);
4615 else
c8af3574 4616 output_constant (val, fieldsize, align2);
8311a11f
PB
4617
4618 /* Count its size. */
4619 total_bytes += fieldsize;
4620 }
4621 }
4622 else if (field == 0 || !DECL_BIT_FIELD (field))
79e68feb 4623 {
3181cbfd
RS
4624 /* An element that is not a bit-field. */
4625
bf1aaf0a 4626 unsigned HOST_WIDE_INT fieldsize;
79e68feb
RS
4627 /* Since this structure is static,
4628 we know the positions are constant. */
85f3d674 4629 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
c8af3574 4630 unsigned int align2;
770ae6cc 4631
3181cbfd 4632 if (index != 0)
85f3d674
RK
4633 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4634 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
79e68feb 4635
3181cbfd 4636 /* Output any buffered-up bit-fields preceding this element. */
79e68feb
RS
4637 if (byte_buffer_in_use)
4638 {
eac50d7a 4639 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4640 total_bytes++;
4641 byte_buffer_in_use = 0;
4642 }
4643
4644 /* Advance to offset of this element.
4645 Note no alignment needed in an array, since that is guaranteed
4646 if each element has the proper size. */
85f3d674 4647 if ((field != 0 || index != 0) && pos != total_bytes)
79e68feb 4648 {
4038c495 4649 gcc_assert (pos >= total_bytes);
85f3d674
RK
4650 assemble_zeros (pos - total_bytes);
4651 total_bytes = pos;
79e68feb 4652 }
ca2eed21 4653
c8af3574
RH
4654 /* Find the alignment of this element. */
4655 align2 = min_align (align, BITS_PER_UNIT * pos);
46f9491e 4656
79e68feb
RS
4657 /* Determine size this element should occupy. */
4658 if (field)
a25f1211 4659 {
ffc5c6a9
RH
4660 fieldsize = 0;
4661
4662 /* If this is an array with an unspecified upper bound,
4663 the initializer determines the size. */
4664 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4665 but we cannot do this until the deprecated support for
4666 initializing zero-length array members is removed. */
4667 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4668 && TYPE_DOMAIN (TREE_TYPE (field))
4669 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4670 {
a25f1211 4671 fieldsize = array_size_for_constructor (val);
ffc5c6a9
RH
4672 /* Given a non-empty initialization, this field had
4673 better be last. */
fbc848cc 4674 gcc_assert (!fieldsize || !TREE_CHAIN (field));
ffc5c6a9
RH
4675 }
4676 else if (DECL_SIZE_UNIT (field))
4677 {
4678 /* ??? This can't be right. If the decl size overflows
4679 a host integer we will silently emit no data. */
4680 if (host_integerp (DECL_SIZE_UNIT (field), 1))
4681 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4682 }
a25f1211 4683 }
79e68feb 4684 else
85f3d674 4685 fieldsize = int_size_in_bytes (TREE_TYPE (type));
79e68feb
RS
4686
4687 /* Output the element's initial value. */
4688 if (val == 0)
4689 assemble_zeros (fieldsize);
4690 else
c8af3574 4691 output_constant (val, fieldsize, align2);
79e68feb
RS
4692
4693 /* Count its size. */
4694 total_bytes += fieldsize;
4695 }
4696 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
971801ff 4697 error ("invalid initial value for member %qs",
79e68feb
RS
4698 IDENTIFIER_POINTER (DECL_NAME (field)));
4699 else
4700 {
4701 /* Element that is a bit-field. */
4702
770ae6cc
RK
4703 HOST_WIDE_INT next_offset = int_bit_position (field);
4704 HOST_WIDE_INT end_offset
4705 = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
79e68feb
RS
4706
4707 if (val == 0)
4708 val = integer_zero_node;
4709
4710 /* If this field does not start in this (or, next) byte,
4711 skip some bytes. */
4712 if (next_offset / BITS_PER_UNIT != total_bytes)
4713 {
4714 /* Output remnant of any bit field in previous bytes. */
4715 if (byte_buffer_in_use)
4716 {
eac50d7a 4717 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4718 total_bytes++;
4719 byte_buffer_in_use = 0;
4720 }
4721
4722 /* If still not at proper byte, advance to there. */
4723 if (next_offset / BITS_PER_UNIT != total_bytes)
4724 {
4038c495 4725 gcc_assert (next_offset / BITS_PER_UNIT >= total_bytes);
79e68feb
RS
4726 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4727 total_bytes = next_offset / BITS_PER_UNIT;
4728 }
4729 }
4730
4731 if (! byte_buffer_in_use)
4732 byte = 0;
4733
4734 /* We must split the element into pieces that fall within
4735 separate bytes, and combine each byte with previous or
4736 following bit-fields. */
4737
b4ac57ab 4738 /* next_offset is the offset n fbits from the beginning of
79e68feb
RS
4739 the structure to the next bit of this element to be processed.
4740 end_offset is the offset of the first bit past the end of
4741 this element. */
4742 while (next_offset < end_offset)
4743 {
4744 int this_time;
e7105755
JW
4745 int shift;
4746 HOST_WIDE_INT value;
85f3d674
RK
4747 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4748 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
79e68feb
RS
4749
4750 /* Advance from byte to byte
4751 within this element when necessary. */
4752 while (next_byte != total_bytes)
4753 {
eac50d7a 4754 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4755 total_bytes++;
4756 byte = 0;
4757 }
4758
4759 /* Number of bits we can process at once
4760 (all part of the same byte). */
4761 this_time = MIN (end_offset - next_offset,
4762 BITS_PER_UNIT - next_bit);
f76b9db2 4763 if (BYTES_BIG_ENDIAN)
79e68feb 4764 {
f76b9db2
ILT
4765 /* On big-endian machine, take the most significant bits
4766 first (of the bits that are significant)
4767 and put them into bytes from the most significant end. */
4768 shift = end_offset - next_offset - this_time;
85f3d674 4769
f76b9db2 4770 /* Don't try to take a bunch of bits that cross
dfb2c079
HB
4771 the word boundary in the INTEGER_CST. We can
4772 only select bits from the LOW or HIGH part
4773 not from both. */
f76b9db2
ILT
4774 if (shift < HOST_BITS_PER_WIDE_INT
4775 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4776 {
8b1cb95b
GK
4777 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4778 shift = HOST_BITS_PER_WIDE_INT;
f76b9db2
ILT
4779 }
4780
4781 /* Now get the bits from the appropriate constant word. */
4782 if (shift < HOST_BITS_PER_WIDE_INT)
85f3d674 4783 value = TREE_INT_CST_LOW (val);
fbc848cc 4784 else
f76b9db2 4785 {
fbc848cc 4786 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
f76b9db2
ILT
4787 value = TREE_INT_CST_HIGH (val);
4788 shift -= HOST_BITS_PER_WIDE_INT;
4789 }
85f3d674 4790
dfb2c079
HB
4791 /* Get the result. This works only when:
4792 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
f76b9db2 4793 byte |= (((value >> shift)
dfb2c079 4794 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
f76b9db2 4795 << (BITS_PER_UNIT - this_time - next_bit));
79e68feb
RS
4796 }
4797 else
79e68feb 4798 {
f76b9db2
ILT
4799 /* On little-endian machines,
4800 take first the least significant bits of the value
4801 and pack them starting at the least significant
4802 bits of the bytes. */
770ae6cc
RK
4803 shift = next_offset - int_bit_position (field);
4804
f76b9db2 4805 /* Don't try to take a bunch of bits that cross
dfb2c079
HB
4806 the word boundary in the INTEGER_CST. We can
4807 only select bits from the LOW or HIGH part
4808 not from both. */
f76b9db2
ILT
4809 if (shift < HOST_BITS_PER_WIDE_INT
4810 && shift + this_time > HOST_BITS_PER_WIDE_INT)
770ae6cc 4811 this_time = (HOST_BITS_PER_WIDE_INT - shift);
f76b9db2
ILT
4812
4813 /* Now get the bits from the appropriate constant word. */
e9a25f70 4814 if (shift < HOST_BITS_PER_WIDE_INT)
f76b9db2 4815 value = TREE_INT_CST_LOW (val);
fbc848cc 4816 else
f76b9db2 4817 {
fbc848cc 4818 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
f76b9db2
ILT
4819 value = TREE_INT_CST_HIGH (val);
4820 shift -= HOST_BITS_PER_WIDE_INT;
4821 }
770ae6cc 4822
dfb2c079
HB
4823 /* Get the result. This works only when:
4824 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
f76b9db2 4825 byte |= (((value >> shift)
dfb2c079 4826 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
f76b9db2 4827 << next_bit);
79e68feb 4828 }
85f3d674 4829
79e68feb
RS
4830 next_offset += this_time;
4831 byte_buffer_in_use = 1;
4832 }
4833 }
4834 }
85f3d674 4835
79e68feb
RS
4836 if (byte_buffer_in_use)
4837 {
eac50d7a 4838 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
79e68feb
RS
4839 total_bytes++;
4840 }
85f3d674 4841
58e15542 4842 if ((unsigned HOST_WIDE_INT)total_bytes < size)
79e68feb
RS
4843 assemble_zeros (size - total_bytes);
4844}
ca695ac9 4845
ecb0eece 4846/* This TREE_LIST contains any weak symbol declarations waiting
46f9491e 4847 to be emitted. */
e2500fed 4848static GTY(()) tree weak_decls;
0e9264a2 4849
f90bf7ca
MM
4850/* Mark DECL as weak. */
4851
4852static void
2e1eedd6 4853mark_weak (tree decl)
f90bf7ca
MM
4854{
4855 DECL_WEAK (decl) = 1;
4856
4857 if (DECL_RTL_SET_P (decl)
3c0cb5de 4858 && MEM_P (DECL_RTL (decl))
f90bf7ca
MM
4859 && XEXP (DECL_RTL (decl), 0)
4860 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4861 SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4862}
41077ce4 4863
45806a3f
FS
4864/* Merge weak status between NEWDECL and OLDDECL. */
4865
4866void
2e1eedd6 4867merge_weak (tree newdecl, tree olddecl)
45806a3f 4868{
45806a3f 4869 if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
46fb43a7
JJ
4870 {
4871 if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
4872 {
4873 tree *pwd;
4874 /* We put the NEWDECL on the weak_decls list at some point
4875 and OLDDECL as well. Keep just OLDDECL on the list. */
4876 for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
4877 if (TREE_VALUE (*pwd) == newdecl)
4878 {
4879 *pwd = TREE_CHAIN (*pwd);
4880 break;
4881 }
4882 }
4883 return;
4884 }
45806a3f 4885
f90bf7ca
MM
4886 if (DECL_WEAK (newdecl))
4887 {
4888 tree wd;
41077ce4 4889
f90bf7ca
MM
4890 /* NEWDECL is weak, but OLDDECL is not. */
4891
4892 /* If we already output the OLDDECL, we're in trouble; we can't
4893 go back and make it weak. This error cannot caught in
4894 declare_weak because the NEWDECL and OLDDECL was not yet
4895 been merged; therefore, TREE_ASM_WRITTEN was not set. */
14285ace 4896 if (TREE_ASM_WRITTEN (olddecl))
dee15844
JM
4897 error ("weak declaration of %q+D must precede definition",
4898 newdecl);
14285ace
RH
4899
4900 /* If we've already generated rtl referencing OLDDECL, we may
4901 have done so in a way that will not function properly with
4902 a weak symbol. */
4903 else if (TREE_USED (olddecl)
34fb9ba5 4904 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
dee15844
JM
4905 warning (0, "weak declaration of %q+D after first use results "
4906 "in unspecified behavior", newdecl);
14285ace 4907
f90bf7ca
MM
4908 if (SUPPORTS_WEAK)
4909 {
4910 /* We put the NEWDECL on the weak_decls list at some point.
4911 Replace it with the OLDDECL. */
4912 for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4913 if (TREE_VALUE (wd) == newdecl)
4914 {
4915 TREE_VALUE (wd) = olddecl;
4916 break;
4917 }
4918 /* We may not find the entry on the list. If NEWDECL is a
4919 weak alias, then we will have already called
4920 globalize_decl to remove the entry; in that case, we do
4921 not need to do anything. */
4922 }
45806a3f 4923
f90bf7ca
MM
4924 /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */
4925 mark_weak (olddecl);
4926 }
4927 else
4928 /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4929 weak. Just update NEWDECL to indicate that it's weak too. */
4930 mark_weak (newdecl);
45806a3f
FS
4931}
4932
4b8af8d9
JM
4933/* Declare DECL to be a weak symbol. */
4934
4935void
2e1eedd6 4936declare_weak (tree decl)
4b8af8d9
JM
4937{
4938 if (! TREE_PUBLIC (decl))
dee15844 4939 error ("weak declaration of %q+D must be public", decl);
45806a3f 4940 else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
dee15844 4941 error ("weak declaration of %q+D must precede definition", decl);
daefd78b 4942 else if (SUPPORTS_WEAK)
ecb0eece
RH
4943 {
4944 if (! DECL_WEAK (decl))
4945 weak_decls = tree_cons (NULL, decl, weak_decls);
4946 }
4ae08f95 4947 else
dee15844 4948 warning (0, "weak declaration of %q+D not supported", decl);
4ae08f95 4949
f90bf7ca 4950 mark_weak (decl);
4b8af8d9
JM
4951}
4952
a0203ca7
AO
4953static void
4954weak_finish_1 (tree decl)
4b8af8d9 4955{
4977bab6 4956#if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
a0203ca7 4957 const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4977bab6 4958#endif
ecb0eece 4959
a0203ca7
AO
4960 if (! TREE_USED (decl))
4961 return;
4962
79c4e63f 4963#ifdef ASM_WEAKEN_DECL
a0203ca7 4964 ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4ae08f95
JM
4965#else
4966#ifdef ASM_WEAKEN_LABEL
a0203ca7 4967 ASM_WEAKEN_LABEL (asm_out_file, name);
ecb0eece
RH
4968#else
4969#ifdef ASM_OUTPUT_WEAK_ALIAS
a0203ca7
AO
4970 {
4971 static bool warn_once = 0;
4972 if (! warn_once)
4973 {
4974 warning (0, "only weak aliases are supported in this configuration");
4975 warn_once = 1;
4976 }
4977 return;
4978 }
4979#endif
4ae08f95 4980#endif
79c4e63f 4981#endif
a0203ca7
AO
4982}
4983
4984/* This TREE_LIST contains weakref targets. */
4985
4986static GTY(()) tree weakref_targets;
4987
4988/* Forward declaration. */
4989static tree find_decl_and_mark_needed (tree decl, tree target);
4990
4991/* Emit any pending weak declarations. */
4992
4993void
4994weak_finish (void)
4995{
4996 tree t;
4997
4998 for (t = weakref_targets; t; t = TREE_CHAIN (t))
4999 {
5000 tree alias_decl = TREE_PURPOSE (t);
5001 tree target = ultimate_transparent_alias_target (&TREE_VALUE (t));
5002
5003 if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl)))
5004 /* Remove alias_decl from the weak list, but leave entries for
5005 the target alone. */
5006 target = NULL_TREE;
5007#ifndef ASM_OUTPUT_WEAKREF
5008 else if (! TREE_SYMBOL_REFERENCED (target))
5009 {
ff2d10c1
AO
5010 /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not
5011 defined, otherwise we and weak_finish_1 would use a
5012 different macros. */
5013# if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL
a0203ca7
AO
5014 ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target));
5015# else
5016 tree decl = find_decl_and_mark_needed (alias_decl, target);
5017
5018 if (! decl)
5019 {
5020 decl = build_decl (TREE_CODE (alias_decl), target,
5021 TREE_TYPE (alias_decl));
5022
5023 DECL_EXTERNAL (decl) = 1;
5024 TREE_PUBLIC (decl) = 1;
5025 DECL_ARTIFICIAL (decl) = 1;
5026 TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl);
5027 TREE_USED (decl) = 1;
5028 }
5029
5030 weak_finish_1 (decl);
5031# endif
5032 }
4ae08f95 5033#endif
a0203ca7
AO
5034
5035 {
5036 tree *p;
5037 tree t2;
5038
5039 /* Remove the alias and the target from the pending weak list
5040 so that we do not emit any .weak directives for the former,
5041 nor multiple .weak directives for the latter. */
5042 for (p = &weak_decls; (t2 = *p) ; )
5043 {
5044 if (TREE_VALUE (t2) == alias_decl
5045 || target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2)))
5046 *p = TREE_CHAIN (t2);
5047 else
5048 p = &TREE_CHAIN (t2);
5049 }
5050
5051 /* Remove other weakrefs to the same target, to speed things up. */
5052 for (p = &TREE_CHAIN (t); (t2 = *p) ; )
5053 {
5054 if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2)))
5055 *p = TREE_CHAIN (t2);
5056 else
5057 p = &TREE_CHAIN (t2);
5058 }
5059 }
5060 }
5061
5062 for (t = weak_decls; t; t = TREE_CHAIN (t))
5063 {
5064 tree decl = TREE_VALUE (t);
5065
5066 weak_finish_1 (decl);
4b8af8d9 5067 }
4b8af8d9 5068}
4ae08f95 5069
19c5b1cf
JM
5070/* Emit the assembly bits to indicate that DECL is globally visible. */
5071
5072static void
2e1eedd6 5073globalize_decl (tree decl)
19c5b1cf 5074{
19c5b1cf
JM
5075
5076#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
5077 if (DECL_WEAK (decl))
5078 {
812b587e 5079 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
ecb0eece
RH
5080 tree *p, t;
5081
19c5b1cf
JM
5082#ifdef ASM_WEAKEN_DECL
5083 ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
5084#else
5085 ASM_WEAKEN_LABEL (asm_out_file, name);
5086#endif
ecb0eece 5087
19c5b1cf
JM
5088 /* Remove this function from the pending weak list so that
5089 we do not emit multiple .weak directives for it. */
a81eed10
FS
5090 for (p = &weak_decls; (t = *p) ; )
5091 {
5092 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
ecb0eece 5093 *p = TREE_CHAIN (t);
a81eed10
FS
5094 else
5095 p = &TREE_CHAIN (t);
5096 }
a0203ca7 5097
eb5fa773
KH
5098 /* Remove weakrefs to the same target from the pending weakref
5099 list, for the same reason. */
5100 for (p = &weakref_targets; (t = *p) ; )
5101 {
5102 if (DECL_ASSEMBLER_NAME (decl)
5103 == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5104 *p = TREE_CHAIN (t);
5105 else
5106 p = &TREE_CHAIN (t);
5107 }
a0203ca7 5108
19c5b1cf
JM
5109 return;
5110 }
19c5b1cf 5111#endif
ecb0eece 5112
812b587e 5113 targetm.asm_out.globalize_decl_name (asm_out_file, decl);
19c5b1cf
JM
5114}
5115
e4d5432a
RH
5116/* We have to be able to tell cgraph about the needed-ness of the target
5117 of an alias. This requires that the decl have been defined. Aliases
aabcd309 5118 that precede their definition have to be queued for later processing. */
e4d5432a 5119
d4e6fecb 5120typedef struct alias_pair GTY(())
083b6717
JDA
5121{
5122 tree decl;
5123 tree target;
d4e6fecb 5124} alias_pair;
083b6717
JDA
5125
5126/* Define gc'd vector type. */
d4e6fecb
NS
5127DEF_VEC_O(alias_pair);
5128DEF_VEC_ALLOC_O(alias_pair,gc);
083b6717 5129
d4e6fecb 5130static GTY(()) VEC(alias_pair,gc) *alias_pairs;
083b6717 5131
e4d5432a
RH
5132/* Given an assembly name, find the decl it is associated with. At the
5133 same time, mark it needed for cgraph. */
5134
5135static tree
5136find_decl_and_mark_needed (tree decl, tree target)
5137{
5138 struct cgraph_node *fnode = NULL;
8a4a83ed 5139 struct varpool_node *vnode = NULL;
e4d5432a 5140
cdcba1ea 5141 if (TREE_CODE (decl) == FUNCTION_DECL)
e4d5432a 5142 {
cdcba1ea
AO
5143 fnode = cgraph_node_for_asm (target);
5144 if (fnode == NULL)
8a4a83ed 5145 vnode = varpool_node_for_asm (target);
cdcba1ea
AO
5146 }
5147 else
5148 {
8a4a83ed 5149 vnode = varpool_node_for_asm (target);
cdcba1ea
AO
5150 if (vnode == NULL)
5151 fnode = cgraph_node_for_asm (target);
e4d5432a
RH
5152 }
5153
5154 if (fnode)
5155 {
cdcba1ea
AO
5156 /* We can't mark function nodes as used after cgraph global info
5157 is finished. This wouldn't generally be necessary, but C++
5158 virtual table thunks are introduced late in the game and
5159 might seem like they need marking, although in fact they
5160 don't. */
5161 if (! cgraph_global_info_ready)
5162 cgraph_mark_needed_node (fnode);
e4d5432a
RH
5163 return fnode->decl;
5164 }
5165 else if (vnode)
5166 {
8a4a83ed 5167 varpool_mark_needed_node (vnode);
e4d5432a
RH
5168 return vnode->decl;
5169 }
083cad55 5170 else
e4d5432a
RH
5171 return NULL_TREE;
5172}
083b6717 5173
749053f5
RS
5174/* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
5175 or ASM_OUTPUT_DEF_FROM_DECLS. The function defines the symbol whose
5176 tree node is DECL to have the value of the tree node TARGET. */
5177
083b6717 5178static void
a0203ca7 5179do_assemble_alias (tree decl, tree target)
083b6717 5180{
ebccb65d
JM
5181 if (TREE_ASM_WRITTEN (decl))
5182 return;
5183
e4d5432a
RH
5184 TREE_ASM_WRITTEN (decl) = 1;
5185 TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
5186
a0203ca7
AO
5187 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5188 {
5189 ultimate_transparent_alias_target (&target);
5190
8893239d
RH
5191 if (!targetm.have_tls
5192 && TREE_CODE (decl) == VAR_DECL
5193 && DECL_THREAD_LOCAL_P (decl))
5194 {
5195 decl = emutls_decl (decl);
5196 target = get_emutls_object_name (target);
5197 }
5198
a0203ca7
AO
5199 if (!TREE_SYMBOL_REFERENCED (target))
5200 weakref_targets = tree_cons (decl, target, weakref_targets);
5201
5202#ifdef ASM_OUTPUT_WEAKREF
ff2d10c1 5203 ASM_OUTPUT_WEAKREF (asm_out_file, decl,
a0203ca7
AO
5204 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
5205 IDENTIFIER_POINTER (target));
5206#else
5207 if (!SUPPORTS_WEAK)
5208 {
5209 error ("%Jweakref is not supported in this configuration", decl);
5210 return;
5211 }
5212#endif
5213 return;
5214 }
5215
8893239d
RH
5216 if (!targetm.have_tls
5217 && TREE_CODE (decl) == VAR_DECL
5218 && DECL_THREAD_LOCAL_P (decl))
5219 {
5220 decl = emutls_decl (decl);
5221 target = get_emutls_object_name (target);
5222 }
5223
e4d5432a
RH
5224#ifdef ASM_OUTPUT_DEF
5225 /* Make name accessible from other files, if appropriate. */
5226
5227 if (TREE_PUBLIC (decl))
5228 {
5229 globalize_decl (decl);
5230 maybe_assemble_visibility (decl);
5231 }
5232
5233# ifdef ASM_OUTPUT_DEF_FROM_DECLS
083b6717 5234 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
e4d5432a 5235# else
083b6717
JDA
5236 ASM_OUTPUT_DEF (asm_out_file,
5237 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
5238 IDENTIFIER_POINTER (target));
e4d5432a
RH
5239# endif
5240#elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
5241 {
5242 const char *name;
5243 tree *p, t;
5244
5245 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5246# ifdef ASM_WEAKEN_DECL
5247 ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
5248# else
5249 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
5250# endif
5251 /* Remove this function from the pending weak list so that
5252 we do not emit multiple .weak directives for it. */
5253 for (p = &weak_decls; (t = *p) ; )
5254 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
5255 *p = TREE_CHAIN (t);
5256 else
5257 p = &TREE_CHAIN (t);
a0203ca7
AO
5258
5259 /* Remove weakrefs to the same target from the pending weakref
5260 list, for the same reason. */
5261 for (p = &weakref_targets; (t = *p) ; )
5262 {
5263 if (DECL_ASSEMBLER_NAME (decl)
5264 == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5265 *p = TREE_CHAIN (t);
5266 else
5267 p = &TREE_CHAIN (t);
5268 }
e4d5432a 5269 }
083b6717
JDA
5270#endif
5271}
083b6717 5272
e4d5432a
RH
5273/* First pass of completing pending aliases. Make sure that cgraph knows
5274 which symbols will be required. */
083b6717
JDA
5275
5276void
e4d5432a 5277finish_aliases_1 (void)
083b6717 5278{
083b6717 5279 unsigned i;
d4e6fecb 5280 alias_pair *p;
083b6717 5281
e4d5432a
RH
5282 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
5283 {
5284 tree target_decl;
5285
5286 target_decl = find_decl_and_mark_needed (p->decl, p->target);
5287 if (target_decl == NULL)
a0203ca7
AO
5288 {
5289 if (! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
5290 error ("%q+D aliased to undefined symbol %qs",
5291 p->decl, IDENTIFIER_POINTER (p->target));
5292 }
5293 else if (DECL_EXTERNAL (target_decl)
5294 && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
ea40ba9c
JM
5295 error ("%q+D aliased to external symbol %qs",
5296 p->decl, IDENTIFIER_POINTER (p->target));
e4d5432a
RH
5297 }
5298}
083b6717 5299
e4d5432a
RH
5300/* Second pass of completing pending aliases. Emit the actual assembly.
5301 This happens at the end of compilation and thus it is assured that the
5302 target symbol has been emitted. */
5303
5304void
5305finish_aliases_2 (void)
5306{
5307 unsigned i;
d4e6fecb 5308 alias_pair *p;
e4d5432a
RH
5309
5310 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
5311 do_assemble_alias (p->decl, p->target);
5312
d4e6fecb 5313 VEC_truncate (alias_pair, alias_pairs, 0);
083b6717
JDA
5314}
5315
4ae08f95
JM
5316/* Emit an assembler directive to make the symbol for DECL an alias to
5317 the symbol for TARGET. */
4b8af8d9
JM
5318
5319void
bedb9fc0 5320assemble_alias (tree decl, tree target)
4b8af8d9 5321{
e4d5432a 5322 tree target_decl;
a0203ca7 5323 bool is_weakref = false;
4b8af8d9 5324
a0203ca7
AO
5325 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5326 {
5327 tree alias = DECL_ASSEMBLER_NAME (decl);
5328
5329 is_weakref = true;
5330
5331 ultimate_transparent_alias_target (&target);
5332
5333 if (alias == target)
6d3e3e6a 5334 error ("weakref %q+D ultimately targets itself", decl);
a0203ca7
AO
5335 else
5336 {
5337#ifndef ASM_OUTPUT_WEAKREF
5338 IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1;
5339 TREE_CHAIN (alias) = target;
5340#endif
5341 }
a9b0b825
GK
5342 if (TREE_PUBLIC (decl))
5343 error ("weakref %q+D must have static linkage", decl);
a0203ca7
AO
5344 }
5345 else
5346 {
e4d5432a
RH
5347#if !defined (ASM_OUTPUT_DEF)
5348# if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
a0203ca7 5349 error ("%Jalias definitions not supported in this configuration", decl);
e4d5432a 5350 return;
a0203ca7
AO
5351# else
5352 if (!DECL_WEAK (decl))
5353 {
5354 error ("%Jonly weak aliases are supported in this configuration", decl);
5355 return;
5356 }
e4d5432a
RH
5357# endif
5358#endif
a0203ca7 5359 }
4b8af8d9 5360
e4d5432a
RH
5361 /* We must force creation of DECL_RTL for debug info generation, even though
5362 we don't use it here. */
5363 make_decl_rtl (decl);
5364 TREE_USED (decl) = 1;
083b6717 5365
e4d5432a
RH
5366 /* A quirk of the initial implementation of aliases required that the user
5367 add "extern" to all of them. Which is silly, but now historical. Do
5368 note that the symbol is in fact locally defined. */
a0203ca7
AO
5369 if (! is_weakref)
5370 DECL_EXTERNAL (decl) = 0;
083b6717 5371
e4d5432a
RH
5372 /* Allow aliases to aliases. */
5373 if (TREE_CODE (decl) == FUNCTION_DECL)
12527dce 5374 cgraph_node (decl)->alias = true;
06e4eab5 5375 else
8a4a83ed 5376 varpool_node (decl)->alias = true;
06e4eab5 5377
e4d5432a
RH
5378 /* If the target has already been emitted, we don't have to queue the
5379 alias. This saves a tad o memory. */
5380 target_decl = find_decl_and_mark_needed (decl, target);
5381 if (target_decl && TREE_ASM_WRITTEN (target_decl))
5382 do_assemble_alias (decl, target);
5383 else
bedb9fc0 5384 {
d4e6fecb 5385 alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL);
e4d5432a
RH
5386 p->decl = decl;
5387 p->target = target;
bedb9fc0 5388 }
4b8af8d9 5389}
f796d997 5390
47bd70b5 5391/* Emit an assembler directive to set symbol for DECL visibility to
25fdb4dc 5392 the visibility type VIS, which must not be VISIBILITY_DEFAULT. */
47bd70b5
JJ
5393
5394void
2e1eedd6 5395default_assemble_visibility (tree decl, int vis)
47bd70b5 5396{
25fdb4dc 5397 static const char * const visibility_types[] = {
b9e75696 5398 NULL, "protected", "hidden", "internal"
25fdb4dc
RH
5399 };
5400
5401 const char *name, *type;
47bd70b5 5402
b0250067 5403 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
25fdb4dc 5404 type = visibility_types[vis];
47bd70b5
JJ
5405
5406#ifdef HAVE_GAS_HIDDEN
267594f3
R
5407 fprintf (asm_out_file, "\t.%s\t", type);
5408 assemble_name (asm_out_file, name);
5409 fprintf (asm_out_file, "\n");
47bd70b5 5410#else
5c498b10
DD
5411 warning (OPT_Wattributes, "visibility attribute not supported "
5412 "in this configuration; ignored");
47bd70b5
JJ
5413#endif
5414}
5415
b14707c3
RH
5416/* A helper function to call assemble_visibility when needed for a decl. */
5417
c47c29c8 5418int
2e1eedd6 5419maybe_assemble_visibility (tree decl)
b14707c3 5420{
968b41a1 5421 enum symbol_visibility vis = DECL_VISIBILITY (decl);
25fdb4dc
RH
5422
5423 if (vis != VISIBILITY_DEFAULT)
c47c29c8
L
5424 {
5425 targetm.asm_out.visibility (decl, vis);
5426 return 1;
5427 }
5428 else
5429 return 0;
b14707c3
RH
5430}
5431
f796d997
JM
5432/* Returns 1 if the target configuration supports defining public symbols
5433 so that one of them will be chosen at link time instead of generating a
5434 multiply-defined symbol error, whether through the use of weak symbols or
5435 a target-specific mechanism for having duplicates discarded. */
5436
5437int
2e1eedd6 5438supports_one_only (void)
f796d997
JM
5439{
5440 if (SUPPORTS_ONE_ONLY)
5441 return 1;
5442 return SUPPORTS_WEAK;
5443}
5444
5445/* Set up DECL as a public symbol that can be defined in multiple
5446 translation units without generating a linker error. */
5447
5448void
2e1eedd6 5449make_decl_one_only (tree decl)
f796d997 5450{
fbc848cc
NS
5451 gcc_assert (TREE_CODE (decl) == VAR_DECL
5452 || TREE_CODE (decl) == FUNCTION_DECL);
f796d997
JM
5453
5454 TREE_PUBLIC (decl) = 1;
5455
4746cf84 5456 if (SUPPORTS_ONE_ONLY)
f796d997
JM
5457 {
5458#ifdef MAKE_DECL_ONE_ONLY
5459 MAKE_DECL_ONE_ONLY (decl);
5460#endif
5461 DECL_ONE_ONLY (decl) = 1;
5462 }
4746cf84
MA
5463 else if (TREE_CODE (decl) == VAR_DECL
5464 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
5465 DECL_COMMON (decl) = 1;
f796d997 5466 else
fbc848cc
NS
5467 {
5468 gcc_assert (SUPPORTS_WEAK);
5469 DECL_WEAK (decl) = 1;
5470 }
f796d997 5471}
76095e2f
RH
5472
5473void
2e1eedd6 5474init_varasm_once (void)
76095e2f 5475{
d6b5193b
RS
5476 section_htab = htab_create_ggc (31, section_entry_hash,
5477 section_entry_eq, NULL);
aacd3885
RS
5478 object_block_htab = htab_create_ggc (31, object_block_entry_hash,
5479 object_block_entry_eq, NULL);
10b6a274
ZW
5480 const_desc_htab = htab_create_ggc (1009, const_desc_hash,
5481 const_desc_eq, NULL);
715bdd29 5482
a79e3a45 5483 const_alias_set = new_alias_set ();
1d3dbd99 5484 shared_constant_pool = create_constant_pool ();
d6b5193b
RS
5485
5486#ifdef TEXT_SECTION_ASM_OP
5487 text_section = get_unnamed_section (SECTION_CODE, output_section_asm_op,
5488 TEXT_SECTION_ASM_OP);
5489#endif
5490
5491#ifdef DATA_SECTION_ASM_OP
5492 data_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
5493 DATA_SECTION_ASM_OP);
5494#endif
5495
5496#ifdef SDATA_SECTION_ASM_OP
5497 sdata_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
5498 SDATA_SECTION_ASM_OP);
5499#endif
5500
5501#ifdef READONLY_DATA_SECTION_ASM_OP
5502 readonly_data_section = get_unnamed_section (0, output_section_asm_op,
5503 READONLY_DATA_SECTION_ASM_OP);
5504#endif
5505
5506#ifdef CTORS_SECTION_ASM_OP
5507 ctors_section = get_unnamed_section (0, output_section_asm_op,
5508 CTORS_SECTION_ASM_OP);
5509#endif
5510
5511#ifdef DTORS_SECTION_ASM_OP
5512 dtors_section = get_unnamed_section (0, output_section_asm_op,
5513 DTORS_SECTION_ASM_OP);
5514#endif
5515
5516#ifdef BSS_SECTION_ASM_OP
5517 bss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
5518 output_section_asm_op,
5519 BSS_SECTION_ASM_OP);
5520#endif
5521
5522#ifdef SBSS_SECTION_ASM_OP
5523 sbss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
5524 output_section_asm_op,
5525 SBSS_SECTION_ASM_OP);
5526#endif
5527
434aeebb
RS
5528 tls_comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
5529 | SECTION_COMMON, emit_tls_common);
5530 lcomm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
5531 | SECTION_COMMON, emit_local);
5532 comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
5533 | SECTION_COMMON, emit_common);
5534
5535#if defined ASM_OUTPUT_ALIGNED_BSS || defined ASM_OUTPUT_BSS
5536 bss_noswitch_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS,
5537 emit_bss);
5538#endif
5539
d6b5193b
RS
5540 targetm.asm_out.init_sections ();
5541
5542 if (readonly_data_section == NULL)
5543 readonly_data_section = text_section;
76095e2f 5544}
7c262518 5545
c2f7fa15 5546enum tls_model
3101faab 5547decl_default_tls_model (const_tree decl)
dce81a1a
JJ
5548{
5549 enum tls_model kind;
dce81a1a
JJ
5550 bool is_local;
5551
5fd9b178 5552 is_local = targetm.binds_local_p (decl);
0bfb33e5 5553 if (!flag_shlib)
dce81a1a
JJ
5554 {
5555 if (is_local)
5556 kind = TLS_MODEL_LOCAL_EXEC;
5557 else
5558 kind = TLS_MODEL_INITIAL_EXEC;
5559 }
c2f7fa15 5560
dce81a1a
JJ
5561 /* Local dynamic is inefficient when we're not combining the
5562 parts of the address. */
5563 else if (optimize && is_local)
5564 kind = TLS_MODEL_LOCAL_DYNAMIC;
5565 else
5566 kind = TLS_MODEL_GLOBAL_DYNAMIC;
5567 if (kind < flag_tls_default)
5568 kind = flag_tls_default;
5569
5570 return kind;
5571}
5572
7c262518
RH
5573/* Select a set of attributes for section NAME based on the properties
5574 of DECL and whether or not RELOC indicates that DECL's initializer
5575 might contain runtime relocations.
5576
5577 We make the section read-only and executable for a function decl,
715bdd29 5578 read-only for a const data decl, and writable for a non-const data decl. */
7c262518
RH
5579
5580unsigned int
2e1eedd6 5581default_section_type_flags (tree decl, const char *name, int reloc)
7c262518 5582{
7c262518 5583 unsigned int flags;
7c262518
RH
5584
5585 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
5586 flags = SECTION_CODE;
9b580a0b 5587 else if (decl && decl_readonly_section (decl, reloc))
7c262518 5588 flags = 0;
c7466dee
CT
5589 else if (current_function_decl
5590 && cfun
5591 && cfun->unlikely_text_section_name
5592 && strcmp (name, cfun->unlikely_text_section_name) == 0)
750054a2 5593 flags = SECTION_CODE;
083cad55 5594 else if (!decl
c7466dee
CT
5595 && (!current_function_decl || !cfun)
5596 && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
083cad55 5597 flags = SECTION_CODE;
7c262518
RH
5598 else
5599 flags = SECTION_WRITE;
5600
5601 if (decl && DECL_ONE_ONLY (decl))
5602 flags |= SECTION_LINKONCE;
5603
c2f7fa15 5604 if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
c711ba8e
RH
5605 flags |= SECTION_TLS | SECTION_WRITE;
5606
7c262518
RH
5607 if (strcmp (name, ".bss") == 0
5608 || strncmp (name, ".bss.", 5) == 0
abb8b19a
AM
5609 || strncmp (name, ".gnu.linkonce.b.", 16) == 0
5610 || strcmp (name, ".sbss") == 0
826eb7ed
JB
5611 || strncmp (name, ".sbss.", 6) == 0
5612 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
abb8b19a 5613 flags |= SECTION_BSS;
826eb7ed 5614
3d78f2e9 5615 if (strcmp (name, ".tdata") == 0
826eb7ed
JB
5616 || strncmp (name, ".tdata.", 7) == 0
5617 || strncmp (name, ".gnu.linkonce.td.", 17) == 0)
3d78f2e9
RH
5618 flags |= SECTION_TLS;
5619
826eb7ed
JB
5620 if (strcmp (name, ".tbss") == 0
5621 || strncmp (name, ".tbss.", 6) == 0
5622 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
5623 flags |= SECTION_TLS | SECTION_BSS;
5624
6a0a6ac4
AM
5625 /* These three sections have special ELF types. They are neither
5626 SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
5627 want to print a section type (@progbits or @nobits). If someone
5628 is silly enough to emit code or TLS variables to one of these
5629 sections, then don't handle them specially. */
5630 if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
5631 && (strcmp (name, ".init_array") == 0
5632 || strcmp (name, ".fini_array") == 0
5633 || strcmp (name, ".preinit_array") == 0))
5634 flags |= SECTION_NOTYPE;
5635
7c262518
RH
5636 return flags;
5637}
5638
434aeebb
RS
5639/* Return true if the target supports some form of global BSS,
5640 either through bss_noswitch_section, or by selecting a BSS
5641 section in TARGET_ASM_SELECT_SECTION. */
5642
5643bool
5644have_global_bss_p (void)
5645{
5646 return bss_noswitch_section || targetm.have_switchable_bss_sections;
5647}
5648
7c262518
RH
5649/* Output assembly to switch to section NAME with attribute FLAGS.
5650 Four variants for common object file formats. */
5651
5652void
2e1eedd6 5653default_no_named_section (const char *name ATTRIBUTE_UNUSED,
c18a5b6c
MM
5654 unsigned int flags ATTRIBUTE_UNUSED,
5655 tree decl ATTRIBUTE_UNUSED)
7c262518
RH
5656{
5657 /* Some object formats don't support named sections at all. The
5658 front-end should already have flagged this as an error. */
fbc848cc 5659 gcc_unreachable ();
7c262518
RH
5660}
5661
5662void
c18a5b6c
MM
5663default_elf_asm_named_section (const char *name, unsigned int flags,
5664 tree decl ATTRIBUTE_UNUSED)
7c262518 5665{
201556f0 5666 char flagchars[10], *f = flagchars;
7c262518 5667
c18a5b6c
MM
5668 /* If we have already declared this section, we can use an
5669 abbreviated form to switch back to it -- unless this section is
5670 part of a COMDAT groups, in which case GAS requires the full
5671 declaration every time. */
11176d2a 5672 if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
d6b5193b 5673 && (flags & SECTION_DECLARED))
a8c01a59
RL
5674 {
5675 fprintf (asm_out_file, "\t.section\t%s\n", name);
5676 return;
5677 }
5678
7c262518
RH
5679 if (!(flags & SECTION_DEBUG))
5680 *f++ = 'a';
5681 if (flags & SECTION_WRITE)
5682 *f++ = 'w';
5683 if (flags & SECTION_CODE)
5684 *f++ = 'x';
5685 if (flags & SECTION_SMALL)
5686 *f++ = 's';
201556f0
JJ
5687 if (flags & SECTION_MERGE)
5688 *f++ = 'M';
5689 if (flags & SECTION_STRINGS)
5690 *f++ = 'S';
3d78f2e9
RH
5691 if (flags & SECTION_TLS)
5692 *f++ = 'T';
11176d2a 5693 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
c18a5b6c 5694 *f++ = 'G';
7c262518
RH
5695 *f = '\0';
5696
6a0a6ac4 5697 fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
7c262518 5698
6a0a6ac4
AM
5699 if (!(flags & SECTION_NOTYPE))
5700 {
5701 const char *type;
c18a5b6c 5702 const char *format;
6a0a6ac4
AM
5703
5704 if (flags & SECTION_BSS)
5705 type = "nobits";
5706 else
5707 type = "progbits";
5708
c18a5b6c
MM
5709 format = ",@%s";
5710#ifdef ASM_COMMENT_START
5711 /* On platforms that use "@" as the assembly comment character,
5712 use "%" instead. */
5713 if (strcmp (ASM_COMMENT_START, "@") == 0)
5714 format = ",%%%s";
5715#endif
5716 fprintf (asm_out_file, format, type);
6a0a6ac4
AM
5717
5718 if (flags & SECTION_ENTSIZE)
5719 fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
11176d2a 5720 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
083cad55 5721 fprintf (asm_out_file, ",%s,comdat",
c18a5b6c 5722 lang_hooks.decls.comdat_group (decl));
6a0a6ac4
AM
5723 }
5724
5725 putc ('\n', asm_out_file);
7c262518
RH
5726}
5727
5728void
083cad55 5729default_coff_asm_named_section (const char *name, unsigned int flags,
c18a5b6c 5730 tree decl ATTRIBUTE_UNUSED)
7c262518
RH
5731{
5732 char flagchars[8], *f = flagchars;
5733
5734 if (flags & SECTION_WRITE)
5735 *f++ = 'w';
5736 if (flags & SECTION_CODE)
5737 *f++ = 'x';
5738 *f = '\0';
5739
5740 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
5741}
5742
5743void
c18a5b6c
MM
5744default_pe_asm_named_section (const char *name, unsigned int flags,
5745 tree decl)
7c262518 5746{
c18a5b6c 5747 default_coff_asm_named_section (name, flags, decl);
7c262518
RH
5748
5749 if (flags & SECTION_LINKONCE)
5750 {
5751 /* Functions may have been compiled at various levels of
5752 optimization so we can't use `same_size' here.
5753 Instead, have the linker pick one. */
5754 fprintf (asm_out_file, "\t.linkonce %s\n",
5755 (flags & SECTION_CODE ? "discard" : "same_size"));
5756 }
5757}
4a8d0c9c 5758\f
ae46c4e0
RH
5759/* The lame default section selector. */
5760
d6b5193b 5761section *
2e1eedd6
AJ
5762default_select_section (tree decl, int reloc,
5763 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
ae46c4e0 5764{
ae46c4e0
RH
5765 if (DECL_P (decl))
5766 {
4e4d733e 5767 if (decl_readonly_section (decl, reloc))
d6b5193b 5768 return readonly_data_section;
ae46c4e0
RH
5769 }
5770 else if (TREE_CODE (decl) == CONSTRUCTOR)
5771 {
5772 if (! ((flag_pic && reloc)
5773 || !TREE_READONLY (decl)
5774 || TREE_SIDE_EFFECTS (decl)
5775 || !TREE_CONSTANT (decl)))
d6b5193b 5776 return readonly_data_section;
ae46c4e0
RH
5777 }
5778 else if (TREE_CODE (decl) == STRING_CST)
d6b5193b 5779 return readonly_data_section;
ae46c4e0 5780 else if (! (flag_pic && reloc))
d6b5193b 5781 return readonly_data_section;
ae46c4e0 5782
d6b5193b 5783 return data_section;
ae46c4e0
RH
5784}
5785
ae46c4e0 5786enum section_category
3101faab 5787categorize_decl_for_section (const_tree decl, int reloc)
ae46c4e0
RH
5788{
5789 enum section_category ret;
5790
5791 if (TREE_CODE (decl) == FUNCTION_DECL)
5792 return SECCAT_TEXT;
5793 else if (TREE_CODE (decl) == STRING_CST)
6de9cd9a
DN
5794 {
5795 if (flag_mudflap) /* or !flag_merge_constants */
5796 return SECCAT_RODATA;
5797 else
5798 return SECCAT_RODATA_MERGE_STR;
5799 }
ae46c4e0
RH
5800 else if (TREE_CODE (decl) == VAR_DECL)
5801 {
434aeebb 5802 if (bss_initializer_p (decl))
ae46c4e0
RH
5803 ret = SECCAT_BSS;
5804 else if (! TREE_READONLY (decl)
5805 || TREE_SIDE_EFFECTS (decl)
5806 || ! TREE_CONSTANT (DECL_INITIAL (decl)))
5807 {
9b580a0b
RH
5808 /* Here the reloc_rw_mask is not testing whether the section should
5809 be read-only or not, but whether the dynamic link will have to
5810 do something. If so, we wish to segregate the data in order to
5811 minimize cache misses inside the dynamic linker. */
5812 if (reloc & targetm.asm_out.reloc_rw_mask ())
5813 ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL;
ae46c4e0
RH
5814 else
5815 ret = SECCAT_DATA;
5816 }
9b580a0b
RH
5817 else if (reloc & targetm.asm_out.reloc_rw_mask ())
5818 ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO;
7eca317a 5819 else if (reloc || flag_merge_constants < 2)
ae46c4e0
RH
5820 /* C and C++ don't allow different variables to share the same
5821 location. -fmerge-all-constants allows even that (at the
5822 expense of not conforming). */
5823 ret = SECCAT_RODATA;
5824 else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
5825 ret = SECCAT_RODATA_MERGE_STR_INIT;
5826 else
5827 ret = SECCAT_RODATA_MERGE_CONST;
5828 }
5829 else if (TREE_CODE (decl) == CONSTRUCTOR)
5830 {
9b580a0b 5831 if ((reloc & targetm.asm_out.reloc_rw_mask ())
ae46c4e0
RH
5832 || TREE_SIDE_EFFECTS (decl)
5833 || ! TREE_CONSTANT (decl))
5834 ret = SECCAT_DATA;
5835 else
5836 ret = SECCAT_RODATA;
5837 }
5838 else
5839 ret = SECCAT_RODATA;
5840
3d78f2e9 5841 /* There are no read-only thread-local sections. */
c2f7fa15 5842 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
3d78f2e9 5843 {
08a8c6b6
JB
5844 /* Note that this would be *just* SECCAT_BSS, except that there's
5845 no concept of a read-only thread-local-data section. */
5846 if (ret == SECCAT_BSS
5847 || (flag_zero_initialized_in_bss
5848 && initializer_zerop (DECL_INITIAL (decl))))
3d78f2e9
RH
5849 ret = SECCAT_TBSS;
5850 else
5851 ret = SECCAT_TDATA;
5852 }
5853
ae46c4e0 5854 /* If the target uses small data sections, select it. */
5fd9b178 5855 else if (targetm.in_small_data_p (decl))
ae46c4e0
RH
5856 {
5857 if (ret == SECCAT_BSS)
5858 ret = SECCAT_SBSS;
275b6d80
DE
5859 else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
5860 ret = SECCAT_SRODATA;
ae46c4e0
RH
5861 else
5862 ret = SECCAT_SDATA;
5863 }
5864
5865 return ret;
5866}
5867
4e4d733e 5868bool
3101faab 5869decl_readonly_section (const_tree decl, int reloc)
4e4d733e 5870{
9b580a0b 5871 switch (categorize_decl_for_section (decl, reloc))
4e4d733e
L
5872 {
5873 case SECCAT_RODATA:
5874 case SECCAT_RODATA_MERGE_STR:
5875 case SECCAT_RODATA_MERGE_STR_INIT:
5876 case SECCAT_RODATA_MERGE_CONST:
275b6d80 5877 case SECCAT_SRODATA:
4e4d733e
L
5878 return true;
5879 break;
5880 default:
5881 return false;
5882 break;
5883 }
5884}
5885
ae46c4e0
RH
5886/* Select a section based on the above categorization. */
5887
d6b5193b 5888section *
2e1eedd6
AJ
5889default_elf_select_section (tree decl, int reloc,
5890 unsigned HOST_WIDE_INT align)
2cc9fb4c 5891{
e13971e0 5892 const char *sname;
9b580a0b 5893 switch (categorize_decl_for_section (decl, reloc))
ae46c4e0
RH
5894 {
5895 case SECCAT_TEXT:
5896 /* We're not supposed to be called on FUNCTION_DECLs. */
fbc848cc 5897 gcc_unreachable ();
ae46c4e0 5898 case SECCAT_RODATA:
d6b5193b 5899 return readonly_data_section;
ae46c4e0 5900 case SECCAT_RODATA_MERGE_STR:
d6b5193b 5901 return mergeable_string_section (decl, align, 0);
ae46c4e0 5902 case SECCAT_RODATA_MERGE_STR_INIT:
d6b5193b 5903 return mergeable_string_section (DECL_INITIAL (decl), align, 0);
ae46c4e0 5904 case SECCAT_RODATA_MERGE_CONST:
d6b5193b 5905 return mergeable_constant_section (DECL_MODE (decl), align, 0);
275b6d80 5906 case SECCAT_SRODATA:
e13971e0 5907 sname = ".sdata2";
275b6d80 5908 break;
ae46c4e0 5909 case SECCAT_DATA:
d6b5193b 5910 return data_section;
ae46c4e0 5911 case SECCAT_DATA_REL:
e13971e0 5912 sname = ".data.rel";
ae46c4e0
RH
5913 break;
5914 case SECCAT_DATA_REL_LOCAL:
e13971e0 5915 sname = ".data.rel.local";
ae46c4e0
RH
5916 break;
5917 case SECCAT_DATA_REL_RO:
e13971e0 5918 sname = ".data.rel.ro";
ae46c4e0
RH
5919 break;
5920 case SECCAT_DATA_REL_RO_LOCAL:
e13971e0 5921 sname = ".data.rel.ro.local";
ae46c4e0
RH
5922 break;
5923 case SECCAT_SDATA:
e13971e0 5924 sname = ".sdata";
ae46c4e0
RH
5925 break;
5926 case SECCAT_TDATA:
e13971e0 5927 sname = ".tdata";
ae46c4e0
RH
5928 break;
5929 case SECCAT_BSS:
d6b5193b
RS
5930 if (bss_section)
5931 return bss_section;
e13971e0 5932 sname = ".bss";
ae46c4e0
RH
5933 break;
5934 case SECCAT_SBSS:
e13971e0 5935 sname = ".sbss";
ae46c4e0
RH
5936 break;
5937 case SECCAT_TBSS:
e13971e0 5938 sname = ".tbss";
ae46c4e0
RH
5939 break;
5940 default:
fbc848cc 5941 gcc_unreachable ();
ae46c4e0 5942 }
e13971e0
AM
5943
5944 if (!DECL_P (decl))
5945 decl = NULL_TREE;
d6b5193b 5946 return get_named_section (decl, sname, reloc);
ae46c4e0
RH
5947}
5948
41077ce4 5949/* Construct a unique section name based on the decl name and the
ae46c4e0
RH
5950 categorization performed above. */
5951
5952void
2e1eedd6 5953default_unique_section (tree decl, int reloc)
ae46c4e0 5954{
11176d2a
JB
5955 /* We only need to use .gnu.linkonce if we don't have COMDAT groups. */
5956 bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
ae46c4e0
RH
5957 const char *prefix, *name;
5958 size_t nlen, plen;
5959 char *string;
5960
9b580a0b 5961 switch (categorize_decl_for_section (decl, reloc))
ae46c4e0
RH
5962 {
5963 case SECCAT_TEXT:
5964 prefix = one_only ? ".gnu.linkonce.t." : ".text.";
5965 break;
5966 case SECCAT_RODATA:
5967 case SECCAT_RODATA_MERGE_STR:
5968 case SECCAT_RODATA_MERGE_STR_INIT:
5969 case SECCAT_RODATA_MERGE_CONST:
5970 prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
5971 break;
275b6d80
DE
5972 case SECCAT_SRODATA:
5973 prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
5974 break;
ae46c4e0 5975 case SECCAT_DATA:
0a942fea
JJ
5976 prefix = one_only ? ".gnu.linkonce.d." : ".data.";
5977 break;
ae46c4e0 5978 case SECCAT_DATA_REL:
0a942fea
JJ
5979 prefix = one_only ? ".gnu.linkonce.d.rel." : ".data.rel.";
5980 break;
ae46c4e0 5981 case SECCAT_DATA_REL_LOCAL:
0a942fea
JJ
5982 prefix = one_only ? ".gnu.linkonce.d.rel.local." : ".data.rel.local.";
5983 break;
ae46c4e0 5984 case SECCAT_DATA_REL_RO:
0a942fea
JJ
5985 prefix = one_only ? ".gnu.linkonce.d.rel.ro." : ".data.rel.ro.";
5986 break;
ae46c4e0 5987 case SECCAT_DATA_REL_RO_LOCAL:
0a942fea
JJ
5988 prefix = one_only ? ".gnu.linkonce.d.rel.ro.local."
5989 : ".data.rel.ro.local.";
ae46c4e0
RH
5990 break;
5991 case SECCAT_SDATA:
5992 prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
5993 break;
5994 case SECCAT_BSS:
5995 prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
5996 break;
5997 case SECCAT_SBSS:
5998 prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
5999 break;
6000 case SECCAT_TDATA:
c711ba8e
RH
6001 prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
6002 break;
ae46c4e0 6003 case SECCAT_TBSS:
c711ba8e
RH
6004 prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
6005 break;
ae46c4e0 6006 default:
fbc848cc 6007 gcc_unreachable ();
ae46c4e0
RH
6008 }
6009 plen = strlen (prefix);
6010
6011 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
245f1bfa 6012 name = targetm.strip_name_encoding (name);
ae46c4e0
RH
6013 nlen = strlen (name);
6014
6015 string = alloca (nlen + plen + 1);
6016 memcpy (string, prefix, plen);
6017 memcpy (string + plen, name, nlen + 1);
6018
6019 DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
6020}
b64a1b53 6021
9b580a0b
RH
6022/* Like compute_reloc_for_constant, except for an RTX. The return value
6023 is a mask for which bit 1 indicates a global relocation, and bit 0
6024 indicates a local relocation. */
6025
6026static int
6027compute_reloc_for_rtx_1 (rtx *xp, void *data)
6028{
6029 int *preloc = data;
6030 rtx x = *xp;
6031
6032 switch (GET_CODE (x))
6033 {
6034 case SYMBOL_REF:
6035 *preloc |= SYMBOL_REF_LOCAL_P (x) ? 1 : 2;
6036 break;
6037 case LABEL_REF:
6038 *preloc |= 1;
6039 break;
6040 default:
6041 break;
6042 }
6043
6044 return 0;
6045}
6046
6047static int
6048compute_reloc_for_rtx (rtx x)
6049{
6050 int reloc;
6051
6052 switch (GET_CODE (x))
6053 {
6054 case CONST:
6055 case SYMBOL_REF:
6056 case LABEL_REF:
6057 reloc = 0;
6058 for_each_rtx (&x, compute_reloc_for_rtx_1, &reloc);
6059 return reloc;
6060
6061 default:
6062 return 0;
6063 }
6064}
6065
d6b5193b 6066section *
2e1eedd6
AJ
6067default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
6068 rtx x,
6069 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
b64a1b53 6070{
9b580a0b
RH
6071 if (compute_reloc_for_rtx (x) & targetm.asm_out.reloc_rw_mask ())
6072 return data_section;
6073 else
6074 return readonly_data_section;
b64a1b53
RH
6075}
6076
d6b5193b 6077section *
2e1eedd6
AJ
6078default_elf_select_rtx_section (enum machine_mode mode, rtx x,
6079 unsigned HOST_WIDE_INT align)
b64a1b53 6080{
9b580a0b 6081 int reloc = compute_reloc_for_rtx (x);
b64a1b53 6082
9b580a0b 6083 /* ??? Handle small data here somehow. */
b64a1b53 6084
9b580a0b
RH
6085 if (reloc & targetm.asm_out.reloc_rw_mask ())
6086 {
6087 if (reloc == 1)
d6b5193b 6088 return get_named_section (NULL, ".data.rel.ro.local", 1);
9b580a0b
RH
6089 else
6090 return get_named_section (NULL, ".data.rel.ro", 3);
6091 }
b64a1b53 6092
d6b5193b 6093 return mergeable_constant_section (mode, align, 0);
b64a1b53 6094}
772c5265 6095
52859c77
RH
6096/* Set the generally applicable flags on the SYMBOL_REF for EXP. */
6097
6098void
2e1eedd6 6099default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
52859c77 6100{
c6a2438a 6101 rtx symbol;
52859c77
RH
6102 int flags;
6103
52859c77 6104 /* Careful not to prod global register variables. */
3c0cb5de 6105 if (!MEM_P (rtl))
52859c77
RH
6106 return;
6107 symbol = XEXP (rtl, 0);
6108 if (GET_CODE (symbol) != SYMBOL_REF)
6109 return;
6110
3fa9c136 6111 flags = SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_HAS_BLOCK_INFO;
52859c77
RH
6112 if (TREE_CODE (decl) == FUNCTION_DECL)
6113 flags |= SYMBOL_FLAG_FUNCTION;
5fd9b178 6114 if (targetm.binds_local_p (decl))
52859c77 6115 flags |= SYMBOL_FLAG_LOCAL;
8893239d
RH
6116 if (targetm.have_tls && TREE_CODE (decl) == VAR_DECL
6117 && DECL_THREAD_LOCAL_P (decl))
c2f7fa15 6118 flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT;
0050e862
AM
6119 else if (targetm.in_small_data_p (decl))
6120 flags |= SYMBOL_FLAG_SMALL;
1b8135a4
RH
6121 /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without
6122 being PUBLIC, the thing *must* be defined in this translation unit.
6123 Prevent this buglet from being propagated into rtl code as well. */
6124 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
52859c77
RH
6125 flags |= SYMBOL_FLAG_EXTERNAL;
6126
6127 SYMBOL_REF_FLAGS (symbol) = flags;
6128}
6129
772c5265
RH
6130/* By default, we do nothing for encode_section_info, so we need not
6131 do anything but discard the '*' marker. */
6132
6133const char *
2e1eedd6 6134default_strip_name_encoding (const char *str)
772c5265
RH
6135{
6136 return str + (*str == '*');
6137}
47754fd5 6138
aacd3885
RS
6139#ifdef ASM_OUTPUT_DEF
6140/* The default implementation of TARGET_ASM_OUTPUT_ANCHOR. Define the
6141 anchor relative to ".", the current section position. */
6142
6143void
6144default_asm_output_anchor (rtx symbol)
6145{
6146 char buffer[100];
6147
c1a1cc5f 6148 sprintf (buffer, "*. + " HOST_WIDE_INT_PRINT_DEC,
aacd3885
RS
6149 SYMBOL_REF_BLOCK_OFFSET (symbol));
6150 ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
6151}
6152#endif
6153
6154/* The default implementation of TARGET_USE_ANCHORS_FOR_SYMBOL_P. */
6155
6156bool
3101faab 6157default_use_anchors_for_symbol_p (const_rtx symbol)
aacd3885
RS
6158{
6159 section *sect;
6160 tree decl;
6161
6162 /* Don't use anchors for mergeable sections. The linker might move
6163 the objects around. */
6164 sect = SYMBOL_REF_BLOCK (symbol)->sect;
6165 if (sect->common.flags & SECTION_MERGE)
6166 return false;
6167
6168 /* Don't use anchors for small data sections. The small data register
6169 acts as an anchor for such sections. */
6170 if (sect->common.flags & SECTION_SMALL)
6171 return false;
6172
6173 decl = SYMBOL_REF_DECL (symbol);
6174 if (decl && DECL_P (decl))
6175 {
6176 /* Don't use section anchors for decls that might be defined by
6177 other modules. */
6178 if (!targetm.binds_local_p (decl))
6179 return false;
6180
6181 /* Don't use section anchors for decls that will be placed in a
6182 small data section. */
6183 /* ??? Ideally, this check would be redundant with the SECTION_SMALL
6184 one above. The problem is that we only use SECTION_SMALL for
6185 sections that should be marked as small in the section directive. */
6186 if (targetm.in_small_data_p (decl))
6187 return false;
6188 }
6189 return true;
6190}
6191
47754fd5
RH
6192/* Assume ELF-ish defaults, since that's pretty much the most liberal
6193 wrt cross-module name binding. */
6194
6195bool
3101faab 6196default_binds_local_p (const_tree exp)
2cc9fb4c 6197{
24a4dd31 6198 return default_binds_local_p_1 (exp, flag_shlib);
2cc9fb4c
DE
6199}
6200
6201bool
3101faab 6202default_binds_local_p_1 (const_tree exp, int shlib)
47754fd5
RH
6203{
6204 bool local_p;
6205
6206 /* A non-decl is an entry in the constant pool. */
6207 if (!DECL_P (exp))
6208 local_p = true;
a9b0b825
GK
6209 /* Weakrefs may not bind locally, even though the weakref itself is
6210 always static and therefore local. */
6211 else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp)))
6212 local_p = false;
923c7cdf
RH
6213 /* Static variables are always local. */
6214 else if (! TREE_PUBLIC (exp))
6215 local_p = true;
a9b0b825
GK
6216 /* A variable is local if the user has said explicitly that it will
6217 be. */
083cad55 6218 else if (DECL_VISIBILITY_SPECIFIED (exp)
a9b0b825 6219 && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
47754fd5 6220 local_p = true;
a9b0b825 6221 /* Variables defined outside this object might not be local. */
47754fd5
RH
6222 else if (DECL_EXTERNAL (exp))
6223 local_p = false;
a9b0b825
GK
6224 /* If defined in this object and visibility is not default, must be
6225 local. */
d7afec4b
ND
6226 else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
6227 local_p = true;
a9b0b825
GK
6228 /* Default visibility weak data can be overridden by a strong symbol
6229 in another module and so are not local. */
6230 else if (DECL_WEAK (exp))
6231 local_p = false;
47754fd5 6232 /* If PIC, then assume that any global name can be overridden by
d236f595
NF
6233 symbols resolved from other modules, unless we are compiling with
6234 -fwhole-program, which assumes that names are local. */
2cc9fb4c 6235 else if (shlib)
d236f595 6236 local_p = flag_whole_program;
47754fd5
RH
6237 /* Uninitialized COMMON variable may be unified with symbols
6238 resolved from other modules. */
6239 else if (DECL_COMMON (exp)
6240 && (DECL_INITIAL (exp) == NULL
6241 || DECL_INITIAL (exp) == error_mark_node))
6242 local_p = false;
6243 /* Otherwise we're left with initialized (or non-common) global data
6244 which is of necessity defined locally. */
6245 else
6246 local_p = true;
6247
6248 return local_p;
6249}
e2500fed 6250
4977bab6 6251/* Determine whether or not a pointer mode is valid. Assume defaults
5bdc5878 6252 of ptr_mode or Pmode - can be overridden. */
4977bab6 6253bool
2e1eedd6 6254default_valid_pointer_mode (enum machine_mode mode)
4977bab6
ZW
6255{
6256 return (mode == ptr_mode || mode == Pmode);
6257}
6258
5eb99654 6259/* Default function to output code that will globalize a label. A
f3b569ca 6260 target must define GLOBAL_ASM_OP or provide its own function to
5eb99654
KG
6261 globalize a label. */
6262#ifdef GLOBAL_ASM_OP
6263void
2e1eedd6 6264default_globalize_label (FILE * stream, const char *name)
5eb99654
KG
6265{
6266 fputs (GLOBAL_ASM_OP, stream);
6267 assemble_name (stream, name);
6268 putc ('\n', stream);
6269}
6270#endif /* GLOBAL_ASM_OP */
2e1eedd6 6271
812b587e
SE
6272/* Default function to output code that will globalize a declaration. */
6273void
6274default_globalize_decl_name (FILE * stream, tree decl)
6275{
6276 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
6277 targetm.asm_out.globalize_label (stream, name);
6278}
6279
4746cf84
MA
6280/* Default function to output a label for unwind information. The
6281 default is to do nothing. A target that needs nonlocal labels for
9cf737f8 6282 unwind information must provide its own function to do this. */
4746cf84
MA
6283void
6284default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
6285 tree decl ATTRIBUTE_UNUSED,
eeab4d81 6286 int for_eh ATTRIBUTE_UNUSED,
4746cf84 6287 int empty ATTRIBUTE_UNUSED)
083cad55
EC
6288{
6289}
6290
6291/* Default function to output a label to divide up the exception table.
6292 The default is to do nothing. A target that needs/wants to divide
6293 up the table must provide it's own function to do this. */
6294void
6295default_emit_except_table_label (FILE * stream ATTRIBUTE_UNUSED)
6296{
4746cf84
MA
6297}
6298
4977bab6
ZW
6299/* This is how to output an internal numbered label where PREFIX is
6300 the class of label and LABELNO is the number within the class. */
6301
6302void
2e1eedd6
AJ
6303default_internal_label (FILE *stream, const char *prefix,
6304 unsigned long labelno)
4977bab6
ZW
6305{
6306 char *const buf = alloca (40 + strlen (prefix));
6307 ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
57829bc4 6308 ASM_OUTPUT_INTERNAL_LABEL (stream, buf);
4977bab6
ZW
6309}
6310
1bc7c5b6
ZW
6311/* This is the default behavior at the beginning of a file. It's
6312 controlled by two other target-hook toggles. */
6313void
2e1eedd6 6314default_file_start (void)
1bc7c5b6
ZW
6315{
6316 if (targetm.file_start_app_off && !flag_verbose_asm)
6317 fputs (ASM_APP_OFF, asm_out_file);
6318
6319 if (targetm.file_start_file_directive)
6320 output_file_directive (asm_out_file, main_input_filename);
6321}
6322
a5fe455b
ZW
6323/* This is a generic routine suitable for use as TARGET_ASM_FILE_END
6324 which emits a special section directive used to indicate whether or
6325 not this object file needs an executable stack. This is primarily
6326 a GNU extension to ELF but could be used on other targets. */
6de9cd9a
DN
6327
6328int trampolines_created;
6329
a5fe455b 6330void
2e1eedd6 6331file_end_indicate_exec_stack (void)
a5fe455b
ZW
6332{
6333 unsigned int flags = SECTION_DEBUG;
6334 if (trampolines_created)
6335 flags |= SECTION_CODE;
6336
d6b5193b
RS
6337 switch_to_section (get_section (".note.GNU-stack", flags, NULL));
6338}
6339
6340/* Output DIRECTIVE (a C string) followed by a newline. This is used as
6341 a get_unnamed_section callback. */
6342
6343void
6344output_section_asm_op (const void *directive)
6345{
6346 fprintf (asm_out_file, "%s\n", (const char *) directive);
6347}
6348
6349/* Emit assembly code to switch to section NEW_SECTION. Do nothing if
6350 the current section is NEW_SECTION. */
6351
6352void
6353switch_to_section (section *new_section)
6354{
6355 if (in_section == new_section)
6356 return;
6357
6358 if (new_section->common.flags & SECTION_FORGET)
6359 in_section = NULL;
6360 else
c543ca49 6361 in_section = new_section;
d6b5193b 6362
434aeebb 6363 switch (SECTION_STYLE (new_section))
d6b5193b 6364 {
434aeebb 6365 case SECTION_NAMED:
d6b5193b
RS
6366 if (cfun
6367 && !cfun->unlikely_text_section_name
6368 && strcmp (new_section->named.name,
6369 UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
6370 cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
6371
6372 targetm.asm_out.named_section (new_section->named.name,
6373 new_section->named.common.flags,
6374 new_section->named.decl);
434aeebb
RS
6375 break;
6376
6377 case SECTION_UNNAMED:
6378 new_section->unnamed.callback (new_section->unnamed.data);
6379 break;
6380
6381 case SECTION_NOSWITCH:
6382 gcc_unreachable ();
6383 break;
d6b5193b 6384 }
d6b5193b
RS
6385
6386 new_section->common.flags |= SECTION_DECLARED;
a5fe455b
ZW
6387}
6388
aacd3885
RS
6389/* If block symbol SYMBOL has not yet been assigned an offset, place
6390 it at the end of its block. */
6391
6392void
6393place_block_symbol (rtx symbol)
6394{
6395 unsigned HOST_WIDE_INT size, mask, offset;
6396 struct constant_descriptor_rtx *desc;
6397 unsigned int alignment;
6398 struct object_block *block;
6399 tree decl;
6400
434aeebb 6401 gcc_assert (SYMBOL_REF_BLOCK (symbol));
aacd3885
RS
6402 if (SYMBOL_REF_BLOCK_OFFSET (symbol) >= 0)
6403 return;
6404
6405 /* Work out the symbol's size and alignment. */
6406 if (CONSTANT_POOL_ADDRESS_P (symbol))
6407 {
6408 desc = SYMBOL_REF_CONSTANT (symbol);
6409 alignment = desc->align;
6410 size = GET_MODE_SIZE (desc->mode);
6411 }
6412 else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
6413 {
6414 decl = SYMBOL_REF_DECL (symbol);
6415 alignment = get_constant_alignment (decl);
6416 size = get_constant_size (decl);
6417 }
6418 else
6419 {
6420 decl = SYMBOL_REF_DECL (symbol);
6421 alignment = DECL_ALIGN (decl);
6422 size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
6423 }
6424
6425 /* Calculate the object's offset from the start of the block. */
6426 block = SYMBOL_REF_BLOCK (symbol);
6427 mask = alignment / BITS_PER_UNIT - 1;
6428 offset = (block->size + mask) & ~mask;
6429 SYMBOL_REF_BLOCK_OFFSET (symbol) = offset;
6430
6431 /* Record the block's new alignment and size. */
6432 block->alignment = MAX (block->alignment, alignment);
6433 block->size = offset + size;
6434
6435 VEC_safe_push (rtx, gc, block->objects, symbol);
6436}
6437
6438/* Return the anchor that should be used to address byte offset OFFSET
6439 from the first object in BLOCK. MODEL is the TLS model used
6440 to access it. */
6441
6442rtx
6443get_section_anchor (struct object_block *block, HOST_WIDE_INT offset,
6444 enum tls_model model)
6445{
6446 char label[100];
6447 unsigned int begin, middle, end;
6448 unsigned HOST_WIDE_INT min_offset, max_offset, range, bias, delta;
6449 rtx anchor;
6450
6451 /* Work out the anchor's offset. Use an offset of 0 for the first
6452 anchor so that we don't pessimize the case where we take the address
6453 of a variable at the beginning of the block. This is particularly
6454 useful when a block has only one variable assigned to it.
6455
6456 We try to place anchors RANGE bytes apart, so there can then be
6457 anchors at +/-RANGE, +/-2 * RANGE, and so on, up to the limits of
6458 a ptr_mode offset. With some target settings, the lowest such
6459 anchor might be out of range for the lowest ptr_mode offset;
6460 likewise the highest anchor for the highest offset. Use anchors
6461 at the extreme ends of the ptr_mode range in such cases.
6462
6463 All arithmetic uses unsigned integers in order to avoid
6464 signed overflow. */
6465 max_offset = (unsigned HOST_WIDE_INT) targetm.max_anchor_offset;
6466 min_offset = (unsigned HOST_WIDE_INT) targetm.min_anchor_offset;
6467 range = max_offset - min_offset + 1;
6468 if (range == 0)
6469 offset = 0;
6470 else
6471 {
6472 bias = 1 << (GET_MODE_BITSIZE (ptr_mode) - 1);
6473 if (offset < 0)
6474 {
6475 delta = -(unsigned HOST_WIDE_INT) offset + max_offset;
6476 delta -= delta % range;
6477 if (delta > bias)
6478 delta = bias;
6479 offset = (HOST_WIDE_INT) (-delta);
6480 }
6481 else
6482 {
6483 delta = (unsigned HOST_WIDE_INT) offset - min_offset;
6484 delta -= delta % range;
6485 if (delta > bias - 1)
6486 delta = bias - 1;
6487 offset = (HOST_WIDE_INT) delta;
6488 }
6489 }
6490
6491 /* Do a binary search to see if there's already an anchor we can use.
6492 Set BEGIN to the new anchor's index if not. */
6493 begin = 0;
6494 end = VEC_length (rtx, block->anchors);
6495 while (begin != end)
6496 {
6497 middle = (end + begin) / 2;
6498 anchor = VEC_index (rtx, block->anchors, middle);
6499 if (SYMBOL_REF_BLOCK_OFFSET (anchor) > offset)
6500 end = middle;
6501 else if (SYMBOL_REF_BLOCK_OFFSET (anchor) < offset)
6502 begin = middle + 1;
6503 else if (SYMBOL_REF_TLS_MODEL (anchor) > model)
6504 end = middle;
6505 else if (SYMBOL_REF_TLS_MODEL (anchor) < model)
6506 begin = middle + 1;
6507 else
6508 return anchor;
6509 }
6510
6511 /* Create a new anchor with a unique label. */
6512 ASM_GENERATE_INTERNAL_LABEL (label, "LANCHOR", anchor_labelno++);
6513 anchor = create_block_symbol (ggc_strdup (label), block, offset);
6514 SYMBOL_REF_FLAGS (anchor) |= SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_ANCHOR;
6515 SYMBOL_REF_FLAGS (anchor) |= model << SYMBOL_FLAG_TLS_SHIFT;
6516
6517 /* Insert it at index BEGIN. */
6518 VEC_safe_insert (rtx, gc, block->anchors, begin, anchor);
6519 return anchor;
6520}
6521
6522/* Output the objects in BLOCK. */
6523
6524static void
6525output_object_block (struct object_block *block)
6526{
6527 struct constant_descriptor_rtx *desc;
6528 unsigned int i;
6529 HOST_WIDE_INT offset;
6530 tree decl;
6531 rtx symbol;
6532
6533 if (block->objects == NULL)
6534 return;
6535
6536 /* Switch to the section and make sure that the first byte is
6537 suitably aligned. */
6538 switch_to_section (block->sect);
6539 assemble_align (block->alignment);
6540
6541 /* Define the values of all anchors relative to the current section
6542 position. */
6543 for (i = 0; VEC_iterate (rtx, block->anchors, i, symbol); i++)
6544 targetm.asm_out.output_anchor (symbol);
6545
6546 /* Output the objects themselves. */
6547 offset = 0;
6548 for (i = 0; VEC_iterate (rtx, block->objects, i, symbol); i++)
6549 {
6550 /* Move to the object's offset, padding with zeros if necessary. */
6551 assemble_zeros (SYMBOL_REF_BLOCK_OFFSET (symbol) - offset);
6552 offset = SYMBOL_REF_BLOCK_OFFSET (symbol);
6553 if (CONSTANT_POOL_ADDRESS_P (symbol))
6554 {
6555 desc = SYMBOL_REF_CONSTANT (symbol);
6556 output_constant_pool_1 (desc, 1);
6557 offset += GET_MODE_SIZE (desc->mode);
6558 }
6559 else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
6560 {
6561 decl = SYMBOL_REF_DECL (symbol);
6562 assemble_constant_contents (decl, XSTR (symbol, 0),
6563 get_constant_alignment (decl));
6564 offset += get_constant_size (decl);
6565 }
6566 else
6567 {
6568 decl = SYMBOL_REF_DECL (symbol);
6569 assemble_variable_contents (decl, XSTR (symbol, 0), false);
6570 offset += tree_low_cst (DECL_SIZE_UNIT (decl), 1);
6571 }
6572 }
6573}
6574
6575/* A htab_traverse callback used to call output_object_block for
6576 each member of object_block_htab. */
6577
6578static int
6579output_object_block_htab (void **slot, void *data ATTRIBUTE_UNUSED)
6580{
6581 output_object_block ((struct object_block *) (*slot));
6582 return 1;
6583}
6584
6585/* Output the definitions of all object_blocks. */
6586
6587void
6588output_object_blocks (void)
6589{
6590 htab_traverse (object_block_htab, output_object_block_htab, NULL);
6591}
6592
e0d9d0dd
NC
6593/* This function provides a possible implementation of the
6594 TARGET_ASM_RECORD_GCC_SWITCHES target hook for ELF targets. When triggered
6595 by -frecord-gcc-switches it creates a new mergeable, string section in the
6596 assembler output file called TARGET_ASM_RECORD_GCC_SWITCHES_SECTION which
6597 contains the switches in ASCII format.
6598
6599 FIXME: This code does not correctly handle double quote characters
6600 that appear inside strings, (it strips them rather than preserving them).
6601 FIXME: ASM_OUTPUT_ASCII, as defined in config/elfos.h will not emit NUL
6602 characters - instead it treats them as sub-string separators. Since
6603 we want to emit NUL strings terminators into the object file we have to use
6604 ASM_OUTPUT_SKIP. */
6605
6606int
6607elf_record_gcc_switches (print_switch_type type, const char * name)
6608{
6609 static char buffer[1024];
6610
6611 /* This variable is used as part of a simplistic heuristic to detect
6612 command line switches which take an argument:
6613
6614 "If a command line option does not start with a dash then
6615 it is an argument for the previous command line option."
6616
6617 This fails in the case of the command line option which is the name
6618 of the file to compile, but otherwise it is pretty reasonable. */
6619 static bool previous_name_held_back = FALSE;
6620
6621 switch (type)
6622 {
6623 case SWITCH_TYPE_PASSED:
6624 if (* name != '-')
6625 {
6626 if (previous_name_held_back)
6627 {
6628 unsigned int len = strlen (buffer);
6629
6630 snprintf (buffer + len, sizeof buffer - len, " %s", name);
6631 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6632 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6633 previous_name_held_back = FALSE;
6634 }
6635 else
6636 {
6637 strncpy (buffer, name, sizeof buffer);
6638 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6639 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6640 }
6641 }
6642 else
6643 {
6644 if (previous_name_held_back)
6645 {
6646 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6647 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6648 }
6649
6650 strncpy (buffer, name, sizeof buffer);
6651 previous_name_held_back = TRUE;
6652 }
6653 break;
6654
6655 case SWITCH_TYPE_DESCRIPTIVE:
6656 if (name == NULL)
6657 {
6658 /* Distinguish between invocations where name is NULL. */
6659 static bool started = false;
6660
6661 if (started)
6662 {
6663 if (previous_name_held_back)
6664 {
6665 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer));
86aa5312 6666 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1);
e0d9d0dd
NC
6667 }
6668 }
6669 else
6670 {
6671 section * sec;
6672
6673 sec = get_section (targetm.asm_out.record_gcc_switches_section,
6674 SECTION_DEBUG
6675 | SECTION_MERGE
6676 | SECTION_STRINGS
6677 | (SECTION_ENTSIZE & 1),
6678 NULL);
6679 switch_to_section (sec);
6680 started = true;
6681 }
6682 }
6683
6684 default:
6685 break;
6686 }
6687
6688 /* The return value is currently ignored by the caller, but must be 0.
6689 For -fverbose-asm the return value would be the number of characters
6690 emitted into the assembler file. */
6691 return 0;
6692}
6693
c47c29c8
L
6694/* Emit text to declare externally defined symbols. It is needed to
6695 properly support non-default visibility. */
6696void
6697default_elf_asm_output_external (FILE *file ATTRIBUTE_UNUSED,
6698 tree decl,
6699 const char *name ATTRIBUTE_UNUSED)
6700{
6701 /* We output the name if and only if TREE_SYMBOL_REFERENCED is
6702 set in order to avoid putting out names that are never really
6703 used. */
6704 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
6705 && targetm.binds_local_p (decl))
6706 maybe_assemble_visibility (decl);
6707}
6708
e2500fed 6709#include "gt-varasm.h"