OSDN Git Service

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