OSDN Git Service

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