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