OSDN Git Service

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