OSDN Git Service

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