OSDN Git Service

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