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