OSDN Git Service

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