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