OSDN Git Service

5e59f3a1a92c1a0c416908a970f58f7e7054e15d
[pf3gnuchains/gcc-fork.git] / gcc / varasm.c
1 /* Output variables, constants and external declarations, for GNU compiler.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004, 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       return tree_int_cst_equal (t1, t2);
2546
2547     case REAL_CST:
2548       /* Real constants are the same only if the same width of type.  */
2549       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2550         return 0;
2551
2552       return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2553
2554     case STRING_CST:
2555       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2556         return 0;
2557
2558       return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2559               && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2560                          TREE_STRING_LENGTH (t1)));
2561
2562     case COMPLEX_CST:
2563       return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2564               && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2565
2566     case CONSTRUCTOR:
2567       {
2568         VEC(constructor_elt, gc) *v1, *v2;
2569         unsigned HOST_WIDE_INT idx;
2570         
2571         typecode = TREE_CODE (TREE_TYPE (t1));
2572         if (typecode != TREE_CODE (TREE_TYPE (t2)))
2573           return 0;
2574
2575         if (typecode == ARRAY_TYPE)
2576           {
2577             HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2578             /* For arrays, check that the sizes all match.  */
2579             if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2580                 || size_1 == -1
2581                 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
2582               return 0;
2583           }
2584         else
2585           {
2586             /* For record and union constructors, require exact type
2587                equality.  */
2588             if (TREE_TYPE (t1) != TREE_TYPE (t2))
2589               return 0;
2590           }
2591
2592         v1 = CONSTRUCTOR_ELTS (t1);
2593         v2 = CONSTRUCTOR_ELTS (t2);
2594         if (VEC_length (constructor_elt, v1)
2595             != VEC_length (constructor_elt, v2))
2596             return 0;
2597
2598         for (idx = 0; idx < VEC_length (constructor_elt, v1); ++idx)
2599           {
2600             constructor_elt *c1 = VEC_index (constructor_elt, v1, idx);
2601             constructor_elt *c2 = VEC_index (constructor_elt, v2, idx);
2602
2603             /* Check that each value is the same...  */
2604             if (!compare_constant (c1->value, c2->value))
2605               return 0;
2606             /* ... and that they apply to the same fields!  */
2607             if (typecode == ARRAY_TYPE)
2608               {
2609                 if (!compare_constant (c1->index, c2->index))
2610                   return 0;
2611               }
2612             else
2613               {
2614                 if (c1->index != c2->index)
2615                   return 0;
2616               }
2617           }
2618         
2619         return 1;
2620       }
2621
2622     case ADDR_EXPR:
2623     case FDESC_EXPR:
2624       {
2625         struct addr_const value1, value2;
2626
2627         decode_addr_const (t1, &value1);
2628         decode_addr_const (t2, &value2);
2629         return (value1.offset == value2.offset
2630                 && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
2631       }
2632
2633     case PLUS_EXPR:
2634     case MINUS_EXPR:
2635     case RANGE_EXPR:
2636       return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2637               && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
2638
2639     case NOP_EXPR:
2640     case CONVERT_EXPR:
2641     case NON_LVALUE_EXPR:
2642     case VIEW_CONVERT_EXPR:
2643       return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2644
2645     default:
2646       {
2647         tree nt1, nt2;
2648         nt1 = lang_hooks.expand_constant (t1);
2649         nt2 = lang_hooks.expand_constant (t2);
2650         if (nt1 != t1 || nt2 != t2)
2651           return compare_constant (nt1, nt2);
2652         else
2653           return 0;
2654       }
2655     }
2656
2657   gcc_unreachable ();
2658 }
2659 \f
2660 /* Make a copy of the whole tree structure for a constant.  This
2661    handles the same types of nodes that compare_constant handles.  */
2662
2663 static tree
2664 copy_constant (tree exp)
2665 {
2666   switch (TREE_CODE (exp))
2667     {
2668     case ADDR_EXPR:
2669       /* For ADDR_EXPR, we do not want to copy the decl whose address
2670          is requested.  We do want to copy constants though.  */
2671       if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
2672         return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2673                        copy_constant (TREE_OPERAND (exp, 0)));
2674       else
2675         return copy_node (exp);
2676
2677     case INTEGER_CST:
2678     case REAL_CST:
2679     case STRING_CST:
2680       return copy_node (exp);
2681
2682     case COMPLEX_CST:
2683       return build_complex (TREE_TYPE (exp),
2684                             copy_constant (TREE_REALPART (exp)),
2685                             copy_constant (TREE_IMAGPART (exp)));
2686
2687     case PLUS_EXPR:
2688     case MINUS_EXPR:
2689       return build2 (TREE_CODE (exp), TREE_TYPE (exp),
2690                      copy_constant (TREE_OPERAND (exp, 0)),
2691                      copy_constant (TREE_OPERAND (exp, 1)));
2692
2693     case NOP_EXPR:
2694     case CONVERT_EXPR:
2695     case NON_LVALUE_EXPR:
2696     case VIEW_CONVERT_EXPR:
2697       return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2698                      copy_constant (TREE_OPERAND (exp, 0)));
2699
2700     case CONSTRUCTOR:
2701       {
2702         tree copy = copy_node (exp);
2703         VEC(constructor_elt, gc) *v;
2704         unsigned HOST_WIDE_INT idx;
2705         tree purpose, value;
2706         
2707         v = VEC_alloc(constructor_elt, gc, VEC_length(constructor_elt,
2708                                                       CONSTRUCTOR_ELTS (exp)));
2709         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value)
2710           {
2711             constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL);
2712             ce->index = purpose;
2713             ce->value = copy_constant (value);
2714           }
2715         CONSTRUCTOR_ELTS (copy) = v;
2716         return copy;
2717       }
2718
2719     default:
2720       {
2721         tree t = lang_hooks.expand_constant (exp);
2722         
2723         gcc_assert (t == exp);
2724         return copy_constant (t);
2725       }
2726     }
2727 }
2728 \f
2729 /* Subroutine of output_constant_def:
2730    No constant equal to EXP is known to have been output.
2731    Make a constant descriptor to enter EXP in the hash table.
2732    Assign the label number and construct RTL to refer to the
2733    constant's location in memory.
2734    Caller is responsible for updating the hash table.  */
2735
2736 static struct constant_descriptor_tree *
2737 build_constant_desc (tree exp)
2738 {
2739   rtx symbol;
2740   rtx rtl;
2741   char label[256];
2742   int labelno;
2743   struct constant_descriptor_tree *desc;
2744
2745   desc = ggc_alloc (sizeof (*desc));
2746   desc->value = copy_constant (exp);
2747
2748   /* Propagate marked-ness to copied constant.  */
2749   if (flag_mudflap && mf_marked_p (exp))
2750     mf_mark (desc->value);
2751
2752   /* Create a string containing the label name, in LABEL.  */
2753   labelno = const_labelno++;
2754   ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
2755
2756   /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
2757   symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2758   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2759   SYMBOL_REF_DECL (symbol) = desc->value;
2760   TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2761
2762   rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
2763   set_mem_attributes (rtl, exp, 1);
2764   set_mem_alias_set (rtl, 0);
2765   set_mem_alias_set (rtl, const_alias_set);
2766
2767   /* Set flags or add text to the name to record information, such as
2768      that it is a local symbol.  If the name is changed, the macro
2769      ASM_OUTPUT_LABELREF will have to know how to strip this
2770      information.  This call might invalidate our local variable
2771      SYMBOL; we can't use it afterward.  */
2772
2773   targetm.encode_section_info (exp, rtl, true);
2774
2775   desc->rtl = rtl;
2776
2777   return desc;
2778 }
2779
2780 /* Return an rtx representing a reference to constant data in memory
2781    for the constant expression EXP.
2782
2783    If assembler code for such a constant has already been output,
2784    return an rtx to refer to it.
2785    Otherwise, output such a constant in memory
2786    and generate an rtx for it.
2787
2788    If DEFER is nonzero, this constant can be deferred and output only
2789    if referenced in the function after all optimizations.
2790
2791    `const_desc_table' records which constants already have label strings.  */
2792
2793 rtx
2794 output_constant_def (tree exp, int defer)
2795 {
2796   struct constant_descriptor_tree *desc;
2797   struct constant_descriptor_tree key;
2798   void **loc;
2799
2800   /* Look up EXP in the table of constant descriptors.  If we didn't find
2801      it, create a new one.  */
2802   key.value = exp;
2803   key.hash = const_hash_1 (exp);
2804   loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT);
2805
2806   desc = *loc;
2807   if (desc == 0)
2808     {
2809       desc = build_constant_desc (exp);
2810       desc->hash = key.hash;
2811       *loc = desc;
2812     }
2813
2814   maybe_output_constant_def_contents (desc, defer);
2815   return desc->rtl;
2816 }
2817
2818 /* Subroutine of output_constant_def: Decide whether or not we need to
2819    output the constant DESC now, and if so, do it.  */
2820 static void
2821 maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
2822                                     int defer)
2823 {
2824   rtx symbol = XEXP (desc->rtl, 0);
2825   tree exp = desc->value;
2826
2827   if (flag_syntax_only)
2828     return;
2829
2830   if (TREE_ASM_WRITTEN (exp))
2831     /* Already output; don't do it again.  */
2832     return;
2833
2834   /* We can always defer constants as long as the context allows
2835      doing so.  */
2836   if (defer)
2837     {
2838       /* Increment n_deferred_constants if it exists.  It needs to be at
2839          least as large as the number of constants actually referred to
2840          by the function.  If it's too small we'll stop looking too early
2841          and fail to emit constants; if it's too large we'll only look
2842          through the entire function when we could have stopped earlier.  */
2843       if (cfun)
2844         n_deferred_constants++;
2845       return;
2846     }
2847
2848   output_constant_def_contents (symbol);
2849 }
2850
2851 /* We must output the constant data referred to by SYMBOL; do so.  */
2852
2853 static void
2854 output_constant_def_contents (rtx symbol)
2855 {
2856   tree exp = SYMBOL_REF_DECL (symbol);
2857   const char *label = XSTR (symbol, 0);
2858   HOST_WIDE_INT size;
2859
2860   /* Make sure any other constants whose addresses appear in EXP
2861      are assigned label numbers.  */
2862   int reloc = compute_reloc_for_constant (exp);
2863
2864   /* Align the location counter as required by EXP's data type.  */
2865   unsigned int align = TYPE_ALIGN (TREE_TYPE (exp));
2866 #ifdef CONSTANT_ALIGNMENT
2867   align = CONSTANT_ALIGNMENT (exp, align);
2868 #endif
2869
2870   output_addressed_constants (exp);
2871
2872   /* We are no longer deferring this constant.  */
2873   TREE_ASM_WRITTEN (exp) = 1;
2874
2875   if (IN_NAMED_SECTION (exp))
2876     named_section (exp, NULL, reloc);
2877   else
2878     targetm.asm_out.select_section (exp, reloc, align);
2879
2880   if (align > BITS_PER_UNIT)
2881     {
2882       ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2883     }
2884
2885   size = int_size_in_bytes (TREE_TYPE (exp));
2886   if (TREE_CODE (exp) == STRING_CST)
2887     size = MAX (TREE_STRING_LENGTH (exp), size);
2888
2889   /* Do any machine/system dependent processing of the constant.  */
2890 #ifdef ASM_DECLARE_CONSTANT_NAME
2891   ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
2892 #else
2893   /* Standard thing is just output label for the constant.  */
2894   ASM_OUTPUT_LABEL (asm_out_file, label);
2895 #endif /* ASM_DECLARE_CONSTANT_NAME */
2896
2897   /* Output the value of EXP.  */
2898   output_constant (exp, size, align);
2899   if (flag_mudflap)
2900     mudflap_enqueue_constant (exp);
2901 }
2902
2903 /* Look up EXP in the table of constant descriptors.  Return the rtl
2904    if it has been emitted, else null.  */
2905
2906 rtx
2907 lookup_constant_def (tree exp)
2908 {
2909   struct constant_descriptor_tree *desc;
2910   struct constant_descriptor_tree key;
2911
2912   key.value = exp;
2913   key.hash = const_hash_1 (exp);
2914   desc = htab_find_with_hash (const_desc_htab, &key, key.hash);
2915
2916   return (desc ? desc->rtl : NULL_RTX);
2917 }
2918 \f
2919 /* Used in the hash tables to avoid outputting the same constant
2920    twice.  Unlike 'struct constant_descriptor_tree', RTX constants
2921    are output once per function, not once per file.  */
2922 /* ??? Only a few targets need per-function constant pools.  Most
2923    can use one per-file pool.  Should add a targetm bit to tell the
2924    difference.  */
2925
2926 struct rtx_constant_pool GTY(())
2927 {
2928   /* Pointers to first and last constant in pool, as ordered by offset.  */
2929   struct constant_descriptor_rtx *first;
2930   struct constant_descriptor_rtx *last;
2931
2932   /* Hash facility for making memory-constants from constant rtl-expressions.
2933      It is used on RISC machines where immediate integer arguments and
2934      constant addresses are restricted so that such constants must be stored
2935      in memory.  */
2936   htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
2937   htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_sym_htab;
2938
2939   /* Current offset in constant pool (does not include any
2940      machine-specific header).  */
2941   HOST_WIDE_INT offset;
2942 };
2943
2944 struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
2945 {
2946   struct constant_descriptor_rtx *next;
2947   rtx mem;
2948   rtx sym;
2949   rtx constant;
2950   HOST_WIDE_INT offset;
2951   hashval_t hash;
2952   enum machine_mode mode;
2953   unsigned int align;
2954   int labelno;
2955   int mark;
2956 };
2957
2958 /* Hash and compare functions for const_rtx_htab.  */
2959
2960 static hashval_t
2961 const_desc_rtx_hash (const void *ptr)
2962 {
2963   const struct constant_descriptor_rtx *desc = ptr;
2964   return desc->hash;
2965 }
2966
2967 static int
2968 const_desc_rtx_eq (const void *a, const void *b)
2969 {
2970   const struct constant_descriptor_rtx *x = a;
2971   const struct constant_descriptor_rtx *y = b;
2972
2973   if (x->mode != y->mode)
2974     return 0;
2975   return rtx_equal_p (x->constant, y->constant);
2976 }
2977
2978 /* Hash and compare functions for const_rtx_sym_htab.  */
2979
2980 static hashval_t
2981 const_desc_rtx_sym_hash (const void *ptr)
2982 {
2983   const struct constant_descriptor_rtx *desc = ptr;
2984   return htab_hash_string (XSTR (desc->sym, 0));
2985 }
2986
2987 static int
2988 const_desc_rtx_sym_eq (const void *a, const void *b)
2989 {
2990   const struct constant_descriptor_rtx *x = a;
2991   const struct constant_descriptor_rtx *y = b;
2992   return XSTR (x->sym, 0) == XSTR (y->sym, 0);
2993 }
2994
2995 /* This is the worker function for const_rtx_hash, called via for_each_rtx.  */
2996
2997 static int
2998 const_rtx_hash_1 (rtx *xp, void *data)
2999 {
3000   unsigned HOST_WIDE_INT hwi;
3001   enum machine_mode mode;
3002   enum rtx_code code;
3003   hashval_t h, *hp;
3004   rtx x;
3005
3006   x = *xp;
3007   code = GET_CODE (x);
3008   mode = GET_MODE (x);
3009   h = (hashval_t) code * 1048573 + mode;
3010
3011   switch (code)
3012     {
3013     case CONST_INT:
3014       hwi = INTVAL (x);
3015     fold_hwi:
3016       {
3017         const int shift = sizeof (hashval_t) * CHAR_BIT;
3018         const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
3019         int i;
3020
3021         h ^= (hashval_t) hwi;
3022         for (i = 1; i < n; ++i)
3023           {
3024             hwi >>= shift;
3025             h ^= (hashval_t) hwi;
3026           }
3027       }
3028       break;
3029
3030     case CONST_DOUBLE:
3031       if (mode == VOIDmode)
3032         {
3033           hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
3034           goto fold_hwi;
3035         }
3036       else
3037         h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
3038       break;
3039
3040     case CONST_VECTOR:
3041       {
3042         int i;
3043         for (i = XVECLEN (x, 0); i-- > 0; )
3044           h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data);
3045       }
3046       break;
3047
3048     case SYMBOL_REF:
3049       h ^= htab_hash_string (XSTR (x, 0));
3050       break;
3051
3052     case LABEL_REF:
3053       h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
3054       break;
3055
3056     case UNSPEC:
3057     case UNSPEC_VOLATILE:
3058       h = h * 251 + XINT (x, 1);
3059       break;
3060
3061     default:
3062       break;
3063     }
3064
3065   hp = data;
3066   *hp = *hp * 509 + h;
3067   return 0;
3068 }
3069
3070 /* Compute a hash value for X, which should be a constant.  */
3071
3072 static hashval_t
3073 const_rtx_hash (rtx x)
3074 {
3075   hashval_t h = 0;
3076   for_each_rtx (&x, const_rtx_hash_1, &h);
3077   return h;
3078 }
3079
3080 \f
3081 /* Initialize constant pool hashing for a new function.  */
3082
3083 void
3084 init_varasm_status (struct function *f)
3085 {
3086   struct varasm_status *p;
3087   struct rtx_constant_pool *pool;
3088
3089   p = ggc_alloc (sizeof (struct varasm_status));
3090   f->varasm = p;
3091
3092   pool = ggc_alloc (sizeof (struct rtx_constant_pool));
3093   p->pool = pool;
3094   p->deferred_constants = 0;
3095
3096   pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
3097                                           const_desc_rtx_eq, NULL);
3098   pool->const_rtx_sym_htab = htab_create_ggc (31, const_desc_rtx_sym_hash,
3099                                               const_desc_rtx_sym_eq, NULL);
3100   pool->first = pool->last = NULL;
3101   pool->offset = 0;
3102 }
3103 \f
3104 /* Given a MINUS expression, simplify it if both sides
3105    include the same symbol.  */
3106
3107 rtx
3108 simplify_subtraction (rtx x)
3109 {
3110   rtx r = simplify_rtx (x);
3111   return r ? r : x;
3112 }
3113 \f
3114 /* Given a constant rtx X, make (or find) a memory constant for its value
3115    and return a MEM rtx to refer to it in memory.  */
3116
3117 rtx
3118 force_const_mem (enum machine_mode mode, rtx x)
3119 {
3120   struct constant_descriptor_rtx *desc, tmp;
3121   struct rtx_constant_pool *pool = cfun->varasm->pool;
3122   char label[256];
3123   rtx def, symbol;
3124   hashval_t hash;
3125   unsigned int align;
3126   void **slot;
3127
3128   /* If we're not allowed to drop X into the constant pool, don't.  */
3129   if (targetm.cannot_force_const_mem (x))
3130     return NULL_RTX;
3131
3132   /* Lookup the value in the hashtable.  */
3133   tmp.constant = x;
3134   tmp.mode = mode;
3135   hash = const_rtx_hash (x);
3136   slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
3137   desc = *slot;
3138   
3139   /* If the constant was already present, return its memory.  */
3140   if (desc)
3141     return copy_rtx (desc->mem);
3142
3143   /* Otherwise, create a new descriptor.  */
3144   desc = ggc_alloc (sizeof (*desc));
3145   *slot = desc;
3146
3147   /* Align the location counter as required by EXP's data type.  */
3148   align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
3149 #ifdef CONSTANT_ALIGNMENT
3150   {
3151     tree type = lang_hooks.types.type_for_mode (mode, 0);
3152     if (type != NULL_TREE)
3153       align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
3154   }
3155 #endif
3156
3157   pool->offset += (align / BITS_PER_UNIT) - 1;
3158   pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3159
3160   desc->next = NULL;
3161   desc->constant = tmp.constant;
3162   desc->offset = pool->offset;
3163   desc->hash = hash;
3164   desc->mode = mode;
3165   desc->align = align;
3166   desc->labelno = const_labelno;
3167   desc->mark = 0;
3168
3169   pool->offset += GET_MODE_SIZE (mode);
3170   if (pool->last)
3171     pool->last->next = desc;
3172   else
3173     pool->first = pool->last = desc;
3174   pool->last = desc;
3175
3176   /* Create a string containing the label name, in LABEL.  */
3177   ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3178   ++const_labelno;
3179
3180   /* Construct the SYMBOL_REF.  Make sure to mark it as belonging to
3181      the constants pool.  */
3182   desc->sym = symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3183   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
3184   CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3185   current_function_uses_const_pool = 1;
3186
3187   /* Insert the descriptor into the symbol cross-reference table too.  */
3188   slot = htab_find_slot (pool->const_rtx_sym_htab, desc, INSERT);
3189   gcc_assert (!*slot);
3190   *slot = desc;
3191
3192   /* Construct the MEM.  */
3193   desc->mem = def = gen_const_mem (mode, symbol);
3194   set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
3195   set_mem_align (def, align);
3196
3197   /* If we're dropping a label to the constant pool, make sure we
3198      don't delete it.  */
3199   if (GET_CODE (x) == LABEL_REF)
3200     LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3201
3202   return copy_rtx (def);
3203 }
3204 \f
3205 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3206    the corresponding constant_descriptor_rtx structure.  */
3207
3208 static struct constant_descriptor_rtx *
3209 find_pool_constant (struct rtx_constant_pool *pool, rtx sym)
3210 {
3211   struct constant_descriptor_rtx tmp;
3212   tmp.sym = sym;
3213   return htab_find (pool->const_rtx_sym_htab, &tmp);
3214 }
3215
3216 /* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
3217
3218 rtx
3219 get_pool_constant (rtx addr)
3220 {
3221   return find_pool_constant (cfun->varasm->pool, addr)->constant;
3222 }
3223
3224 /* Given a constant pool SYMBOL_REF, return the corresponding constant
3225    and whether it has been output or not.  */
3226
3227 rtx
3228 get_pool_constant_mark (rtx addr, bool *pmarked)
3229 {
3230   struct constant_descriptor_rtx *desc;
3231
3232   desc = find_pool_constant (cfun->varasm->pool, addr);
3233   *pmarked = (desc->mark != 0);
3234   return desc->constant;
3235 }
3236
3237 /* Likewise, but for the constant pool of a specific function.  */
3238
3239 rtx
3240 get_pool_constant_for_function (struct function *f, rtx addr)
3241 {
3242   return find_pool_constant (f->varasm->pool, addr)->constant;
3243 }
3244
3245 /* Similar, return the mode.  */
3246
3247 enum machine_mode
3248 get_pool_mode (rtx addr)
3249 {
3250   return find_pool_constant (cfun->varasm->pool, addr)->mode;
3251 }
3252
3253 /* Return the size of the constant pool.  */
3254
3255 int
3256 get_pool_size (void)
3257 {
3258   return cfun->varasm->pool->offset;
3259 }
3260 \f
3261 /* Worker function for output_constant_pool_1.  Emit assembly for X
3262    in MODE with known alignment ALIGN.  */
3263
3264 static void
3265 output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
3266 {
3267   switch (GET_MODE_CLASS (mode))
3268     {
3269     case MODE_FLOAT:
3270       {
3271         REAL_VALUE_TYPE r;
3272         
3273         gcc_assert (GET_CODE (x) == CONST_DOUBLE);
3274         REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3275         assemble_real (r, mode, align);
3276         break;
3277       }
3278       
3279     case MODE_INT:
3280     case MODE_PARTIAL_INT:
3281       assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3282       break;
3283
3284     case MODE_VECTOR_FLOAT:
3285     case MODE_VECTOR_INT:
3286       {
3287         int i, units;
3288         enum machine_mode submode = GET_MODE_INNER (mode);
3289         unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
3290
3291         gcc_assert (GET_CODE (x) == CONST_VECTOR);
3292         units = CONST_VECTOR_NUNITS (x);
3293
3294         for (i = 0; i < units; i++)
3295           {
3296             rtx elt = CONST_VECTOR_ELT (x, i);
3297             output_constant_pool_2 (submode, elt, i ? subalign : align);
3298           }
3299       }
3300       break;
3301
3302     default:
3303       gcc_unreachable ();
3304     }
3305 }
3306
3307 /* Worker function for output_constant_pool.  Emit POOL.  */
3308
3309 static void
3310 output_constant_pool_1 (struct constant_descriptor_rtx *desc)
3311 {
3312   rtx x, tmp;
3313
3314   if (!desc->mark)
3315     return;
3316   x = desc->constant;
3317
3318   /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3319      whose CODE_LABEL has been deleted.  This can occur if a jump table
3320      is eliminated by optimization.  If so, write a constant of zero
3321      instead.  Note that this can also happen by turning the
3322      CODE_LABEL into a NOTE.  */
3323   /* ??? This seems completely and utterly wrong.  Certainly it's
3324      not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3325      functioning even with INSN_DELETED_P and friends.  */
3326
3327   tmp = x;
3328   switch (GET_CODE (x))
3329     {
3330     case CONST:
3331       if (GET_CODE (XEXP (x, 0)) != PLUS
3332           || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3333         break;
3334       tmp = XEXP (XEXP (x, 0), 0);
3335       /* FALLTHRU  */
3336
3337     case LABEL_REF:
3338       tmp = XEXP (x, 0);
3339       gcc_assert (!INSN_DELETED_P (tmp));
3340       gcc_assert (!NOTE_P (tmp)
3341                   || NOTE_LINE_NUMBER (tmp) != NOTE_INSN_DELETED);
3342       break;
3343
3344     default:
3345       break;
3346     }
3347
3348   /* First switch to correct section.  */
3349   targetm.asm_out.select_rtx_section (desc->mode, x, desc->align);
3350
3351 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3352   ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3353                                  desc->align, desc->labelno, done);
3354 #endif
3355
3356   assemble_align (desc->align);
3357
3358   /* Output the label.  */
3359   targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
3360
3361   /* Output the data.  */
3362   output_constant_pool_2 (desc->mode, x, desc->align);
3363
3364   /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3365      sections have proper size.  */
3366   if (desc->align > GET_MODE_BITSIZE (desc->mode)
3367       && in_section == in_named
3368       && get_named_section_flags (in_named_name) & SECTION_MERGE)
3369     assemble_align (desc->align);
3370
3371 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3372  done:
3373 #endif
3374   return;
3375 }
3376
3377 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3378    to as used.  Emit referenced deferred strings.  This function can
3379    be used with for_each_rtx to mark all SYMBOL_REFs in an rtx.  */
3380
3381 static int
3382 mark_constant (rtx *current_rtx, void *data)
3383 {
3384   struct rtx_constant_pool *pool = data;
3385   rtx x = *current_rtx;
3386
3387   if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3388     return 0;
3389
3390   if (CONSTANT_POOL_ADDRESS_P (x))
3391     {
3392       struct constant_descriptor_rtx *desc = find_pool_constant (pool, x);
3393       if (desc->mark == 0)
3394         {
3395           desc->mark = 1;
3396           for_each_rtx (&desc->constant, mark_constant, pool);
3397         }
3398     }
3399   else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3400     {
3401       tree exp = SYMBOL_REF_DECL (x);
3402       if (!TREE_ASM_WRITTEN (exp))
3403         {
3404           n_deferred_constants--;
3405           output_constant_def_contents (x);
3406         }
3407     }
3408
3409   return -1;
3410
3411
3412 /* Look through appropriate parts of INSN, marking all entries in the
3413    constant pool which are actually being used.  Entries that are only
3414    referenced by other constants are also marked as used.  Emit
3415    deferred strings that are used.  */
3416
3417 static void
3418 mark_constants (struct rtx_constant_pool *pool, rtx insn)
3419 {
3420   if (!INSN_P (insn))
3421     return;
3422
3423   /* Insns may appear inside a SEQUENCE.  Only check the patterns of
3424      insns, not any notes that may be attached.  We don't want to mark
3425      a constant just because it happens to appear in a REG_EQUIV note.  */
3426   if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3427     {
3428       rtx seq = PATTERN (insn);
3429       int i, n = XVECLEN (seq, 0);
3430       for (i = 0; i < n; ++i)
3431         {
3432           rtx subinsn = XVECEXP (seq, 0, i);
3433           if (INSN_P (subinsn))
3434             for_each_rtx (&PATTERN (subinsn), mark_constant, pool);
3435         }
3436     }
3437   else
3438     for_each_rtx (&PATTERN (insn), mark_constant, pool);
3439 }
3440
3441 /* Look through the instructions for this function, and mark all the
3442    entries in POOL which are actually being used.  Emit deferred constants
3443    which have indeed been used.  */
3444
3445 static void
3446 mark_constant_pool (struct rtx_constant_pool *pool)
3447 {
3448   rtx insn, link;
3449
3450   if (pool->first == 0 && n_deferred_constants == 0)
3451     return;
3452
3453   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3454     mark_constants (pool, insn);
3455
3456   for (link = current_function_epilogue_delay_list;
3457        link;
3458        link = XEXP (link, 1))
3459     mark_constants (pool, XEXP (link, 0));
3460 }
3461
3462 /* Write all the constants in the constant pool.  */
3463
3464 void
3465 output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3466                       tree fndecl ATTRIBUTE_UNUSED)
3467 {
3468   struct rtx_constant_pool *pool = cfun->varasm->pool;
3469   struct constant_descriptor_rtx *desc;
3470
3471   /* It is possible for gcc to call force_const_mem and then to later
3472      discard the instructions which refer to the constant.  In such a
3473      case we do not need to output the constant.  */
3474   mark_constant_pool (pool);
3475
3476 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3477   ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3478 #endif
3479
3480   for (desc = pool->first; desc ; desc = desc->next)
3481     output_constant_pool_1 (desc);
3482
3483 #ifdef ASM_OUTPUT_POOL_EPILOGUE
3484   ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3485 #endif
3486 }
3487 \f
3488 /* Determine what kind of relocations EXP may need.  */
3489
3490 int
3491 compute_reloc_for_constant (tree exp)
3492 {
3493   int reloc = 0, reloc2;
3494   tree tem;
3495
3496   /* Give the front-end a chance to convert VALUE to something that
3497      looks more like a constant to the back-end.  */
3498   exp = lang_hooks.expand_constant (exp);
3499
3500   switch (TREE_CODE (exp))
3501     {
3502     case ADDR_EXPR:
3503     case FDESC_EXPR:
3504       /* Go inside any operations that get_inner_reference can handle and see
3505          if what's inside is a constant: no need to do anything here for
3506          addresses of variables or functions.  */
3507       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3508            tem = TREE_OPERAND (tem, 0))
3509         ;
3510
3511       if (TREE_PUBLIC (tem))
3512         reloc |= 2;
3513       else
3514         reloc |= 1;
3515       break;
3516
3517     case PLUS_EXPR:
3518       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3519       reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3520       break;
3521
3522     case MINUS_EXPR:
3523       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3524       reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3525       /* The difference of two local labels is computable at link time.  */
3526       if (reloc == 1 && reloc2 == 1)
3527         reloc = 0;
3528       else
3529         reloc |= reloc2;
3530       break;
3531
3532     case NOP_EXPR:
3533     case CONVERT_EXPR:
3534     case NON_LVALUE_EXPR:
3535     case VIEW_CONVERT_EXPR:
3536       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3537       break;
3538
3539     case CONSTRUCTOR:
3540       {
3541         unsigned HOST_WIDE_INT idx;
3542         FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
3543           if (tem != 0)
3544             reloc |= compute_reloc_for_constant (tem);
3545       }
3546       break;
3547
3548     default:
3549       break;
3550     }
3551   return reloc;
3552 }
3553
3554 /* Find all the constants whose addresses are referenced inside of EXP,
3555    and make sure assembler code with a label has been output for each one.
3556    Indicate whether an ADDR_EXPR has been encountered.  */
3557
3558 static void
3559 output_addressed_constants (tree exp)
3560 {
3561   tree tem;
3562
3563   /* Give the front-end a chance to convert VALUE to something that
3564      looks more like a constant to the back-end.  */
3565   exp = lang_hooks.expand_constant (exp);
3566
3567   switch (TREE_CODE (exp))
3568     {
3569     case ADDR_EXPR:
3570     case FDESC_EXPR:
3571       /* Go inside any operations that get_inner_reference can handle and see
3572          if what's inside is a constant: no need to do anything here for
3573          addresses of variables or functions.  */
3574       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3575            tem = TREE_OPERAND (tem, 0))
3576         ;
3577
3578       /* If we have an initialized CONST_DECL, retrieve the initializer.  */
3579       if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem))
3580         tem = DECL_INITIAL (tem);
3581
3582       if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
3583         output_constant_def (tem, 0);
3584       break;
3585
3586     case PLUS_EXPR:
3587     case MINUS_EXPR:
3588       output_addressed_constants (TREE_OPERAND (exp, 1));
3589       /* Fall through.  */
3590
3591     case NOP_EXPR:
3592     case CONVERT_EXPR:
3593     case NON_LVALUE_EXPR:
3594     case VIEW_CONVERT_EXPR:
3595       output_addressed_constants (TREE_OPERAND (exp, 0));
3596       break;
3597
3598     case CONSTRUCTOR:
3599       {
3600         unsigned HOST_WIDE_INT idx;
3601         FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
3602           if (tem != 0)
3603             output_addressed_constants (tem);
3604       }
3605       break;
3606
3607     default:
3608       break;
3609     }
3610 }
3611 \f
3612 /* Return nonzero if VALUE is a valid constant-valued expression
3613    for use in initializing a static variable; one that can be an
3614    element of a "constant" initializer.
3615
3616    Return null_pointer_node if the value is absolute;
3617    if it is relocatable, return the variable that determines the relocation.
3618    We assume that VALUE has been folded as much as possible;
3619    therefore, we do not need to check for such things as
3620    arithmetic-combinations of integers.  */
3621
3622 tree
3623 initializer_constant_valid_p (tree value, tree endtype)
3624 {
3625   /* Give the front-end a chance to convert VALUE to something that
3626      looks more like a constant to the back-end.  */
3627   value = lang_hooks.expand_constant (value);
3628
3629   switch (TREE_CODE (value))
3630     {
3631     case CONSTRUCTOR:
3632       if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3633            || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3634           && TREE_CONSTANT (value)
3635           && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (value)))
3636         {
3637           unsigned HOST_WIDE_INT idx;
3638           tree elt;
3639           bool absolute = true;
3640
3641           FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
3642             {
3643               tree reloc;
3644               reloc = initializer_constant_valid_p (elt, TREE_TYPE (elt));
3645               if (!reloc)
3646                 return NULL_TREE;
3647               if (reloc != null_pointer_node)
3648                 absolute = false;
3649             }
3650           /* For a non-absolute relocation, there is no single
3651              variable that can be "the variable that determines the
3652              relocation."  */
3653           return absolute ? null_pointer_node : error_mark_node;
3654         }
3655
3656       return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
3657
3658     case INTEGER_CST:
3659     case VECTOR_CST:
3660     case REAL_CST:
3661     case STRING_CST:
3662     case COMPLEX_CST:
3663       return null_pointer_node;
3664
3665     case ADDR_EXPR:
3666     case FDESC_EXPR:
3667       value = staticp (TREE_OPERAND (value, 0));
3668       /* "&(*a).f" is like unto pointer arithmetic.  If "a" turns out to
3669          be a constant, this is old-skool offsetof-like nonsense.  */
3670       if (value
3671           && TREE_CODE (value) == INDIRECT_REF
3672           && TREE_CONSTANT (TREE_OPERAND (value, 0)))
3673         return null_pointer_node;
3674       /* Taking the address of a nested function involves a trampoline.  */
3675       if (value
3676           && TREE_CODE (value) == FUNCTION_DECL
3677           && ((decl_function_context (value) && !DECL_NO_STATIC_CHAIN (value))
3678               || DECL_DLLIMPORT_P (value)))
3679         return NULL_TREE;
3680       return value;
3681
3682     case VIEW_CONVERT_EXPR:
3683     case NON_LVALUE_EXPR:
3684       return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3685
3686     case CONVERT_EXPR:
3687     case NOP_EXPR:
3688       {
3689         tree src;
3690         tree src_type;
3691         tree dest_type;
3692
3693         src = TREE_OPERAND (value, 0);
3694         src_type = TREE_TYPE (src);
3695         dest_type = TREE_TYPE (value);
3696
3697         /* Allow conversions between pointer types, floating-point
3698            types, and offset types.  */
3699         if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type))
3700             || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type))
3701             || (TREE_CODE (dest_type) == OFFSET_TYPE
3702                 && TREE_CODE (src_type) == OFFSET_TYPE))
3703           return initializer_constant_valid_p (src, endtype);
3704
3705         /* Allow length-preserving conversions between integer types.  */
3706         if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)
3707             && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type)))
3708           return initializer_constant_valid_p (src, endtype);
3709
3710         /* Allow conversions between other integer types only if
3711            explicit value.  */
3712         if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
3713           {
3714             tree inner = initializer_constant_valid_p (src, endtype);
3715             if (inner == null_pointer_node)
3716               return null_pointer_node;
3717             break;
3718           }
3719
3720         /* Allow (int) &foo provided int is as wide as a pointer.  */
3721         if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)
3722             && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)))
3723           return initializer_constant_valid_p (src, endtype);
3724
3725         /* Likewise conversions from int to pointers, but also allow
3726            conversions from 0.  */
3727         if ((POINTER_TYPE_P (dest_type)
3728              || TREE_CODE (dest_type) == OFFSET_TYPE)
3729             && INTEGRAL_TYPE_P (src_type))
3730           {
3731             if (integer_zerop (src))
3732               return null_pointer_node;
3733             else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type))
3734               return initializer_constant_valid_p (src, endtype);
3735           }
3736
3737         /* Allow conversions to struct or union types if the value
3738            inside is okay.  */
3739         if (TREE_CODE (dest_type) == RECORD_TYPE
3740             || TREE_CODE (dest_type) == UNION_TYPE)
3741           return initializer_constant_valid_p (src, endtype);
3742       }
3743       break;
3744
3745     case PLUS_EXPR:
3746       if (! INTEGRAL_TYPE_P (endtype)
3747           || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3748         {
3749           tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3750                                                       endtype);
3751           tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3752                                                       endtype);
3753           /* If either term is absolute, use the other terms relocation.  */
3754           if (valid0 == null_pointer_node)
3755             return valid1;
3756           if (valid1 == null_pointer_node)
3757             return valid0;
3758         }
3759       break;
3760
3761     case MINUS_EXPR:
3762       if (! INTEGRAL_TYPE_P (endtype)
3763           || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3764         {
3765           tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3766                                                       endtype);
3767           tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3768                                                       endtype);
3769           /* Win if second argument is absolute.  */
3770           if (valid1 == null_pointer_node)
3771             return valid0;
3772           /* Win if both arguments have the same relocation.
3773              Then the value is absolute.  */
3774           if (valid0 == valid1 && valid0 != 0)
3775             return null_pointer_node;
3776
3777           /* Since GCC guarantees that string constants are unique in the
3778              generated code, a subtraction between two copies of the same
3779              constant string is absolute.  */
3780           if (valid0 && TREE_CODE (valid0) == STRING_CST
3781               && valid1 && TREE_CODE (valid1) == STRING_CST
3782               && operand_equal_p (valid0, valid1, 1))
3783             return null_pointer_node;
3784         }
3785
3786       /* Support narrowing differences.  */
3787       if (INTEGRAL_TYPE_P (endtype))
3788         {
3789           tree op0, op1;
3790
3791           op0 = TREE_OPERAND (value, 0);
3792           op1 = TREE_OPERAND (value, 1);
3793
3794           /* Like STRIP_NOPS except allow the operand mode to widen.
3795              This works around a feature of fold that simplifies
3796              (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3797              that the narrower operation is cheaper.  */
3798
3799           while (TREE_CODE (op0) == NOP_EXPR
3800                  || TREE_CODE (op0) == CONVERT_EXPR
3801                  || TREE_CODE (op0) == NON_LVALUE_EXPR)
3802             {
3803               tree inner = TREE_OPERAND (op0, 0);
3804               if (inner == error_mark_node
3805                   || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3806                   || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
3807                       > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3808                 break;
3809               op0 = inner;
3810             }
3811
3812           while (TREE_CODE (op1) == NOP_EXPR
3813                  || TREE_CODE (op1) == CONVERT_EXPR
3814                  || TREE_CODE (op1) == NON_LVALUE_EXPR)
3815             {
3816               tree inner = TREE_OPERAND (op1, 0);
3817               if (inner == error_mark_node
3818                   || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3819                   || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
3820                       > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3821                 break;
3822               op1 = inner;
3823             }
3824
3825           op0 = initializer_constant_valid_p (op0, endtype);
3826           op1 = initializer_constant_valid_p (op1, endtype);
3827
3828           /* Both initializers must be known.  */
3829           if (op0 && op1)
3830             {
3831               if (op0 == op1)
3832                 return null_pointer_node;
3833
3834               /* Support differences between labels.  */
3835               if (TREE_CODE (op0) == LABEL_DECL
3836                   && TREE_CODE (op1) == LABEL_DECL)
3837                 return null_pointer_node;
3838
3839               if (TREE_CODE (op0) == STRING_CST
3840                   && TREE_CODE (op1) == STRING_CST
3841                   && operand_equal_p (op0, op1, 1))
3842                 return null_pointer_node;
3843             }
3844         }
3845       break;
3846
3847     default:
3848       break;
3849     }
3850
3851   return 0;
3852 }
3853 \f
3854 /* Output assembler code for constant EXP to FILE, with no label.
3855    This includes the pseudo-op such as ".int" or ".byte", and a newline.
3856    Assumes output_addressed_constants has been done on EXP already.
3857
3858    Generate exactly SIZE bytes of assembler data, padding at the end
3859    with zeros if necessary.  SIZE must always be specified.
3860
3861    SIZE is important for structure constructors,
3862    since trailing members may have been omitted from the constructor.
3863    It is also important for initialization of arrays from string constants
3864    since the full length of the string constant might not be wanted.
3865    It is also needed for initialization of unions, where the initializer's
3866    type is just one member, and that may not be as long as the union.
3867
3868    There a case in which we would fail to output exactly SIZE bytes:
3869    for a structure constructor that wants to produce more than SIZE bytes.
3870    But such constructors will never be generated for any possible input.
3871
3872    ALIGN is the alignment of the data in bits.  */
3873
3874 void
3875 output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
3876 {
3877   enum tree_code code;
3878   unsigned HOST_WIDE_INT thissize;
3879
3880   /* Some front-ends use constants other than the standard language-independent
3881      varieties, but which may still be output directly.  Give the front-end a
3882      chance to convert EXP to a language-independent representation.  */
3883   exp = lang_hooks.expand_constant (exp);
3884
3885   if (size == 0 || flag_syntax_only)
3886     return;
3887
3888   /* See if we're trying to initialize a pointer in a non-default mode
3889      to the address of some declaration somewhere.  If the target says
3890      the mode is valid for pointers, assume the target has a way of
3891      resolving it.  */
3892   if (TREE_CODE (exp) == NOP_EXPR
3893       && POINTER_TYPE_P (TREE_TYPE (exp))
3894       && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
3895     {
3896       tree saved_type = TREE_TYPE (exp);
3897
3898       /* Peel off any intermediate conversions-to-pointer for valid
3899          pointer modes.  */
3900       while (TREE_CODE (exp) == NOP_EXPR
3901              && POINTER_TYPE_P (TREE_TYPE (exp))
3902              && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp))))
3903         exp = TREE_OPERAND (exp, 0);
3904
3905       /* If what we're left with is the address of something, we can
3906          convert the address to the final type and output it that
3907          way.  */
3908       if (TREE_CODE (exp) == ADDR_EXPR)
3909         exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0));
3910     }
3911
3912   /* Eliminate any conversions since we'll be outputting the underlying
3913      constant.  */
3914   while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3915          || TREE_CODE (exp) == NON_LVALUE_EXPR
3916          || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
3917     {
3918       HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp));
3919       HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0)));
3920
3921       /* Make sure eliminating the conversion is really a no-op, except with
3922          VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and
3923          union types to allow for Ada unchecked unions.  */
3924       if (type_size > op_size
3925           && TREE_CODE (exp) != VIEW_CONVERT_EXPR
3926           && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE)
3927         internal_error ("no-op convert from %wd to %wd bytes in initializer",
3928                         op_size, type_size);
3929
3930       exp = TREE_OPERAND (exp, 0);
3931     }
3932
3933   code = TREE_CODE (TREE_TYPE (exp));
3934   thissize = int_size_in_bytes (TREE_TYPE (exp));
3935
3936   /* Allow a constructor with no elements for any data type.
3937      This means to fill the space with zeros.  */
3938   if (TREE_CODE (exp) == CONSTRUCTOR
3939       && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (exp)))
3940     {
3941       assemble_zeros (size);
3942       return;
3943     }
3944
3945   if (TREE_CODE (exp) == FDESC_EXPR)
3946     {
3947 #ifdef ASM_OUTPUT_FDESC
3948       HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
3949       tree decl = TREE_OPERAND (exp, 0);
3950       ASM_OUTPUT_FDESC (asm_out_file, decl, part);
3951 #else
3952       gcc_unreachable ();
3953 #endif
3954       return;
3955     }
3956
3957   /* Now output the underlying data.  If we've handling the padding, return.
3958      Otherwise, break and ensure SIZE is the size written.  */
3959   switch (code)
3960     {
3961     case CHAR_TYPE:
3962     case BOOLEAN_TYPE:
3963     case INTEGER_TYPE:
3964     case ENUMERAL_TYPE:
3965     case POINTER_TYPE:
3966     case REFERENCE_TYPE:
3967     case OFFSET_TYPE:
3968       if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
3969                                            EXPAND_INITIALIZER),
3970                               MIN (size, thissize), align, 0))
3971         error ("initializer for integer value is too complicated");
3972       break;
3973
3974     case REAL_TYPE:
3975       if (TREE_CODE (exp) != REAL_CST)
3976         error ("initializer for floating value is not a floating constant");
3977
3978       assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
3979       break;
3980
3981     case COMPLEX_TYPE:
3982       output_constant (TREE_REALPART (exp), thissize / 2, align);
3983       output_constant (TREE_IMAGPART (exp), thissize / 2,
3984                        min_align (align, BITS_PER_UNIT * (thissize / 2)));
3985       break;
3986
3987     case ARRAY_TYPE:
3988     case VECTOR_TYPE:
3989       switch (TREE_CODE (exp))
3990         {
3991         case CONSTRUCTOR:
3992           output_constructor (exp, size, align);
3993           return;
3994         case STRING_CST:
3995           thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
3996                           size);
3997           assemble_string (TREE_STRING_POINTER (exp), thissize);
3998           break;
3999
4000         case VECTOR_CST:
4001           {
4002             int elt_size;
4003             tree link;
4004             unsigned int nalign;
4005             enum machine_mode inner;
4006             
4007             inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
4008             nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
4009             
4010             elt_size = GET_MODE_SIZE (inner);
4011             
4012             link = TREE_VECTOR_CST_ELTS (exp);
4013             output_constant (TREE_VALUE (link), elt_size, align);
4014             while ((link = TREE_CHAIN (link)) != NULL)
4015               output_constant (TREE_VALUE (link), elt_size, nalign);
4016             break;
4017           }
4018         default:
4019           gcc_unreachable ();
4020         }
4021       break;
4022
4023     case RECORD_TYPE:
4024     case UNION_TYPE:
4025       gcc_assert (TREE_CODE (exp) == CONSTRUCTOR);
4026       output_constructor (exp, size, align);
4027       return;
4028
4029     case ERROR_MARK:
4030       return;
4031
4032     default:
4033       gcc_unreachable ();
4034     }
4035
4036   if (size > thissize)
4037     assemble_zeros (size - thissize);
4038 }
4039
4040 \f
4041 /* Subroutine of output_constructor, used for computing the size of
4042    arrays of unspecified length.  VAL must be a CONSTRUCTOR of an array
4043    type with an unspecified upper bound.  */
4044
4045 static unsigned HOST_WIDE_INT
4046 array_size_for_constructor (tree val)
4047 {
4048   tree max_index, i;
4049   unsigned HOST_WIDE_INT cnt;
4050   tree index, value;
4051
4052   /* This code used to attempt to handle string constants that are not
4053      arrays of single-bytes, but nothing else does, so there's no point in
4054      doing it here.  */
4055   if (TREE_CODE (val) == STRING_CST)
4056     return TREE_STRING_LENGTH (val);
4057
4058   max_index = NULL_TREE;
4059   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value)
4060     {
4061       if (TREE_CODE (index) == RANGE_EXPR)
4062         index = TREE_OPERAND (index, 1);
4063       if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4064         max_index = index;
4065     }
4066
4067   if (max_index == NULL_TREE)
4068     return 0;
4069
4070   /* Compute the total number of array elements.  */
4071   i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
4072                   convert (sizetype,
4073                            TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
4074   i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
4075
4076   /* Multiply by the array element unit size to find number of bytes.  */
4077   i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
4078
4079   return tree_low_cst (i, 1);
4080 }
4081
4082 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
4083    Generate at least SIZE bytes, padding if necessary.  */
4084
4085 static void
4086 output_constructor (tree exp, unsigned HOST_WIDE_INT size,
4087                     unsigned int align)
4088 {
4089   tree type = TREE_TYPE (exp);
4090   tree field = 0;
4091   tree min_index = 0;
4092   /* Number of bytes output or skipped so far.
4093      In other words, current position within the constructor.  */
4094   HOST_WIDE_INT total_bytes = 0;
4095   /* Nonzero means BYTE contains part of a byte, to be output.  */
4096   int byte_buffer_in_use = 0;
4097   int byte = 0;
4098   unsigned HOST_WIDE_INT cnt;
4099   constructor_elt *ce;
4100
4101   gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT);
4102
4103   if (TREE_CODE (type) == RECORD_TYPE)
4104     field = TYPE_FIELDS (type);
4105
4106   if (TREE_CODE (type) == ARRAY_TYPE
4107       && TYPE_DOMAIN (type) != 0)
4108     min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
4109
4110   /* As LINK goes through the elements of the constant,
4111      FIELD goes through the structure fields, if the constant is a structure.
4112      if the constant is a union, then we override this,
4113      by getting the field from the TREE_LIST element.
4114      But the constant could also be an array.  Then FIELD is zero.
4115
4116      There is always a maximum of one element in the chain LINK for unions
4117      (even if the initializer in a source program incorrectly contains
4118      more one).  */
4119   for (cnt = 0;
4120        VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), cnt, ce);
4121        cnt++, field = field ? TREE_CHAIN (field) : 0)
4122     {
4123       tree val = ce->value;
4124       tree index = 0;
4125
4126       /* The element in a union constructor specifies the proper field
4127          or index.  */
4128       if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
4129            || TREE_CODE (type) == QUAL_UNION_TYPE)
4130           && ce->index != 0)
4131         field = ce->index;
4132
4133       else if (TREE_CODE (type) == ARRAY_TYPE)
4134         index = ce->index;
4135
4136 #ifdef ASM_COMMENT_START
4137       if (field && flag_verbose_asm)
4138         fprintf (asm_out_file, "%s %s:\n",
4139                  ASM_COMMENT_START, 
4140                  DECL_NAME (field) 
4141                  ? IDENTIFIER_POINTER (DECL_NAME (field))
4142                  : "<anonymous>");
4143 #endif
4144
4145       /* Eliminate the marker that makes a cast not be an lvalue.  */
4146       if (val != 0)
4147         STRIP_NOPS (val);
4148
4149       if (index && TREE_CODE (index) == RANGE_EXPR)
4150         {
4151           unsigned HOST_WIDE_INT fieldsize
4152             = int_size_in_bytes (TREE_TYPE (type));
4153           HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
4154           HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
4155           HOST_WIDE_INT index;
4156           unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
4157
4158           for (index = lo_index; index <= hi_index; index++)
4159             {
4160               /* Output the element's initial value.  */
4161               if (val == 0)
4162                 assemble_zeros (fieldsize);
4163               else
4164                 output_constant (val, fieldsize, align2);
4165
4166               /* Count its size.  */
4167               total_bytes += fieldsize;
4168             }
4169         }
4170       else if (field == 0 || !DECL_BIT_FIELD (field))
4171         {
4172           /* An element that is not a bit-field.  */
4173
4174           unsigned HOST_WIDE_INT fieldsize;
4175           /* Since this structure is static,
4176              we know the positions are constant.  */
4177           HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
4178           unsigned int align2;
4179
4180           if (index != 0)
4181             pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4182                    * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
4183
4184           /* Output any buffered-up bit-fields preceding this element.  */
4185           if (byte_buffer_in_use)
4186             {
4187               assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4188               total_bytes++;
4189               byte_buffer_in_use = 0;
4190             }
4191
4192           /* Advance to offset of this element.
4193              Note no alignment needed in an array, since that is guaranteed
4194              if each element has the proper size.  */
4195           if ((field != 0 || index != 0) && pos != total_bytes)
4196             {
4197               gcc_assert (pos >= total_bytes);
4198               assemble_zeros (pos - total_bytes);
4199               total_bytes = pos;
4200             }
4201
4202           /* Find the alignment of this element.  */
4203           align2 = min_align (align, BITS_PER_UNIT * pos);
4204
4205           /* Determine size this element should occupy.  */
4206           if (field)
4207             {
4208               fieldsize = 0;
4209
4210               /* If this is an array with an unspecified upper bound,
4211                  the initializer determines the size.  */
4212               /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4213                  but we cannot do this until the deprecated support for
4214                  initializing zero-length array members is removed.  */
4215               if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4216                   && TYPE_DOMAIN (TREE_TYPE (field))
4217                   && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4218                 {
4219                   fieldsize = array_size_for_constructor (val);
4220                   /* Given a non-empty initialization, this field had
4221                      better be last.  */
4222                   gcc_assert (!fieldsize || !TREE_CHAIN (field));
4223                 }
4224               else if (DECL_SIZE_UNIT (field))
4225                 {
4226                   /* ??? This can't be right.  If the decl size overflows
4227                      a host integer we will silently emit no data.  */
4228                   if (host_integerp (DECL_SIZE_UNIT (field), 1))
4229                     fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4230                 }
4231             }
4232           else
4233             fieldsize = int_size_in_bytes (TREE_TYPE (type));
4234
4235           /* Output the element's initial value.  */
4236           if (val == 0)
4237             assemble_zeros (fieldsize);
4238           else
4239             output_constant (val, fieldsize, align2);
4240
4241           /* Count its size.  */
4242           total_bytes += fieldsize;
4243         }
4244       else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4245         error ("invalid initial value for member %qs",
4246                IDENTIFIER_POINTER (DECL_NAME (field)));
4247       else
4248         {
4249           /* Element that is a bit-field.  */
4250
4251           HOST_WIDE_INT next_offset = int_bit_position (field);
4252           HOST_WIDE_INT end_offset
4253             = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
4254
4255           if (val == 0)
4256             val = integer_zero_node;
4257
4258           /* If this field does not start in this (or, next) byte,
4259              skip some bytes.  */
4260           if (next_offset / BITS_PER_UNIT != total_bytes)
4261             {
4262               /* Output remnant of any bit field in previous bytes.  */
4263               if (byte_buffer_in_use)
4264                 {
4265                   assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4266                   total_bytes++;
4267                   byte_buffer_in_use = 0;
4268                 }
4269
4270               /* If still not at proper byte, advance to there.  */
4271               if (next_offset / BITS_PER_UNIT != total_bytes)
4272                 {
4273                   gcc_assert (next_offset / BITS_PER_UNIT >= total_bytes);
4274                   assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4275                   total_bytes = next_offset / BITS_PER_UNIT;
4276                 }
4277             }
4278
4279           if (! byte_buffer_in_use)
4280             byte = 0;
4281
4282           /* We must split the element into pieces that fall within
4283              separate bytes, and combine each byte with previous or
4284              following bit-fields.  */
4285
4286           /* next_offset is the offset n fbits from the beginning of
4287              the structure to the next bit of this element to be processed.
4288              end_offset is the offset of the first bit past the end of
4289              this element.  */
4290           while (next_offset < end_offset)
4291             {
4292               int this_time;
4293               int shift;
4294               HOST_WIDE_INT value;
4295               HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4296               HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4297
4298               /* Advance from byte to byte
4299                  within this element when necessary.  */
4300               while (next_byte != total_bytes)
4301                 {
4302                   assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4303                   total_bytes++;
4304                   byte = 0;
4305                 }
4306
4307               /* Number of bits we can process at once
4308                  (all part of the same byte).  */
4309               this_time = MIN (end_offset - next_offset,
4310                                BITS_PER_UNIT - next_bit);
4311               if (BYTES_BIG_ENDIAN)
4312                 {
4313                   /* On big-endian machine, take the most significant bits
4314                      first (of the bits that are significant)
4315                      and put them into bytes from the most significant end.  */
4316                   shift = end_offset - next_offset - this_time;
4317
4318                   /* Don't try to take a bunch of bits that cross
4319                      the word boundary in the INTEGER_CST. We can
4320                      only select bits from the LOW or HIGH part
4321                      not from both.  */
4322                   if (shift < HOST_BITS_PER_WIDE_INT
4323                       && shift + this_time > HOST_BITS_PER_WIDE_INT)
4324                     {
4325                       this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4326                       shift = HOST_BITS_PER_WIDE_INT;
4327                     }
4328
4329                   /* Now get the bits from the appropriate constant word.  */
4330                   if (shift < HOST_BITS_PER_WIDE_INT)
4331                     value = TREE_INT_CST_LOW (val);
4332                   else
4333                     {
4334                       gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
4335                       value = TREE_INT_CST_HIGH (val);
4336                       shift -= HOST_BITS_PER_WIDE_INT;
4337                     }
4338
4339                   /* Get the result. This works only when:
4340                      1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
4341                   byte |= (((value >> shift)
4342                             & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4343                            << (BITS_PER_UNIT - this_time - next_bit));
4344                 }
4345               else
4346                 {
4347                   /* On little-endian machines,
4348                      take first the least significant bits of the value
4349                      and pack them starting at the least significant
4350                      bits of the bytes.  */
4351                   shift = next_offset - int_bit_position (field);
4352
4353                   /* Don't try to take a bunch of bits that cross
4354                      the word boundary in the INTEGER_CST. We can
4355                      only select bits from the LOW or HIGH part
4356                      not from both.  */
4357                   if (shift < HOST_BITS_PER_WIDE_INT
4358                       && shift + this_time > HOST_BITS_PER_WIDE_INT)
4359                     this_time = (HOST_BITS_PER_WIDE_INT - shift);
4360
4361                   /* Now get the bits from the appropriate constant word.  */
4362                   if (shift < HOST_BITS_PER_WIDE_INT)
4363                     value = TREE_INT_CST_LOW (val);
4364                   else
4365                     {
4366                       gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
4367                       value = TREE_INT_CST_HIGH (val);
4368                       shift -= HOST_BITS_PER_WIDE_INT;
4369                     }
4370
4371                   /* Get the result. This works only when:
4372                      1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
4373                   byte |= (((value >> shift)
4374                             & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4375                            << next_bit);
4376                 }
4377
4378               next_offset += this_time;
4379               byte_buffer_in_use = 1;
4380             }
4381         }
4382     }
4383
4384   if (byte_buffer_in_use)
4385     {
4386       assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4387       total_bytes++;
4388     }
4389
4390   if ((unsigned HOST_WIDE_INT)total_bytes < size)
4391     assemble_zeros (size - total_bytes);
4392 }
4393
4394 /* This TREE_LIST contains any weak symbol declarations waiting
4395    to be emitted.  */
4396 static GTY(()) tree weak_decls;
4397
4398 /* Mark DECL as weak.  */
4399
4400 static void
4401 mark_weak (tree decl)
4402 {
4403   DECL_WEAK (decl) = 1;
4404
4405   if (DECL_RTL_SET_P (decl)
4406       && MEM_P (DECL_RTL (decl))
4407       && XEXP (DECL_RTL (decl), 0)
4408       && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4409     SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4410 }
4411
4412 /* Merge weak status between NEWDECL and OLDDECL.  */
4413
4414 void
4415 merge_weak (tree newdecl, tree olddecl)
4416 {
4417   if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
4418     {
4419       if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
4420         {
4421           tree *pwd;
4422           /* We put the NEWDECL on the weak_decls list at some point
4423              and OLDDECL as well.  Keep just OLDDECL on the list.  */
4424           for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
4425             if (TREE_VALUE (*pwd) == newdecl)
4426               {
4427                 *pwd = TREE_CHAIN (*pwd);
4428                 break;
4429               }
4430         }
4431       return;
4432     }
4433
4434   if (DECL_WEAK (newdecl))
4435     {
4436       tree wd;
4437
4438       /* NEWDECL is weak, but OLDDECL is not.  */
4439
4440       /* If we already output the OLDDECL, we're in trouble; we can't
4441          go back and make it weak.  This error cannot caught in
4442          declare_weak because the NEWDECL and OLDDECL was not yet
4443          been merged; therefore, TREE_ASM_WRITTEN was not set.  */
4444       if (TREE_ASM_WRITTEN (olddecl))
4445         error ("weak declaration of %q+D must precede definition",
4446                newdecl);
4447
4448       /* If we've already generated rtl referencing OLDDECL, we may
4449          have done so in a way that will not function properly with
4450          a weak symbol.  */
4451       else if (TREE_USED (olddecl)
4452                && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
4453         warning (0, "weak declaration of %q+D after first use results "
4454                  "in unspecified behavior", newdecl);
4455
4456       if (SUPPORTS_WEAK)
4457         {
4458           /* We put the NEWDECL on the weak_decls list at some point.
4459              Replace it with the OLDDECL.  */
4460           for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4461             if (TREE_VALUE (wd) == newdecl)
4462               {
4463                 TREE_VALUE (wd) = olddecl;
4464                 break;
4465               }
4466           /* We may not find the entry on the list.  If NEWDECL is a
4467              weak alias, then we will have already called
4468              globalize_decl to remove the entry; in that case, we do
4469              not need to do anything.  */
4470         }
4471
4472       /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping.  */
4473       mark_weak (olddecl);
4474     }
4475   else
4476     /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4477        weak.  Just update NEWDECL to indicate that it's weak too.  */
4478     mark_weak (newdecl);
4479 }
4480
4481 /* Declare DECL to be a weak symbol.  */
4482
4483 void
4484 declare_weak (tree decl)
4485 {
4486   if (! TREE_PUBLIC (decl))
4487     error ("weak declaration of %q+D must be public", decl);
4488   else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
4489     error ("weak declaration of %q+D must precede definition", decl);
4490   else if (SUPPORTS_WEAK)
4491     {
4492       if (! DECL_WEAK (decl))
4493         weak_decls = tree_cons (NULL, decl, weak_decls);
4494     }
4495   else
4496     warning (0, "weak declaration of %q+D not supported", decl);
4497
4498   mark_weak (decl);
4499 }
4500
4501 static void
4502 weak_finish_1 (tree decl)
4503 {
4504 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4505   const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4506 #endif
4507
4508   if (! TREE_USED (decl))
4509     return;
4510
4511 #ifdef ASM_WEAKEN_DECL
4512   ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4513 #else
4514 #ifdef ASM_WEAKEN_LABEL
4515   ASM_WEAKEN_LABEL (asm_out_file, name);
4516 #else
4517 #ifdef ASM_OUTPUT_WEAK_ALIAS
4518   {
4519     static bool warn_once = 0;
4520     if (! warn_once)
4521       {
4522         warning (0, "only weak aliases are supported in this configuration");
4523         warn_once = 1;
4524       }
4525     return;
4526   }
4527 #endif
4528 #endif
4529 #endif
4530 }
4531
4532 /* This TREE_LIST contains weakref targets.  */
4533
4534 static GTY(()) tree weakref_targets;
4535
4536 /* Forward declaration.  */
4537 static tree find_decl_and_mark_needed (tree decl, tree target);
4538
4539 /* Emit any pending weak declarations.  */
4540
4541 void
4542 weak_finish (void)
4543 {
4544   tree t;
4545
4546   for (t = weakref_targets; t; t = TREE_CHAIN (t))
4547     {
4548       tree alias_decl = TREE_PURPOSE (t);
4549       tree target = ultimate_transparent_alias_target (&TREE_VALUE (t));
4550
4551       if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl)))
4552         /* Remove alias_decl from the weak list, but leave entries for
4553            the target alone.  */
4554         target = NULL_TREE;
4555 #ifndef ASM_OUTPUT_WEAKREF
4556       else if (! TREE_SYMBOL_REFERENCED (target))
4557         {
4558           /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not
4559              defined, otherwise we and weak_finish_1 would use a
4560              different macros.  */
4561 # if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL
4562           ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target));
4563 # else
4564           tree decl = find_decl_and_mark_needed (alias_decl, target);
4565
4566           if (! decl)
4567             {
4568               decl = build_decl (TREE_CODE (alias_decl), target,
4569                                  TREE_TYPE (alias_decl));
4570
4571               DECL_EXTERNAL (decl) = 1;
4572               TREE_PUBLIC (decl) = 1;
4573               DECL_ARTIFICIAL (decl) = 1;
4574               TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl);
4575               TREE_USED (decl) = 1;
4576             }
4577
4578           weak_finish_1 (decl);
4579 # endif
4580         }
4581 #endif
4582
4583       {
4584         tree *p;
4585         tree t2;
4586
4587         /* Remove the alias and the target from the pending weak list
4588            so that we do not emit any .weak directives for the former,
4589            nor multiple .weak directives for the latter.  */
4590         for (p = &weak_decls; (t2 = *p) ; )
4591           {
4592             if (TREE_VALUE (t2) == alias_decl
4593                 || target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2)))
4594               *p = TREE_CHAIN (t2);
4595             else
4596               p = &TREE_CHAIN (t2);
4597           }
4598
4599         /* Remove other weakrefs to the same target, to speed things up.  */
4600         for (p = &TREE_CHAIN (t); (t2 = *p) ; )
4601           {
4602             if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2)))
4603               *p = TREE_CHAIN (t2);
4604             else
4605               p = &TREE_CHAIN (t2);
4606           }
4607       }
4608     }
4609
4610   for (t = weak_decls; t; t = TREE_CHAIN (t))
4611     {
4612       tree decl = TREE_VALUE (t);
4613
4614       weak_finish_1 (decl);
4615     }
4616 }
4617
4618 /* Emit the assembly bits to indicate that DECL is globally visible.  */
4619
4620 static void
4621 globalize_decl (tree decl)
4622 {
4623   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4624
4625 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4626   if (DECL_WEAK (decl))
4627     {
4628       tree *p, t;
4629
4630 #ifdef ASM_WEAKEN_DECL
4631       ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
4632 #else
4633       ASM_WEAKEN_LABEL (asm_out_file, name);
4634 #endif
4635
4636       /* Remove this function from the pending weak list so that
4637          we do not emit multiple .weak directives for it.  */
4638       for (p = &weak_decls; (t = *p) ; )
4639         {
4640           if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4641             *p = TREE_CHAIN (t);
4642           else
4643             p = &TREE_CHAIN (t);
4644         }
4645
4646         /* Remove weakrefs to the same target from the pending weakref
4647            list, for the same reason.  */
4648         for (p = &weakref_targets; (t = *p) ; )
4649           {
4650             if (DECL_ASSEMBLER_NAME (decl)
4651                 == ultimate_transparent_alias_target (&TREE_VALUE (t)))
4652               *p = TREE_CHAIN (t);
4653             else
4654               p = &TREE_CHAIN (t);
4655           }
4656
4657       return;
4658     }
4659 #elif defined(ASM_MAKE_LABEL_LINKONCE)
4660   if (DECL_ONE_ONLY (decl))
4661     ASM_MAKE_LABEL_LINKONCE (asm_out_file, name);
4662 #endif
4663
4664   targetm.asm_out.globalize_label (asm_out_file, name);
4665 }
4666
4667 /* We have to be able to tell cgraph about the needed-ness of the target
4668    of an alias.  This requires that the decl have been defined.  Aliases
4669    that precede their definition have to be queued for later processing.  */
4670
4671 typedef struct alias_pair GTY(())
4672 {
4673   tree decl;
4674   tree target;
4675 } alias_pair;
4676
4677 /* Define gc'd vector type.  */
4678 DEF_VEC_O(alias_pair);
4679 DEF_VEC_ALLOC_O(alias_pair,gc);
4680
4681 static GTY(()) VEC(alias_pair,gc) *alias_pairs;
4682
4683 /* Given an assembly name, find the decl it is associated with.  At the
4684    same time, mark it needed for cgraph.  */
4685
4686 static tree
4687 find_decl_and_mark_needed (tree decl, tree target)
4688 {
4689   struct cgraph_node *fnode = NULL;
4690   struct cgraph_varpool_node *vnode = NULL;
4691
4692   if (TREE_CODE (decl) == FUNCTION_DECL)
4693     {
4694       fnode = cgraph_node_for_asm (target);
4695       if (fnode == NULL)
4696         vnode = cgraph_varpool_node_for_asm (target);
4697     }
4698   else
4699     {
4700       vnode = cgraph_varpool_node_for_asm (target);
4701       if (vnode == NULL)
4702         fnode = cgraph_node_for_asm (target);
4703     }
4704
4705   if (fnode)
4706     {
4707       /* We can't mark function nodes as used after cgraph global info
4708          is finished.  This wouldn't generally be necessary, but C++
4709          virtual table thunks are introduced late in the game and
4710          might seem like they need marking, although in fact they
4711          don't.  */
4712       if (! cgraph_global_info_ready)
4713         cgraph_mark_needed_node (fnode);
4714       return fnode->decl;
4715     }
4716   else if (vnode)
4717     {
4718       cgraph_varpool_mark_needed_node (vnode);
4719       return vnode->decl;
4720     }
4721   else 
4722     return NULL_TREE;
4723 }
4724
4725 /* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
4726    or ASM_OUTPUT_DEF_FROM_DECLS.  The function defines the symbol whose
4727    tree node is DECL to have the value of the tree node TARGET.  */
4728
4729 static void
4730 do_assemble_alias (tree decl, tree target)
4731 {
4732   if (TREE_ASM_WRITTEN (decl))
4733     return;
4734
4735   TREE_ASM_WRITTEN (decl) = 1;
4736   TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
4737
4738   if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
4739     {
4740       ultimate_transparent_alias_target (&target);
4741
4742       if (!TREE_SYMBOL_REFERENCED (target))
4743         weakref_targets = tree_cons (decl, target, weakref_targets);
4744
4745 #ifdef ASM_OUTPUT_WEAKREF
4746       ASM_OUTPUT_WEAKREF (asm_out_file, decl,
4747                           IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
4748                           IDENTIFIER_POINTER (target));
4749 #else
4750       if (!SUPPORTS_WEAK)
4751         {
4752           error ("%Jweakref is not supported in this configuration", decl);
4753           return;
4754         }
4755 #endif
4756       return;
4757     }
4758
4759 #ifdef ASM_OUTPUT_DEF
4760   /* Make name accessible from other files, if appropriate.  */
4761
4762   if (TREE_PUBLIC (decl))
4763     {
4764       globalize_decl (decl);
4765       maybe_assemble_visibility (decl);
4766     }
4767
4768 # ifdef ASM_OUTPUT_DEF_FROM_DECLS
4769   ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4770 # else
4771   ASM_OUTPUT_DEF (asm_out_file,
4772                   IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
4773                   IDENTIFIER_POINTER (target));
4774 # endif
4775 #elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
4776   {
4777     const char *name;
4778     tree *p, t;
4779
4780     name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4781 # ifdef ASM_WEAKEN_DECL
4782     ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
4783 # else
4784     ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4785 # endif
4786     /* Remove this function from the pending weak list so that
4787        we do not emit multiple .weak directives for it.  */
4788     for (p = &weak_decls; (t = *p) ; )
4789       if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4790         *p = TREE_CHAIN (t);
4791       else
4792         p = &TREE_CHAIN (t);
4793
4794     /* Remove weakrefs to the same target from the pending weakref
4795        list, for the same reason.  */
4796     for (p = &weakref_targets; (t = *p) ; )
4797       {
4798         if (DECL_ASSEMBLER_NAME (decl)
4799             == ultimate_transparent_alias_target (&TREE_VALUE (t)))
4800           *p = TREE_CHAIN (t);
4801         else
4802           p = &TREE_CHAIN (t);
4803       }
4804   }
4805 #endif
4806 }
4807
4808 /* First pass of completing pending aliases.  Make sure that cgraph knows
4809    which symbols will be required.  */
4810
4811 void
4812 finish_aliases_1 (void)
4813 {
4814   unsigned i;
4815   alias_pair *p;
4816
4817   for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
4818     {
4819       tree target_decl;
4820
4821       target_decl = find_decl_and_mark_needed (p->decl, p->target);
4822       if (target_decl == NULL)
4823         {
4824           if (! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
4825             error ("%q+D aliased to undefined symbol %qs",
4826                    p->decl, IDENTIFIER_POINTER (p->target));
4827         }
4828       else if (DECL_EXTERNAL (target_decl)
4829                && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
4830         error ("%q+D aliased to external symbol %qs",
4831                p->decl, IDENTIFIER_POINTER (p->target));
4832     }
4833 }
4834
4835 /* Second pass of completing pending aliases.  Emit the actual assembly.
4836    This happens at the end of compilation and thus it is assured that the
4837    target symbol has been emitted.  */
4838
4839 void
4840 finish_aliases_2 (void)
4841 {
4842   unsigned i;
4843   alias_pair *p;
4844
4845   for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
4846     do_assemble_alias (p->decl, p->target);
4847
4848   VEC_truncate (alias_pair, alias_pairs, 0);
4849 }
4850
4851 /* Emit an assembler directive to make the symbol for DECL an alias to
4852    the symbol for TARGET.  */
4853
4854 void
4855 assemble_alias (tree decl, tree target)
4856 {
4857   tree target_decl;
4858   bool is_weakref = false;
4859
4860   if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
4861     {
4862       tree alias = DECL_ASSEMBLER_NAME (decl);
4863
4864       is_weakref = true;
4865
4866       ultimate_transparent_alias_target (&target);
4867
4868       if (alias == target)
4869         error ("weakref %q+D ultimately targets itself", decl);
4870       else
4871         {
4872 #ifndef ASM_OUTPUT_WEAKREF
4873           IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1;
4874           TREE_CHAIN (alias) = target;
4875 #endif
4876         }
4877       if (TREE_PUBLIC (decl))
4878         error ("weakref %q+D must have static linkage", decl);
4879     }
4880   else
4881     {
4882 #if !defined (ASM_OUTPUT_DEF)
4883 # if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
4884       error ("%Jalias definitions not supported in this configuration", decl);
4885       return;
4886 # else
4887       if (!DECL_WEAK (decl))
4888         {
4889           error ("%Jonly weak aliases are supported in this configuration", decl);
4890           return;
4891         }
4892 # endif
4893 #endif
4894     }
4895
4896   /* We must force creation of DECL_RTL for debug info generation, even though
4897      we don't use it here.  */
4898   make_decl_rtl (decl);
4899   TREE_USED (decl) = 1;
4900
4901   /* A quirk of the initial implementation of aliases required that the user
4902      add "extern" to all of them.  Which is silly, but now historical.  Do
4903      note that the symbol is in fact locally defined.  */
4904   if (! is_weakref)
4905     DECL_EXTERNAL (decl) = 0;
4906
4907   /* Allow aliases to aliases.  */
4908   if (TREE_CODE (decl) == FUNCTION_DECL)
4909     cgraph_node (decl)->alias = true;
4910   else
4911     cgraph_varpool_node (decl)->alias = true;
4912
4913   /* If the target has already been emitted, we don't have to queue the
4914      alias.  This saves a tad o memory.  */
4915   target_decl = find_decl_and_mark_needed (decl, target);
4916   if (target_decl && TREE_ASM_WRITTEN (target_decl))
4917     do_assemble_alias (decl, target);
4918   else
4919     {
4920       alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL);
4921       p->decl = decl;
4922       p->target = target;
4923     }
4924 }
4925
4926 /* Emit an assembler directive to set symbol for DECL visibility to
4927    the visibility type VIS, which must not be VISIBILITY_DEFAULT.  */
4928
4929 void
4930 default_assemble_visibility (tree decl, int vis)
4931 {
4932   static const char * const visibility_types[] = {
4933     NULL, "internal", "hidden", "protected"
4934   };
4935
4936   const char *name, *type;
4937
4938   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4939   type = visibility_types[vis];
4940
4941 #ifdef HAVE_GAS_HIDDEN
4942   fprintf (asm_out_file, "\t.%s\t", type);
4943   assemble_name (asm_out_file, name);
4944   fprintf (asm_out_file, "\n");
4945 #else
4946   warning (OPT_Wattributes, "visibility attribute not supported "
4947            "in this configuration; ignored");
4948 #endif
4949 }
4950
4951 /* A helper function to call assemble_visibility when needed for a decl.  */
4952
4953 static void
4954 maybe_assemble_visibility (tree decl)
4955 {
4956   enum symbol_visibility vis = DECL_VISIBILITY (decl);
4957
4958   if (vis != VISIBILITY_DEFAULT)
4959     targetm.asm_out.visibility (decl, vis);
4960 }
4961
4962 /* Returns 1 if the target configuration supports defining public symbols
4963    so that one of them will be chosen at link time instead of generating a
4964    multiply-defined symbol error, whether through the use of weak symbols or
4965    a target-specific mechanism for having duplicates discarded.  */
4966
4967 int
4968 supports_one_only (void)
4969 {
4970   if (SUPPORTS_ONE_ONLY)
4971     return 1;
4972   return SUPPORTS_WEAK;
4973 }
4974
4975 /* Set up DECL as a public symbol that can be defined in multiple
4976    translation units without generating a linker error.  */
4977
4978 void
4979 make_decl_one_only (tree decl)
4980 {
4981   gcc_assert (TREE_CODE (decl) == VAR_DECL
4982               || TREE_CODE (decl) == FUNCTION_DECL);
4983
4984   TREE_PUBLIC (decl) = 1;
4985
4986   if (SUPPORTS_ONE_ONLY)
4987     {
4988 #ifdef MAKE_DECL_ONE_ONLY
4989       MAKE_DECL_ONE_ONLY (decl);
4990 #endif
4991       DECL_ONE_ONLY (decl) = 1;
4992     }
4993   else if (TREE_CODE (decl) == VAR_DECL
4994       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4995     DECL_COMMON (decl) = 1;
4996   else
4997     {
4998       gcc_assert (SUPPORTS_WEAK);
4999       DECL_WEAK (decl) = 1;
5000     }
5001 }
5002
5003 void
5004 init_varasm_once (void)
5005 {
5006   in_named_htab = htab_create_ggc (31, in_named_entry_hash,
5007                                    in_named_entry_eq, NULL);
5008   const_desc_htab = htab_create_ggc (1009, const_desc_hash,
5009                                      const_desc_eq, NULL);
5010
5011   const_alias_set = new_alias_set ();
5012 }
5013
5014 enum tls_model
5015 decl_default_tls_model (tree decl)
5016 {
5017   enum tls_model kind;
5018   bool is_local;
5019
5020   is_local = targetm.binds_local_p (decl);
5021   if (!flag_shlib)
5022     {
5023       if (is_local)
5024         kind = TLS_MODEL_LOCAL_EXEC;
5025       else
5026         kind = TLS_MODEL_INITIAL_EXEC;
5027     }
5028
5029   /* Local dynamic is inefficient when we're not combining the
5030      parts of the address.  */
5031   else if (optimize && is_local)
5032     kind = TLS_MODEL_LOCAL_DYNAMIC;
5033   else
5034     kind = TLS_MODEL_GLOBAL_DYNAMIC;
5035   if (kind < flag_tls_default)
5036     kind = flag_tls_default;
5037
5038   return kind;
5039 }
5040
5041 /* Select a set of attributes for section NAME based on the properties
5042    of DECL and whether or not RELOC indicates that DECL's initializer
5043    might contain runtime relocations.
5044
5045    We make the section read-only and executable for a function decl,
5046    read-only for a const data decl, and writable for a non-const data decl.  */
5047
5048 unsigned int
5049 default_section_type_flags (tree decl, const char *name, int reloc)
5050 {
5051   return default_section_type_flags_1 (decl, name, reloc, flag_pic);
5052 }
5053
5054 unsigned int
5055 default_section_type_flags_1 (tree decl, const char *name, int reloc,
5056                               int shlib)
5057 {
5058   unsigned int flags;
5059
5060   if (decl && TREE_CODE (decl) == FUNCTION_DECL)
5061     flags = SECTION_CODE;
5062   else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
5063     flags = 0;
5064   else if (current_function_decl
5065            && cfun
5066            && cfun->unlikely_text_section_name
5067            && strcmp (name, cfun->unlikely_text_section_name) == 0)
5068     flags = SECTION_CODE;
5069   else if (!decl 
5070            && (!current_function_decl || !cfun)
5071            && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
5072     flags = SECTION_CODE; 
5073   else
5074     flags = SECTION_WRITE;
5075
5076   if (decl && DECL_ONE_ONLY (decl))
5077     flags |= SECTION_LINKONCE;
5078
5079   if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
5080     flags |= SECTION_TLS | SECTION_WRITE;
5081
5082   if (strcmp (name, ".bss") == 0
5083       || strncmp (name, ".bss.", 5) == 0
5084       || strncmp (name, ".gnu.linkonce.b.", 16) == 0
5085       || strcmp (name, ".sbss") == 0
5086       || strncmp (name, ".sbss.", 6) == 0
5087       || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
5088     flags |= SECTION_BSS;
5089
5090   if (strcmp (name, ".tdata") == 0
5091       || strncmp (name, ".tdata.", 7) == 0
5092       || strncmp (name, ".gnu.linkonce.td.", 17) == 0)
5093     flags |= SECTION_TLS;
5094
5095   if (strcmp (name, ".tbss") == 0
5096       || strncmp (name, ".tbss.", 6) == 0
5097       || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
5098     flags |= SECTION_TLS | SECTION_BSS;
5099
5100   /* These three sections have special ELF types.  They are neither
5101      SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
5102      want to print a section type (@progbits or @nobits).  If someone
5103      is silly enough to emit code or TLS variables to one of these
5104      sections, then don't handle them specially.  */
5105   if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
5106       && (strcmp (name, ".init_array") == 0
5107           || strcmp (name, ".fini_array") == 0
5108           || strcmp (name, ".preinit_array") == 0))
5109     flags |= SECTION_NOTYPE;
5110
5111   return flags;
5112 }
5113
5114 /* Output assembly to switch to section NAME with attribute FLAGS.
5115    Four variants for common object file formats.  */
5116
5117 void
5118 default_no_named_section (const char *name ATTRIBUTE_UNUSED,
5119                           unsigned int flags ATTRIBUTE_UNUSED,
5120                           tree decl ATTRIBUTE_UNUSED)
5121 {
5122   /* Some object formats don't support named sections at all.  The
5123      front-end should already have flagged this as an error.  */
5124   gcc_unreachable ();
5125 }
5126
5127 void
5128 default_elf_asm_named_section (const char *name, unsigned int flags,
5129                                tree decl ATTRIBUTE_UNUSED)
5130 {
5131   char flagchars[10], *f = flagchars;
5132
5133   /* If we have already declared this section, we can use an
5134      abbreviated form to switch back to it -- unless this section is
5135      part of a COMDAT groups, in which case GAS requires the full
5136      declaration every time.  */
5137   if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
5138       && ! named_section_first_declaration (name))
5139     {
5140       fprintf (asm_out_file, "\t.section\t%s\n", name);
5141       return;
5142     }
5143
5144   if (!(flags & SECTION_DEBUG))
5145     *f++ = 'a';
5146   if (flags & SECTION_WRITE)
5147     *f++ = 'w';
5148   if (flags & SECTION_CODE)
5149     *f++ = 'x';
5150   if (flags & SECTION_SMALL)
5151     *f++ = 's';
5152   if (flags & SECTION_MERGE)
5153     *f++ = 'M';
5154   if (flags & SECTION_STRINGS)
5155     *f++ = 'S';
5156   if (flags & SECTION_TLS)
5157     *f++ = 'T';
5158   if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
5159     *f++ = 'G';
5160   *f = '\0';
5161
5162   fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
5163
5164   if (!(flags & SECTION_NOTYPE))
5165     {
5166       const char *type;
5167       const char *format;
5168
5169       if (flags & SECTION_BSS)
5170         type = "nobits";
5171       else
5172         type = "progbits";
5173
5174       format = ",@%s";
5175 #ifdef ASM_COMMENT_START
5176       /* On platforms that use "@" as the assembly comment character,
5177          use "%" instead.  */
5178       if (strcmp (ASM_COMMENT_START, "@") == 0)
5179         format = ",%%%s";
5180 #endif
5181       fprintf (asm_out_file, format, type);
5182
5183       if (flags & SECTION_ENTSIZE)
5184         fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
5185       if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
5186         fprintf (asm_out_file, ",%s,comdat", 
5187                  lang_hooks.decls.comdat_group (decl));
5188     }
5189
5190   putc ('\n', asm_out_file);
5191 }
5192
5193 void
5194 default_coff_asm_named_section (const char *name, unsigned int flags, 
5195                                 tree decl ATTRIBUTE_UNUSED)
5196 {
5197   char flagchars[8], *f = flagchars;
5198
5199   if (flags & SECTION_WRITE)
5200     *f++ = 'w';
5201   if (flags & SECTION_CODE)
5202     *f++ = 'x';
5203   *f = '\0';
5204
5205   fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
5206 }
5207
5208 void
5209 default_pe_asm_named_section (const char *name, unsigned int flags,
5210                               tree decl)
5211 {
5212   default_coff_asm_named_section (name, flags, decl);
5213
5214   if (flags & SECTION_LINKONCE)
5215     {
5216       /* Functions may have been compiled at various levels of
5217          optimization so we can't use `same_size' here.
5218          Instead, have the linker pick one.  */
5219       fprintf (asm_out_file, "\t.linkonce %s\n",
5220                (flags & SECTION_CODE ? "discard" : "same_size"));
5221     }
5222 }
5223 \f
5224 /* The lame default section selector.  */
5225
5226 void
5227 default_select_section (tree decl, int reloc,
5228                         unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
5229 {
5230   bool readonly = false;
5231
5232   if (DECL_P (decl))
5233     {
5234       if (decl_readonly_section (decl, reloc))
5235         readonly = true;
5236     }
5237   else if (TREE_CODE (decl) == CONSTRUCTOR)
5238     {
5239       if (! ((flag_pic && reloc)
5240              || !TREE_READONLY (decl)
5241              || TREE_SIDE_EFFECTS (decl)
5242              || !TREE_CONSTANT (decl)))
5243         readonly = true;
5244     }
5245   else if (TREE_CODE (decl) == STRING_CST)
5246     readonly = true;
5247   else if (! (flag_pic && reloc))
5248     readonly = true;
5249
5250   if (readonly)
5251     readonly_data_section ();
5252   else
5253     data_section ();
5254 }
5255
5256 enum section_category
5257 categorize_decl_for_section (tree decl, int reloc, int shlib)
5258 {
5259   enum section_category ret;
5260
5261   if (TREE_CODE (decl) == FUNCTION_DECL)
5262     return SECCAT_TEXT;
5263   else if (TREE_CODE (decl) == STRING_CST)
5264     {
5265       if (flag_mudflap) /* or !flag_merge_constants */
5266         return SECCAT_RODATA;
5267       else
5268         return SECCAT_RODATA_MERGE_STR;
5269     }
5270   else if (TREE_CODE (decl) == VAR_DECL)
5271     {
5272       if (DECL_INITIAL (decl) == NULL
5273           || DECL_INITIAL (decl) == error_mark_node
5274           || (flag_zero_initialized_in_bss
5275               /* Leave constant zeroes in .rodata so they can be shared.  */
5276               && !TREE_READONLY (decl)
5277               && initializer_zerop (DECL_INITIAL (decl))))
5278         ret = SECCAT_BSS;
5279       else if (! TREE_READONLY (decl)
5280                || TREE_SIDE_EFFECTS (decl)
5281                || ! TREE_CONSTANT (DECL_INITIAL (decl)))
5282         {
5283           if (shlib && (reloc & 2))
5284             ret = SECCAT_DATA_REL;
5285           else if (shlib && reloc)
5286             ret = SECCAT_DATA_REL_LOCAL;
5287           else
5288             ret = SECCAT_DATA;
5289         }
5290       else if (shlib && (reloc & 2))
5291         ret = SECCAT_DATA_REL_RO;
5292       else if (shlib && reloc)
5293         ret = SECCAT_DATA_REL_RO_LOCAL;
5294       else if (reloc || flag_merge_constants < 2)
5295         /* C and C++ don't allow different variables to share the same
5296            location.  -fmerge-all-constants allows even that (at the
5297            expense of not conforming).  */
5298         ret = SECCAT_RODATA;
5299       else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
5300         ret = SECCAT_RODATA_MERGE_STR_INIT;
5301       else
5302         ret = SECCAT_RODATA_MERGE_CONST;
5303     }
5304   else if (TREE_CODE (decl) == CONSTRUCTOR)
5305     {
5306       if ((shlib && reloc)
5307           || TREE_SIDE_EFFECTS (decl)
5308           || ! TREE_CONSTANT (decl))
5309         ret = SECCAT_DATA;
5310       else
5311         ret = SECCAT_RODATA;
5312     }
5313   else
5314     ret = SECCAT_RODATA;
5315
5316   /* There are no read-only thread-local sections.  */
5317   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
5318     {
5319       /* Note that this would be *just* SECCAT_BSS, except that there's
5320          no concept of a read-only thread-local-data section.  */
5321       if (ret == SECCAT_BSS
5322           || (flag_zero_initialized_in_bss
5323               && initializer_zerop (DECL_INITIAL (decl))))
5324         ret = SECCAT_TBSS;
5325       else
5326         ret = SECCAT_TDATA;
5327     }
5328
5329   /* If the target uses small data sections, select it.  */
5330   else if (targetm.in_small_data_p (decl))
5331     {
5332       if (ret == SECCAT_BSS)
5333         ret = SECCAT_SBSS;
5334       else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
5335         ret = SECCAT_SRODATA;
5336       else
5337         ret = SECCAT_SDATA;
5338     }
5339
5340   return ret;
5341 }
5342
5343 bool
5344 decl_readonly_section (tree decl, int reloc)
5345 {
5346   return decl_readonly_section_1 (decl, reloc, flag_pic);
5347 }
5348
5349 bool
5350 decl_readonly_section_1 (tree decl, int reloc, int shlib)
5351 {
5352   switch (categorize_decl_for_section (decl, reloc, shlib))
5353     {
5354     case SECCAT_RODATA:
5355     case SECCAT_RODATA_MERGE_STR:
5356     case SECCAT_RODATA_MERGE_STR_INIT:
5357     case SECCAT_RODATA_MERGE_CONST:
5358     case SECCAT_SRODATA:
5359       return true;
5360       break;
5361     default:
5362       return false;
5363       break;
5364     }
5365 }
5366
5367 /* Select a section based on the above categorization.  */
5368
5369 void
5370 default_elf_select_section (tree decl, int reloc,
5371                             unsigned HOST_WIDE_INT align)
5372 {
5373   default_elf_select_section_1 (decl, reloc, align, flag_pic);
5374 }
5375
5376 void
5377 default_elf_select_section_1 (tree decl, int reloc,
5378                               unsigned HOST_WIDE_INT align, int shlib)
5379 {
5380   const char *sname;
5381   switch (categorize_decl_for_section (decl, reloc, shlib))
5382     {
5383     case SECCAT_TEXT:
5384       /* We're not supposed to be called on FUNCTION_DECLs.  */
5385       gcc_unreachable ();
5386     case SECCAT_RODATA:
5387       readonly_data_section ();
5388       return;
5389     case SECCAT_RODATA_MERGE_STR:
5390       mergeable_string_section (decl, align, 0);
5391       return;
5392     case SECCAT_RODATA_MERGE_STR_INIT:
5393       mergeable_string_section (DECL_INITIAL (decl), align, 0);
5394       return;
5395     case SECCAT_RODATA_MERGE_CONST:
5396       mergeable_constant_section (DECL_MODE (decl), align, 0);
5397       return;
5398     case SECCAT_SRODATA:
5399       sname = ".sdata2";
5400       break;
5401     case SECCAT_DATA:
5402       data_section ();
5403       return;
5404     case SECCAT_DATA_REL:
5405       sname = ".data.rel";
5406       break;
5407     case SECCAT_DATA_REL_LOCAL:
5408       sname = ".data.rel.local";
5409       break;
5410     case SECCAT_DATA_REL_RO:
5411       sname = ".data.rel.ro";
5412       break;
5413     case SECCAT_DATA_REL_RO_LOCAL:
5414       sname = ".data.rel.ro.local";
5415       break;
5416     case SECCAT_SDATA:
5417       sname = ".sdata";
5418       break;
5419     case SECCAT_TDATA:
5420       sname = ".tdata";
5421       break;
5422     case SECCAT_BSS:
5423 #ifdef BSS_SECTION_ASM_OP
5424       bss_section ();
5425       return;
5426 #else
5427       sname = ".bss";
5428       break;
5429 #endif
5430     case SECCAT_SBSS:
5431       sname = ".sbss";
5432       break;
5433     case SECCAT_TBSS:
5434       sname = ".tbss";
5435       break;
5436     default:
5437       gcc_unreachable ();
5438     }
5439
5440   if (!DECL_P (decl))
5441     decl = NULL_TREE;
5442   named_section (decl, sname, reloc);
5443 }
5444
5445 /* Construct a unique section name based on the decl name and the
5446    categorization performed above.  */
5447
5448 void
5449 default_unique_section (tree decl, int reloc)
5450 {
5451   default_unique_section_1 (decl, reloc, flag_pic);
5452 }
5453
5454 void
5455 default_unique_section_1 (tree decl, int reloc, int shlib)
5456 {
5457   /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
5458   bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
5459   const char *prefix, *name;
5460   size_t nlen, plen;
5461   char *string;
5462
5463   switch (categorize_decl_for_section (decl, reloc, shlib))
5464     {
5465     case SECCAT_TEXT:
5466       prefix = one_only ? ".gnu.linkonce.t." : ".text.";
5467       break;
5468     case SECCAT_RODATA:
5469     case SECCAT_RODATA_MERGE_STR:
5470     case SECCAT_RODATA_MERGE_STR_INIT:
5471     case SECCAT_RODATA_MERGE_CONST:
5472       prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
5473       break;
5474     case SECCAT_SRODATA:
5475       prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
5476       break;
5477     case SECCAT_DATA:
5478     case SECCAT_DATA_REL:
5479     case SECCAT_DATA_REL_LOCAL:
5480     case SECCAT_DATA_REL_RO:
5481     case SECCAT_DATA_REL_RO_LOCAL:
5482       prefix = one_only ? ".gnu.linkonce.d." : ".data.";
5483       break;
5484     case SECCAT_SDATA:
5485       prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
5486       break;
5487     case SECCAT_BSS:
5488       prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
5489       break;
5490     case SECCAT_SBSS:
5491       prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
5492       break;
5493     case SECCAT_TDATA:
5494       prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
5495       break;
5496     case SECCAT_TBSS:
5497       prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
5498       break;
5499     default:
5500       gcc_unreachable ();
5501     }
5502   plen = strlen (prefix);
5503
5504   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5505   name = targetm.strip_name_encoding (name);
5506   nlen = strlen (name);
5507
5508   string = alloca (nlen + plen + 1);
5509   memcpy (string, prefix, plen);
5510   memcpy (string + plen, name, nlen + 1);
5511
5512   DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
5513 }
5514
5515 void
5516 default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
5517                             rtx x,
5518                             unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
5519 {
5520   if (flag_pic)
5521     switch (GET_CODE (x))
5522       {
5523       case CONST:
5524       case SYMBOL_REF:
5525       case LABEL_REF:
5526         data_section ();
5527         return;
5528
5529       default:
5530         break;
5531       }
5532
5533   readonly_data_section ();
5534 }
5535
5536 void
5537 default_elf_select_rtx_section (enum machine_mode mode, rtx x,
5538                                 unsigned HOST_WIDE_INT align)
5539 {
5540   /* ??? Handle small data here somehow.  */
5541
5542   if (flag_pic)
5543     switch (GET_CODE (x))
5544       {
5545       case CONST:
5546       case SYMBOL_REF:
5547         named_section (NULL_TREE, ".data.rel.ro", 3);
5548         return;
5549
5550       case LABEL_REF:
5551         named_section (NULL_TREE, ".data.rel.ro.local", 1);
5552         return;
5553
5554       default:
5555         break;
5556       }
5557
5558   mergeable_constant_section (mode, align, 0);
5559 }
5560
5561 /* Set the generally applicable flags on the SYMBOL_REF for EXP.  */
5562
5563 void
5564 default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
5565 {
5566   rtx symbol;
5567   int flags;
5568
5569   /* Careful not to prod global register variables.  */
5570   if (!MEM_P (rtl))
5571     return;
5572   symbol = XEXP (rtl, 0);
5573   if (GET_CODE (symbol) != SYMBOL_REF)
5574     return;
5575
5576   flags = 0;
5577   if (TREE_CODE (decl) == FUNCTION_DECL)
5578     flags |= SYMBOL_FLAG_FUNCTION;
5579   if (targetm.binds_local_p (decl))
5580     flags |= SYMBOL_FLAG_LOCAL;
5581   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
5582     flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT;
5583   else if (targetm.in_small_data_p (decl))
5584     flags |= SYMBOL_FLAG_SMALL;
5585   /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names?  Without
5586      being PUBLIC, the thing *must* be defined in this translation unit.
5587      Prevent this buglet from being propagated into rtl code as well.  */
5588   if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
5589     flags |= SYMBOL_FLAG_EXTERNAL;
5590
5591   SYMBOL_REF_FLAGS (symbol) = flags;
5592 }
5593
5594 /* By default, we do nothing for encode_section_info, so we need not
5595    do anything but discard the '*' marker.  */
5596
5597 const char *
5598 default_strip_name_encoding (const char *str)
5599 {
5600   return str + (*str == '*');
5601 }
5602
5603 /* Assume ELF-ish defaults, since that's pretty much the most liberal
5604    wrt cross-module name binding.  */
5605
5606 bool
5607 default_binds_local_p (tree exp)
5608 {
5609   return default_binds_local_p_1 (exp, flag_shlib);
5610 }
5611
5612 bool
5613 default_binds_local_p_1 (tree exp, int shlib)
5614 {
5615   bool local_p;
5616
5617   /* A non-decl is an entry in the constant pool.  */
5618   if (!DECL_P (exp))
5619     local_p = true;
5620   /* Weakrefs may not bind locally, even though the weakref itself is
5621      always static and therefore local.  */
5622   else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp)))
5623     local_p = false;
5624   /* Static variables are always local.  */
5625   else if (! TREE_PUBLIC (exp))
5626     local_p = true;
5627   /* A variable is local if the user has said explicitly that it will
5628      be.  */
5629   else if (DECL_VISIBILITY_SPECIFIED (exp) 
5630            && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5631     local_p = true;
5632   /* Variables defined outside this object might not be local.  */
5633   else if (DECL_EXTERNAL (exp))
5634     local_p = false;
5635   /* If defined in this object and visibility is not default, must be
5636      local.  */
5637   else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5638     local_p = true;
5639   /* Default visibility weak data can be overridden by a strong symbol
5640      in another module and so are not local.  */
5641   else if (DECL_WEAK (exp))
5642     local_p = false;
5643   /* If PIC, then assume that any global name can be overridden by
5644      symbols resolved from other modules.  */
5645   else if (shlib)
5646     local_p = false;
5647   /* Uninitialized COMMON variable may be unified with symbols
5648      resolved from other modules.  */
5649   else if (DECL_COMMON (exp)
5650            && (DECL_INITIAL (exp) == NULL
5651                || DECL_INITIAL (exp) == error_mark_node))
5652     local_p = false;
5653   /* Otherwise we're left with initialized (or non-common) global data
5654      which is of necessity defined locally.  */
5655   else
5656     local_p = true;
5657
5658   return local_p;
5659 }
5660
5661 /* Determine whether or not a pointer mode is valid. Assume defaults
5662    of ptr_mode or Pmode - can be overridden.  */
5663 bool
5664 default_valid_pointer_mode (enum machine_mode mode)
5665 {
5666   return (mode == ptr_mode || mode == Pmode);
5667 }
5668
5669 /* Default function to output code that will globalize a label.  A
5670    target must define GLOBAL_ASM_OP or provide its own function to
5671    globalize a label.  */
5672 #ifdef GLOBAL_ASM_OP
5673 void
5674 default_globalize_label (FILE * stream, const char *name)
5675 {
5676   fputs (GLOBAL_ASM_OP, stream);
5677   assemble_name (stream, name);
5678   putc ('\n', stream);
5679 }
5680 #endif /* GLOBAL_ASM_OP */
5681
5682 /* Default function to output a label for unwind information.  The
5683    default is to do nothing.  A target that needs nonlocal labels for
5684    unwind information must provide its own function to do this.  */
5685 void
5686 default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
5687                            tree decl ATTRIBUTE_UNUSED,
5688                            int for_eh ATTRIBUTE_UNUSED,
5689                            int empty ATTRIBUTE_UNUSED)
5690
5691 }
5692
5693 /* This is how to output an internal numbered label where PREFIX is
5694    the class of label and LABELNO is the number within the class.  */
5695
5696 void
5697 default_internal_label (FILE *stream, const char *prefix,
5698                         unsigned long labelno)
5699 {
5700   char *const buf = alloca (40 + strlen (prefix));
5701   ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
5702   ASM_OUTPUT_INTERNAL_LABEL (stream, buf);
5703 }
5704
5705 /* This is the default behavior at the beginning of a file.  It's
5706    controlled by two other target-hook toggles.  */
5707 void
5708 default_file_start (void)
5709 {
5710   if (targetm.file_start_app_off && !flag_verbose_asm)
5711     fputs (ASM_APP_OFF, asm_out_file);
5712
5713   if (targetm.file_start_file_directive)
5714     output_file_directive (asm_out_file, main_input_filename);
5715 }
5716
5717 /* This is a generic routine suitable for use as TARGET_ASM_FILE_END
5718    which emits a special section directive used to indicate whether or
5719    not this object file needs an executable stack.  This is primarily
5720    a GNU extension to ELF but could be used on other targets.  */
5721
5722 int trampolines_created;
5723
5724 void
5725 file_end_indicate_exec_stack (void)
5726 {
5727   unsigned int flags = SECTION_DEBUG;
5728   if (trampolines_created)
5729     flags |= SECTION_CODE;
5730
5731   named_section_flags (".note.GNU-stack", flags);
5732 }
5733
5734 #include "gt-varasm.h"