OSDN Git Service

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