OSDN Git Service

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