OSDN Git Service

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