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