Bring in a trimmed down gcc-3.4-20040618.
[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
2355 static tree
2356 copy_constant (tree exp)
2357 {
2358   switch (TREE_CODE (exp))
2359     {
2360     case ADDR_EXPR:
2361       /* For ADDR_EXPR, we do not want to copy the decl whose address
2362          is requested.  We do want to copy constants though.  */
2363       if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
2364         return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2365                        copy_constant (TREE_OPERAND (exp, 0)));
2366       else
2367         return copy_node (exp);
2368
2369     case INTEGER_CST:
2370     case REAL_CST:
2371     case STRING_CST:
2372       return copy_node (exp);
2373
2374     case COMPLEX_CST:
2375       return build_complex (TREE_TYPE (exp),
2376                             copy_constant (TREE_REALPART (exp)),
2377                             copy_constant (TREE_IMAGPART (exp)));
2378
2379     case PLUS_EXPR:
2380     case MINUS_EXPR:
2381       return build (TREE_CODE (exp), TREE_TYPE (exp),
2382                     copy_constant (TREE_OPERAND (exp, 0)),
2383                     copy_constant (TREE_OPERAND (exp, 1)));
2384
2385     case NOP_EXPR:
2386     case CONVERT_EXPR:
2387     case NON_LVALUE_EXPR:
2388     case VIEW_CONVERT_EXPR:
2389       return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2390                      copy_constant (TREE_OPERAND (exp, 0)));
2391
2392     case CONSTRUCTOR:
2393       {
2394         tree copy = copy_node (exp);
2395         tree list = copy_list (CONSTRUCTOR_ELTS (exp));
2396         tree tail;
2397
2398         CONSTRUCTOR_ELTS (copy) = list;
2399         for (tail = list; tail; tail = TREE_CHAIN (tail))
2400           TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
2401         if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2402           for (tail = list; tail; tail = TREE_CHAIN (tail))
2403             TREE_PURPOSE (tail) = copy_constant (TREE_PURPOSE (tail));
2404
2405         return copy;
2406       }
2407
2408     default:
2409       {
2410         tree t;
2411         t = (*lang_hooks.expand_constant) (exp);
2412         if (t != exp)
2413           return copy_constant (t);
2414         else
2415           abort ();
2416       }
2417     }
2418 }
2419 \f
2420 /* Subroutine of output_constant_def:
2421    No constant equal to EXP is known to have been output.
2422    Make a constant descriptor to enter EXP in the hash table.
2423    Assign the label number and construct RTL to refer to the
2424    constant's location in memory.
2425    Caller is responsible for updating the hash table.  */
2426
2427 static struct constant_descriptor_tree *
2428 build_constant_desc (tree exp)
2429 {
2430   rtx symbol;
2431   rtx rtl;
2432   char label[256];
2433   int labelno;
2434   struct constant_descriptor_tree *desc;
2435
2436   desc = ggc_alloc (sizeof (*desc));
2437   if (flag_writable_strings && TREE_CODE (exp) == STRING_CST)
2438     desc->value = exp;
2439   else
2440     desc->value = copy_constant (exp);
2441
2442   /* Create a string containing the label name, in LABEL.  */
2443   labelno = const_labelno++;
2444   ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
2445
2446   /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
2447   symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2448   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2449   SYMBOL_REF_DECL (symbol) = desc->value;
2450   TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2451
2452   rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
2453   set_mem_attributes (rtl, exp, 1);
2454   set_mem_alias_set (rtl, 0);
2455   set_mem_alias_set (rtl, const_alias_set);
2456
2457   /* Set flags or add text to the name to record information, such as
2458      that it is a local symbol.  If the name is changed, the macro
2459      ASM_OUTPUT_LABELREF will have to know how to strip this
2460      information.  This call might invalidate our local variable
2461      SYMBOL; we can't use it afterward.  */
2462
2463   (*targetm.encode_section_info) (exp, rtl, true);
2464
2465   desc->rtl = rtl;
2466
2467   return desc;
2468 }
2469
2470 /* Return an rtx representing a reference to constant data in memory
2471    for the constant expression EXP.
2472
2473    If assembler code for such a constant has already been output,
2474    return an rtx to refer to it.
2475    Otherwise, output such a constant in memory
2476    and generate an rtx for it.
2477
2478    If DEFER is nonzero, this constant can be deferred and output only
2479    if referenced in the function after all optimizations.
2480
2481    `const_desc_table' records which constants already have label strings.  */
2482
2483 rtx
2484 output_constant_def (tree exp, int defer)
2485 {
2486   struct constant_descriptor_tree *desc;
2487   struct constant_descriptor_tree key;
2488   void **loc;
2489
2490   /* Look up EXP in the table of constant descriptors.  If we didn't find
2491      it, create a new one.  */
2492   key.value = exp;
2493   loc = htab_find_slot (const_desc_htab, &key, INSERT);
2494
2495   desc = *loc;
2496   if (desc == 0)
2497     {
2498       desc = build_constant_desc (exp);
2499       *loc = desc;
2500     }
2501
2502   maybe_output_constant_def_contents (desc, defer);
2503   return desc->rtl;
2504 }
2505
2506 /* Subroutine of output_constant_def: Decide whether or not we need to
2507    output the constant DESC now, and if so, do it.  */
2508 static void
2509 maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
2510                                     int defer)
2511 {
2512   rtx symbol = XEXP (desc->rtl, 0);
2513   tree exp = desc->value;
2514
2515   if (flag_syntax_only)
2516     return;
2517
2518   if (TREE_ASM_WRITTEN (exp))
2519     /* Already output; don't do it again.  */
2520     return;
2521
2522   /* The only constants that cannot safely be deferred, assuming the
2523      context allows it, are strings under flag_writable_strings.  */
2524   if (defer && (TREE_CODE (exp) != STRING_CST || !flag_writable_strings))
2525     {
2526       /* Increment n_deferred_constants if it exists.  It needs to be at
2527          least as large as the number of constants actually referred to
2528          by the function.  If it's too small we'll stop looking too early
2529          and fail to emit constants; if it's too large we'll only look
2530          through the entire function when we could have stopped earlier.  */
2531       if (cfun)
2532         n_deferred_constants++;
2533       return;
2534     }
2535
2536   output_constant_def_contents (symbol);
2537 }
2538
2539 /* We must output the constant data referred to by SYMBOL; do so.  */
2540
2541 static void
2542 output_constant_def_contents (rtx symbol)
2543 {
2544   tree exp = SYMBOL_REF_DECL (symbol);
2545   const char *label = XSTR (symbol, 0);
2546   HOST_WIDE_INT size;
2547
2548   /* Make sure any other constants whose addresses appear in EXP
2549      are assigned label numbers.  */
2550   int reloc = compute_reloc_for_constant (exp);
2551
2552   /* Align the location counter as required by EXP's data type.  */
2553   int align = TYPE_ALIGN (TREE_TYPE (exp));
2554 #ifdef CONSTANT_ALIGNMENT
2555   align = CONSTANT_ALIGNMENT (exp, align);
2556 #endif
2557
2558   output_addressed_constants (exp);
2559
2560   /* We are no longer deferring this constant.  */
2561   TREE_ASM_WRITTEN (exp) = 1;
2562
2563   if (IN_NAMED_SECTION (exp))
2564     named_section (exp, NULL, reloc);
2565   else
2566     (*targetm.asm_out.select_section) (exp, reloc, align);
2567
2568   if (align > BITS_PER_UNIT)
2569     {
2570       ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2571     }
2572
2573   size = int_size_in_bytes (TREE_TYPE (exp));
2574   if (TREE_CODE (exp) == STRING_CST)
2575     size = MAX (TREE_STRING_LENGTH (exp), size);
2576
2577   /* Do any machine/system dependent processing of the constant.  */
2578 #ifdef ASM_DECLARE_CONSTANT_NAME
2579   ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
2580 #else
2581   /* Standard thing is just output label for the constant.  */
2582   ASM_OUTPUT_LABEL (asm_out_file, label);
2583 #endif /* ASM_DECLARE_CONSTANT_NAME */
2584
2585   /* Output the value of EXP.  */
2586   output_constant (exp, size, align);
2587 }
2588
2589 /* A constant which was deferred in its original location has been
2590    inserted by the RTL inliner into a different function.  The
2591    current function's deferred constant count must be incremented.  */
2592 void
2593 notice_rtl_inlining_of_deferred_constant (void)
2594 {
2595   n_deferred_constants++;
2596 }
2597
2598 /* Look up EXP in the table of constant descriptors.  Return the rtl
2599    if it has been emitted, else null.  */
2600
2601 rtx
2602 lookup_constant_def (tree exp)
2603 {
2604   struct constant_descriptor_tree *desc;
2605   struct constant_descriptor_tree key;
2606
2607   key.value = exp;
2608   desc = htab_find (const_desc_htab, &key);
2609
2610   return (desc ? desc->rtl : NULL_RTX);
2611 }
2612 \f
2613 /* Used in the hash tables to avoid outputting the same constant
2614    twice.  Unlike 'struct constant_descriptor_tree', RTX constants
2615    are output once per function, not once per file; there seems
2616    to be no reason for the difference.  */
2617
2618 struct constant_descriptor_rtx GTY(())
2619 {
2620   /* More constant_descriptors with the same hash code.  */
2621   struct constant_descriptor_rtx *next;
2622
2623   /* A MEM for the constant.  */
2624   rtx rtl;
2625
2626   /* The value of the constant.  */
2627   struct rtx_const value;
2628 };
2629
2630 /* Structure to represent sufficient information about a constant so that
2631    it can be output when the constant pool is output, so that function
2632    integration can be done, and to simplify handling on machines that reference
2633    constant pool as base+displacement.  */
2634
2635 struct pool_constant GTY(())
2636 {
2637   struct constant_descriptor_rtx *desc;
2638   struct pool_constant *next;
2639   struct pool_constant *next_sym;
2640   rtx constant;
2641   enum machine_mode mode;
2642   int labelno;
2643   unsigned int align;
2644   HOST_WIDE_INT offset;
2645   int mark;
2646 };
2647
2648 /* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
2649    The argument is XSTR (... , 0)  */
2650
2651 #define SYMHASH(LABEL)  (((unsigned long) (LABEL)) % MAX_RTX_HASH_TABLE)
2652 \f
2653 /* Initialize constant pool hashing for a new function.  */
2654
2655 void
2656 init_varasm_status (struct function *f)
2657 {
2658   struct varasm_status *p;
2659   p = ggc_alloc (sizeof (struct varasm_status));
2660   f->varasm = p;
2661   p->x_const_rtx_hash_table
2662     = ggc_alloc_cleared (MAX_RTX_HASH_TABLE
2663                          * sizeof (struct constant_descriptor_rtx *));
2664   p->x_const_rtx_sym_hash_table
2665     = ggc_alloc_cleared (MAX_RTX_HASH_TABLE
2666                          * sizeof (struct pool_constant *));
2667
2668   p->x_first_pool = p->x_last_pool = 0;
2669   p->x_pool_offset = 0;
2670   p->deferred_constants = 0;
2671 }
2672 \f
2673
2674 /* Express an rtx for a constant integer (perhaps symbolic)
2675    as the sum of a symbol or label plus an explicit integer.
2676    They are stored into VALUE.  */
2677
2678 static void
2679 decode_rtx_const (enum machine_mode mode, rtx x, struct rtx_const *value)
2680 {
2681   /* Clear the whole structure, including any gaps.  */
2682   memset (value, 0, sizeof (struct rtx_const));
2683
2684   value->kind = RTX_INT;        /* Most usual kind.  */
2685   value->mode = mode;
2686
2687   switch (GET_CODE (x))
2688     {
2689     case CONST_DOUBLE:
2690       value->kind = RTX_DOUBLE;
2691       if (GET_MODE (x) != VOIDmode)
2692         {
2693           const REAL_VALUE_TYPE *r = CONST_DOUBLE_REAL_VALUE (x);
2694
2695           value->mode = GET_MODE (x);
2696
2697           /* Copy the REAL_VALUE_TYPE by members so that we don't
2698              copy garbage from the original structure into our
2699              carefully cleaned hashing structure.  */
2700           value->un.du.class = r->class;
2701           value->un.du.sign = r->sign;
2702           switch (r->class)
2703             {
2704             case rvc_zero:
2705             case rvc_inf:
2706               break;
2707             case rvc_normal:
2708               value->un.du.exp = r->exp;
2709               /* Fall through.  */
2710             case rvc_nan:
2711               memcpy (value->un.du.sig, r->sig, sizeof (r->sig));
2712               break;
2713             default:
2714               abort ();
2715             }
2716         }
2717       else
2718         {
2719           value->un.di.low = CONST_DOUBLE_LOW (x);
2720           value->un.di.high = CONST_DOUBLE_HIGH (x);
2721         }
2722       break;
2723
2724     case CONST_VECTOR:
2725       {
2726         int units, i;
2727
2728         units = CONST_VECTOR_NUNITS (x);
2729         value->kind = RTX_VECTOR;
2730         value->mode = mode;
2731
2732         if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
2733           {
2734             for (i = 0; i < units; ++i)
2735               {
2736                 rtx elt = CONST_VECTOR_ELT (x, i);
2737                 if (GET_CODE (elt) == CONST_INT)
2738                   {
2739                     value->un.int_vec[i].low = INTVAL (elt);
2740                     value->un.int_vec[i].high = 0;
2741                   }
2742                 else
2743                   {
2744                     value->un.int_vec[i].low = CONST_DOUBLE_LOW (elt);
2745                     value->un.int_vec[i].high = CONST_DOUBLE_HIGH (elt);
2746                   }
2747               }
2748           }
2749         else if (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
2750           {
2751             for (i = 0; i < units; ++i)
2752               {
2753                 const REAL_VALUE_TYPE *r
2754                   = CONST_DOUBLE_REAL_VALUE (CONST_VECTOR_ELT (x, i));
2755                 REAL_VALUE_TYPE *d = &value->un.fp_vec[i];
2756
2757                 /* Copy the REAL_VALUE_TYPE by members so that we don't
2758                    copy garbage from the original structure into our
2759                    carefully cleaned hashing structure.  */
2760                 d->class = r->class;
2761                 d->sign = r->sign;
2762                 switch (r->class)
2763                   {
2764                   case rvc_zero:
2765                   case rvc_inf:
2766                     break;
2767                   case rvc_normal:
2768                     d->exp = r->exp;
2769                     /* Fall through.  */
2770                   case rvc_nan:
2771                     memcpy (d->sig, r->sig, sizeof (r->sig));
2772                     break;
2773                   default:
2774                     abort ();
2775                   }
2776               }
2777           }
2778         else
2779           abort ();
2780       }
2781       break;
2782
2783     case CONST_INT:
2784       value->un.addr.offset = INTVAL (x);
2785       break;
2786
2787     case SYMBOL_REF:
2788     case LABEL_REF:
2789     case PC:
2790       value->un.addr.base = x;
2791       break;
2792
2793     case CONST:
2794       x = XEXP (x, 0);
2795       if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
2796         {
2797           value->un.addr.base = XEXP (x, 0);
2798           value->un.addr.offset = INTVAL (XEXP (x, 1));
2799         }
2800       else if (GET_CODE (x) == MINUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
2801         {
2802           value->un.addr.base = XEXP (x, 0);
2803           value->un.addr.offset = - INTVAL (XEXP (x, 1));
2804         }
2805       else
2806         {
2807           value->un.addr.base = x;
2808           value->un.addr.offset = 0;
2809         }
2810       break;
2811
2812     default:
2813       value->kind = RTX_UNKNOWN;
2814       break;
2815     }
2816
2817   if (value->kind == RTX_INT && value->un.addr.base != 0
2818       && GET_CODE (value->un.addr.base) == UNSPEC)
2819     {
2820       /* For a simple UNSPEC, the base is set to the
2821          operand, the kind field is set to the index of
2822          the unspec expression.
2823          Together with the code below, in case that
2824          the operand is a SYMBOL_REF or LABEL_REF,
2825          the address of the string or the code_label
2826          is taken as base.  */
2827       if (XVECLEN (value->un.addr.base, 0) == 1)
2828         {
2829           value->kind = RTX_UNSPEC + XINT (value->un.addr.base, 1);
2830           value->un.addr.base = XVECEXP (value->un.addr.base, 0, 0);
2831         }
2832     }
2833
2834   if (value->kind >= RTX_INT && value->un.addr.base != 0)
2835     switch (GET_CODE (value->un.addr.base))
2836       {
2837       case SYMBOL_REF:
2838         /* Use the string's address, not the SYMBOL_REF's address,
2839            for the sake of addresses of library routines.  */
2840         value->un.addr.symbol = XSTR (value->un.addr.base, 0);
2841         value->un.addr.base = NULL_RTX;
2842         break;
2843
2844       case LABEL_REF:
2845         /* For a LABEL_REF, compare labels.  */
2846         value->un.addr.base = XEXP (value->un.addr.base, 0);
2847
2848       default:
2849         break;
2850       }
2851 }
2852
2853 /* Given a MINUS expression, simplify it if both sides
2854    include the same symbol.  */
2855
2856 rtx
2857 simplify_subtraction (rtx x)
2858 {
2859   struct rtx_const val0, val1;
2860
2861   decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
2862   decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
2863
2864   if (val0.kind >= RTX_INT
2865       && val0.kind == val1.kind
2866       && val0.un.addr.base == val1.un.addr.base
2867       && val0.un.addr.symbol == val1.un.addr.symbol)
2868     return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
2869
2870   return x;
2871 }
2872
2873 /* Compute a hash code for a constant RTL expression.  */
2874
2875 static unsigned int
2876 const_hash_rtx (enum machine_mode mode, rtx x)
2877 {
2878   union {
2879     struct rtx_const value;
2880     unsigned int data[sizeof(struct rtx_const) / sizeof (unsigned int)];
2881   } u;
2882
2883   unsigned int hi;
2884   size_t i;
2885
2886   decode_rtx_const (mode, x, &u.value);
2887
2888   /* Compute hashing function.  */
2889   hi = 0;
2890   for (i = 0; i < ARRAY_SIZE (u.data); i++)
2891     hi = hi * 613 + u.data[i];
2892
2893   return hi % MAX_RTX_HASH_TABLE;
2894 }
2895
2896 /* Compare a constant rtl object X with a constant-descriptor DESC.
2897    Return 1 if DESC describes a constant with the same value as X.  */
2898
2899 static int
2900 compare_constant_rtx (enum machine_mode mode, rtx x,
2901                       struct constant_descriptor_rtx *desc)
2902 {
2903   struct rtx_const value;
2904
2905   decode_rtx_const (mode, x, &value);
2906
2907   /* Compare constant contents.  */
2908   return memcmp (&value, &desc->value, sizeof (struct rtx_const)) == 0;
2909 }
2910
2911 /* Construct a constant descriptor for the rtl-expression X.
2912    It is up to the caller to enter the descriptor in the hash table.  */
2913
2914 static struct constant_descriptor_rtx *
2915 record_constant_rtx (enum machine_mode mode, rtx x)
2916 {
2917   struct constant_descriptor_rtx *ptr;
2918
2919   ptr = ggc_alloc (sizeof (*ptr));
2920   decode_rtx_const (mode, x, &ptr->value);
2921
2922   return ptr;
2923 }
2924 \f
2925 /* Given a constant rtx X, make (or find) a memory constant for its value
2926    and return a MEM rtx to refer to it in memory.  */
2927
2928 rtx
2929 force_const_mem (enum machine_mode mode, rtx x)
2930 {
2931   int hash;
2932   struct constant_descriptor_rtx *desc;
2933   char label[256];
2934   rtx def, symbol;
2935   struct pool_constant *pool;
2936   unsigned int align;
2937
2938   /* If we're not allowed to drop X into the constant pool, don't.  */
2939   if ((*targetm.cannot_force_const_mem) (x))
2940     return NULL_RTX;
2941
2942   /* Compute hash code of X.  Search the descriptors for that hash code
2943      to see if any of them describes X.  If yes, we have an rtx to use.  */
2944   hash = const_hash_rtx (mode, x);
2945   for (desc = const_rtx_hash_table[hash]; desc; desc = desc->next)
2946     if (compare_constant_rtx (mode, x, desc))
2947       return copy_rtx (desc->rtl);
2948
2949   /* No constant equal to X is known to have been output.
2950      Make a constant descriptor to enter X in the hash table
2951      and make a MEM for it.  */
2952   desc = record_constant_rtx (mode, x);
2953   desc->next = const_rtx_hash_table[hash];
2954   const_rtx_hash_table[hash] = desc;
2955
2956   /* Align the location counter as required by EXP's data type.  */
2957   align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
2958 #ifdef CONSTANT_ALIGNMENT
2959   {
2960     tree type = (*lang_hooks.types.type_for_mode) (mode, 0);
2961     if (type != NULL_TREE)
2962       align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
2963   }
2964 #endif
2965
2966   pool_offset += (align / BITS_PER_UNIT) - 1;
2967   pool_offset &= ~ ((align / BITS_PER_UNIT) - 1);
2968
2969   if (GET_CODE (x) == LABEL_REF)
2970     LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
2971
2972   /* Allocate a pool constant descriptor, fill it in, and chain it in.  */
2973   pool = ggc_alloc (sizeof (struct pool_constant));
2974   pool->desc = desc;
2975   pool->constant = x;
2976   pool->mode = mode;
2977   pool->labelno = const_labelno;
2978   pool->align = align;
2979   pool->offset = pool_offset;
2980   pool->mark = 1;
2981   pool->next = 0;
2982
2983   if (last_pool == 0)
2984     first_pool = pool;
2985   else
2986     last_pool->next = pool;
2987
2988   last_pool = pool;
2989   pool_offset += GET_MODE_SIZE (mode);
2990
2991   /* Create a string containing the label name, in LABEL.  */
2992   ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2993
2994   ++const_labelno;
2995
2996   /* Construct the SYMBOL_REF and the MEM.  */
2997
2998   symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2999   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
3000
3001   pool->desc->rtl = def = gen_rtx_MEM (mode, symbol);
3002   set_mem_attributes (def, (*lang_hooks.types.type_for_mode) (mode, 0), 1);
3003   RTX_UNCHANGING_P (def) = 1;
3004
3005   /* Add label to symbol hash table.  */
3006   hash = SYMHASH (XSTR (symbol, 0));
3007   pool->next_sym = const_rtx_sym_hash_table[hash];
3008   const_rtx_sym_hash_table[hash] = pool;
3009
3010   /* Mark the symbol_ref as belonging to this constants pool.  */
3011   CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3012   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
3013   current_function_uses_const_pool = 1;
3014
3015   return copy_rtx (def);
3016 }
3017 \f
3018 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3019    the corresponding pool_constant structure.  */
3020
3021 static struct pool_constant *
3022 find_pool_constant (struct function *f, rtx addr)
3023 {
3024   struct pool_constant *pool;
3025   const char *label = XSTR (addr, 0);
3026
3027   for (pool = f->varasm->x_const_rtx_sym_hash_table[SYMHASH (label)]; pool;
3028        pool = pool->next_sym)
3029     if (XSTR (XEXP (pool->desc->rtl, 0), 0) == label)
3030       return pool;
3031
3032   abort ();
3033 }
3034
3035 /* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
3036
3037 rtx
3038 get_pool_constant (rtx addr)
3039 {
3040   return (find_pool_constant (cfun, addr))->constant;
3041 }
3042
3043 /* Given a constant pool SYMBOL_REF, return the corresponding constant
3044    and whether it has been output or not.  */
3045
3046 rtx
3047 get_pool_constant_mark (rtx addr, bool *pmarked)
3048 {
3049   struct pool_constant *pool = find_pool_constant (cfun, addr);
3050   *pmarked = (pool->mark != 0);
3051   return pool->constant;
3052 }
3053
3054 /* Likewise, but for the constant pool of a specific function.  */
3055
3056 rtx
3057 get_pool_constant_for_function (struct function *f, rtx addr)
3058 {
3059   return (find_pool_constant (f, addr))->constant;
3060 }
3061
3062 /* Similar, return the mode.  */
3063
3064 enum machine_mode
3065 get_pool_mode (rtx addr)
3066 {
3067   return (find_pool_constant (cfun, addr))->mode;
3068 }
3069
3070 enum machine_mode
3071 get_pool_mode_for_function (struct function *f, rtx addr)
3072 {
3073   return (find_pool_constant (f, addr))->mode;
3074 }
3075
3076 /* Similar, return the offset in the constant pool.  */
3077
3078 int
3079 get_pool_offset (rtx addr)
3080 {
3081   return (find_pool_constant (cfun, addr))->offset;
3082 }
3083
3084 /* Return the size of the constant pool.  */
3085
3086 int
3087 get_pool_size (void)
3088 {
3089   return pool_offset;
3090 }
3091 \f
3092 /* Write all the constants in the constant pool.  */
3093
3094 void
3095 output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3096                       tree fndecl ATTRIBUTE_UNUSED)
3097 {
3098   struct pool_constant *pool;
3099   rtx x;
3100   REAL_VALUE_TYPE r;
3101
3102   /* It is possible for gcc to call force_const_mem and then to later
3103      discard the instructions which refer to the constant.  In such a
3104      case we do not need to output the constant.  */
3105   mark_constant_pool ();
3106
3107 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3108   ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
3109 #endif
3110
3111   for (pool = first_pool; pool; pool = pool->next)
3112     {
3113       rtx tmp;
3114
3115       x = pool->constant;
3116
3117       if (! pool->mark)
3118         continue;
3119
3120       /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3121          whose CODE_LABEL has been deleted.  This can occur if a jump table
3122          is eliminated by optimization.  If so, write a constant of zero
3123          instead.  Note that this can also happen by turning the
3124          CODE_LABEL into a NOTE.  */
3125       /* ??? This seems completely and utterly wrong.  Certainly it's
3126          not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3127          functioning even with INSN_DELETED_P and friends.  */
3128
3129       tmp = x;
3130       switch (GET_CODE (x))
3131         {
3132         case CONST:
3133           if (GET_CODE (XEXP (x, 0)) != PLUS
3134               || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3135             break;
3136           tmp = XEXP (XEXP (x, 0), 0);
3137           /* Fall through.  */
3138
3139         case LABEL_REF:
3140           tmp = XEXP (x, 0);
3141           if (INSN_DELETED_P (tmp)
3142               || (GET_CODE (tmp) == NOTE
3143                   && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_DELETED))
3144             {
3145               abort ();
3146               x = const0_rtx;
3147             }
3148           break;
3149
3150         default:
3151           break;
3152         }
3153
3154       /* First switch to correct section.  */
3155       (*targetm.asm_out.select_rtx_section) (pool->mode, x, pool->align);
3156
3157 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3158       ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
3159                                      pool->align, pool->labelno, done);
3160 #endif
3161
3162       assemble_align (pool->align);
3163
3164       /* Output the label.  */
3165       (*targetm.asm_out.internal_label) (asm_out_file, "LC", pool->labelno);
3166
3167       /* Output the value of the constant itself.  */
3168       switch (GET_MODE_CLASS (pool->mode))
3169         {
3170         case MODE_FLOAT:
3171           if (GET_CODE (x) != CONST_DOUBLE)
3172             abort ();
3173
3174           REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3175           assemble_real (r, pool->mode, pool->align);
3176           break;
3177
3178         case MODE_INT:
3179         case MODE_PARTIAL_INT:
3180           assemble_integer (x, GET_MODE_SIZE (pool->mode), pool->align, 1);
3181           break;
3182
3183         case MODE_VECTOR_FLOAT:
3184           {
3185             int i, units;
3186             rtx elt;
3187
3188             if (GET_CODE (x) != CONST_VECTOR)
3189               abort ();
3190
3191             units = CONST_VECTOR_NUNITS (x);
3192
3193             for (i = 0; i < units; i++)
3194               {
3195                 elt = CONST_VECTOR_ELT (x, i);
3196                 REAL_VALUE_FROM_CONST_DOUBLE (r, elt);
3197                 assemble_real (r, GET_MODE_INNER (pool->mode), pool->align);
3198               }
3199           }
3200           break;
3201
3202         case MODE_VECTOR_INT:
3203           {
3204             int i, units;
3205             rtx elt;
3206
3207             if (GET_CODE (x) != CONST_VECTOR)
3208               abort ();
3209
3210             units = CONST_VECTOR_NUNITS (x);
3211
3212             for (i = 0; i < units; i++)
3213               {
3214                 elt = CONST_VECTOR_ELT (x, i);
3215                 assemble_integer (elt, GET_MODE_UNIT_SIZE (pool->mode),
3216                                   pool->align, 1);
3217               }
3218           }
3219           break;
3220
3221         default:
3222           abort ();
3223         }
3224
3225       /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3226          sections have proper size.  */
3227       if (pool->align > GET_MODE_BITSIZE (pool->mode)
3228           && in_section == in_named
3229           && get_named_section_flags (in_named_name) & SECTION_MERGE)
3230         assemble_align (pool->align);
3231
3232 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3233     done: ;
3234 #endif
3235     }
3236
3237 #ifdef ASM_OUTPUT_POOL_EPILOGUE
3238   ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool_offset);
3239 #endif
3240
3241   /* Done with this pool.  */
3242   first_pool = last_pool = 0;
3243 }
3244
3245 /* Look through the instructions for this function, and mark all the
3246    entries in the constant pool which are actually being used.  Emit
3247    deferred constants which have indeed been used.  */
3248
3249 static void
3250 mark_constant_pool (void)
3251 {
3252   rtx insn;
3253   rtx link;
3254   struct pool_constant *pool;
3255
3256   if (first_pool == 0 && n_deferred_constants == 0)
3257     return;
3258
3259   for (pool = first_pool; pool; pool = pool->next)
3260     pool->mark = 0;
3261
3262   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3263     if (INSN_P (insn))
3264       mark_constants (PATTERN (insn));
3265
3266   for (link = current_function_epilogue_delay_list;
3267        link;
3268        link = XEXP (link, 1))
3269     {
3270       insn = XEXP (link, 0);
3271
3272       if (INSN_P (insn))
3273         mark_constants (PATTERN (insn));
3274     }
3275 }
3276
3277 /* Look through appropriate parts of X, marking all entries in the
3278    constant pool which are actually being used.  Entries that are only
3279    referenced by other constants are also marked as used.  Emit
3280    deferred strings that are used.  */
3281
3282 static void
3283 mark_constants (rtx x)
3284 {
3285   int i;
3286   const char *format_ptr;
3287
3288   if (x == 0)
3289     return;
3290
3291   if (GET_CODE (x) == SYMBOL_REF)
3292     {
3293       mark_constant (&x, NULL);
3294       return;
3295     }
3296
3297   /* Insns may appear inside a SEQUENCE.  Only check the patterns of
3298      insns, not any notes that may be attached.  We don't want to mark
3299      a constant just because it happens to appear in a REG_EQUIV note.  */
3300   if (INSN_P (x))
3301     {
3302       mark_constants (PATTERN (x));
3303       return;
3304     }
3305
3306   format_ptr = GET_RTX_FORMAT (GET_CODE (x));
3307
3308   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
3309     {
3310       switch (*format_ptr++)
3311         {
3312         case 'e':
3313           mark_constants (XEXP (x, i));
3314           break;
3315
3316         case 'E':
3317           if (XVEC (x, i) != 0)
3318             {
3319               int j;
3320
3321               for (j = 0; j < XVECLEN (x, i); j++)
3322                 mark_constants (XVECEXP (x, i, j));
3323             }
3324           break;
3325
3326         case 'S':
3327         case 's':
3328         case '0':
3329         case 'i':
3330         case 'w':
3331         case 'n':
3332         case 'u':
3333         case 'B':
3334           break;
3335
3336         default:
3337           abort ();
3338         }
3339     }
3340 }
3341
3342 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3343    to as used.  Emit referenced deferred strings.  This function can
3344    be used with for_each_rtx to mark all SYMBOL_REFs in an rtx.  */
3345
3346 static int
3347 mark_constant (rtx *current_rtx, void *data ATTRIBUTE_UNUSED)
3348 {
3349   rtx x = *current_rtx;
3350
3351   if (x == NULL_RTX)
3352     return 0;
3353
3354   else if (GET_CODE (x) == SYMBOL_REF)
3355     {
3356       if (CONSTANT_POOL_ADDRESS_P (x))
3357         {
3358           struct pool_constant *pool = find_pool_constant (cfun, x);
3359           if (pool->mark == 0)
3360             {
3361               pool->mark = 1;
3362               for_each_rtx (&(pool->constant), &mark_constant, NULL);
3363             }
3364           else
3365             return -1;
3366         }
3367       else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3368         {
3369           tree exp = SYMBOL_REF_DECL (x);
3370           if (!TREE_ASM_WRITTEN (exp))
3371             {
3372               n_deferred_constants--;
3373               output_constant_def_contents (x);
3374             }
3375         }
3376     }
3377   return 0;
3378 }
3379 \f
3380 /* Determine what kind of relocations EXP may need.  */
3381
3382 int
3383 compute_reloc_for_constant (tree exp)
3384 {
3385   int reloc = 0, reloc2;
3386   tree tem;
3387
3388   /* Give the front-end a chance to convert VALUE to something that
3389      looks more like a constant to the back-end.  */
3390   exp = (*lang_hooks.expand_constant) (exp);
3391
3392   switch (TREE_CODE (exp))
3393     {
3394     case ADDR_EXPR:
3395     case FDESC_EXPR:
3396       /* Go inside any operations that get_inner_reference can handle and see
3397          if what's inside is a constant: no need to do anything here for
3398          addresses of variables or functions.  */
3399       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3400            tem = TREE_OPERAND (tem, 0))
3401         ;
3402
3403       if (TREE_PUBLIC (tem))
3404         reloc |= 2;
3405       else
3406         reloc |= 1;
3407       break;
3408
3409     case PLUS_EXPR:
3410       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3411       reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3412       break;
3413
3414     case MINUS_EXPR:
3415       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3416       reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3417       /* The difference of two local labels is computable at link time.  */
3418       if (reloc == 1 && reloc2 == 1)
3419         reloc = 0;
3420       else
3421         reloc |= reloc2;
3422       break;
3423
3424     case NOP_EXPR:
3425     case CONVERT_EXPR:
3426     case NON_LVALUE_EXPR:
3427       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3428       break;
3429
3430     case CONSTRUCTOR:
3431       for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3432         if (TREE_VALUE (tem) != 0)
3433           reloc |= compute_reloc_for_constant (TREE_VALUE (tem));
3434
3435       break;
3436
3437     default:
3438       break;
3439     }
3440   return reloc;
3441 }
3442
3443 /* Find all the constants whose addresses are referenced inside of EXP,
3444    and make sure assembler code with a label has been output for each one.
3445    Indicate whether an ADDR_EXPR has been encountered.  */
3446
3447 static void
3448 output_addressed_constants (tree exp)
3449 {
3450   tree tem;
3451
3452   /* Give the front-end a chance to convert VALUE to something that
3453      looks more like a constant to the back-end.  */
3454   exp = (*lang_hooks.expand_constant) (exp);
3455
3456   switch (TREE_CODE (exp))
3457     {
3458     case ADDR_EXPR:
3459     case FDESC_EXPR:
3460       /* Go inside any operations that get_inner_reference can handle and see
3461          if what's inside is a constant: no need to do anything here for
3462          addresses of variables or functions.  */
3463       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3464            tem = TREE_OPERAND (tem, 0))
3465         ;
3466
3467       if (TREE_CODE_CLASS (TREE_CODE (tem)) == 'c'
3468           || TREE_CODE (tem) == CONSTRUCTOR)
3469         output_constant_def (tem, 0);
3470       break;
3471
3472     case PLUS_EXPR:
3473     case MINUS_EXPR:
3474       output_addressed_constants (TREE_OPERAND (exp, 1));
3475       /* Fall through.  */
3476
3477     case NOP_EXPR:
3478     case CONVERT_EXPR:
3479     case NON_LVALUE_EXPR:
3480       output_addressed_constants (TREE_OPERAND (exp, 0));
3481       break;
3482
3483     case CONSTRUCTOR:
3484       for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3485         if (TREE_VALUE (tem) != 0)
3486           output_addressed_constants (TREE_VALUE (tem));
3487
3488       break;
3489
3490     default:
3491       break;
3492     }
3493 }
3494 \f
3495 /* Return nonzero if VALUE is a valid constant-valued expression
3496    for use in initializing a static variable; one that can be an
3497    element of a "constant" initializer.
3498
3499    Return null_pointer_node if the value is absolute;
3500    if it is relocatable, return the variable that determines the relocation.
3501    We assume that VALUE has been folded as much as possible;
3502    therefore, we do not need to check for such things as
3503    arithmetic-combinations of integers.  */
3504
3505 tree
3506 initializer_constant_valid_p (tree value, tree endtype)
3507 {
3508   /* Give the front-end a chance to convert VALUE to something that
3509      looks more like a constant to the back-end.  */
3510   value = (*lang_hooks.expand_constant) (value);
3511
3512   switch (TREE_CODE (value))
3513     {
3514     case CONSTRUCTOR:
3515       if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3516            || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3517           && TREE_CONSTANT (value)
3518           && CONSTRUCTOR_ELTS (value))
3519         {
3520           tree elt;
3521           bool absolute = true;
3522
3523           for (elt = CONSTRUCTOR_ELTS (value); elt; elt = TREE_CHAIN (elt))
3524             {
3525               tree reloc;
3526               value = TREE_VALUE (elt);
3527               reloc = initializer_constant_valid_p (value, TREE_TYPE (value));
3528               if (!reloc)
3529                 return NULL_TREE;
3530               if (reloc != null_pointer_node)
3531                 absolute = false;
3532             }
3533           /* For a non-absolute relocation, there is no single
3534              variable that can be "the variable that determines the
3535              relocation."  */
3536           return absolute ? null_pointer_node : error_mark_node;
3537         }
3538
3539       return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
3540
3541     case INTEGER_CST:
3542     case VECTOR_CST:
3543     case REAL_CST:
3544     case STRING_CST:
3545     case COMPLEX_CST:
3546       return null_pointer_node;
3547
3548     case ADDR_EXPR:
3549     case FDESC_EXPR:
3550       return staticp (TREE_OPERAND (value, 0)) ? TREE_OPERAND (value, 0) : 0;
3551
3552     case VIEW_CONVERT_EXPR:
3553     case NON_LVALUE_EXPR:
3554       return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3555
3556     case CONVERT_EXPR:
3557     case NOP_EXPR:
3558       /* Allow conversions between pointer types.  */
3559       if (POINTER_TYPE_P (TREE_TYPE (value))
3560           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3561         return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3562
3563       /* Allow conversions between real types.  */
3564       if (FLOAT_TYPE_P (TREE_TYPE (value))
3565           && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3566         return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3567
3568       /* Allow length-preserving conversions between integer types.  */
3569       if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3570           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3571           && (TYPE_PRECISION (TREE_TYPE (value))
3572               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3573         return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3574
3575       /* Allow conversions between other integer types only if
3576          explicit value.  */
3577       if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3578           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3579         {
3580           tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3581                                                      endtype);
3582           if (inner == null_pointer_node)
3583             return null_pointer_node;
3584           break;
3585         }
3586
3587       /* Allow (int) &foo provided int is as wide as a pointer.  */
3588       if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3589           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3590           && (TYPE_PRECISION (TREE_TYPE (value))
3591               >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3592         return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3593                                              endtype);
3594
3595       /* Likewise conversions from int to pointers, but also allow
3596          conversions from 0.  */
3597       if ((POINTER_TYPE_P (TREE_TYPE (value))
3598            || TREE_CODE (TREE_TYPE (value)) == OFFSET_TYPE)
3599           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3600         {
3601           if (integer_zerop (TREE_OPERAND (value, 0)))
3602             return null_pointer_node;
3603           else if (TYPE_PRECISION (TREE_TYPE (value))
3604                    <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
3605             return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3606                                                  endtype);
3607         }
3608
3609       /* Allow conversions to struct or union types if the value
3610          inside is okay.  */
3611       if (TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE
3612           || TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
3613         return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3614                                              endtype);
3615       break;
3616
3617     case PLUS_EXPR:
3618       if (! INTEGRAL_TYPE_P (endtype)
3619           || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3620         {
3621           tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3622                                                       endtype);
3623           tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3624                                                       endtype);
3625           /* If either term is absolute, use the other terms relocation.  */
3626           if (valid0 == null_pointer_node)
3627             return valid1;
3628           if (valid1 == null_pointer_node)
3629             return valid0;
3630         }
3631       break;
3632
3633     case MINUS_EXPR:
3634       if (! INTEGRAL_TYPE_P (endtype)
3635           || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3636         {
3637           tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3638                                                       endtype);
3639           tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3640                                                       endtype);
3641           /* Win if second argument is absolute.  */
3642           if (valid1 == null_pointer_node)
3643             return valid0;
3644           /* Win if both arguments have the same relocation.
3645              Then the value is absolute.  */
3646           if (valid0 == valid1 && valid0 != 0)
3647             return null_pointer_node;
3648
3649           /* Since GCC guarantees that string constants are unique in the
3650              generated code, a subtraction between two copies of the same
3651              constant string is absolute.  */
3652           if (valid0 && TREE_CODE (valid0) == STRING_CST &&
3653               valid1 && TREE_CODE (valid1) == STRING_CST &&
3654               TREE_STRING_POINTER (valid0) == TREE_STRING_POINTER (valid1))
3655             return null_pointer_node;
3656         }
3657
3658       /* Support differences between labels.  */
3659       if (INTEGRAL_TYPE_P (endtype))
3660         {
3661           tree op0, op1;
3662           op0 = TREE_OPERAND (value, 0);
3663           op1 = TREE_OPERAND (value, 1);
3664
3665           /* Like STRIP_NOPS except allow the operand mode to widen.
3666              This works around a feature of fold that simplifies
3667              (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3668              that the narrower operation is cheaper.  */
3669
3670           while (TREE_CODE (op0) == NOP_EXPR
3671                  || TREE_CODE (op0) == CONVERT_EXPR
3672                  || TREE_CODE (op0) == NON_LVALUE_EXPR)
3673             {
3674               tree inner = TREE_OPERAND (op0, 0);
3675               if (inner == error_mark_node
3676                   || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3677                   || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
3678                       > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3679                 break;
3680               op0 = inner;
3681             }
3682
3683           while (TREE_CODE (op1) == NOP_EXPR
3684                  || TREE_CODE (op1) == CONVERT_EXPR
3685                  || TREE_CODE (op1) == NON_LVALUE_EXPR)
3686             {
3687               tree inner = TREE_OPERAND (op1, 0);
3688               if (inner == error_mark_node
3689                   || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3690                   || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
3691                       > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3692                 break;
3693               op1 = inner;
3694             }
3695
3696           if (TREE_CODE (op0) == ADDR_EXPR
3697               && TREE_CODE (TREE_OPERAND (op0, 0)) == LABEL_DECL
3698               && TREE_CODE (op1) == ADDR_EXPR
3699               && TREE_CODE (TREE_OPERAND (op1, 0)) == LABEL_DECL)
3700             return null_pointer_node;
3701         }
3702       break;
3703
3704     default:
3705       break;
3706     }
3707
3708   return 0;
3709 }
3710 \f
3711 /* Output assembler code for constant EXP to FILE, with no label.
3712    This includes the pseudo-op such as ".int" or ".byte", and a newline.
3713    Assumes output_addressed_constants has been done on EXP already.
3714
3715    Generate exactly SIZE bytes of assembler data, padding at the end
3716    with zeros if necessary.  SIZE must always be specified.
3717
3718    SIZE is important for structure constructors,
3719    since trailing members may have been omitted from the constructor.
3720    It is also important for initialization of arrays from string constants
3721    since the full length of the string constant might not be wanted.
3722    It is also needed for initialization of unions, where the initializer's
3723    type is just one member, and that may not be as long as the union.
3724
3725    There a case in which we would fail to output exactly SIZE bytes:
3726    for a structure constructor that wants to produce more than SIZE bytes.
3727    But such constructors will never be generated for any possible input.
3728
3729    ALIGN is the alignment of the data in bits.  */
3730
3731 void
3732 output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
3733 {
3734   enum tree_code code;
3735   unsigned HOST_WIDE_INT thissize;
3736
3737   /* Some front-ends use constants other than the standard language-independent
3738      varieties, but which may still be output directly.  Give the front-end a
3739      chance to convert EXP to a language-independent representation.  */
3740   exp = (*lang_hooks.expand_constant) (exp);
3741
3742   if (size == 0 || flag_syntax_only)
3743     return;
3744
3745   /* Eliminate any conversions since we'll be outputting the underlying
3746      constant.  */
3747   while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3748          || TREE_CODE (exp) == NON_LVALUE_EXPR
3749          || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
3750     exp = TREE_OPERAND (exp, 0);
3751
3752   code = TREE_CODE (TREE_TYPE (exp));
3753   thissize = int_size_in_bytes (TREE_TYPE (exp));
3754
3755   /* Allow a constructor with no elements for any data type.
3756      This means to fill the space with zeros.  */
3757   if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
3758     {
3759       assemble_zeros (size);
3760       return;
3761     }
3762
3763   if (TREE_CODE (exp) == FDESC_EXPR)
3764     {
3765 #ifdef ASM_OUTPUT_FDESC
3766       HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
3767       tree decl = TREE_OPERAND (exp, 0);
3768       ASM_OUTPUT_FDESC (asm_out_file, decl, part);
3769 #else
3770       abort ();
3771 #endif
3772       return;
3773     }
3774
3775   /* Now output the underlying data.  If we've handling the padding, return.
3776      Otherwise, break and ensure THISSIZE is the size written.  */
3777   switch (code)
3778     {
3779     case CHAR_TYPE:
3780     case BOOLEAN_TYPE:
3781     case INTEGER_TYPE:
3782     case ENUMERAL_TYPE:
3783     case POINTER_TYPE:
3784     case REFERENCE_TYPE:
3785     case OFFSET_TYPE:
3786       if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
3787                                            EXPAND_INITIALIZER),
3788                               size, align, 0))
3789         error ("initializer for integer value is too complicated");
3790       break;
3791
3792     case REAL_TYPE:
3793       if (TREE_CODE (exp) != REAL_CST)
3794         error ("initializer for floating value is not a floating constant");
3795
3796       assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
3797       break;
3798
3799     case COMPLEX_TYPE:
3800       output_constant (TREE_REALPART (exp), thissize / 2, align);
3801       output_constant (TREE_IMAGPART (exp), thissize / 2,
3802                        min_align (align, BITS_PER_UNIT * (thissize / 2)));
3803       break;
3804
3805     case ARRAY_TYPE:
3806     case VECTOR_TYPE:
3807       if (TREE_CODE (exp) == CONSTRUCTOR)
3808         {
3809           output_constructor (exp, size, align);
3810           return;
3811         }
3812       else if (TREE_CODE (exp) == STRING_CST)
3813         {
3814           thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
3815                           size);
3816           assemble_string (TREE_STRING_POINTER (exp), thissize);
3817         }
3818       else if (TREE_CODE (exp) == VECTOR_CST)
3819         {
3820           int elt_size;
3821           tree link;
3822           unsigned int nalign;
3823           enum machine_mode inner;
3824
3825           inner = GET_MODE_INNER (TYPE_MODE (TREE_TYPE (exp)));
3826           nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
3827
3828           elt_size = GET_MODE_UNIT_SIZE (TYPE_MODE (TREE_TYPE (exp)));
3829
3830           link = TREE_VECTOR_CST_ELTS (exp);
3831           output_constant (TREE_VALUE (link), elt_size, align);
3832           while ((link = TREE_CHAIN (link)) != NULL)
3833             output_constant (TREE_VALUE (link), elt_size, nalign);
3834         }
3835       else
3836         abort ();
3837       break;
3838
3839     case RECORD_TYPE:
3840     case UNION_TYPE:
3841       if (TREE_CODE (exp) == CONSTRUCTOR)
3842         output_constructor (exp, size, align);
3843       else
3844         abort ();
3845       return;
3846
3847     case SET_TYPE:
3848       if (TREE_CODE (exp) == INTEGER_CST)
3849         assemble_integer (expand_expr (exp, NULL_RTX,
3850                                        VOIDmode, EXPAND_INITIALIZER),
3851                           thissize, align, 1);
3852       else if (TREE_CODE (exp) == CONSTRUCTOR)
3853         {
3854           unsigned char *buffer = alloca (thissize);
3855           if (get_set_constructor_bytes (exp, buffer, thissize))
3856             abort ();
3857           assemble_string ((char *) buffer, thissize);
3858         }
3859       else
3860         error ("unknown set constructor type");
3861       return;
3862
3863     case ERROR_MARK:
3864       return;
3865
3866     default:
3867       abort ();
3868     }
3869
3870   if (size > thissize)
3871     assemble_zeros (size - thissize);
3872 }
3873
3874 \f
3875 /* Subroutine of output_constructor, used for computing the size of
3876    arrays of unspecified length.  VAL must be a CONSTRUCTOR of an array
3877    type with an unspecified upper bound.  */
3878
3879 static unsigned HOST_WIDE_INT
3880 array_size_for_constructor (tree val)
3881 {
3882   tree max_index, i;
3883
3884   /* This code used to attempt to handle string constants that are not
3885      arrays of single-bytes, but nothing else does, so there's no point in
3886      doing it here.  */
3887   if (TREE_CODE (val) == STRING_CST)
3888     return TREE_STRING_LENGTH (val);
3889
3890   max_index = NULL_TREE;
3891   for (i = CONSTRUCTOR_ELTS (val); i; i = TREE_CHAIN (i))
3892     {
3893       tree index = TREE_PURPOSE (i);
3894
3895       if (TREE_CODE (index) == RANGE_EXPR)
3896         index = TREE_OPERAND (index, 1);
3897       if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
3898         max_index = index;
3899     }
3900
3901   if (max_index == NULL_TREE)
3902     return 0;
3903
3904   /* Compute the total number of array elements.  */
3905   i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
3906                   convert (sizetype,
3907                            TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
3908   i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
3909
3910   /* Multiply by the array element unit size to find number of bytes.  */
3911   i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
3912
3913   return tree_low_cst (i, 1);
3914 }
3915
3916 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
3917    Generate at least SIZE bytes, padding if necessary.  */
3918
3919 static void
3920 output_constructor (tree exp, unsigned HOST_WIDE_INT size,
3921                     unsigned int align)
3922 {
3923   tree type = TREE_TYPE (exp);
3924   tree link, field = 0;
3925   tree min_index = 0;
3926   /* Number of bytes output or skipped so far.
3927      In other words, current position within the constructor.  */
3928   HOST_WIDE_INT total_bytes = 0;
3929   /* Nonzero means BYTE contains part of a byte, to be output.  */
3930   int byte_buffer_in_use = 0;
3931   int byte = 0;
3932
3933   if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
3934     abort ();
3935
3936   if (TREE_CODE (type) == RECORD_TYPE)
3937     field = TYPE_FIELDS (type);
3938
3939   if (TREE_CODE (type) == ARRAY_TYPE
3940       && TYPE_DOMAIN (type) != 0)
3941     min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
3942
3943   /* As LINK goes through the elements of the constant,
3944      FIELD goes through the structure fields, if the constant is a structure.
3945      if the constant is a union, then we override this,
3946      by getting the field from the TREE_LIST element.
3947      But the constant could also be an array.  Then FIELD is zero.
3948
3949      There is always a maximum of one element in the chain LINK for unions
3950      (even if the initializer in a source program incorrectly contains
3951      more one).  */
3952   for (link = CONSTRUCTOR_ELTS (exp);
3953        link;
3954        link = TREE_CHAIN (link),
3955        field = field ? TREE_CHAIN (field) : 0)
3956     {
3957       tree val = TREE_VALUE (link);
3958       tree index = 0;
3959
3960       /* The element in a union constructor specifies the proper field
3961          or index.  */
3962       if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
3963            || TREE_CODE (type) == QUAL_UNION_TYPE)
3964           && TREE_PURPOSE (link) != 0)
3965         field = TREE_PURPOSE (link);
3966
3967       else if (TREE_CODE (type) == ARRAY_TYPE)
3968         index = TREE_PURPOSE (link);
3969
3970 #ifdef ASM_COMMENT_START
3971       if (field && flag_verbose_asm)
3972         fprintf (asm_out_file, "%s %s:\n",
3973                  ASM_COMMENT_START, 
3974                  DECL_NAME (field) 
3975                  ? IDENTIFIER_POINTER (DECL_NAME (field))
3976                  : "<anonymous>");
3977 #endif
3978
3979       /* Eliminate the marker that makes a cast not be an lvalue.  */
3980       if (val != 0)
3981         STRIP_NOPS (val);
3982
3983       if (index && TREE_CODE (index) == RANGE_EXPR)
3984         {
3985           unsigned HOST_WIDE_INT fieldsize
3986             = int_size_in_bytes (TREE_TYPE (type));
3987           HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
3988           HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
3989           HOST_WIDE_INT index;
3990           unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
3991
3992           for (index = lo_index; index <= hi_index; index++)
3993             {
3994               /* Output the element's initial value.  */
3995               if (val == 0)
3996                 assemble_zeros (fieldsize);
3997               else
3998                 output_constant (val, fieldsize, align2);
3999
4000               /* Count its size.  */
4001               total_bytes += fieldsize;
4002             }
4003         }
4004       else if (field == 0 || !DECL_BIT_FIELD (field))
4005         {
4006           /* An element that is not a bit-field.  */
4007
4008           unsigned HOST_WIDE_INT fieldsize;
4009           /* Since this structure is static,
4010              we know the positions are constant.  */
4011           HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
4012           unsigned int align2;
4013
4014           if (index != 0)
4015             pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4016                    * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
4017
4018           /* Output any buffered-up bit-fields preceding this element.  */
4019           if (byte_buffer_in_use)
4020             {
4021               assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4022               total_bytes++;
4023               byte_buffer_in_use = 0;
4024             }
4025
4026           /* Advance to offset of this element.
4027              Note no alignment needed in an array, since that is guaranteed
4028              if each element has the proper size.  */
4029           if ((field != 0 || index != 0) && pos != total_bytes)
4030             {
4031               assemble_zeros (pos - total_bytes);
4032               total_bytes = pos;
4033             }
4034
4035           /* Find the alignment of this element.  */
4036           align2 = min_align (align, BITS_PER_UNIT * pos);
4037
4038           /* Determine size this element should occupy.  */
4039           if (field)
4040             {
4041               fieldsize = 0;
4042
4043               /* If this is an array with an unspecified upper bound,
4044                  the initializer determines the size.  */
4045               /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4046                  but we cannot do this until the deprecated support for
4047                  initializing zero-length array members is removed.  */
4048               if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4049                   && TYPE_DOMAIN (TREE_TYPE (field))
4050                   && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4051                 {
4052                   fieldsize = array_size_for_constructor (val);
4053                   /* Given a non-empty initialization, this field had
4054                      better be last.  */
4055                   if (fieldsize != 0 && TREE_CHAIN (field) != NULL_TREE)
4056                     abort ();
4057                 }
4058               else if (DECL_SIZE_UNIT (field))
4059                 {
4060                   /* ??? This can't be right.  If the decl size overflows
4061                      a host integer we will silently emit no data.  */
4062                   if (host_integerp (DECL_SIZE_UNIT (field), 1))
4063                     fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4064                 }
4065             }
4066           else
4067             fieldsize = int_size_in_bytes (TREE_TYPE (type));
4068
4069           /* Output the element's initial value.  */
4070           if (val == 0)
4071             assemble_zeros (fieldsize);
4072           else
4073             output_constant (val, fieldsize, align2);
4074
4075           /* Count its size.  */
4076           total_bytes += fieldsize;
4077         }
4078       else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4079         error ("invalid initial value for member `%s'",
4080                IDENTIFIER_POINTER (DECL_NAME (field)));
4081       else
4082         {
4083           /* Element that is a bit-field.  */
4084
4085           HOST_WIDE_INT next_offset = int_bit_position (field);
4086           HOST_WIDE_INT end_offset
4087             = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
4088
4089           if (val == 0)
4090             val = integer_zero_node;
4091
4092           /* If this field does not start in this (or, next) byte,
4093              skip some bytes.  */
4094           if (next_offset / BITS_PER_UNIT != total_bytes)
4095             {
4096               /* Output remnant of any bit field in previous bytes.  */
4097               if (byte_buffer_in_use)
4098                 {
4099                   assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4100                   total_bytes++;
4101                   byte_buffer_in_use = 0;
4102                 }
4103
4104               /* If still not at proper byte, advance to there.  */
4105               if (next_offset / BITS_PER_UNIT != total_bytes)
4106                 {
4107                   assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4108                   total_bytes = next_offset / BITS_PER_UNIT;
4109                 }
4110             }
4111
4112           if (! byte_buffer_in_use)
4113             byte = 0;
4114
4115           /* We must split the element into pieces that fall within
4116              separate bytes, and combine each byte with previous or
4117              following bit-fields.  */
4118
4119           /* next_offset is the offset n fbits from the beginning of
4120              the structure to the next bit of this element to be processed.
4121              end_offset is the offset of the first bit past the end of
4122              this element.  */
4123           while (next_offset < end_offset)
4124             {
4125               int this_time;
4126               int shift;
4127               HOST_WIDE_INT value;
4128               HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4129               HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4130
4131               /* Advance from byte to byte
4132                  within this element when necessary.  */
4133               while (next_byte != total_bytes)
4134                 {
4135                   assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4136                   total_bytes++;
4137                   byte = 0;
4138                 }
4139
4140               /* Number of bits we can process at once
4141                  (all part of the same byte).  */
4142               this_time = MIN (end_offset - next_offset,
4143                                BITS_PER_UNIT - next_bit);
4144               if (BYTES_BIG_ENDIAN)
4145                 {
4146                   /* On big-endian machine, take the most significant bits
4147                      first (of the bits that are significant)
4148                      and put them into bytes from the most significant end.  */
4149                   shift = end_offset - next_offset - this_time;
4150
4151                   /* Don't try to take a bunch of bits that cross
4152                      the word boundary in the INTEGER_CST. We can
4153                      only select bits from the LOW or HIGH part
4154                      not from both.  */
4155                   if (shift < HOST_BITS_PER_WIDE_INT
4156                       && shift + this_time > HOST_BITS_PER_WIDE_INT)
4157                     {
4158                       this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4159                       shift = HOST_BITS_PER_WIDE_INT;
4160                     }
4161
4162                   /* Now get the bits from the appropriate constant word.  */
4163                   if (shift < HOST_BITS_PER_WIDE_INT)
4164                     value = TREE_INT_CST_LOW (val);
4165                   else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4166                     {
4167                       value = TREE_INT_CST_HIGH (val);
4168                       shift -= HOST_BITS_PER_WIDE_INT;
4169                     }
4170                   else
4171                     abort ();
4172
4173                   /* Get the result. This works only when:
4174                      1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
4175                   byte |= (((value >> shift)
4176                             & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4177                            << (BITS_PER_UNIT - this_time - next_bit));
4178                 }
4179               else
4180                 {
4181                   /* On little-endian machines,
4182                      take first the least significant bits of the value
4183                      and pack them starting at the least significant
4184                      bits of the bytes.  */
4185                   shift = next_offset - int_bit_position (field);
4186
4187                   /* Don't try to take a bunch of bits that cross
4188                      the word boundary in the INTEGER_CST. We can
4189                      only select bits from the LOW or HIGH part
4190                      not from both.  */
4191                   if (shift < HOST_BITS_PER_WIDE_INT
4192                       && shift + this_time > HOST_BITS_PER_WIDE_INT)
4193                     this_time = (HOST_BITS_PER_WIDE_INT - shift);
4194
4195                   /* Now get the bits from the appropriate constant word.  */
4196                   if (shift < HOST_BITS_PER_WIDE_INT)
4197                     value = TREE_INT_CST_LOW (val);
4198                   else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4199                     {
4200                       value = TREE_INT_CST_HIGH (val);
4201                       shift -= HOST_BITS_PER_WIDE_INT;
4202                     }
4203                   else
4204                     abort ();
4205
4206                   /* Get the result. This works only when:
4207                      1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
4208                   byte |= (((value >> shift)
4209                             & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4210                            << next_bit);
4211                 }
4212
4213               next_offset += this_time;
4214               byte_buffer_in_use = 1;
4215             }
4216         }
4217     }
4218
4219   if (byte_buffer_in_use)
4220     {
4221       assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4222       total_bytes++;
4223     }
4224
4225   if ((unsigned HOST_WIDE_INT)total_bytes < size)
4226     assemble_zeros (size - total_bytes);
4227 }
4228
4229 /* This TREE_LIST contains any weak symbol declarations waiting
4230    to be emitted.  */
4231 static GTY(()) tree weak_decls;
4232
4233 /* Mark DECL as weak.  */
4234
4235 static void
4236 mark_weak (tree decl)
4237 {
4238   DECL_WEAK (decl) = 1;
4239
4240   if (DECL_RTL_SET_P (decl)
4241       && GET_CODE (DECL_RTL (decl)) == MEM
4242       && XEXP (DECL_RTL (decl), 0)
4243       && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4244     SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4245 }
4246
4247 /* Merge weak status between NEWDECL and OLDDECL.  */
4248
4249 void
4250 merge_weak (tree newdecl, tree olddecl)
4251 {
4252   if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
4253     return;
4254
4255   if (DECL_WEAK (newdecl))
4256     {
4257       tree wd;
4258
4259       /* NEWDECL is weak, but OLDDECL is not.  */
4260
4261       /* If we already output the OLDDECL, we're in trouble; we can't
4262          go back and make it weak.  This error cannot caught in
4263          declare_weak because the NEWDECL and OLDDECL was not yet
4264          been merged; therefore, TREE_ASM_WRITTEN was not set.  */
4265       if (TREE_ASM_WRITTEN (olddecl))
4266         error ("%Jweak declaration of '%D' must precede definition",
4267                newdecl, newdecl);
4268
4269       /* If we've already generated rtl referencing OLDDECL, we may
4270          have done so in a way that will not function properly with
4271          a weak symbol.  */
4272       else if (TREE_USED (olddecl)
4273                && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
4274         warning ("%Jweak declaration of '%D' after first use results "
4275                  "in unspecified behavior", newdecl, newdecl);
4276
4277       if (SUPPORTS_WEAK)
4278         {
4279           /* We put the NEWDECL on the weak_decls list at some point.
4280              Replace it with the OLDDECL.  */
4281           for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4282             if (TREE_VALUE (wd) == newdecl)
4283               {
4284                 TREE_VALUE (wd) = olddecl;
4285                 break;
4286               }
4287           /* We may not find the entry on the list.  If NEWDECL is a
4288              weak alias, then we will have already called
4289              globalize_decl to remove the entry; in that case, we do
4290              not need to do anything.  */
4291         }
4292
4293       /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping.  */
4294       mark_weak (olddecl);
4295     }
4296   else
4297     /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4298        weak.  Just update NEWDECL to indicate that it's weak too.  */
4299     mark_weak (newdecl);
4300 }
4301
4302 /* Declare DECL to be a weak symbol.  */
4303
4304 void
4305 declare_weak (tree decl)
4306 {
4307   if (! TREE_PUBLIC (decl))
4308     error ("%Jweak declaration of '%D' must be public", decl, decl);
4309   else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
4310     error ("%Jweak declaration of '%D' must precede definition", decl, decl);
4311   else if (SUPPORTS_WEAK)
4312     {
4313       if (! DECL_WEAK (decl))
4314         weak_decls = tree_cons (NULL, decl, weak_decls);
4315     }
4316   else
4317     warning ("%Jweak declaration of '%D' not supported", decl, decl);
4318
4319   mark_weak (decl);
4320 }
4321
4322 /* Emit any pending weak declarations.  */
4323
4324 void
4325 weak_finish (void)
4326 {
4327   tree t;
4328
4329   for (t = weak_decls; t; t = TREE_CHAIN (t))
4330     {
4331       tree decl = TREE_VALUE (t);
4332 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4333       const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4334 #endif
4335
4336       if (! TREE_USED (decl))
4337         continue;
4338
4339 #ifdef ASM_WEAKEN_DECL
4340       ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4341 #else
4342 #ifdef ASM_WEAKEN_LABEL
4343       ASM_WEAKEN_LABEL (asm_out_file, name);
4344 #else
4345 #ifdef ASM_OUTPUT_WEAK_ALIAS
4346       warning ("only weak aliases are supported in this configuration");
4347       return;
4348 #endif
4349 #endif
4350 #endif
4351     }
4352 }
4353
4354 /* Emit the assembly bits to indicate that DECL is globally visible.  */
4355
4356 static void
4357 globalize_decl (tree decl)
4358 {
4359   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4360
4361 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4362   if (DECL_WEAK (decl))
4363     {
4364       tree *p, t;
4365
4366 #ifdef ASM_WEAKEN_DECL
4367       ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
4368 #else
4369       ASM_WEAKEN_LABEL (asm_out_file, name);
4370 #endif
4371
4372       /* Remove this function from the pending weak list so that
4373          we do not emit multiple .weak directives for it.  */
4374       for (p = &weak_decls; (t = *p) ; )
4375         {
4376           if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4377             *p = TREE_CHAIN (t);
4378           else
4379             p = &TREE_CHAIN (t);
4380         }
4381       return;
4382     }
4383 #endif
4384
4385   (*targetm.asm_out.globalize_label) (asm_out_file, name);
4386 }
4387
4388 /* Emit an assembler directive to make the symbol for DECL an alias to
4389    the symbol for TARGET.  */
4390
4391 void
4392 assemble_alias (tree decl, tree target ATTRIBUTE_UNUSED)
4393 {
4394   const char *name;
4395
4396   /* We must force creation of DECL_RTL for debug info generation, even though
4397      we don't use it here.  */
4398   make_decl_rtl (decl, NULL);
4399
4400   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4401
4402 #ifdef ASM_OUTPUT_DEF
4403   /* Make name accessible from other files, if appropriate.  */
4404
4405   if (TREE_PUBLIC (decl))
4406     {
4407       globalize_decl (decl);
4408       maybe_assemble_visibility (decl);
4409     }
4410
4411 #ifdef ASM_OUTPUT_DEF_FROM_DECLS
4412   ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4413 #else
4414   ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
4415 #endif
4416 #else /* !ASM_OUTPUT_DEF */
4417 #if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
4418   if (DECL_WEAK (decl))
4419     {
4420       tree *p, t;
4421 #ifdef ASM_WEAKEN_DECL
4422       ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
4423 #else
4424       ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4425 #endif
4426       /* Remove this function from the pending weak list so that
4427          we do not emit multiple .weak directives for it.  */
4428       for (p = &weak_decls; (t = *p) ; )
4429         if (DECL_ASSEMBLER_NAME (decl)
4430             == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4431           *p = TREE_CHAIN (t);
4432         else
4433           p = &TREE_CHAIN (t);
4434     }
4435   else
4436     warning ("only weak aliases are supported in this configuration");
4437
4438 #else
4439   warning ("alias definitions not supported in this configuration; ignored");
4440 #endif
4441 #endif
4442
4443   TREE_USED (decl) = 1;
4444   TREE_ASM_WRITTEN (decl) = 1;
4445   TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
4446 }
4447
4448 /* Emit an assembler directive to set symbol for DECL visibility to
4449    the visibility type VIS, which must not be VISIBILITY_DEFAULT.  */
4450
4451 void
4452 default_assemble_visibility (tree decl, int vis)
4453 {
4454   static const char * const visibility_types[] = {
4455     NULL, "internal", "hidden", "protected"
4456   };
4457
4458   const char *name, *type;
4459
4460   name = (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
4461   type = visibility_types[vis];
4462
4463 #ifdef HAVE_GAS_HIDDEN
4464   fprintf (asm_out_file, "\t.%s\t", type);
4465   assemble_name (asm_out_file, name);
4466   fprintf (asm_out_file, "\n");
4467 #else
4468   warning ("visibility attribute not supported in this configuration; ignored");
4469 #endif
4470 }
4471
4472 /* A helper function to call assemble_visibility when needed for a decl.  */
4473
4474 static void
4475 maybe_assemble_visibility (tree decl)
4476 {
4477   enum symbol_visibility vis = DECL_VISIBILITY (decl);
4478
4479   if (vis != VISIBILITY_DEFAULT)
4480     (* targetm.asm_out.visibility) (decl, vis);
4481 }
4482
4483 /* Returns 1 if the target configuration supports defining public symbols
4484    so that one of them will be chosen at link time instead of generating a
4485    multiply-defined symbol error, whether through the use of weak symbols or
4486    a target-specific mechanism for having duplicates discarded.  */
4487
4488 int
4489 supports_one_only (void)
4490 {
4491   if (SUPPORTS_ONE_ONLY)
4492     return 1;
4493   return SUPPORTS_WEAK;
4494 }
4495
4496 /* Set up DECL as a public symbol that can be defined in multiple
4497    translation units without generating a linker error.  */
4498
4499 void
4500 make_decl_one_only (tree decl)
4501 {
4502   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
4503     abort ();
4504
4505   TREE_PUBLIC (decl) = 1;
4506
4507   if (SUPPORTS_ONE_ONLY)
4508     {
4509 #ifdef MAKE_DECL_ONE_ONLY
4510       MAKE_DECL_ONE_ONLY (decl);
4511 #endif
4512       DECL_ONE_ONLY (decl) = 1;
4513     }
4514   else if (TREE_CODE (decl) == VAR_DECL
4515       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4516     DECL_COMMON (decl) = 1;
4517   else if (SUPPORTS_WEAK)
4518     DECL_WEAK (decl) = 1;
4519   else
4520     abort ();
4521 }
4522
4523 void
4524 init_varasm_once (void)
4525 {
4526   in_named_htab = htab_create_ggc (31, in_named_entry_hash,
4527                                    in_named_entry_eq, NULL);
4528   const_desc_htab = htab_create_ggc (1009, const_desc_hash,
4529                                      const_desc_eq, NULL);
4530
4531   const_alias_set = new_alias_set ();
4532 }
4533
4534 enum tls_model
4535 decl_tls_model (tree decl)
4536 {
4537   enum tls_model kind;
4538   tree attr = lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl));
4539   bool is_local;
4540
4541   if (attr)
4542     {
4543       attr = TREE_VALUE (TREE_VALUE (attr));
4544       if (TREE_CODE (attr) != STRING_CST)
4545         abort ();
4546       if (!strcmp (TREE_STRING_POINTER (attr), "local-exec"))
4547         kind = TLS_MODEL_LOCAL_EXEC;
4548       else if (!strcmp (TREE_STRING_POINTER (attr), "initial-exec"))
4549         kind = TLS_MODEL_INITIAL_EXEC;
4550       else if (!strcmp (TREE_STRING_POINTER (attr), "local-dynamic"))
4551         kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
4552       else if (!strcmp (TREE_STRING_POINTER (attr), "global-dynamic"))
4553         kind = TLS_MODEL_GLOBAL_DYNAMIC;
4554       else
4555         abort ();
4556       return kind;
4557     }
4558
4559   is_local = (*targetm.binds_local_p) (decl);
4560   if (!flag_pic)
4561     {
4562       if (is_local)
4563         kind = TLS_MODEL_LOCAL_EXEC;
4564       else
4565         kind = TLS_MODEL_INITIAL_EXEC;
4566     }
4567   /* Local dynamic is inefficient when we're not combining the
4568      parts of the address.  */
4569   else if (optimize && is_local)
4570     kind = TLS_MODEL_LOCAL_DYNAMIC;
4571   else
4572     kind = TLS_MODEL_GLOBAL_DYNAMIC;
4573   if (kind < flag_tls_default)
4574     kind = flag_tls_default;
4575
4576   return kind;
4577 }
4578
4579 /* Select a set of attributes for section NAME based on the properties
4580    of DECL and whether or not RELOC indicates that DECL's initializer
4581    might contain runtime relocations.
4582
4583    We make the section read-only and executable for a function decl,
4584    read-only for a const data decl, and writable for a non-const data decl.  */
4585
4586 unsigned int
4587 default_section_type_flags (tree decl, const char *name, int reloc)
4588 {
4589   return default_section_type_flags_1 (decl, name, reloc, flag_pic);
4590 }
4591
4592 unsigned int
4593 default_section_type_flags_1 (tree decl, const char *name, int reloc,
4594                               int shlib)
4595 {
4596   unsigned int flags;
4597
4598   if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4599     flags = SECTION_CODE;
4600   else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
4601     flags = 0;
4602   else
4603     flags = SECTION_WRITE;
4604
4605   if (decl && DECL_ONE_ONLY (decl))
4606     flags |= SECTION_LINKONCE;
4607
4608   if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4609     flags |= SECTION_TLS | SECTION_WRITE;
4610
4611   if (strcmp (name, ".bss") == 0
4612       || strncmp (name, ".bss.", 5) == 0
4613       || strncmp (name, ".gnu.linkonce.b.", 16) == 0
4614       || strcmp (name, ".sbss") == 0
4615       || strncmp (name, ".sbss.", 6) == 0
4616       || strncmp (name, ".gnu.linkonce.sb.", 17) == 0
4617       || strcmp (name, ".tbss") == 0
4618       || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
4619     flags |= SECTION_BSS;
4620
4621   if (strcmp (name, ".tdata") == 0
4622       || strcmp (name, ".tbss") == 0
4623       || strncmp (name, ".gnu.linkonce.td.", 17) == 0
4624       || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
4625     flags |= SECTION_TLS;
4626
4627   /* These three sections have special ELF types.  They are neither
4628      SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
4629      want to print a section type (@progbits or @nobits).  If someone
4630      is silly enough to emit code or TLS variables to one of these
4631      sections, then don't handle them specially.  */
4632   if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
4633       && (strcmp (name, ".init_array") == 0
4634           || strcmp (name, ".fini_array") == 0
4635           || strcmp (name, ".preinit_array") == 0))
4636     flags |= SECTION_NOTYPE;
4637
4638   return flags;
4639 }
4640
4641 /* Output assembly to switch to section NAME with attribute FLAGS.
4642    Four variants for common object file formats.  */
4643
4644 void
4645 default_no_named_section (const char *name ATTRIBUTE_UNUSED,
4646                           unsigned int flags ATTRIBUTE_UNUSED)
4647 {
4648   /* Some object formats don't support named sections at all.  The
4649      front-end should already have flagged this as an error.  */
4650   abort ();
4651 }
4652
4653 void
4654 default_elf_asm_named_section (const char *name, unsigned int flags)
4655 {
4656   char flagchars[10], *f = flagchars;
4657
4658   if (! named_section_first_declaration (name))
4659     {
4660       fprintf (asm_out_file, "\t.section\t%s\n", name);
4661       return;
4662     }
4663
4664   if (!(flags & SECTION_DEBUG))
4665     *f++ = 'a';
4666   if (flags & SECTION_WRITE)
4667     *f++ = 'w';
4668   if (flags & SECTION_CODE)
4669     *f++ = 'x';
4670   if (flags & SECTION_SMALL)
4671     *f++ = 's';
4672   if (flags & SECTION_MERGE)
4673     *f++ = 'M';
4674   if (flags & SECTION_STRINGS)
4675     *f++ = 'S';
4676   if (flags & SECTION_TLS)
4677     *f++ = 'T';
4678   *f = '\0';
4679
4680   fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
4681
4682   if (!(flags & SECTION_NOTYPE))
4683     {
4684       const char *type;
4685
4686       if (flags & SECTION_BSS)
4687         type = "nobits";
4688       else
4689         type = "progbits";
4690
4691       fprintf (asm_out_file, ",@%s", type);
4692
4693       if (flags & SECTION_ENTSIZE)
4694         fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
4695     }
4696
4697   putc ('\n', asm_out_file);
4698 }
4699
4700 void
4701 default_coff_asm_named_section (const char *name, unsigned int flags)
4702 {
4703   char flagchars[8], *f = flagchars;
4704
4705   if (flags & SECTION_WRITE)
4706     *f++ = 'w';
4707   if (flags & SECTION_CODE)
4708     *f++ = 'x';
4709   *f = '\0';
4710
4711   fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
4712 }
4713
4714 void
4715 default_pe_asm_named_section (const char *name, unsigned int flags)
4716 {
4717   default_coff_asm_named_section (name, flags);
4718
4719   if (flags & SECTION_LINKONCE)
4720     {
4721       /* Functions may have been compiled at various levels of
4722          optimization so we can't use `same_size' here.
4723          Instead, have the linker pick one.  */
4724       fprintf (asm_out_file, "\t.linkonce %s\n",
4725                (flags & SECTION_CODE ? "discard" : "same_size"));
4726     }
4727 }
4728 \f
4729 /* The lame default section selector.  */
4730
4731 void
4732 default_select_section (tree decl, int reloc,
4733                         unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
4734 {
4735   bool readonly = false;
4736
4737   if (DECL_P (decl))
4738     {
4739       if (decl_readonly_section (decl, reloc))
4740         readonly = true;
4741     }
4742   else if (TREE_CODE (decl) == CONSTRUCTOR)
4743     {
4744       if (! ((flag_pic && reloc)
4745              || !TREE_READONLY (decl)
4746              || TREE_SIDE_EFFECTS (decl)
4747              || !TREE_CONSTANT (decl)))
4748         readonly = true;
4749     }
4750   else if (TREE_CODE (decl) == STRING_CST)
4751     readonly = !flag_writable_strings;
4752   else if (! (flag_pic && reloc))
4753     readonly = true;
4754
4755   if (readonly)
4756     readonly_data_section ();
4757   else
4758     data_section ();
4759 }
4760
4761 /* A helper function for default_elf_select_section and
4762    default_elf_unique_section.  Categorizes the DECL.  */
4763
4764 enum section_category
4765 {
4766   SECCAT_TEXT,
4767
4768   SECCAT_RODATA,
4769   SECCAT_RODATA_MERGE_STR,
4770   SECCAT_RODATA_MERGE_STR_INIT,
4771   SECCAT_RODATA_MERGE_CONST,
4772   SECCAT_SRODATA,
4773
4774   SECCAT_DATA,
4775
4776   /* To optimize loading of shared programs, define following subsections
4777      of data section:
4778         _REL    Contains data that has relocations, so they get grouped
4779                 together and dynamic linker will visit fewer pages in memory.
4780         _RO     Contains data that is otherwise read-only.  This is useful
4781                 with prelinking as most relocations won't be dynamically
4782                 linked and thus stay read only.
4783         _LOCAL  Marks data containing relocations only to local objects.
4784                 These relocations will get fully resolved by prelinking.  */
4785   SECCAT_DATA_REL,
4786   SECCAT_DATA_REL_LOCAL,
4787   SECCAT_DATA_REL_RO,
4788   SECCAT_DATA_REL_RO_LOCAL,
4789
4790   SECCAT_SDATA,
4791   SECCAT_TDATA,
4792
4793   SECCAT_BSS,
4794   SECCAT_SBSS,
4795   SECCAT_TBSS
4796 };
4797
4798 static enum section_category
4799 categorize_decl_for_section (tree, int, int);
4800
4801 static enum section_category
4802 categorize_decl_for_section (tree decl, int reloc, int shlib)
4803 {
4804   enum section_category ret;
4805
4806   if (TREE_CODE (decl) == FUNCTION_DECL)
4807     return SECCAT_TEXT;
4808   else if (TREE_CODE (decl) == STRING_CST)
4809     {
4810       if (flag_writable_strings)
4811         return SECCAT_DATA;
4812       else
4813         return SECCAT_RODATA_MERGE_STR;
4814     }
4815   else if (TREE_CODE (decl) == VAR_DECL)
4816     {
4817       if (DECL_INITIAL (decl) == NULL
4818           || DECL_INITIAL (decl) == error_mark_node)
4819         ret = SECCAT_BSS;
4820       else if (! TREE_READONLY (decl)
4821                || TREE_SIDE_EFFECTS (decl)
4822                || ! TREE_CONSTANT (DECL_INITIAL (decl)))
4823         {
4824           if (shlib && (reloc & 2))
4825             ret = SECCAT_DATA_REL;
4826           else if (shlib && reloc)
4827             ret = SECCAT_DATA_REL_LOCAL;
4828           else
4829             ret = SECCAT_DATA;
4830         }
4831       else if (shlib && (reloc & 2))
4832         ret = SECCAT_DATA_REL_RO;
4833       else if (shlib && reloc)
4834         ret = SECCAT_DATA_REL_RO_LOCAL;
4835       else if (reloc || flag_merge_constants < 2)
4836         /* C and C++ don't allow different variables to share the same
4837            location.  -fmerge-all-constants allows even that (at the
4838            expense of not conforming).  */
4839         ret = SECCAT_RODATA;
4840       else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
4841         ret = SECCAT_RODATA_MERGE_STR_INIT;
4842       else
4843         ret = SECCAT_RODATA_MERGE_CONST;
4844     }
4845   else if (TREE_CODE (decl) == CONSTRUCTOR)
4846     {
4847       if ((shlib && reloc)
4848           || TREE_SIDE_EFFECTS (decl)
4849           || ! TREE_CONSTANT (decl))
4850         ret = SECCAT_DATA;
4851       else
4852         ret = SECCAT_RODATA;
4853     }
4854   else
4855     ret = SECCAT_RODATA;
4856
4857   /* There are no read-only thread-local sections.  */
4858   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4859     {
4860       if (ret == SECCAT_BSS)
4861         ret = SECCAT_TBSS;
4862       else
4863         ret = SECCAT_TDATA;
4864     }
4865
4866   /* If the target uses small data sections, select it.  */
4867   else if ((*targetm.in_small_data_p) (decl))
4868     {
4869       if (ret == SECCAT_BSS)
4870         ret = SECCAT_SBSS;
4871       else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
4872         ret = SECCAT_SRODATA;
4873       else
4874         ret = SECCAT_SDATA;
4875     }
4876
4877   return ret;
4878 }
4879
4880 bool
4881 decl_readonly_section (tree decl, int reloc)
4882 {
4883   return decl_readonly_section_1 (decl, reloc, flag_pic);
4884 }
4885
4886 bool
4887 decl_readonly_section_1 (tree decl, int reloc, int shlib)
4888 {
4889   switch (categorize_decl_for_section (decl, reloc, shlib))
4890     {
4891     case SECCAT_RODATA:
4892     case SECCAT_RODATA_MERGE_STR:
4893     case SECCAT_RODATA_MERGE_STR_INIT:
4894     case SECCAT_RODATA_MERGE_CONST:
4895     case SECCAT_SRODATA:
4896       return true;
4897       break;
4898     default:
4899       return false;
4900       break;
4901     }
4902 }
4903
4904 /* Select a section based on the above categorization.  */
4905
4906 void
4907 default_elf_select_section (tree decl, int reloc,
4908                             unsigned HOST_WIDE_INT align)
4909 {
4910   default_elf_select_section_1 (decl, reloc, align, flag_pic);
4911 }
4912
4913 void
4914 default_elf_select_section_1 (tree decl, int reloc,
4915                               unsigned HOST_WIDE_INT align, int shlib)
4916 {
4917   switch (categorize_decl_for_section (decl, reloc, shlib))
4918     {
4919     case SECCAT_TEXT:
4920       /* We're not supposed to be called on FUNCTION_DECLs.  */
4921       abort ();
4922     case SECCAT_RODATA:
4923       readonly_data_section ();
4924       break;
4925     case SECCAT_RODATA_MERGE_STR:
4926       mergeable_string_section (decl, align, 0);
4927       break;
4928     case SECCAT_RODATA_MERGE_STR_INIT:
4929       mergeable_string_section (DECL_INITIAL (decl), align, 0);
4930       break;
4931     case SECCAT_RODATA_MERGE_CONST:
4932       mergeable_constant_section (DECL_MODE (decl), align, 0);
4933       break;
4934     case SECCAT_SRODATA:
4935       named_section (NULL_TREE, ".sdata2", reloc);
4936       break;
4937     case SECCAT_DATA:
4938       data_section ();
4939       break;
4940     case SECCAT_DATA_REL:
4941       named_section (NULL_TREE, ".data.rel", reloc);
4942       break;
4943     case SECCAT_DATA_REL_LOCAL:
4944       named_section (NULL_TREE, ".data.rel.local", reloc);
4945       break;
4946     case SECCAT_DATA_REL_RO:
4947       named_section (NULL_TREE, ".data.rel.ro", reloc);
4948       break;
4949     case SECCAT_DATA_REL_RO_LOCAL:
4950       named_section (NULL_TREE, ".data.rel.ro.local", reloc);
4951       break;
4952     case SECCAT_SDATA:
4953       named_section (NULL_TREE, ".sdata", reloc);
4954       break;
4955     case SECCAT_TDATA:
4956       named_section (NULL_TREE, ".tdata", reloc);
4957       break;
4958     case SECCAT_BSS:
4959 #ifdef BSS_SECTION_ASM_OP
4960       bss_section ();
4961 #else
4962       named_section (NULL_TREE, ".bss", reloc);
4963 #endif
4964       break;
4965     case SECCAT_SBSS:
4966       named_section (NULL_TREE, ".sbss", reloc);
4967       break;
4968     case SECCAT_TBSS:
4969       named_section (NULL_TREE, ".tbss", reloc);
4970       break;
4971     default:
4972       abort ();
4973     }
4974 }
4975
4976 /* Construct a unique section name based on the decl name and the
4977    categorization performed above.  */
4978
4979 void
4980 default_unique_section (tree decl, int reloc)
4981 {
4982   default_unique_section_1 (decl, reloc, flag_pic);
4983 }
4984
4985 void
4986 default_unique_section_1 (tree decl, int reloc, int shlib)
4987 {
4988   bool one_only = DECL_ONE_ONLY (decl);
4989   const char *prefix, *name;
4990   size_t nlen, plen;
4991   char *string;
4992
4993   switch (categorize_decl_for_section (decl, reloc, shlib))
4994     {
4995     case SECCAT_TEXT:
4996       prefix = one_only ? ".gnu.linkonce.t." : ".text.";
4997       break;
4998     case SECCAT_RODATA:
4999     case SECCAT_RODATA_MERGE_STR:
5000     case SECCAT_RODATA_MERGE_STR_INIT:
5001     case SECCAT_RODATA_MERGE_CONST:
5002       prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
5003       break;
5004     case SECCAT_SRODATA:
5005       prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
5006       break;
5007     case SECCAT_DATA:
5008     case SECCAT_DATA_REL:
5009     case SECCAT_DATA_REL_LOCAL:
5010     case SECCAT_DATA_REL_RO:
5011     case SECCAT_DATA_REL_RO_LOCAL:
5012       prefix = one_only ? ".gnu.linkonce.d." : ".data.";
5013       break;
5014     case SECCAT_SDATA:
5015       prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
5016       break;
5017     case SECCAT_BSS:
5018       prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
5019       break;
5020     case SECCAT_SBSS:
5021       prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
5022       break;
5023     case SECCAT_TDATA:
5024       prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
5025       break;
5026     case SECCAT_TBSS:
5027       prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
5028       break;
5029     default:
5030       abort ();
5031     }
5032   plen = strlen (prefix);
5033
5034   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5035   name = (* targetm.strip_name_encoding) (name);
5036   nlen = strlen (name);
5037
5038   string = alloca (nlen + plen + 1);
5039   memcpy (string, prefix, plen);
5040   memcpy (string + plen, name, nlen + 1);
5041
5042   DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
5043 }
5044
5045 void
5046 default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
5047                             rtx x,
5048                             unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
5049 {
5050   if (flag_pic)
5051     switch (GET_CODE (x))
5052       {
5053       case CONST:
5054       case SYMBOL_REF:
5055       case LABEL_REF:
5056         data_section ();
5057         return;
5058
5059       default:
5060         break;
5061       }
5062
5063   readonly_data_section ();
5064 }
5065
5066 void
5067 default_elf_select_rtx_section (enum machine_mode mode, rtx x,
5068                                 unsigned HOST_WIDE_INT align)
5069 {
5070   /* ??? Handle small data here somehow.  */
5071
5072   if (flag_pic)
5073     switch (GET_CODE (x))
5074       {
5075       case CONST:
5076       case SYMBOL_REF:
5077         named_section (NULL_TREE, ".data.rel.ro", 3);
5078         return;
5079
5080       case LABEL_REF:
5081         named_section (NULL_TREE, ".data.rel.ro.local", 1);
5082         return;
5083
5084       default:
5085         break;
5086       }
5087
5088   mergeable_constant_section (mode, align, 0);
5089 }
5090
5091 /* Set the generally applicable flags on the SYMBOL_REF for EXP.  */
5092
5093 void
5094 default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
5095 {
5096   rtx symbol;
5097   int flags;
5098
5099   /* Careful not to prod global register variables.  */
5100   if (GET_CODE (rtl) != MEM)
5101     return;
5102   symbol = XEXP (rtl, 0);
5103   if (GET_CODE (symbol) != SYMBOL_REF)
5104     return;
5105
5106   flags = 0;
5107   if (TREE_CODE (decl) == FUNCTION_DECL)
5108     flags |= SYMBOL_FLAG_FUNCTION;
5109   if ((*targetm.binds_local_p) (decl))
5110     flags |= SYMBOL_FLAG_LOCAL;
5111   if ((*targetm.in_small_data_p) (decl))
5112     flags |= SYMBOL_FLAG_SMALL;
5113   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
5114     flags |= decl_tls_model (decl) << SYMBOL_FLAG_TLS_SHIFT;
5115   /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names?  Without
5116      being PUBLIC, the thing *must* be defined in this translation unit.
5117      Prevent this buglet from being propagated into rtl code as well.  */
5118   if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
5119     flags |= SYMBOL_FLAG_EXTERNAL;
5120
5121   SYMBOL_REF_FLAGS (symbol) = flags;
5122 }
5123
5124 /* By default, we do nothing for encode_section_info, so we need not
5125    do anything but discard the '*' marker.  */
5126
5127 const char *
5128 default_strip_name_encoding (const char *str)
5129 {
5130   return str + (*str == '*');
5131 }
5132
5133 /* Assume ELF-ish defaults, since that's pretty much the most liberal
5134    wrt cross-module name binding.  */
5135
5136 bool
5137 default_binds_local_p (tree exp)
5138 {
5139   return default_binds_local_p_1 (exp, flag_shlib);
5140 }
5141
5142 bool
5143 default_binds_local_p_1 (tree exp, int shlib)
5144 {
5145   bool local_p;
5146
5147   /* A non-decl is an entry in the constant pool.  */
5148   if (!DECL_P (exp))
5149     local_p = true;
5150   /* Static variables are always local.  */
5151   else if (! TREE_PUBLIC (exp))
5152     local_p = true;
5153   /* A variable is local if the user tells us so.  */
5154   else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5155     local_p = true;
5156   /* Otherwise, variables defined outside this object may not be local.  */
5157   else if (DECL_EXTERNAL (exp))
5158     local_p = false;
5159   /* Linkonce and weak data are never local.  */
5160   else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
5161     local_p = false;
5162   /* If PIC, then assume that any global name can be overridden by
5163      symbols resolved from other modules.  */
5164   else if (shlib)
5165     local_p = false;
5166   /* Uninitialized COMMON variable may be unified with symbols
5167      resolved from other modules.  */
5168   else if (DECL_COMMON (exp)
5169            && (DECL_INITIAL (exp) == NULL
5170                || DECL_INITIAL (exp) == error_mark_node))
5171     local_p = false;
5172   /* Otherwise we're left with initialized (or non-common) global data
5173      which is of necessity defined locally.  */
5174   else
5175     local_p = true;
5176
5177   return local_p;
5178 }
5179
5180 /* Determine whether or not a pointer mode is valid. Assume defaults
5181    of ptr_mode or Pmode - can be overridden.  */
5182 bool
5183 default_valid_pointer_mode (enum machine_mode mode)
5184 {
5185   return (mode == ptr_mode || mode == Pmode);
5186 }
5187
5188 /* Default function to output code that will globalize a label.  A
5189    target must define GLOBAL_ASM_OP or provide it's own function to
5190    globalize a label.  */
5191 #ifdef GLOBAL_ASM_OP
5192 void
5193 default_globalize_label (FILE * stream, const char *name)
5194 {
5195   fputs (GLOBAL_ASM_OP, stream);
5196   assemble_name (stream, name);
5197   putc ('\n', stream);
5198 }
5199 #endif /* GLOBAL_ASM_OP */
5200
5201 /* This is how to output an internal numbered label where PREFIX is
5202    the class of label and LABELNO is the number within the class.  */
5203
5204 void
5205 default_internal_label (FILE *stream, const char *prefix,
5206                         unsigned long labelno)
5207 {
5208   char *const buf = alloca (40 + strlen (prefix));
5209   ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
5210   ASM_OUTPUT_LABEL (stream, buf);
5211 }
5212
5213 /* This is the default behavior at the beginning of a file.  It's
5214    controlled by two other target-hook toggles.  */
5215 void
5216 default_file_start (void)
5217 {
5218   if (targetm.file_start_app_off && !flag_verbose_asm)
5219     fputs (ASM_APP_OFF, asm_out_file);
5220
5221   if (targetm.file_start_file_directive)
5222     output_file_directive (asm_out_file, main_input_filename);
5223 }
5224
5225 /* This is a generic routine suitable for use as TARGET_ASM_FILE_END
5226    which emits a special section directive used to indicate whether or
5227    not this object file needs an executable stack.  This is primarily
5228    a GNU extension to ELF but could be used on other targets.  */
5229 void
5230 file_end_indicate_exec_stack (void)
5231 {
5232   unsigned int flags = SECTION_DEBUG;
5233   if (trampolines_created)
5234     flags |= SECTION_CODE;
5235
5236   named_section_flags (".note.GNU-stack", flags);
5237 }
5238
5239 #include "gt-varasm.h"