OSDN Git Service

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