OSDN Git Service

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