OSDN Git Service

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