OSDN Git Service

Merge in xfails from PR14107.
[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.  */
1689 void
1690 mark_referenced (tree id)
1691 {
1692   TREE_SYMBOL_REFERENCED (id) = 1;
1693 }
1694
1695 /* Set the symbol_referenced flag for DECL and notify callgraph.  */
1696 void
1697 mark_decl_referenced (tree decl)
1698 {
1699   if (TREE_CODE (decl) == FUNCTION_DECL)
1700     cgraph_mark_needed_node (cgraph_node (decl));
1701   else if (TREE_CODE (decl) == VAR_DECL)
1702     cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
1703   /* else do nothing - we can get various sorts of CST nodes here,
1704      which do not need to be marked.  */
1705 }
1706
1707 /* Output to FILE a reference to the assembler name of a C-level name NAME.
1708    If NAME starts with a *, the rest of NAME is output verbatim.
1709    Otherwise NAME is transformed in an implementation-defined way
1710    (usually by the addition of an underscore).
1711    Many macros in the tm file are defined to call this function.  */
1712
1713 void
1714 assemble_name (FILE *file, const char *name)
1715 {
1716   const char *real_name;
1717   tree id;
1718
1719   real_name = targetm.strip_name_encoding (name);
1720
1721   id = maybe_get_identifier (real_name);
1722   if (id)
1723     mark_referenced (id);
1724
1725   if (name[0] == '*')
1726     fputs (&name[1], file);
1727   else
1728     ASM_OUTPUT_LABELREF (file, name);
1729 }
1730
1731 /* Allocate SIZE bytes writable static space with a gensym name
1732    and return an RTX to refer to its address.  */
1733
1734 rtx
1735 assemble_static_space (unsigned HOST_WIDE_INT size)
1736 {
1737   char name[12];
1738   const char *namestring;
1739   rtx x;
1740
1741 #if 0
1742   if (flag_shared_data)
1743     data_section ();
1744 #endif
1745
1746   ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1747   ++const_labelno;
1748   namestring = ggc_strdup (name);
1749
1750   x = gen_rtx_SYMBOL_REF (Pmode, namestring);
1751   SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
1752
1753 #ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
1754   ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
1755                                  BIGGEST_ALIGNMENT);
1756 #else
1757 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
1758   ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
1759 #else
1760   {
1761     /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1762        so that each uninitialized object starts on such a boundary.  */
1763     /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL.  */
1764     unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
1765       = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1766          / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1767          * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1768     ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1769   }
1770 #endif
1771 #endif
1772   return x;
1773 }
1774
1775 /* Assemble the static constant template for function entry trampolines.
1776    This is done at most once per compilation.
1777    Returns an RTX for the address of the template.  */
1778
1779 static GTY(()) rtx initial_trampoline;
1780
1781 #ifdef TRAMPOLINE_TEMPLATE
1782 rtx
1783 assemble_trampoline_template (void)
1784 {
1785   char label[256];
1786   const char *name;
1787   int align;
1788   rtx symbol;
1789
1790   if (initial_trampoline)
1791     return initial_trampoline;
1792
1793   /* By default, put trampoline templates in read-only data section.  */
1794
1795 #ifdef TRAMPOLINE_SECTION
1796   TRAMPOLINE_SECTION ();
1797 #else
1798   readonly_data_section ();
1799 #endif
1800
1801   /* Write the assembler code to define one.  */
1802   align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
1803   if (align > 0)
1804     {
1805       ASM_OUTPUT_ALIGN (asm_out_file, align);
1806     }
1807
1808   targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
1809   TRAMPOLINE_TEMPLATE (asm_out_file);
1810
1811   /* Record the rtl to refer to it.  */
1812   ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1813   name = ggc_strdup (label);
1814   symbol = gen_rtx_SYMBOL_REF (Pmode, name);
1815   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
1816
1817   initial_trampoline = gen_rtx_MEM (BLKmode, symbol);
1818   set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
1819
1820   return initial_trampoline;
1821 }
1822 #endif
1823 \f
1824 /* A and B are either alignments or offsets.  Return the minimum alignment
1825    that may be assumed after adding the two together.  */
1826
1827 static inline unsigned
1828 min_align (unsigned int a, unsigned int b)
1829 {
1830   return (a | b) & -(a | b);
1831 }
1832
1833 /* Return the assembler directive for creating a given kind of integer
1834    object.  SIZE is the number of bytes in the object and ALIGNED_P
1835    indicates whether it is known to be aligned.  Return NULL if the
1836    assembly dialect has no such directive.
1837
1838    The returned string should be printed at the start of a new line and
1839    be followed immediately by the object's initial value.  */
1840
1841 const char *
1842 integer_asm_op (int size, int aligned_p)
1843 {
1844   struct asm_int_op *ops;
1845
1846   if (aligned_p)
1847     ops = &targetm.asm_out.aligned_op;
1848   else
1849     ops = &targetm.asm_out.unaligned_op;
1850
1851   switch (size)
1852     {
1853     case 1:
1854       return targetm.asm_out.byte_op;
1855     case 2:
1856       return ops->hi;
1857     case 4:
1858       return ops->si;
1859     case 8:
1860       return ops->di;
1861     case 16:
1862       return ops->ti;
1863     default:
1864       return NULL;
1865     }
1866 }
1867
1868 /* Use directive OP to assemble an integer object X.  Print OP at the
1869    start of the line, followed immediately by the value of X.  */
1870
1871 void
1872 assemble_integer_with_op (const char *op, rtx x)
1873 {
1874   fputs (op, asm_out_file);
1875   output_addr_const (asm_out_file, x);
1876   fputc ('\n', asm_out_file);
1877 }
1878
1879 /* The default implementation of the asm_out.integer target hook.  */
1880
1881 bool
1882 default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
1883                           unsigned int size ATTRIBUTE_UNUSED,
1884                           int aligned_p ATTRIBUTE_UNUSED)
1885 {
1886   const char *op = integer_asm_op (size, aligned_p);
1887   return op && (assemble_integer_with_op (op, x), true);
1888 }
1889
1890 /* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
1891    the alignment of the integer in bits.  Return 1 if we were able to output
1892    the constant, otherwise 0.  If FORCE is nonzero, abort if we can't output
1893    the constant.  */
1894
1895 bool
1896 assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
1897 {
1898   int aligned_p;
1899
1900   aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
1901
1902   /* See if the target hook can handle this kind of object.  */
1903   if (targetm.asm_out.integer (x, size, aligned_p))
1904     return true;
1905
1906   /* If the object is a multi-byte one, try splitting it up.  Split
1907      it into words it if is multi-word, otherwise split it into bytes.  */
1908   if (size > 1)
1909     {
1910       enum machine_mode omode, imode;
1911       unsigned int subalign;
1912       unsigned int subsize, i;
1913
1914       subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
1915       subalign = MIN (align, subsize * BITS_PER_UNIT);
1916       omode = mode_for_size (subsize * BITS_PER_UNIT, MODE_INT, 0);
1917       imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1918
1919       for (i = 0; i < size; i += subsize)
1920         {
1921           rtx partial = simplify_subreg (omode, x, imode, i);
1922           if (!partial || !assemble_integer (partial, subsize, subalign, 0))
1923             break;
1924         }
1925       if (i == size)
1926         return true;
1927
1928       /* If we've printed some of it, but not all of it, there's no going
1929          back now.  */
1930       if (i > 0)
1931         abort ();
1932     }
1933
1934   if (force)
1935     abort ();
1936
1937   return false;
1938 }
1939 \f
1940 void
1941 assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align)
1942 {
1943   long data[4];
1944   int i;
1945   int bitsize, nelts, nunits, units_per;
1946
1947   /* This is hairy.  We have a quantity of known size.  real_to_target
1948      will put it into an array of *host* longs, 32 bits per element
1949      (even if long is more than 32 bits).  We need to determine the
1950      number of array elements that are occupied (nelts) and the number
1951      of *target* min-addressable units that will be occupied in the
1952      object file (nunits).  We cannot assume that 32 divides the
1953      mode's bitsize (size * BITS_PER_UNIT) evenly.
1954
1955      size * BITS_PER_UNIT is used here to make sure that padding bits
1956      (which might appear at either end of the value; real_to_target
1957      will include the padding bits in its output array) are included.  */
1958
1959   nunits = GET_MODE_SIZE (mode);
1960   bitsize = nunits * BITS_PER_UNIT;
1961   nelts = CEIL (bitsize, 32);
1962   units_per = 32 / BITS_PER_UNIT;
1963
1964   real_to_target (data, &d, mode);
1965
1966   /* Put out the first word with the specified alignment.  */
1967   assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1);
1968   nunits -= units_per;
1969
1970   /* Subsequent words need only 32-bit alignment.  */
1971   align = min_align (align, 32);
1972
1973   for (i = 1; i < nelts; i++)
1974     {
1975       assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1);
1976       nunits -= units_per;
1977     }
1978 }
1979 \f
1980 /* Given an expression EXP with a constant value,
1981    reduce it to the sum of an assembler symbol and an integer.
1982    Store them both in the structure *VALUE.
1983    Abort if EXP does not reduce.  */
1984
1985 struct addr_const GTY(())
1986 {
1987   rtx base;
1988   HOST_WIDE_INT offset;
1989 };
1990
1991 static void
1992 decode_addr_const (tree exp, struct addr_const *value)
1993 {
1994   tree target = TREE_OPERAND (exp, 0);
1995   int offset = 0;
1996   rtx x;
1997
1998   while (1)
1999     {
2000       if (TREE_CODE (target) == COMPONENT_REF
2001           && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
2002
2003         {
2004           offset += int_byte_position (TREE_OPERAND (target, 1));
2005           target = TREE_OPERAND (target, 0);
2006         }
2007       else if (TREE_CODE (target) == ARRAY_REF
2008                || TREE_CODE (target) == ARRAY_RANGE_REF)
2009         {
2010           offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2011                      * tree_low_cst (TREE_OPERAND (target, 1), 0));
2012           target = TREE_OPERAND (target, 0);
2013         }
2014       else
2015         break;
2016     }
2017
2018   switch (TREE_CODE (target))
2019     {
2020     case VAR_DECL:
2021     case FUNCTION_DECL:
2022       x = DECL_RTL (target);
2023       break;
2024
2025     case LABEL_DECL:
2026       x = gen_rtx_MEM (FUNCTION_MODE,
2027                        gen_rtx_LABEL_REF (VOIDmode, force_label_rtx (target)));
2028       break;
2029
2030     case REAL_CST:
2031     case STRING_CST:
2032     case COMPLEX_CST:
2033     case CONSTRUCTOR:
2034     case INTEGER_CST:
2035       x = output_constant_def (target, 1);
2036       break;
2037
2038     default:
2039       abort ();
2040     }
2041
2042   if (GET_CODE (x) != MEM)
2043     abort ();
2044   x = XEXP (x, 0);
2045
2046   value->base = x;
2047   value->offset = offset;
2048 }
2049 \f
2050 /* Uniquize all constants that appear in memory.
2051    Each constant in memory thus far output is recorded
2052    in `const_desc_table'.  */
2053
2054 struct constant_descriptor_tree GTY(())
2055 {
2056   /* A MEM for the constant.  */
2057   rtx rtl;
2058
2059   /* The value of the constant.  */
2060   tree value;
2061 };
2062
2063 static GTY((param_is (struct constant_descriptor_tree)))
2064      htab_t const_desc_htab;
2065
2066 static struct constant_descriptor_tree * build_constant_desc (tree);
2067 static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
2068
2069 /* Compute a hash code for a constant expression.  */
2070
2071 static hashval_t
2072 const_desc_hash (const void *ptr)
2073 {
2074   return const_hash_1 (((struct constant_descriptor_tree *)ptr)->value);
2075 }
2076
2077 static hashval_t
2078 const_hash_1 (const tree exp)
2079 {
2080   const char *p;
2081   hashval_t hi;
2082   int len, i;
2083   enum tree_code code = TREE_CODE (exp);
2084
2085   /* Either set P and LEN to the address and len of something to hash and
2086      exit the switch or return a value.  */
2087
2088   switch (code)
2089     {
2090     case INTEGER_CST:
2091       p = (char *) &TREE_INT_CST (exp);
2092       len = sizeof TREE_INT_CST (exp);
2093       break;
2094
2095     case REAL_CST:
2096       return real_hash (TREE_REAL_CST_PTR (exp));
2097
2098     case STRING_CST:
2099       p = TREE_STRING_POINTER (exp);
2100       len = TREE_STRING_LENGTH (exp);
2101       break;
2102
2103     case COMPLEX_CST:
2104       return (const_hash_1 (TREE_REALPART (exp)) * 5
2105               + const_hash_1 (TREE_IMAGPART (exp)));
2106
2107     case CONSTRUCTOR:
2108       if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2109         {
2110           char *tmp;
2111
2112           len = int_size_in_bytes (TREE_TYPE (exp));
2113           tmp = alloca (len);
2114           get_set_constructor_bytes (exp, (unsigned char *) tmp, len);
2115           p = tmp;
2116           break;
2117         }
2118       else
2119         {
2120           tree link;
2121
2122           hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
2123
2124           for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2125             if (TREE_VALUE (link))
2126               hi = hi * 603 + const_hash_1 (TREE_VALUE (link));
2127
2128           return hi;
2129         }
2130
2131     case ADDR_EXPR:
2132     case FDESC_EXPR:
2133       {
2134         struct addr_const value;
2135
2136         decode_addr_const (exp, &value);
2137         if (GET_CODE (value.base) == SYMBOL_REF)
2138           {
2139             /* Don't hash the address of the SYMBOL_REF;
2140                only use the offset and the symbol name.  */
2141             hi = value.offset;
2142             p = XSTR (value.base, 0);
2143             for (i = 0; p[i] != 0; i++)
2144               hi = ((hi * 613) + (unsigned) (p[i]));
2145           }
2146         else if (GET_CODE (value.base) == LABEL_REF)
2147           hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2148         else
2149           abort ();
2150       }
2151       return hi;
2152
2153     case PLUS_EXPR:
2154     case MINUS_EXPR:
2155       return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
2156               + const_hash_1 (TREE_OPERAND (exp, 1)));
2157
2158     case NOP_EXPR:
2159     case CONVERT_EXPR:
2160     case NON_LVALUE_EXPR:
2161       return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
2162
2163     default:
2164       /* A language specific constant. Just hash the code.  */
2165       return code;
2166     }
2167
2168   /* Compute hashing function.  */
2169   hi = len;
2170   for (i = 0; i < len; i++)
2171     hi = ((hi * 613) + (unsigned) (p[i]));
2172
2173   return hi;
2174 }
2175
2176 /* Wrapper of compare_constant, for the htab interface.  */
2177 static int
2178 const_desc_eq (const void *p1, const void *p2)
2179 {
2180   return compare_constant (((struct constant_descriptor_tree *)p1)->value,
2181                            ((struct constant_descriptor_tree *)p2)->value);
2182 }
2183
2184 /* Compare t1 and t2, and return 1 only if they are known to result in
2185    the same bit pattern on output.  */
2186
2187 static int
2188 compare_constant (const tree t1, const tree t2)
2189 {
2190   enum tree_code typecode;
2191
2192   if (t1 == NULL_TREE)
2193     return t2 == NULL_TREE;
2194   if (t2 == NULL_TREE)
2195     return 0;
2196
2197   if (TREE_CODE (t1) != TREE_CODE (t2))
2198     return 0;
2199
2200   switch (TREE_CODE (t1))
2201     {
2202     case INTEGER_CST:
2203       /* Integer constants are the same only if the same width of type.  */
2204       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2205         return 0;
2206       return tree_int_cst_equal (t1, t2);
2207
2208     case REAL_CST:
2209       /* Real constants are the same only if the same width of type.  */
2210       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2211         return 0;
2212
2213       return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2214
2215     case STRING_CST:
2216       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2217         return 0;
2218
2219       return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2220               && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2221                          TREE_STRING_LENGTH (t1)));
2222
2223     case COMPLEX_CST:
2224       return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2225               && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2226
2227     case CONSTRUCTOR:
2228       typecode = TREE_CODE (TREE_TYPE (t1));
2229       if (typecode != TREE_CODE (TREE_TYPE (t2)))
2230         return 0;
2231
2232       if (typecode == SET_TYPE)
2233         {
2234           int len = int_size_in_bytes (TREE_TYPE (t2));
2235           unsigned char *tmp1, *tmp2;
2236
2237           if (int_size_in_bytes (TREE_TYPE (t1)) != len)
2238             return 0;
2239
2240           tmp1 = alloca (len);
2241           tmp2 = alloca (len);
2242
2243           if (get_set_constructor_bytes (t1, tmp1, len) != NULL_TREE)
2244             return 0;
2245           if (get_set_constructor_bytes (t2, tmp2, len) != NULL_TREE)
2246             return 0;
2247
2248           return memcmp (tmp1, tmp2, len) == 0;
2249         }
2250       else
2251         {
2252           tree l1, l2;
2253
2254           if (typecode == ARRAY_TYPE)
2255             {
2256               HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2257               /* For arrays, check that the sizes all match.  */
2258               if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2259                   || size_1 == -1
2260                   || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
2261                 return 0;
2262             }
2263           else
2264             {
2265               /* For record and union constructors, require exact type
2266                  equality.  */
2267               if (TREE_TYPE (t1) != TREE_TYPE (t2))
2268                 return 0;
2269             }
2270
2271           for (l1 = CONSTRUCTOR_ELTS (t1), l2 = CONSTRUCTOR_ELTS (t2);
2272                l1 && l2;
2273                l1 = TREE_CHAIN (l1), l2 = TREE_CHAIN (l2))
2274             {
2275               /* Check that each value is the same...  */
2276               if (! compare_constant (TREE_VALUE (l1), TREE_VALUE (l2)))
2277                 return 0;
2278               /* ... and that they apply to the same fields!  */
2279               if (typecode == ARRAY_TYPE)
2280                 {
2281                   if (! compare_constant (TREE_PURPOSE (l1),
2282                                           TREE_PURPOSE (l2)))
2283                     return 0;
2284                 }
2285               else
2286                 {
2287                   if (TREE_PURPOSE (l1) != TREE_PURPOSE (l2))
2288                     return 0;
2289                 }
2290             }
2291
2292           return l1 == NULL_TREE && l2 == NULL_TREE;
2293         }
2294
2295     case ADDR_EXPR:
2296     case FDESC_EXPR:
2297       {
2298         struct addr_const value1, value2;
2299
2300         decode_addr_const (t1, &value1);
2301         decode_addr_const (t2, &value2);
2302         return (value1.offset == value2.offset
2303                 && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
2304       }
2305
2306     case PLUS_EXPR:
2307     case MINUS_EXPR:
2308     case RANGE_EXPR:
2309       return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2310               && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
2311
2312     case NOP_EXPR:
2313     case CONVERT_EXPR:
2314     case NON_LVALUE_EXPR:
2315     case VIEW_CONVERT_EXPR:
2316       return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2317
2318     default:
2319       {
2320         tree nt1, nt2;
2321         nt1 = lang_hooks.expand_constant (t1);
2322         nt2 = lang_hooks.expand_constant (t2);
2323         if (nt1 != t1 || nt2 != t2)
2324           return compare_constant (nt1, nt2);
2325         else
2326           return 0;
2327       }
2328     }
2329
2330   /* Should not get here.  */
2331   abort ();
2332 }
2333 \f
2334 /* Make a copy of the whole tree structure for a constant.  This
2335    handles the same types of nodes that compare_constant handles.  */
2336
2337 static tree
2338 copy_constant (tree exp)
2339 {
2340   switch (TREE_CODE (exp))
2341     {
2342     case ADDR_EXPR:
2343       /* For ADDR_EXPR, we do not want to copy the decl whose address
2344          is requested.  We do want to copy constants though.  */
2345       if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
2346         return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2347                        copy_constant (TREE_OPERAND (exp, 0)));
2348       else
2349         return copy_node (exp);
2350
2351     case INTEGER_CST:
2352     case REAL_CST:
2353     case STRING_CST:
2354       return copy_node (exp);
2355
2356     case COMPLEX_CST:
2357       return build_complex (TREE_TYPE (exp),
2358                             copy_constant (TREE_REALPART (exp)),
2359                             copy_constant (TREE_IMAGPART (exp)));
2360
2361     case PLUS_EXPR:
2362     case MINUS_EXPR:
2363       return build (TREE_CODE (exp), TREE_TYPE (exp),
2364                     copy_constant (TREE_OPERAND (exp, 0)),
2365                     copy_constant (TREE_OPERAND (exp, 1)));
2366
2367     case NOP_EXPR:
2368     case CONVERT_EXPR:
2369     case NON_LVALUE_EXPR:
2370     case VIEW_CONVERT_EXPR:
2371       return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2372                      copy_constant (TREE_OPERAND (exp, 0)));
2373
2374     case CONSTRUCTOR:
2375       {
2376         tree copy = copy_node (exp);
2377         tree list = copy_list (CONSTRUCTOR_ELTS (exp));
2378         tree tail;
2379
2380         CONSTRUCTOR_ELTS (copy) = list;
2381         for (tail = list; tail; tail = TREE_CHAIN (tail))
2382           TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
2383         if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2384           for (tail = list; tail; tail = TREE_CHAIN (tail))
2385             TREE_PURPOSE (tail) = copy_constant (TREE_PURPOSE (tail));
2386
2387         return copy;
2388       }
2389
2390     default:
2391       {
2392         tree t;
2393         t = lang_hooks.expand_constant (exp);
2394         if (t != exp)
2395           return copy_constant (t);
2396         else
2397           abort ();
2398       }
2399     }
2400 }
2401 \f
2402 /* Subroutine of output_constant_def:
2403    No constant equal to EXP is known to have been output.
2404    Make a constant descriptor to enter EXP in the hash table.
2405    Assign the label number and construct RTL to refer to the
2406    constant's location in memory.
2407    Caller is responsible for updating the hash table.  */
2408
2409 static struct constant_descriptor_tree *
2410 build_constant_desc (tree exp)
2411 {
2412   rtx symbol;
2413   rtx rtl;
2414   char label[256];
2415   int labelno;
2416   struct constant_descriptor_tree *desc;
2417
2418   desc = ggc_alloc (sizeof (*desc));
2419   desc->value = copy_constant (exp);
2420
2421   /* Propagate marked-ness to copied constant.  */
2422   if (flag_mudflap && mf_marked_p (exp))
2423     mf_mark (desc->value);
2424
2425   /* Create a string containing the label name, in LABEL.  */
2426   labelno = const_labelno++;
2427   ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
2428
2429   /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
2430   symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2431   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2432   SYMBOL_REF_DECL (symbol) = desc->value;
2433   TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2434
2435   rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
2436   set_mem_attributes (rtl, exp, 1);
2437   set_mem_alias_set (rtl, 0);
2438   set_mem_alias_set (rtl, const_alias_set);
2439
2440   /* Set flags or add text to the name to record information, such as
2441      that it is a local symbol.  If the name is changed, the macro
2442      ASM_OUTPUT_LABELREF will have to know how to strip this
2443      information.  This call might invalidate our local variable
2444      SYMBOL; we can't use it afterward.  */
2445
2446   targetm.encode_section_info (exp, rtl, true);
2447
2448   desc->rtl = rtl;
2449
2450   return desc;
2451 }
2452
2453 /* Return an rtx representing a reference to constant data in memory
2454    for the constant expression EXP.
2455
2456    If assembler code for such a constant has already been output,
2457    return an rtx to refer to it.
2458    Otherwise, output such a constant in memory
2459    and generate an rtx for it.
2460
2461    If DEFER is nonzero, this constant can be deferred and output only
2462    if referenced in the function after all optimizations.
2463
2464    `const_desc_table' records which constants already have label strings.  */
2465
2466 rtx
2467 output_constant_def (tree exp, int defer)
2468 {
2469   struct constant_descriptor_tree *desc;
2470   struct constant_descriptor_tree key;
2471   void **loc;
2472
2473   /* Look up EXP in the table of constant descriptors.  If we didn't find
2474      it, create a new one.  */
2475   key.value = exp;
2476   loc = htab_find_slot (const_desc_htab, &key, INSERT);
2477
2478   desc = *loc;
2479   if (desc == 0)
2480     {
2481       desc = build_constant_desc (exp);
2482       *loc = desc;
2483     }
2484
2485   maybe_output_constant_def_contents (desc, defer);
2486   return desc->rtl;
2487 }
2488
2489 /* Subroutine of output_constant_def: Decide whether or not we need to
2490    output the constant DESC now, and if so, do it.  */
2491 static void
2492 maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
2493                                     int defer)
2494 {
2495   rtx symbol = XEXP (desc->rtl, 0);
2496   tree exp = desc->value;
2497
2498   if (flag_syntax_only)
2499     return;
2500
2501   if (TREE_ASM_WRITTEN (exp))
2502     /* Already output; don't do it again.  */
2503     return;
2504
2505   /* We can always defer constants as long as the context allows
2506      doing so.  */
2507   if (defer)
2508     {
2509       /* Increment n_deferred_constants if it exists.  It needs to be at
2510          least as large as the number of constants actually referred to
2511          by the function.  If it's too small we'll stop looking too early
2512          and fail to emit constants; if it's too large we'll only look
2513          through the entire function when we could have stopped earlier.  */
2514       if (cfun)
2515         n_deferred_constants++;
2516       return;
2517     }
2518
2519   output_constant_def_contents (symbol);
2520 }
2521
2522 /* We must output the constant data referred to by SYMBOL; do so.  */
2523
2524 static void
2525 output_constant_def_contents (rtx symbol)
2526 {
2527   tree exp = SYMBOL_REF_DECL (symbol);
2528   const char *label = XSTR (symbol, 0);
2529   HOST_WIDE_INT size;
2530
2531   /* Make sure any other constants whose addresses appear in EXP
2532      are assigned label numbers.  */
2533   int reloc = compute_reloc_for_constant (exp);
2534
2535   /* Align the location counter as required by EXP's data type.  */
2536   int align = TYPE_ALIGN (TREE_TYPE (exp));
2537 #ifdef CONSTANT_ALIGNMENT
2538   align = CONSTANT_ALIGNMENT (exp, align);
2539 #endif
2540
2541   output_addressed_constants (exp);
2542
2543   /* We are no longer deferring this constant.  */
2544   TREE_ASM_WRITTEN (exp) = 1;
2545
2546   if (IN_NAMED_SECTION (exp))
2547     named_section (exp, NULL, reloc);
2548   else
2549     targetm.asm_out.select_section (exp, reloc, align);
2550
2551   if (align > BITS_PER_UNIT)
2552     {
2553       ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2554     }
2555
2556   size = int_size_in_bytes (TREE_TYPE (exp));
2557   if (TREE_CODE (exp) == STRING_CST)
2558     size = MAX (TREE_STRING_LENGTH (exp), size);
2559
2560   /* Do any machine/system dependent processing of the constant.  */
2561 #ifdef ASM_DECLARE_CONSTANT_NAME
2562   ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
2563 #else
2564   /* Standard thing is just output label for the constant.  */
2565   ASM_OUTPUT_LABEL (asm_out_file, label);
2566 #endif /* ASM_DECLARE_CONSTANT_NAME */
2567
2568   /* Output the value of EXP.  */
2569   output_constant (exp, size, align);
2570   if (flag_mudflap)
2571     mudflap_enqueue_constant (exp);
2572 }
2573
2574 /* Look up EXP in the table of constant descriptors.  Return the rtl
2575    if it has been emitted, else null.  */
2576
2577 rtx
2578 lookup_constant_def (tree exp)
2579 {
2580   struct constant_descriptor_tree *desc;
2581   struct constant_descriptor_tree key;
2582
2583   key.value = exp;
2584   desc = htab_find (const_desc_htab, &key);
2585
2586   return (desc ? desc->rtl : NULL_RTX);
2587 }
2588 \f
2589 /* Used in the hash tables to avoid outputting the same constant
2590    twice.  Unlike 'struct constant_descriptor_tree', RTX constants
2591    are output once per function, not once per file.  */
2592 /* ??? Only a few targets need per-function constant pools.  Most
2593    can use one per-file pool.  Should add a targetm bit to tell the
2594    difference.  */
2595
2596 struct rtx_constant_pool GTY(())
2597 {
2598   /* Pointers to first and last constant in pool, as ordered by offset.  */
2599   struct constant_descriptor_rtx *first;
2600   struct constant_descriptor_rtx *last;
2601
2602   /* Hash facility for making memory-constants from constant rtl-expressions.
2603      It is used on RISC machines where immediate integer arguments and
2604      constant addresses are restricted so that such constants must be stored
2605      in memory.  */
2606   htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
2607   htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_sym_htab;
2608
2609   /* Current offset in constant pool (does not include any
2610      machine-specific header).  */
2611   HOST_WIDE_INT offset;
2612 };
2613
2614 struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
2615 {
2616   struct constant_descriptor_rtx *next;
2617   rtx mem;
2618   rtx sym;
2619   rtx constant;
2620   HOST_WIDE_INT offset;
2621   hashval_t hash;
2622   enum machine_mode mode;
2623   unsigned int align;
2624   int labelno;
2625   int mark;
2626 };
2627
2628 /* Hash and compare functions for const_rtx_htab.  */
2629
2630 static hashval_t
2631 const_desc_rtx_hash (const void *ptr)
2632 {
2633   const struct constant_descriptor_rtx *desc = ptr;
2634   return desc->hash;
2635 }
2636
2637 static int
2638 const_desc_rtx_eq (const void *a, const void *b)
2639 {
2640   const struct constant_descriptor_rtx *x = a;
2641   const struct constant_descriptor_rtx *y = b;
2642
2643   if (x->mode != y->mode)
2644     return 0;
2645   return rtx_equal_p (x->constant, y->constant);
2646 }
2647
2648 /* Hash and compare functions for const_rtx_sym_htab.  */
2649
2650 static hashval_t
2651 const_desc_rtx_sym_hash (const void *ptr)
2652 {
2653   const struct constant_descriptor_rtx *desc = ptr;
2654   return htab_hash_string (XSTR (desc->sym, 0));
2655 }
2656
2657 static int
2658 const_desc_rtx_sym_eq (const void *a, const void *b)
2659 {
2660   const struct constant_descriptor_rtx *x = a;
2661   const struct constant_descriptor_rtx *y = b;
2662   return XSTR (x->sym, 0) == XSTR (y->sym, 0);
2663 }
2664
2665 /* This is the worker function for const_rtx_hash, called via for_each_rtx.  */
2666
2667 static int
2668 const_rtx_hash_1 (rtx *xp, void *data)
2669 {
2670   unsigned HOST_WIDE_INT hwi;
2671   enum machine_mode mode;
2672   enum rtx_code code;
2673   hashval_t h, *hp;
2674   rtx x;
2675
2676   x = *xp;
2677   code = GET_CODE (x);
2678   mode = GET_MODE (x);
2679   h = (hashval_t) code * 1048573 + mode;
2680
2681   switch (code)
2682     {
2683     case CONST_INT:
2684       hwi = INTVAL (x);
2685     fold_hwi:
2686       {
2687         const int shift = sizeof (hashval_t) * CHAR_BIT;
2688         const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
2689         int i;
2690
2691         h ^= (hashval_t) hwi;
2692         for (i = 1; i < n; ++i)
2693           {
2694             hwi >>= shift;
2695             h ^= (hashval_t) hwi;
2696           }
2697       }
2698       break;
2699
2700     case CONST_DOUBLE:
2701       if (mode == VOIDmode)
2702         {
2703           hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
2704           goto fold_hwi;
2705         }
2706       else
2707         h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
2708       break;
2709
2710     case SYMBOL_REF:
2711       h ^= htab_hash_string (XSTR (x, 0));
2712       break;
2713
2714     case LABEL_REF:
2715       h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
2716       break;
2717
2718     case UNSPEC:
2719     case UNSPEC_VOLATILE:
2720       h = h * 251 + XINT (x, 1);
2721       break;
2722
2723     default:
2724       break;
2725     }
2726
2727   hp = data;
2728   *hp = *hp * 509 + h;
2729   return 0;
2730 }
2731
2732 /* Compute a hash value for X, which should be a constant.  */
2733
2734 static hashval_t
2735 const_rtx_hash (rtx x)
2736 {
2737   hashval_t h = 0;
2738   for_each_rtx (&x, const_rtx_hash_1, &h);
2739   return h;
2740 }
2741
2742 \f
2743 /* Initialize constant pool hashing for a new function.  */
2744
2745 void
2746 init_varasm_status (struct function *f)
2747 {
2748   struct varasm_status *p;
2749   struct rtx_constant_pool *pool;
2750
2751   p = ggc_alloc (sizeof (struct varasm_status));
2752   f->varasm = p;
2753
2754   pool = ggc_alloc (sizeof (struct rtx_constant_pool));
2755   p->pool = pool;
2756   p->deferred_constants = 0;
2757
2758   pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
2759                                           const_desc_rtx_eq, NULL);
2760   pool->const_rtx_sym_htab = htab_create_ggc (31, const_desc_rtx_sym_hash,
2761                                               const_desc_rtx_sym_eq, NULL);
2762   pool->first = pool->last = NULL;
2763   pool->offset = 0;
2764 }
2765 \f
2766 /* Given a MINUS expression, simplify it if both sides
2767    include the same symbol.  */
2768
2769 rtx
2770 simplify_subtraction (rtx x)
2771 {
2772   rtx r = simplify_rtx (x);
2773   return r ? r : x;
2774 }
2775 \f
2776 /* Given a constant rtx X, make (or find) a memory constant for its value
2777    and return a MEM rtx to refer to it in memory.  */
2778
2779 rtx
2780 force_const_mem (enum machine_mode mode, rtx x)
2781 {
2782   struct constant_descriptor_rtx *desc, tmp;
2783   struct rtx_constant_pool *pool = cfun->varasm->pool;
2784   char label[256];
2785   rtx def, symbol;
2786   hashval_t hash;
2787   unsigned int align;
2788   void **slot;
2789
2790   /* If we're not allowed to drop X into the constant pool, don't.  */
2791   if (targetm.cannot_force_const_mem (x))
2792     return NULL_RTX;
2793
2794   /* Lookup the value in the hashtable.  */
2795   tmp.constant = x;
2796   tmp.mode = mode;
2797   hash = const_rtx_hash (x);
2798   slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
2799   desc = *slot;
2800   
2801   /* If the constant was already present, return its memory.  */
2802   if (desc)
2803     return copy_rtx (desc->mem);
2804
2805   /* Otherwise, create a new descriptor.  */
2806   desc = ggc_alloc (sizeof (*desc));
2807   *slot = desc;
2808
2809   /* Align the location counter as required by EXP's data type.  */
2810   align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
2811 #ifdef CONSTANT_ALIGNMENT
2812   {
2813     tree type = lang_hooks.types.type_for_mode (mode, 0);
2814     if (type != NULL_TREE)
2815       align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
2816   }
2817 #endif
2818
2819   pool->offset += (align / BITS_PER_UNIT) - 1;
2820   pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
2821
2822   desc->next = NULL;
2823   desc->constant = tmp.constant;
2824   desc->offset = pool->offset;
2825   desc->hash = hash;
2826   desc->mode = mode;
2827   desc->align = align;
2828   desc->labelno = const_labelno;
2829   desc->mark = 0;
2830
2831   pool->offset += GET_MODE_SIZE (mode);
2832   if (pool->last)
2833     pool->last->next = desc;
2834   else
2835     pool->first = pool->last = desc;
2836   pool->last = desc;
2837
2838   /* Create a string containing the label name, in LABEL.  */
2839   ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2840   ++const_labelno;
2841
2842   /* Construct the SYMBOL_REF.  Make sure to mark it as belonging to
2843      the constants pool.  */
2844   desc->sym = symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2845   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2846   CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2847   current_function_uses_const_pool = 1;
2848
2849   /* Insert the descriptor into the symbol cross-reference table too.  */
2850   slot = htab_find_slot (pool->const_rtx_sym_htab, desc, INSERT);
2851   if (*slot)
2852     abort ();
2853   *slot = desc;
2854
2855   /* Construct the MEM.  */
2856   desc->mem = def = gen_rtx_MEM (mode, symbol);
2857   set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
2858   RTX_UNCHANGING_P (def) = 1;
2859
2860   /* If we're dropping a label to the constant pool, make sure we
2861      don't delete it.  */
2862   if (GET_CODE (x) == LABEL_REF)
2863     LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
2864
2865   return copy_rtx (def);
2866 }
2867 \f
2868 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
2869    the corresponding constant_descriptor_rtx structure.  */
2870
2871 static struct constant_descriptor_rtx *
2872 find_pool_constant (struct rtx_constant_pool *pool, rtx sym)
2873 {
2874   struct constant_descriptor_rtx tmp;
2875   tmp.sym = sym;
2876   return htab_find (pool->const_rtx_sym_htab, &tmp);
2877 }
2878
2879 /* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
2880
2881 rtx
2882 get_pool_constant (rtx addr)
2883 {
2884   return find_pool_constant (cfun->varasm->pool, addr)->constant;
2885 }
2886
2887 /* Given a constant pool SYMBOL_REF, return the corresponding constant
2888    and whether it has been output or not.  */
2889
2890 rtx
2891 get_pool_constant_mark (rtx addr, bool *pmarked)
2892 {
2893   struct constant_descriptor_rtx *desc;
2894
2895   desc = find_pool_constant (cfun->varasm->pool, addr);
2896   *pmarked = (desc->mark != 0);
2897   return desc->constant;
2898 }
2899
2900 /* Likewise, but for the constant pool of a specific function.  */
2901
2902 rtx
2903 get_pool_constant_for_function (struct function *f, rtx addr)
2904 {
2905   return find_pool_constant (f->varasm->pool, addr)->constant;
2906 }
2907
2908 /* Similar, return the mode.  */
2909
2910 enum machine_mode
2911 get_pool_mode (rtx addr)
2912 {
2913   return find_pool_constant (cfun->varasm->pool, addr)->mode;
2914 }
2915
2916 enum machine_mode
2917 get_pool_mode_for_function (struct function *f, rtx addr)
2918 {
2919   return find_pool_constant (f->varasm->pool, addr)->mode;
2920 }
2921
2922 /* Similar, return the offset in the constant pool.  */
2923
2924 int
2925 get_pool_offset (rtx addr)
2926 {
2927   return find_pool_constant (cfun->varasm->pool, addr)->offset;
2928 }
2929
2930 /* Return the size of the constant pool.  */
2931
2932 int
2933 get_pool_size (void)
2934 {
2935   return cfun->varasm->pool->offset;
2936 }
2937 \f
2938 /* Worker function for output_constant_pool_1.  Emit assembly for X
2939    in MODE with known alignment ALIGN.  */
2940
2941 static void
2942 output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
2943 {
2944   switch (GET_MODE_CLASS (mode))
2945     {
2946     case MODE_FLOAT:
2947       if (GET_CODE (x) != CONST_DOUBLE)
2948         abort ();
2949       else
2950         {
2951           REAL_VALUE_TYPE r;
2952           REAL_VALUE_FROM_CONST_DOUBLE (r, x);
2953           assemble_real (r, mode, align);
2954         }
2955       break;
2956
2957     case MODE_INT:
2958     case MODE_PARTIAL_INT:
2959       assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
2960       break;
2961
2962     case MODE_VECTOR_FLOAT:
2963     case MODE_VECTOR_INT:
2964       {
2965         int i, units;
2966         enum machine_mode submode = GET_MODE_INNER (mode);
2967         unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
2968
2969         if (GET_CODE (x) != CONST_VECTOR)
2970           abort ();
2971         units = CONST_VECTOR_NUNITS (x);
2972
2973         for (i = 0; i < units; i++)
2974           {
2975             rtx elt = CONST_VECTOR_ELT (x, i);
2976             output_constant_pool_2 (submode, elt, i ? subalign : align);
2977           }
2978       }
2979       break;
2980
2981     default:
2982       abort ();
2983     }
2984 }
2985
2986 /* Worker function for output_constant_pool.  Emit POOL.  */
2987
2988 static void
2989 output_constant_pool_1 (struct constant_descriptor_rtx *desc)
2990 {
2991   rtx x, tmp;
2992
2993   if (!desc->mark)
2994     return;
2995   x = desc->constant;
2996
2997   /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
2998      whose CODE_LABEL has been deleted.  This can occur if a jump table
2999      is eliminated by optimization.  If so, write a constant of zero
3000      instead.  Note that this can also happen by turning the
3001      CODE_LABEL into a NOTE.  */
3002   /* ??? This seems completely and utterly wrong.  Certainly it's
3003      not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3004      functioning even with INSN_DELETED_P and friends.  */
3005
3006   tmp = x;
3007   switch (GET_CODE (x))
3008     {
3009     case CONST:
3010       if (GET_CODE (XEXP (x, 0)) != PLUS
3011           || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3012         break;
3013       tmp = XEXP (XEXP (x, 0), 0);
3014       /* FALLTHRU  */
3015
3016     case LABEL_REF:
3017       tmp = XEXP (x, 0);
3018       if (INSN_DELETED_P (tmp)
3019           || (GET_CODE (tmp) == NOTE
3020               && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_DELETED))
3021         {
3022           abort ();
3023           x = const0_rtx;
3024         }
3025       break;
3026
3027     default:
3028       break;
3029     }
3030
3031   /* First switch to correct section.  */
3032   targetm.asm_out.select_rtx_section (desc->mode, x, desc->align);
3033
3034 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3035   ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3036                                  desc->align, desc->labelno, done);
3037 #endif
3038
3039   assemble_align (desc->align);
3040
3041   /* Output the label.  */
3042   targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
3043
3044   /* Output the data.  */
3045   output_constant_pool_2 (desc->mode, x, desc->align);
3046
3047   /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3048      sections have proper size.  */
3049   if (desc->align > GET_MODE_BITSIZE (desc->mode)
3050       && in_section == in_named
3051       && get_named_section_flags (in_named_name) & SECTION_MERGE)
3052     assemble_align (desc->align);
3053
3054 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3055  done:
3056 #endif
3057   return;
3058 }
3059
3060 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3061    to as used.  Emit referenced deferred strings.  This function can
3062    be used with for_each_rtx to mark all SYMBOL_REFs in an rtx.  */
3063
3064 static int
3065 mark_constant (rtx *current_rtx, void *data)
3066 {
3067   struct rtx_constant_pool *pool = data;
3068   rtx x = *current_rtx;
3069
3070   if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3071     return 0;
3072
3073   if (CONSTANT_POOL_ADDRESS_P (x))
3074     {
3075       struct constant_descriptor_rtx *desc = find_pool_constant (pool, x);
3076       if (desc->mark == 0)
3077         {
3078           desc->mark = 1;
3079           for_each_rtx (&desc->constant, mark_constant, pool);
3080         }
3081     }
3082   else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3083     {
3084       tree exp = SYMBOL_REF_DECL (x);
3085       if (!TREE_ASM_WRITTEN (exp))
3086         {
3087           n_deferred_constants--;
3088           output_constant_def_contents (x);
3089         }
3090     }
3091
3092   return -1;
3093
3094
3095 /* Look through appropriate parts of INSN, marking all entries in the
3096    constant pool which are actually being used.  Entries that are only
3097    referenced by other constants are also marked as used.  Emit
3098    deferred strings that are used.  */
3099
3100 static void
3101 mark_constants (struct rtx_constant_pool *pool, rtx insn)
3102 {
3103   if (!INSN_P (insn))
3104     return;
3105
3106   /* Insns may appear inside a SEQUENCE.  Only check the patterns of
3107      insns, not any notes that may be attached.  We don't want to mark
3108      a constant just because it happens to appear in a REG_EQUIV note.  */
3109   if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3110     {
3111       rtx seq = PATTERN (insn);
3112       int i, n = XVECLEN (seq, 0);
3113       for (i = 0; i < n; ++i)
3114         {
3115           rtx subinsn = XVECEXP (seq, 0, i);
3116           if (INSN_P (subinsn))
3117             for_each_rtx (&PATTERN (subinsn), mark_constant, pool);
3118         }
3119     }
3120   else
3121     for_each_rtx (&PATTERN (insn), mark_constant, pool);
3122 }
3123
3124 /* Look through the instructions for this function, and mark all the
3125    entries in POOL which are actually being used.  Emit deferred constants
3126    which have indeed been used.  */
3127
3128 static void
3129 mark_constant_pool (struct rtx_constant_pool *pool)
3130 {
3131   rtx insn, link;
3132
3133   if (pool->first == 0 && n_deferred_constants == 0)
3134     return;
3135
3136   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3137     mark_constants (pool, insn);
3138
3139   for (link = current_function_epilogue_delay_list;
3140        link;
3141        link = XEXP (link, 1))
3142     mark_constants (pool, XEXP (link, 0));
3143 }
3144
3145 /* Write all the constants in the constant pool.  */
3146
3147 void
3148 output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3149                       tree fndecl ATTRIBUTE_UNUSED)
3150 {
3151   struct rtx_constant_pool *pool = cfun->varasm->pool;
3152   struct constant_descriptor_rtx *desc;
3153
3154   /* It is possible for gcc to call force_const_mem and then to later
3155      discard the instructions which refer to the constant.  In such a
3156      case we do not need to output the constant.  */
3157   mark_constant_pool (pool);
3158
3159 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3160   ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3161 #endif
3162
3163   for (desc = pool->first; desc ; desc = desc->next)
3164     output_constant_pool_1 (desc);
3165
3166 #ifdef ASM_OUTPUT_POOL_EPILOGUE
3167   ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3168 #endif
3169 }
3170 \f
3171 /* Determine what kind of relocations EXP may need.  */
3172
3173 int
3174 compute_reloc_for_constant (tree exp)
3175 {
3176   int reloc = 0, reloc2;
3177   tree tem;
3178
3179   /* Give the front-end a chance to convert VALUE to something that
3180      looks more like a constant to the back-end.  */
3181   exp = lang_hooks.expand_constant (exp);
3182
3183   switch (TREE_CODE (exp))
3184     {
3185     case ADDR_EXPR:
3186     case FDESC_EXPR:
3187       /* Go inside any operations that get_inner_reference can handle and see
3188          if what's inside is a constant: no need to do anything here for
3189          addresses of variables or functions.  */
3190       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3191            tem = TREE_OPERAND (tem, 0))
3192         ;
3193
3194       if (TREE_PUBLIC (tem))
3195         reloc |= 2;
3196       else
3197         reloc |= 1;
3198       break;
3199
3200     case PLUS_EXPR:
3201       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3202       reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3203       break;
3204
3205     case MINUS_EXPR:
3206       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3207       reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3208       /* The difference of two local labels is computable at link time.  */
3209       if (reloc == 1 && reloc2 == 1)
3210         reloc = 0;
3211       else
3212         reloc |= reloc2;
3213       break;
3214
3215     case NOP_EXPR:
3216     case CONVERT_EXPR:
3217     case NON_LVALUE_EXPR:
3218       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3219       break;
3220
3221     case CONSTRUCTOR:
3222       for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3223         if (TREE_VALUE (tem) != 0)
3224           reloc |= compute_reloc_for_constant (TREE_VALUE (tem));
3225
3226       break;
3227
3228     default:
3229       break;
3230     }
3231   return reloc;
3232 }
3233
3234 /* Find all the constants whose addresses are referenced inside of EXP,
3235    and make sure assembler code with a label has been output for each one.
3236    Indicate whether an ADDR_EXPR has been encountered.  */
3237
3238 static void
3239 output_addressed_constants (tree exp)
3240 {
3241   tree tem;
3242
3243   /* Give the front-end a chance to convert VALUE to something that
3244      looks more like a constant to the back-end.  */
3245   exp = lang_hooks.expand_constant (exp);
3246
3247   switch (TREE_CODE (exp))
3248     {
3249     case ADDR_EXPR:
3250     case FDESC_EXPR:
3251       /* Go inside any operations that get_inner_reference can handle and see
3252          if what's inside is a constant: no need to do anything here for
3253          addresses of variables or functions.  */
3254       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3255            tem = TREE_OPERAND (tem, 0))
3256         ;
3257
3258       if (TREE_CODE_CLASS (TREE_CODE (tem)) == 'c'
3259           || TREE_CODE (tem) == CONSTRUCTOR)
3260         output_constant_def (tem, 0);
3261       break;
3262
3263     case PLUS_EXPR:
3264     case MINUS_EXPR:
3265       output_addressed_constants (TREE_OPERAND (exp, 1));
3266       /* Fall through.  */
3267
3268     case NOP_EXPR:
3269     case CONVERT_EXPR:
3270     case NON_LVALUE_EXPR:
3271       output_addressed_constants (TREE_OPERAND (exp, 0));
3272       break;
3273
3274     case CONSTRUCTOR:
3275       for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3276         if (TREE_VALUE (tem) != 0)
3277           output_addressed_constants (TREE_VALUE (tem));
3278
3279       break;
3280
3281     default:
3282       break;
3283     }
3284 }
3285 \f
3286 /* Return nonzero if VALUE is a valid constant-valued expression
3287    for use in initializing a static variable; one that can be an
3288    element of a "constant" initializer.
3289
3290    Return null_pointer_node if the value is absolute;
3291    if it is relocatable, return the variable that determines the relocation.
3292    We assume that VALUE has been folded as much as possible;
3293    therefore, we do not need to check for such things as
3294    arithmetic-combinations of integers.  */
3295
3296 tree
3297 initializer_constant_valid_p (tree value, tree endtype)
3298 {
3299   /* Give the front-end a chance to convert VALUE to something that
3300      looks more like a constant to the back-end.  */
3301   value = lang_hooks.expand_constant (value);
3302
3303   switch (TREE_CODE (value))
3304     {
3305     case CONSTRUCTOR:
3306       if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3307            || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3308           && TREE_CONSTANT (value)
3309           && CONSTRUCTOR_ELTS (value))
3310         {
3311           tree elt;
3312           bool absolute = true;
3313
3314           for (elt = CONSTRUCTOR_ELTS (value); elt; elt = TREE_CHAIN (elt))
3315             {
3316               tree reloc;
3317               value = TREE_VALUE (elt);
3318               reloc = initializer_constant_valid_p (value, TREE_TYPE (value));
3319               if (!reloc)
3320                 return NULL_TREE;
3321               if (reloc != null_pointer_node)
3322                 absolute = false;
3323             }
3324           /* For a non-absolute relocation, there is no single
3325              variable that can be "the variable that determines the
3326              relocation."  */
3327           return absolute ? null_pointer_node : error_mark_node;
3328         }
3329
3330       return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
3331
3332     case INTEGER_CST:
3333     case VECTOR_CST:
3334     case REAL_CST:
3335     case STRING_CST:
3336     case COMPLEX_CST:
3337       return null_pointer_node;
3338
3339     case ADDR_EXPR:
3340     case FDESC_EXPR:
3341       return staticp (TREE_OPERAND (value, 0)) ? TREE_OPERAND (value, 0) : 0;
3342
3343     case VIEW_CONVERT_EXPR:
3344     case NON_LVALUE_EXPR:
3345       return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3346
3347     case CONVERT_EXPR:
3348     case NOP_EXPR:
3349       /* Allow conversions between pointer types.  */
3350       if (POINTER_TYPE_P (TREE_TYPE (value))
3351           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3352         return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3353
3354       /* Allow conversions between real types.  */
3355       if (FLOAT_TYPE_P (TREE_TYPE (value))
3356           && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3357         return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3358
3359       /* Allow length-preserving conversions between integer types.  */
3360       if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3361           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3362           && (TYPE_PRECISION (TREE_TYPE (value))
3363               == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3364         return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3365
3366       /* Allow conversions between other integer types only if
3367          explicit value.  */
3368       if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3369           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3370         {
3371           tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3372                                                      endtype);
3373           if (inner == null_pointer_node)
3374             return null_pointer_node;
3375           break;
3376         }
3377
3378       /* Allow (int) &foo provided int is as wide as a pointer.  */
3379       if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3380           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3381           && (TYPE_PRECISION (TREE_TYPE (value))
3382               >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3383         return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3384                                              endtype);
3385
3386       /* Likewise conversions from int to pointers, but also allow
3387          conversions from 0.  */
3388       if ((POINTER_TYPE_P (TREE_TYPE (value))
3389            || TREE_CODE (TREE_TYPE (value)) == OFFSET_TYPE)
3390           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3391         {
3392           if (integer_zerop (TREE_OPERAND (value, 0)))
3393             return null_pointer_node;
3394           else if (TYPE_PRECISION (TREE_TYPE (value))
3395                    <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
3396             return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3397                                                  endtype);
3398         }
3399
3400       /* Allow conversions to struct or union types if the value
3401          inside is okay.  */
3402       if (TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE
3403           || TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
3404         return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3405                                              endtype);
3406       break;
3407
3408     case PLUS_EXPR:
3409       if (! INTEGRAL_TYPE_P (endtype)
3410           || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3411         {
3412           tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3413                                                       endtype);
3414           tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3415                                                       endtype);
3416           /* If either term is absolute, use the other terms relocation.  */
3417           if (valid0 == null_pointer_node)
3418             return valid1;
3419           if (valid1 == null_pointer_node)
3420             return valid0;
3421         }
3422       break;
3423
3424     case MINUS_EXPR:
3425       if (! INTEGRAL_TYPE_P (endtype)
3426           || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3427         {
3428           tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3429                                                       endtype);
3430           tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3431                                                       endtype);
3432           /* Win if second argument is absolute.  */
3433           if (valid1 == null_pointer_node)
3434             return valid0;
3435           /* Win if both arguments have the same relocation.
3436              Then the value is absolute.  */
3437           if (valid0 == valid1 && valid0 != 0)
3438             return null_pointer_node;
3439
3440           /* Since GCC guarantees that string constants are unique in the
3441              generated code, a subtraction between two copies of the same
3442              constant string is absolute.  */
3443           if (valid0 && TREE_CODE (valid0) == STRING_CST &&
3444               valid1 && TREE_CODE (valid1) == STRING_CST &&
3445               TREE_STRING_POINTER (valid0) == TREE_STRING_POINTER (valid1))
3446             return null_pointer_node;
3447         }
3448
3449       /* Support differences between labels.  */
3450       if (INTEGRAL_TYPE_P (endtype))
3451         {
3452           tree op0, op1;
3453           op0 = TREE_OPERAND (value, 0);
3454           op1 = TREE_OPERAND (value, 1);
3455
3456           /* Like STRIP_NOPS except allow the operand mode to widen.
3457              This works around a feature of fold that simplifies
3458              (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3459              that the narrower operation is cheaper.  */
3460
3461           while (TREE_CODE (op0) == NOP_EXPR
3462                  || TREE_CODE (op0) == CONVERT_EXPR
3463                  || TREE_CODE (op0) == NON_LVALUE_EXPR)
3464             {
3465               tree inner = TREE_OPERAND (op0, 0);
3466               if (inner == error_mark_node
3467                   || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3468                   || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
3469                       > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3470                 break;
3471               op0 = inner;
3472             }
3473
3474           while (TREE_CODE (op1) == NOP_EXPR
3475                  || TREE_CODE (op1) == CONVERT_EXPR
3476                  || TREE_CODE (op1) == NON_LVALUE_EXPR)
3477             {
3478               tree inner = TREE_OPERAND (op1, 0);
3479               if (inner == error_mark_node
3480                   || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3481                   || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
3482                       > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3483                 break;
3484               op1 = inner;
3485             }
3486
3487           if (TREE_CODE (op0) == ADDR_EXPR
3488               && TREE_CODE (TREE_OPERAND (op0, 0)) == LABEL_DECL
3489               && TREE_CODE (op1) == ADDR_EXPR
3490               && TREE_CODE (TREE_OPERAND (op1, 0)) == LABEL_DECL)
3491             return null_pointer_node;
3492         }
3493       break;
3494
3495     default:
3496       break;
3497     }
3498
3499   return 0;
3500 }
3501 \f
3502 /* Output assembler code for constant EXP to FILE, with no label.
3503    This includes the pseudo-op such as ".int" or ".byte", and a newline.
3504    Assumes output_addressed_constants has been done on EXP already.
3505
3506    Generate exactly SIZE bytes of assembler data, padding at the end
3507    with zeros if necessary.  SIZE must always be specified.
3508
3509    SIZE is important for structure constructors,
3510    since trailing members may have been omitted from the constructor.
3511    It is also important for initialization of arrays from string constants
3512    since the full length of the string constant might not be wanted.
3513    It is also needed for initialization of unions, where the initializer's
3514    type is just one member, and that may not be as long as the union.
3515
3516    There a case in which we would fail to output exactly SIZE bytes:
3517    for a structure constructor that wants to produce more than SIZE bytes.
3518    But such constructors will never be generated for any possible input.
3519
3520    ALIGN is the alignment of the data in bits.  */
3521
3522 void
3523 output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
3524 {
3525   enum tree_code code;
3526   unsigned HOST_WIDE_INT thissize;
3527
3528   /* Some front-ends use constants other than the standard language-independent
3529      varieties, but which may still be output directly.  Give the front-end a
3530      chance to convert EXP to a language-independent representation.  */
3531   exp = lang_hooks.expand_constant (exp);
3532
3533   if (size == 0 || flag_syntax_only)
3534     return;
3535
3536   /* Eliminate any conversions since we'll be outputting the underlying
3537      constant.  */
3538   while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3539          || TREE_CODE (exp) == NON_LVALUE_EXPR
3540          || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
3541     exp = TREE_OPERAND (exp, 0);
3542
3543   code = TREE_CODE (TREE_TYPE (exp));
3544   thissize = int_size_in_bytes (TREE_TYPE (exp));
3545
3546   /* Allow a constructor with no elements for any data type.
3547      This means to fill the space with zeros.  */
3548   if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
3549     {
3550       assemble_zeros (size);
3551       return;
3552     }
3553
3554   if (TREE_CODE (exp) == FDESC_EXPR)
3555     {
3556 #ifdef ASM_OUTPUT_FDESC
3557       HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
3558       tree decl = TREE_OPERAND (exp, 0);
3559       ASM_OUTPUT_FDESC (asm_out_file, decl, part);
3560 #else
3561       abort ();
3562 #endif
3563       return;
3564     }
3565
3566   /* Now output the underlying data.  If we've handling the padding, return.
3567      Otherwise, break and ensure SIZE is the size written.  */
3568   switch (code)
3569     {
3570     case CHAR_TYPE:
3571     case BOOLEAN_TYPE:
3572     case INTEGER_TYPE:
3573     case ENUMERAL_TYPE:
3574     case POINTER_TYPE:
3575     case REFERENCE_TYPE:
3576     case OFFSET_TYPE:
3577       if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
3578                                            EXPAND_INITIALIZER),
3579                               MIN (size, thissize), align, 0))
3580         error ("initializer for integer value is too complicated");
3581       break;
3582
3583     case REAL_TYPE:
3584       if (TREE_CODE (exp) != REAL_CST)
3585         error ("initializer for floating value is not a floating constant");
3586
3587       assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
3588       break;
3589
3590     case COMPLEX_TYPE:
3591       output_constant (TREE_REALPART (exp), thissize / 2, align);
3592       output_constant (TREE_IMAGPART (exp), thissize / 2,
3593                        min_align (align, BITS_PER_UNIT * (thissize / 2)));
3594       break;
3595
3596     case ARRAY_TYPE:
3597     case VECTOR_TYPE:
3598       if (TREE_CODE (exp) == CONSTRUCTOR)
3599         {
3600           output_constructor (exp, size, align);
3601           return;
3602         }
3603       else if (TREE_CODE (exp) == STRING_CST)
3604         {
3605           thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
3606                           size);
3607           assemble_string (TREE_STRING_POINTER (exp), thissize);
3608         }
3609       else if (TREE_CODE (exp) == VECTOR_CST)
3610         {
3611           int elt_size;
3612           tree link;
3613           unsigned int nalign;
3614           enum machine_mode inner;
3615
3616           inner = GET_MODE_INNER (TYPE_MODE (TREE_TYPE (exp)));
3617           nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
3618
3619           elt_size = GET_MODE_UNIT_SIZE (TYPE_MODE (TREE_TYPE (exp)));
3620
3621           link = TREE_VECTOR_CST_ELTS (exp);
3622           output_constant (TREE_VALUE (link), elt_size, align);
3623           while ((link = TREE_CHAIN (link)) != NULL)
3624             output_constant (TREE_VALUE (link), elt_size, nalign);
3625         }
3626       else
3627         abort ();
3628       break;
3629
3630     case RECORD_TYPE:
3631     case UNION_TYPE:
3632       if (TREE_CODE (exp) == CONSTRUCTOR)
3633         output_constructor (exp, size, align);
3634       else
3635         abort ();
3636       return;
3637
3638     case SET_TYPE:
3639       if (TREE_CODE (exp) == INTEGER_CST)
3640         assemble_integer (expand_expr (exp, NULL_RTX,
3641                                        VOIDmode, EXPAND_INITIALIZER),
3642                           thissize, align, 1);
3643       else if (TREE_CODE (exp) == CONSTRUCTOR)
3644         {
3645           unsigned char *buffer = alloca (thissize);
3646           if (get_set_constructor_bytes (exp, buffer, thissize))
3647             abort ();
3648           assemble_string ((char *) buffer, thissize);
3649         }
3650       else
3651         error ("unknown set constructor type");
3652       return;
3653
3654     case ERROR_MARK:
3655       return;
3656
3657     default:
3658       abort ();
3659     }
3660
3661   if (size > thissize)
3662     assemble_zeros (size - thissize);
3663 }
3664
3665 \f
3666 /* Subroutine of output_constructor, used for computing the size of
3667    arrays of unspecified length.  VAL must be a CONSTRUCTOR of an array
3668    type with an unspecified upper bound.  */
3669
3670 static unsigned HOST_WIDE_INT
3671 array_size_for_constructor (tree val)
3672 {
3673   tree max_index, i;
3674
3675   /* This code used to attempt to handle string constants that are not
3676      arrays of single-bytes, but nothing else does, so there's no point in
3677      doing it here.  */
3678   if (TREE_CODE (val) == STRING_CST)
3679     return TREE_STRING_LENGTH (val);
3680
3681   max_index = NULL_TREE;
3682   for (i = CONSTRUCTOR_ELTS (val); i; i = TREE_CHAIN (i))
3683     {
3684       tree index = TREE_PURPOSE (i);
3685
3686       if (TREE_CODE (index) == RANGE_EXPR)
3687         index = TREE_OPERAND (index, 1);
3688       if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
3689         max_index = index;
3690     }
3691
3692   if (max_index == NULL_TREE)
3693     return 0;
3694
3695   /* Compute the total number of array elements.  */
3696   i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
3697                   convert (sizetype,
3698                            TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
3699   i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
3700
3701   /* Multiply by the array element unit size to find number of bytes.  */
3702   i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
3703
3704   return tree_low_cst (i, 1);
3705 }
3706
3707 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
3708    Generate at least SIZE bytes, padding if necessary.  */
3709
3710 static void
3711 output_constructor (tree exp, unsigned HOST_WIDE_INT size,
3712                     unsigned int align)
3713 {
3714   tree type = TREE_TYPE (exp);
3715   tree link, field = 0;
3716   tree min_index = 0;
3717   /* Number of bytes output or skipped so far.
3718      In other words, current position within the constructor.  */
3719   HOST_WIDE_INT total_bytes = 0;
3720   /* Nonzero means BYTE contains part of a byte, to be output.  */
3721   int byte_buffer_in_use = 0;
3722   int byte = 0;
3723
3724   if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
3725     abort ();
3726
3727   if (TREE_CODE (type) == RECORD_TYPE)
3728     field = TYPE_FIELDS (type);
3729
3730   if (TREE_CODE (type) == ARRAY_TYPE
3731       && TYPE_DOMAIN (type) != 0)
3732     min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
3733
3734   /* As LINK goes through the elements of the constant,
3735      FIELD goes through the structure fields, if the constant is a structure.
3736      if the constant is a union, then we override this,
3737      by getting the field from the TREE_LIST element.
3738      But the constant could also be an array.  Then FIELD is zero.
3739
3740      There is always a maximum of one element in the chain LINK for unions
3741      (even if the initializer in a source program incorrectly contains
3742      more one).  */
3743   for (link = CONSTRUCTOR_ELTS (exp);
3744        link;
3745        link = TREE_CHAIN (link),
3746        field = field ? TREE_CHAIN (field) : 0)
3747     {
3748       tree val = TREE_VALUE (link);
3749       tree index = 0;
3750
3751       /* The element in a union constructor specifies the proper field
3752          or index.  */
3753       if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
3754            || TREE_CODE (type) == QUAL_UNION_TYPE)
3755           && TREE_PURPOSE (link) != 0)
3756         field = TREE_PURPOSE (link);
3757
3758       else if (TREE_CODE (type) == ARRAY_TYPE)
3759         index = TREE_PURPOSE (link);
3760
3761 #ifdef ASM_COMMENT_START
3762       if (field && flag_verbose_asm)
3763         fprintf (asm_out_file, "%s %s:\n",
3764                  ASM_COMMENT_START, 
3765                  DECL_NAME (field) 
3766                  ? IDENTIFIER_POINTER (DECL_NAME (field))
3767                  : "<anonymous>");
3768 #endif
3769
3770       /* Eliminate the marker that makes a cast not be an lvalue.  */
3771       if (val != 0)
3772         STRIP_NOPS (val);
3773
3774       if (index && TREE_CODE (index) == RANGE_EXPR)
3775         {
3776           unsigned HOST_WIDE_INT fieldsize
3777             = int_size_in_bytes (TREE_TYPE (type));
3778           HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
3779           HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
3780           HOST_WIDE_INT index;
3781           unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
3782
3783           for (index = lo_index; index <= hi_index; index++)
3784             {
3785               /* Output the element's initial value.  */
3786               if (val == 0)
3787                 assemble_zeros (fieldsize);
3788               else
3789                 output_constant (val, fieldsize, align2);
3790
3791               /* Count its size.  */
3792               total_bytes += fieldsize;
3793             }
3794         }
3795       else if (field == 0 || !DECL_BIT_FIELD (field))
3796         {
3797           /* An element that is not a bit-field.  */
3798
3799           unsigned HOST_WIDE_INT fieldsize;
3800           /* Since this structure is static,
3801              we know the positions are constant.  */
3802           HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
3803           unsigned int align2;
3804
3805           if (index != 0)
3806             pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
3807                    * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
3808
3809           /* Output any buffered-up bit-fields preceding this element.  */
3810           if (byte_buffer_in_use)
3811             {
3812               assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
3813               total_bytes++;
3814               byte_buffer_in_use = 0;
3815             }
3816
3817           /* Advance to offset of this element.
3818              Note no alignment needed in an array, since that is guaranteed
3819              if each element has the proper size.  */
3820           if ((field != 0 || index != 0) && pos != total_bytes)
3821             {
3822               assemble_zeros (pos - total_bytes);
3823               total_bytes = pos;
3824             }
3825
3826           /* Find the alignment of this element.  */
3827           align2 = min_align (align, BITS_PER_UNIT * pos);
3828
3829           /* Determine size this element should occupy.  */
3830           if (field)
3831             {
3832               fieldsize = 0;
3833
3834               /* If this is an array with an unspecified upper bound,
3835                  the initializer determines the size.  */
3836               /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
3837                  but we cannot do this until the deprecated support for
3838                  initializing zero-length array members is removed.  */
3839               if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
3840                   && TYPE_DOMAIN (TREE_TYPE (field))
3841                   && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
3842                 {
3843                   fieldsize = array_size_for_constructor (val);
3844                   /* Given a non-empty initialization, this field had
3845                      better be last.  */
3846                   if (fieldsize != 0 && TREE_CHAIN (field) != NULL_TREE)
3847                     abort ();
3848                 }
3849               else if (DECL_SIZE_UNIT (field))
3850                 {
3851                   /* ??? This can't be right.  If the decl size overflows
3852                      a host integer we will silently emit no data.  */
3853                   if (host_integerp (DECL_SIZE_UNIT (field), 1))
3854                     fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
3855                 }
3856             }
3857           else
3858             fieldsize = int_size_in_bytes (TREE_TYPE (type));
3859
3860           /* Output the element's initial value.  */
3861           if (val == 0)
3862             assemble_zeros (fieldsize);
3863           else
3864             output_constant (val, fieldsize, align2);
3865
3866           /* Count its size.  */
3867           total_bytes += fieldsize;
3868         }
3869       else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
3870         error ("invalid initial value for member `%s'",
3871                IDENTIFIER_POINTER (DECL_NAME (field)));
3872       else
3873         {
3874           /* Element that is a bit-field.  */
3875
3876           HOST_WIDE_INT next_offset = int_bit_position (field);
3877           HOST_WIDE_INT end_offset
3878             = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
3879
3880           if (val == 0)
3881             val = integer_zero_node;
3882
3883           /* If this field does not start in this (or, next) byte,
3884              skip some bytes.  */
3885           if (next_offset / BITS_PER_UNIT != total_bytes)
3886             {
3887               /* Output remnant of any bit field in previous bytes.  */
3888               if (byte_buffer_in_use)
3889                 {
3890                   assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
3891                   total_bytes++;
3892                   byte_buffer_in_use = 0;
3893                 }
3894
3895               /* If still not at proper byte, advance to there.  */
3896               if (next_offset / BITS_PER_UNIT != total_bytes)
3897                 {
3898                   assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
3899                   total_bytes = next_offset / BITS_PER_UNIT;
3900                 }
3901             }
3902
3903           if (! byte_buffer_in_use)
3904             byte = 0;
3905
3906           /* We must split the element into pieces that fall within
3907              separate bytes, and combine each byte with previous or
3908              following bit-fields.  */
3909
3910           /* next_offset is the offset n fbits from the beginning of
3911              the structure to the next bit of this element to be processed.
3912              end_offset is the offset of the first bit past the end of
3913              this element.  */
3914           while (next_offset < end_offset)
3915             {
3916               int this_time;
3917               int shift;
3918               HOST_WIDE_INT value;
3919               HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
3920               HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
3921
3922               /* Advance from byte to byte
3923                  within this element when necessary.  */
3924               while (next_byte != total_bytes)
3925                 {
3926                   assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
3927                   total_bytes++;
3928                   byte = 0;
3929                 }
3930
3931               /* Number of bits we can process at once
3932                  (all part of the same byte).  */
3933               this_time = MIN (end_offset - next_offset,
3934                                BITS_PER_UNIT - next_bit);
3935               if (BYTES_BIG_ENDIAN)
3936                 {
3937                   /* On big-endian machine, take the most significant bits
3938                      first (of the bits that are significant)
3939                      and put them into bytes from the most significant end.  */
3940                   shift = end_offset - next_offset - this_time;
3941
3942                   /* Don't try to take a bunch of bits that cross
3943                      the word boundary in the INTEGER_CST. We can
3944                      only select bits from the LOW or HIGH part
3945                      not from both.  */
3946                   if (shift < HOST_BITS_PER_WIDE_INT
3947                       && shift + this_time > HOST_BITS_PER_WIDE_INT)
3948                     {
3949                       this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
3950                       shift = HOST_BITS_PER_WIDE_INT;
3951                     }
3952
3953                   /* Now get the bits from the appropriate constant word.  */
3954                   if (shift < HOST_BITS_PER_WIDE_INT)
3955                     value = TREE_INT_CST_LOW (val);
3956                   else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
3957                     {
3958                       value = TREE_INT_CST_HIGH (val);
3959                       shift -= HOST_BITS_PER_WIDE_INT;
3960                     }
3961                   else
3962                     abort ();
3963
3964                   /* Get the result. This works only when:
3965                      1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
3966                   byte |= (((value >> shift)
3967                             & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
3968                            << (BITS_PER_UNIT - this_time - next_bit));
3969                 }
3970               else
3971                 {
3972                   /* On little-endian machines,
3973                      take first the least significant bits of the value
3974                      and pack them starting at the least significant
3975                      bits of the bytes.  */
3976                   shift = next_offset - int_bit_position (field);
3977
3978                   /* Don't try to take a bunch of bits that cross
3979                      the word boundary in the INTEGER_CST. We can
3980                      only select bits from the LOW or HIGH part
3981                      not from both.  */
3982                   if (shift < HOST_BITS_PER_WIDE_INT
3983                       && shift + this_time > HOST_BITS_PER_WIDE_INT)
3984                     this_time = (HOST_BITS_PER_WIDE_INT - shift);
3985
3986                   /* Now get the bits from the appropriate constant word.  */
3987                   if (shift < HOST_BITS_PER_WIDE_INT)
3988                     value = TREE_INT_CST_LOW (val);
3989                   else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
3990                     {
3991                       value = TREE_INT_CST_HIGH (val);
3992                       shift -= HOST_BITS_PER_WIDE_INT;
3993                     }
3994                   else
3995                     abort ();
3996
3997                   /* Get the result. This works only when:
3998                      1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
3999                   byte |= (((value >> shift)
4000                             & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4001                            << next_bit);
4002                 }
4003
4004               next_offset += this_time;
4005               byte_buffer_in_use = 1;
4006             }
4007         }
4008     }
4009
4010   if (byte_buffer_in_use)
4011     {
4012       assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4013       total_bytes++;
4014     }
4015
4016   if ((unsigned HOST_WIDE_INT)total_bytes < size)
4017     assemble_zeros (size - total_bytes);
4018 }
4019
4020 /* This TREE_LIST contains any weak symbol declarations waiting
4021    to be emitted.  */
4022 static GTY(()) tree weak_decls;
4023
4024 /* Mark DECL as weak.  */
4025
4026 static void
4027 mark_weak (tree decl)
4028 {
4029   DECL_WEAK (decl) = 1;
4030
4031   if (DECL_RTL_SET_P (decl)
4032       && GET_CODE (DECL_RTL (decl)) == MEM
4033       && XEXP (DECL_RTL (decl), 0)
4034       && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4035     SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4036 }
4037
4038 /* Merge weak status between NEWDECL and OLDDECL.  */
4039
4040 void
4041 merge_weak (tree newdecl, tree olddecl)
4042 {
4043   if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
4044     return;
4045
4046   if (DECL_WEAK (newdecl))
4047     {
4048       tree wd;
4049
4050       /* NEWDECL is weak, but OLDDECL is not.  */
4051
4052       /* If we already output the OLDDECL, we're in trouble; we can't
4053          go back and make it weak.  This error cannot caught in
4054          declare_weak because the NEWDECL and OLDDECL was not yet
4055          been merged; therefore, TREE_ASM_WRITTEN was not set.  */
4056       if (TREE_ASM_WRITTEN (olddecl))
4057         error ("%Jweak declaration of '%D' must precede definition",
4058                newdecl, newdecl);
4059
4060       /* If we've already generated rtl referencing OLDDECL, we may
4061          have done so in a way that will not function properly with
4062          a weak symbol.  */
4063       else if (TREE_USED (olddecl)
4064                && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
4065         warning ("%Jweak declaration of '%D' after first use results "
4066                  "in unspecified behavior", newdecl, newdecl);
4067
4068       if (SUPPORTS_WEAK)
4069         {
4070           /* We put the NEWDECL on the weak_decls list at some point.
4071              Replace it with the OLDDECL.  */
4072           for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4073             if (TREE_VALUE (wd) == newdecl)
4074               {
4075                 TREE_VALUE (wd) = olddecl;
4076                 break;
4077               }
4078           /* We may not find the entry on the list.  If NEWDECL is a
4079              weak alias, then we will have already called
4080              globalize_decl to remove the entry; in that case, we do
4081              not need to do anything.  */
4082         }
4083
4084       /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping.  */
4085       mark_weak (olddecl);
4086     }
4087   else
4088     /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4089        weak.  Just update NEWDECL to indicate that it's weak too.  */
4090     mark_weak (newdecl);
4091 }
4092
4093 /* Declare DECL to be a weak symbol.  */
4094
4095 void
4096 declare_weak (tree decl)
4097 {
4098   if (! TREE_PUBLIC (decl))
4099     error ("%Jweak declaration of '%D' must be public", decl, decl);
4100   else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
4101     error ("%Jweak declaration of '%D' must precede definition", decl, decl);
4102   else if (SUPPORTS_WEAK)
4103     {
4104       if (! DECL_WEAK (decl))
4105         weak_decls = tree_cons (NULL, decl, weak_decls);
4106     }
4107   else
4108     warning ("%Jweak declaration of '%D' not supported", decl, decl);
4109
4110   mark_weak (decl);
4111 }
4112
4113 /* Emit any pending weak declarations.  */
4114
4115 void
4116 weak_finish (void)
4117 {
4118   tree t;
4119
4120   for (t = weak_decls; t; t = TREE_CHAIN (t))
4121     {
4122       tree decl = TREE_VALUE (t);
4123 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4124       const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4125 #endif
4126
4127       if (! TREE_USED (decl))
4128         continue;
4129
4130 #ifdef ASM_WEAKEN_DECL
4131       ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4132 #else
4133 #ifdef ASM_WEAKEN_LABEL
4134       ASM_WEAKEN_LABEL (asm_out_file, name);
4135 #else
4136 #ifdef ASM_OUTPUT_WEAK_ALIAS
4137       warning ("only weak aliases are supported in this configuration");
4138       return;
4139 #endif
4140 #endif
4141 #endif
4142     }
4143 }
4144
4145 /* Emit the assembly bits to indicate that DECL is globally visible.  */
4146
4147 static void
4148 globalize_decl (tree decl)
4149 {
4150   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4151
4152 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4153   if (DECL_WEAK (decl))
4154     {
4155       tree *p, t;
4156
4157 #ifdef ASM_WEAKEN_DECL
4158       ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
4159 #else
4160       ASM_WEAKEN_LABEL (asm_out_file, name);
4161 #endif
4162
4163       /* Remove this function from the pending weak list so that
4164          we do not emit multiple .weak directives for it.  */
4165       for (p = &weak_decls; (t = *p) ; )
4166         {
4167           if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4168             *p = TREE_CHAIN (t);
4169           else
4170             p = &TREE_CHAIN (t);
4171         }
4172       return;
4173     }
4174 #elif defined(ASM_MAKE_LABEL_LINKONCE)
4175   if (DECL_ONE_ONLY (decl))
4176     ASM_MAKE_LABEL_LINKONCE (asm_out_file, name);
4177 #endif
4178
4179   targetm.asm_out.globalize_label (asm_out_file, name);
4180 }
4181
4182 /* Emit an assembler directive to make the symbol for DECL an alias to
4183    the symbol for TARGET.  */
4184
4185 void
4186 assemble_alias (tree decl, tree target ATTRIBUTE_UNUSED)
4187 {
4188   const char *name;
4189
4190   /* We must force creation of DECL_RTL for debug info generation, even though
4191      we don't use it here.  */
4192   make_decl_rtl (decl, NULL);
4193
4194   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4195
4196 #ifdef ASM_OUTPUT_DEF
4197   /* Make name accessible from other files, if appropriate.  */
4198
4199   if (TREE_PUBLIC (decl))
4200     {
4201       globalize_decl (decl);
4202       maybe_assemble_visibility (decl);
4203     }
4204
4205 #ifdef ASM_OUTPUT_DEF_FROM_DECLS
4206   ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4207 #else
4208   ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
4209 #endif
4210 #else /* !ASM_OUTPUT_DEF */
4211 #if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
4212   if (DECL_WEAK (decl))
4213     {
4214       tree *p, t;
4215 #ifdef ASM_WEAKEN_DECL
4216       ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
4217 #else
4218       ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4219 #endif
4220       /* Remove this function from the pending weak list so that
4221          we do not emit multiple .weak directives for it.  */
4222       for (p = &weak_decls; (t = *p) ; )
4223         if (DECL_ASSEMBLER_NAME (decl)
4224             == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4225           *p = TREE_CHAIN (t);
4226         else
4227           p = &TREE_CHAIN (t);
4228     }
4229   else
4230     warning ("only weak aliases are supported in this configuration");
4231
4232 #else
4233   warning ("alias definitions not supported in this configuration; ignored");
4234 #endif
4235 #endif
4236
4237   TREE_USED (decl) = 1;
4238   TREE_ASM_WRITTEN (decl) = 1;
4239   TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
4240 }
4241
4242 /* Emit an assembler directive to set symbol for DECL visibility to
4243    the visibility type VIS, which must not be VISIBILITY_DEFAULT.  */
4244
4245 void
4246 default_assemble_visibility (tree decl, int vis)
4247 {
4248   static const char * const visibility_types[] = {
4249     NULL, "internal", "hidden", "protected"
4250   };
4251
4252   const char *name, *type;
4253
4254   name = (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
4255   type = visibility_types[vis];
4256
4257 #ifdef HAVE_GAS_HIDDEN
4258   fprintf (asm_out_file, "\t.%s\t", type);
4259   assemble_name (asm_out_file, name);
4260   fprintf (asm_out_file, "\n");
4261 #else
4262   warning ("visibility attribute not supported in this configuration; ignored");
4263 #endif
4264 }
4265
4266 /* A helper function to call assemble_visibility when needed for a decl.  */
4267
4268 static void
4269 maybe_assemble_visibility (tree decl)
4270 {
4271   enum symbol_visibility vis = DECL_VISIBILITY (decl);
4272
4273   if (vis != VISIBILITY_DEFAULT)
4274     targetm.asm_out.visibility (decl, vis);
4275 }
4276
4277 /* Returns 1 if the target configuration supports defining public symbols
4278    so that one of them will be chosen at link time instead of generating a
4279    multiply-defined symbol error, whether through the use of weak symbols or
4280    a target-specific mechanism for having duplicates discarded.  */
4281
4282 int
4283 supports_one_only (void)
4284 {
4285   if (SUPPORTS_ONE_ONLY)
4286     return 1;
4287   return SUPPORTS_WEAK;
4288 }
4289
4290 /* Set up DECL as a public symbol that can be defined in multiple
4291    translation units without generating a linker error.  */
4292
4293 void
4294 make_decl_one_only (tree decl)
4295 {
4296   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
4297     abort ();
4298
4299   TREE_PUBLIC (decl) = 1;
4300
4301   if (SUPPORTS_ONE_ONLY)
4302     {
4303 #ifdef MAKE_DECL_ONE_ONLY
4304       MAKE_DECL_ONE_ONLY (decl);
4305 #endif
4306       DECL_ONE_ONLY (decl) = 1;
4307     }
4308   else if (TREE_CODE (decl) == VAR_DECL
4309       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4310     DECL_COMMON (decl) = 1;
4311   else if (SUPPORTS_WEAK)
4312     DECL_WEAK (decl) = 1;
4313   else
4314     abort ();
4315 }
4316
4317 void
4318 init_varasm_once (void)
4319 {
4320   in_named_htab = htab_create_ggc (31, in_named_entry_hash,
4321                                    in_named_entry_eq, NULL);
4322   const_desc_htab = htab_create_ggc (1009, const_desc_hash,
4323                                      const_desc_eq, NULL);
4324
4325   const_alias_set = new_alias_set ();
4326 }
4327
4328 enum tls_model
4329 decl_tls_model (tree decl)
4330 {
4331   enum tls_model kind;
4332   tree attr = lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl));
4333   bool is_local;
4334
4335   if (attr)
4336     {
4337       attr = TREE_VALUE (TREE_VALUE (attr));
4338       if (TREE_CODE (attr) != STRING_CST)
4339         abort ();
4340       if (!strcmp (TREE_STRING_POINTER (attr), "local-exec"))
4341         kind = TLS_MODEL_LOCAL_EXEC;
4342       else if (!strcmp (TREE_STRING_POINTER (attr), "initial-exec"))
4343         kind = TLS_MODEL_INITIAL_EXEC;
4344       else if (!strcmp (TREE_STRING_POINTER (attr), "local-dynamic"))
4345         kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
4346       else if (!strcmp (TREE_STRING_POINTER (attr), "global-dynamic"))
4347         kind = TLS_MODEL_GLOBAL_DYNAMIC;
4348       else
4349         abort ();
4350       return kind;
4351     }
4352
4353   is_local = targetm.binds_local_p (decl);
4354   if (!flag_pic)
4355     {
4356       if (is_local)
4357         kind = TLS_MODEL_LOCAL_EXEC;
4358       else
4359         kind = TLS_MODEL_INITIAL_EXEC;
4360     }
4361   /* Local dynamic is inefficient when we're not combining the
4362      parts of the address.  */
4363   else if (optimize && is_local)
4364     kind = TLS_MODEL_LOCAL_DYNAMIC;
4365   else
4366     kind = TLS_MODEL_GLOBAL_DYNAMIC;
4367   if (kind < flag_tls_default)
4368     kind = flag_tls_default;
4369
4370   return kind;
4371 }
4372
4373 /* Select a set of attributes for section NAME based on the properties
4374    of DECL and whether or not RELOC indicates that DECL's initializer
4375    might contain runtime relocations.
4376
4377    We make the section read-only and executable for a function decl,
4378    read-only for a const data decl, and writable for a non-const data decl.  */
4379
4380 unsigned int
4381 default_section_type_flags (tree decl, const char *name, int reloc)
4382 {
4383   return default_section_type_flags_1 (decl, name, reloc, flag_pic);
4384 }
4385
4386 unsigned int
4387 default_section_type_flags_1 (tree decl, const char *name, int reloc,
4388                               int shlib)
4389 {
4390   unsigned int flags;
4391
4392   if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4393     flags = SECTION_CODE;
4394   else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
4395     flags = 0;
4396   else if (strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
4397     flags = SECTION_CODE;
4398   else
4399     flags = SECTION_WRITE;
4400
4401   if (decl && DECL_ONE_ONLY (decl))
4402     flags |= SECTION_LINKONCE;
4403
4404   if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4405     flags |= SECTION_TLS | SECTION_WRITE;
4406
4407   if (strcmp (name, ".bss") == 0
4408       || strncmp (name, ".bss.", 5) == 0
4409       || strncmp (name, ".gnu.linkonce.b.", 16) == 0
4410       || strcmp (name, ".sbss") == 0
4411       || strncmp (name, ".sbss.", 6) == 0
4412       || strncmp (name, ".gnu.linkonce.sb.", 17) == 0
4413       || strcmp (name, ".tbss") == 0
4414       || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
4415     flags |= SECTION_BSS;
4416
4417   if (strcmp (name, ".tdata") == 0
4418       || strcmp (name, ".tbss") == 0
4419       || strncmp (name, ".gnu.linkonce.td.", 17) == 0
4420       || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
4421     flags |= SECTION_TLS;
4422
4423   /* These three sections have special ELF types.  They are neither
4424      SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
4425      want to print a section type (@progbits or @nobits).  If someone
4426      is silly enough to emit code or TLS variables to one of these
4427      sections, then don't handle them specially.  */
4428   if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
4429       && (strcmp (name, ".init_array") == 0
4430           || strcmp (name, ".fini_array") == 0
4431           || strcmp (name, ".preinit_array") == 0))
4432     flags |= SECTION_NOTYPE;
4433
4434   return flags;
4435 }
4436
4437 /* Output assembly to switch to section NAME with attribute FLAGS.
4438    Four variants for common object file formats.  */
4439
4440 void
4441 default_no_named_section (const char *name ATTRIBUTE_UNUSED,
4442                           unsigned int flags ATTRIBUTE_UNUSED)
4443 {
4444   /* Some object formats don't support named sections at all.  The
4445      front-end should already have flagged this as an error.  */
4446   abort ();
4447 }
4448
4449 void
4450 default_elf_asm_named_section (const char *name, unsigned int flags)
4451 {
4452   char flagchars[10], *f = flagchars;
4453
4454   if (! named_section_first_declaration (name))
4455     {
4456       fprintf (asm_out_file, "\t.section\t%s\n", name);
4457       return;
4458     }
4459
4460   if (!(flags & SECTION_DEBUG))
4461     *f++ = 'a';
4462   if (flags & SECTION_WRITE)
4463     *f++ = 'w';
4464   if (flags & SECTION_CODE)
4465     *f++ = 'x';
4466   if (flags & SECTION_SMALL)
4467     *f++ = 's';
4468   if (flags & SECTION_MERGE)
4469     *f++ = 'M';
4470   if (flags & SECTION_STRINGS)
4471     *f++ = 'S';
4472   if (flags & SECTION_TLS)
4473     *f++ = 'T';
4474   *f = '\0';
4475
4476   fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
4477
4478   if (!(flags & SECTION_NOTYPE))
4479     {
4480       const char *type;
4481
4482       if (flags & SECTION_BSS)
4483         type = "nobits";
4484       else
4485         type = "progbits";
4486
4487       fprintf (asm_out_file, ",@%s", type);
4488
4489       if (flags & SECTION_ENTSIZE)
4490         fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
4491     }
4492
4493   putc ('\n', asm_out_file);
4494 }
4495
4496 void
4497 default_coff_asm_named_section (const char *name, unsigned int flags)
4498 {
4499   char flagchars[8], *f = flagchars;
4500
4501   if (flags & SECTION_WRITE)
4502     *f++ = 'w';
4503   if (flags & SECTION_CODE)
4504     *f++ = 'x';
4505   *f = '\0';
4506
4507   fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
4508 }
4509
4510 void
4511 default_pe_asm_named_section (const char *name, unsigned int flags)
4512 {
4513   default_coff_asm_named_section (name, flags);
4514
4515   if (flags & SECTION_LINKONCE)
4516     {
4517       /* Functions may have been compiled at various levels of
4518          optimization so we can't use `same_size' here.
4519          Instead, have the linker pick one.  */
4520       fprintf (asm_out_file, "\t.linkonce %s\n",
4521                (flags & SECTION_CODE ? "discard" : "same_size"));
4522     }
4523 }
4524 \f
4525 /* The lame default section selector.  */
4526
4527 void
4528 default_select_section (tree decl, int reloc,
4529                         unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
4530 {
4531   bool readonly = false;
4532
4533   if (DECL_P (decl))
4534     {
4535       if (decl_readonly_section (decl, reloc))
4536         readonly = true;
4537     }
4538   else if (TREE_CODE (decl) == CONSTRUCTOR)
4539     {
4540       if (! ((flag_pic && reloc)
4541              || !TREE_READONLY (decl)
4542              || TREE_SIDE_EFFECTS (decl)
4543              || !TREE_CONSTANT (decl)))
4544         readonly = true;
4545     }
4546   else if (TREE_CODE (decl) == STRING_CST)
4547     readonly = true;
4548   else if (! (flag_pic && reloc))
4549     readonly = true;
4550
4551   if (readonly)
4552     readonly_data_section ();
4553   else
4554     data_section ();
4555 }
4556
4557 /* A helper function for default_elf_select_section and
4558    default_elf_unique_section.  Categorizes the DECL.  */
4559
4560 enum section_category
4561 {
4562   SECCAT_TEXT,
4563
4564   SECCAT_RODATA,
4565   SECCAT_RODATA_MERGE_STR,
4566   SECCAT_RODATA_MERGE_STR_INIT,
4567   SECCAT_RODATA_MERGE_CONST,
4568   SECCAT_SRODATA,
4569
4570   SECCAT_DATA,
4571
4572   /* To optimize loading of shared programs, define following subsections
4573      of data section:
4574         _REL    Contains data that has relocations, so they get grouped
4575                 together and dynamic linker will visit fewer pages in memory.
4576         _RO     Contains data that is otherwise read-only.  This is useful
4577                 with prelinking as most relocations won't be dynamically
4578                 linked and thus stay read only.
4579         _LOCAL  Marks data containing relocations only to local objects.
4580                 These relocations will get fully resolved by prelinking.  */
4581   SECCAT_DATA_REL,
4582   SECCAT_DATA_REL_LOCAL,
4583   SECCAT_DATA_REL_RO,
4584   SECCAT_DATA_REL_RO_LOCAL,
4585
4586   SECCAT_SDATA,
4587   SECCAT_TDATA,
4588
4589   SECCAT_BSS,
4590   SECCAT_SBSS,
4591   SECCAT_TBSS
4592 };
4593
4594 static enum section_category
4595 categorize_decl_for_section (tree, int, int);
4596
4597 static enum section_category
4598 categorize_decl_for_section (tree decl, int reloc, int shlib)
4599 {
4600   enum section_category ret;
4601
4602   if (TREE_CODE (decl) == FUNCTION_DECL)
4603     return SECCAT_TEXT;
4604   else if (TREE_CODE (decl) == STRING_CST)
4605     {
4606       if (flag_mudflap) /* or !flag_merge_constants */
4607         return SECCAT_RODATA;
4608       else
4609         return SECCAT_RODATA_MERGE_STR;
4610     }
4611   else if (TREE_CODE (decl) == VAR_DECL)
4612     {
4613       if (DECL_INITIAL (decl) == NULL
4614           || DECL_INITIAL (decl) == error_mark_node)
4615         ret = SECCAT_BSS;
4616       else if (! TREE_READONLY (decl)
4617                || TREE_SIDE_EFFECTS (decl)
4618                || ! TREE_CONSTANT (DECL_INITIAL (decl)))
4619         {
4620           if (shlib && (reloc & 2))
4621             ret = SECCAT_DATA_REL;
4622           else if (shlib && reloc)
4623             ret = SECCAT_DATA_REL_LOCAL;
4624           else
4625             ret = SECCAT_DATA;
4626         }
4627       else if (shlib && (reloc & 2))
4628         ret = SECCAT_DATA_REL_RO;
4629       else if (shlib && reloc)
4630         ret = SECCAT_DATA_REL_RO_LOCAL;
4631       else if (reloc || flag_merge_constants < 2)
4632         /* C and C++ don't allow different variables to share the same
4633            location.  -fmerge-all-constants allows even that (at the
4634            expense of not conforming).  */
4635         ret = SECCAT_RODATA;
4636       else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
4637         ret = SECCAT_RODATA_MERGE_STR_INIT;
4638       else
4639         ret = SECCAT_RODATA_MERGE_CONST;
4640     }
4641   else if (TREE_CODE (decl) == CONSTRUCTOR)
4642     {
4643       if ((shlib && reloc)
4644           || TREE_SIDE_EFFECTS (decl)
4645           || ! TREE_CONSTANT (decl))
4646         ret = SECCAT_DATA;
4647       else
4648         ret = SECCAT_RODATA;
4649     }
4650   else
4651     ret = SECCAT_RODATA;
4652
4653   /* There are no read-only thread-local sections.  */
4654   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4655     {
4656       if (ret == SECCAT_BSS)
4657         ret = SECCAT_TBSS;
4658       else
4659         ret = SECCAT_TDATA;
4660     }
4661
4662   /* If the target uses small data sections, select it.  */
4663   else if (targetm.in_small_data_p (decl))
4664     {
4665       if (ret == SECCAT_BSS)
4666         ret = SECCAT_SBSS;
4667       else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
4668         ret = SECCAT_SRODATA;
4669       else
4670         ret = SECCAT_SDATA;
4671     }
4672
4673   return ret;
4674 }
4675
4676 bool
4677 decl_readonly_section (tree decl, int reloc)
4678 {
4679   return decl_readonly_section_1 (decl, reloc, flag_pic);
4680 }
4681
4682 bool
4683 decl_readonly_section_1 (tree decl, int reloc, int shlib)
4684 {
4685   switch (categorize_decl_for_section (decl, reloc, shlib))
4686     {
4687     case SECCAT_RODATA:
4688     case SECCAT_RODATA_MERGE_STR:
4689     case SECCAT_RODATA_MERGE_STR_INIT:
4690     case SECCAT_RODATA_MERGE_CONST:
4691     case SECCAT_SRODATA:
4692       return true;
4693       break;
4694     default:
4695       return false;
4696       break;
4697     }
4698 }
4699
4700 /* Select a section based on the above categorization.  */
4701
4702 void
4703 default_elf_select_section (tree decl, int reloc,
4704                             unsigned HOST_WIDE_INT align)
4705 {
4706   default_elf_select_section_1 (decl, reloc, align, flag_pic);
4707 }
4708
4709 void
4710 default_elf_select_section_1 (tree decl, int reloc,
4711                               unsigned HOST_WIDE_INT align, int shlib)
4712 {
4713   switch (categorize_decl_for_section (decl, reloc, shlib))
4714     {
4715     case SECCAT_TEXT:
4716       /* We're not supposed to be called on FUNCTION_DECLs.  */
4717       abort ();
4718     case SECCAT_RODATA:
4719       readonly_data_section ();
4720       break;
4721     case SECCAT_RODATA_MERGE_STR:
4722       mergeable_string_section (decl, align, 0);
4723       break;
4724     case SECCAT_RODATA_MERGE_STR_INIT:
4725       mergeable_string_section (DECL_INITIAL (decl), align, 0);
4726       break;
4727     case SECCAT_RODATA_MERGE_CONST:
4728       mergeable_constant_section (DECL_MODE (decl), align, 0);
4729       break;
4730     case SECCAT_SRODATA:
4731       named_section (NULL_TREE, ".sdata2", reloc);
4732       break;
4733     case SECCAT_DATA:
4734       data_section ();
4735       break;
4736     case SECCAT_DATA_REL:
4737       named_section (NULL_TREE, ".data.rel", reloc);
4738       break;
4739     case SECCAT_DATA_REL_LOCAL:
4740       named_section (NULL_TREE, ".data.rel.local", reloc);
4741       break;
4742     case SECCAT_DATA_REL_RO:
4743       named_section (NULL_TREE, ".data.rel.ro", reloc);
4744       break;
4745     case SECCAT_DATA_REL_RO_LOCAL:
4746       named_section (NULL_TREE, ".data.rel.ro.local", reloc);
4747       break;
4748     case SECCAT_SDATA:
4749       named_section (NULL_TREE, ".sdata", reloc);
4750       break;
4751     case SECCAT_TDATA:
4752       named_section (NULL_TREE, ".tdata", reloc);
4753       break;
4754     case SECCAT_BSS:
4755 #ifdef BSS_SECTION_ASM_OP
4756       bss_section ();
4757 #else
4758       named_section (NULL_TREE, ".bss", reloc);
4759 #endif
4760       break;
4761     case SECCAT_SBSS:
4762       named_section (NULL_TREE, ".sbss", reloc);
4763       break;
4764     case SECCAT_TBSS:
4765       named_section (NULL_TREE, ".tbss", reloc);
4766       break;
4767     default:
4768       abort ();
4769     }
4770 }
4771
4772 /* Construct a unique section name based on the decl name and the
4773    categorization performed above.  */
4774
4775 void
4776 default_unique_section (tree decl, int reloc)
4777 {
4778   default_unique_section_1 (decl, reloc, flag_pic);
4779 }
4780
4781 void
4782 default_unique_section_1 (tree decl, int reloc, int shlib)
4783 {
4784   bool one_only = DECL_ONE_ONLY (decl);
4785   const char *prefix, *name;
4786   size_t nlen, plen;
4787   char *string;
4788
4789   switch (categorize_decl_for_section (decl, reloc, shlib))
4790     {
4791     case SECCAT_TEXT:
4792       prefix = one_only ? ".gnu.linkonce.t." : ".text.";
4793       break;
4794     case SECCAT_RODATA:
4795     case SECCAT_RODATA_MERGE_STR:
4796     case SECCAT_RODATA_MERGE_STR_INIT:
4797     case SECCAT_RODATA_MERGE_CONST:
4798       prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
4799       break;
4800     case SECCAT_SRODATA:
4801       prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
4802       break;
4803     case SECCAT_DATA:
4804     case SECCAT_DATA_REL:
4805     case SECCAT_DATA_REL_LOCAL:
4806     case SECCAT_DATA_REL_RO:
4807     case SECCAT_DATA_REL_RO_LOCAL:
4808       prefix = one_only ? ".gnu.linkonce.d." : ".data.";
4809       break;
4810     case SECCAT_SDATA:
4811       prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
4812       break;
4813     case SECCAT_BSS:
4814       prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
4815       break;
4816     case SECCAT_SBSS:
4817       prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
4818       break;
4819     case SECCAT_TDATA:
4820       prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
4821       break;
4822     case SECCAT_TBSS:
4823       prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
4824       break;
4825     default:
4826       abort ();
4827     }
4828   plen = strlen (prefix);
4829
4830   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4831   name = targetm.strip_name_encoding (name);
4832   nlen = strlen (name);
4833
4834   string = alloca (nlen + plen + 1);
4835   memcpy (string, prefix, plen);
4836   memcpy (string + plen, name, nlen + 1);
4837
4838   DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
4839 }
4840
4841 void
4842 default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
4843                             rtx x,
4844                             unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
4845 {
4846   if (flag_pic)
4847     switch (GET_CODE (x))
4848       {
4849       case CONST:
4850       case SYMBOL_REF:
4851       case LABEL_REF:
4852         data_section ();
4853         return;
4854
4855       default:
4856         break;
4857       }
4858
4859   readonly_data_section ();
4860 }
4861
4862 void
4863 default_elf_select_rtx_section (enum machine_mode mode, rtx x,
4864                                 unsigned HOST_WIDE_INT align)
4865 {
4866   /* ??? Handle small data here somehow.  */
4867
4868   if (flag_pic)
4869     switch (GET_CODE (x))
4870       {
4871       case CONST:
4872       case SYMBOL_REF:
4873         named_section (NULL_TREE, ".data.rel.ro", 3);
4874         return;
4875
4876       case LABEL_REF:
4877         named_section (NULL_TREE, ".data.rel.ro.local", 1);
4878         return;
4879
4880       default:
4881         break;
4882       }
4883
4884   mergeable_constant_section (mode, align, 0);
4885 }
4886
4887 /* Set the generally applicable flags on the SYMBOL_REF for EXP.  */
4888
4889 void
4890 default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
4891 {
4892   rtx symbol;
4893   int flags;
4894
4895   /* Careful not to prod global register variables.  */
4896   if (GET_CODE (rtl) != MEM)
4897     return;
4898   symbol = XEXP (rtl, 0);
4899   if (GET_CODE (symbol) != SYMBOL_REF)
4900     return;
4901
4902   flags = 0;
4903   if (TREE_CODE (decl) == FUNCTION_DECL)
4904     flags |= SYMBOL_FLAG_FUNCTION;
4905   if (targetm.binds_local_p (decl))
4906     flags |= SYMBOL_FLAG_LOCAL;
4907   if (targetm.in_small_data_p (decl))
4908     flags |= SYMBOL_FLAG_SMALL;
4909   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4910     flags |= decl_tls_model (decl) << SYMBOL_FLAG_TLS_SHIFT;
4911   /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names?  Without
4912      being PUBLIC, the thing *must* be defined in this translation unit.
4913      Prevent this buglet from being propagated into rtl code as well.  */
4914   if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
4915     flags |= SYMBOL_FLAG_EXTERNAL;
4916
4917   SYMBOL_REF_FLAGS (symbol) = flags;
4918 }
4919
4920 /* By default, we do nothing for encode_section_info, so we need not
4921    do anything but discard the '*' marker.  */
4922
4923 const char *
4924 default_strip_name_encoding (const char *str)
4925 {
4926   return str + (*str == '*');
4927 }
4928
4929 /* Assume ELF-ish defaults, since that's pretty much the most liberal
4930    wrt cross-module name binding.  */
4931
4932 bool
4933 default_binds_local_p (tree exp)
4934 {
4935   return default_binds_local_p_1 (exp, flag_shlib);
4936 }
4937
4938 bool
4939 default_binds_local_p_1 (tree exp, int shlib)
4940 {
4941   bool local_p;
4942
4943   /* A non-decl is an entry in the constant pool.  */
4944   if (!DECL_P (exp))
4945     local_p = true;
4946   /* Static variables are always local.  */
4947   else if (! TREE_PUBLIC (exp))
4948     local_p = true;
4949   /* A variable is local if the user tells us so.  */
4950   else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
4951     local_p = true;
4952   /* Otherwise, variables defined outside this object may not be local.  */
4953   else if (DECL_EXTERNAL (exp))
4954     local_p = false;
4955   /* Linkonce and weak data are never local.  */
4956   else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
4957     local_p = false;
4958   /* If PIC, then assume that any global name can be overridden by
4959      symbols resolved from other modules.  */
4960   else if (shlib)
4961     local_p = false;
4962   /* Uninitialized COMMON variable may be unified with symbols
4963      resolved from other modules.  */
4964   else if (DECL_COMMON (exp)
4965            && (DECL_INITIAL (exp) == NULL
4966                || DECL_INITIAL (exp) == error_mark_node))
4967     local_p = false;
4968   /* Otherwise we're left with initialized (or non-common) global data
4969      which is of necessity defined locally.  */
4970   else
4971     local_p = true;
4972
4973   return local_p;
4974 }
4975
4976 /* Determine whether or not a pointer mode is valid. Assume defaults
4977    of ptr_mode or Pmode - can be overridden.  */
4978 bool
4979 default_valid_pointer_mode (enum machine_mode mode)
4980 {
4981   return (mode == ptr_mode || mode == Pmode);
4982 }
4983
4984 /* Default function to output code that will globalize a label.  A
4985    target must define GLOBAL_ASM_OP or provide it's own function to
4986    globalize a label.  */
4987 #ifdef GLOBAL_ASM_OP
4988 void
4989 default_globalize_label (FILE * stream, const char *name)
4990 {
4991   fputs (GLOBAL_ASM_OP, stream);
4992   assemble_name (stream, name);
4993   putc ('\n', stream);
4994 }
4995 #endif /* GLOBAL_ASM_OP */
4996
4997 /* Default function to output a label for unwind information.  The
4998    default is to do nothing.  A target that needs nonlocal labels for
4999    unwind information must provide its own function to do this.  */
5000 void
5001 default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
5002                            tree decl ATTRIBUTE_UNUSED,
5003                            int for_eh ATTRIBUTE_UNUSED,
5004                            int empty ATTRIBUTE_UNUSED)
5005
5006 }
5007
5008 /* This is how to output an internal numbered label where PREFIX is
5009    the class of label and LABELNO is the number within the class.  */
5010
5011 void
5012 default_internal_label (FILE *stream, const char *prefix,
5013                         unsigned long labelno)
5014 {
5015   char *const buf = alloca (40 + strlen (prefix));
5016   ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
5017   ASM_OUTPUT_LABEL (stream, buf);
5018 }
5019
5020 /* This is the default behavior at the beginning of a file.  It's
5021    controlled by two other target-hook toggles.  */
5022 void
5023 default_file_start (void)
5024 {
5025   if (targetm.file_start_app_off && !flag_verbose_asm)
5026     fputs (ASM_APP_OFF, asm_out_file);
5027
5028   if (targetm.file_start_file_directive)
5029     output_file_directive (asm_out_file, main_input_filename);
5030 }
5031
5032 /* This is a generic routine suitable for use as TARGET_ASM_FILE_END
5033    which emits a special section directive used to indicate whether or
5034    not this object file needs an executable stack.  This is primarily
5035    a GNU extension to ELF but could be used on other targets.  */
5036
5037 int trampolines_created;
5038
5039 void
5040 file_end_indicate_exec_stack (void)
5041 {
5042   unsigned int flags = SECTION_DEBUG;
5043   if (trampolines_created)
5044     flags |= SECTION_CODE;
5045
5046   named_section_flags (".note.GNU-stack", flags);
5047 }
5048
5049 #include "gt-varasm.h"