OSDN Git Service

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