OSDN Git Service

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