OSDN Git Service

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