xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/varasm.c (revision cef8759bd76c1b621f8eab8faa6f208faabc2e15)
1 /* Output variables, constants and external declarations, for GNU compiler.
2    Copyright (C) 1987-2017 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 
21 /* This file handles generation of all the assembler code
22    *except* the instructions of a function.
23    This includes declarations of variables and their initial values.
24 
25    We also output the assembler code for constants stored in memory
26    and are responsible for combining constants with the same value.  */
27 
28 #include "config.h"
29 #include "system.h"
30 #include "coretypes.h"
31 #include "backend.h"
32 #include "target.h"
33 #include "rtl.h"
34 #include "tree.h"
35 #include "predict.h"
36 #include "memmodel.h"
37 #include "tm_p.h"
38 #include "stringpool.h"
39 #include "regs.h"
40 #include "emit-rtl.h"
41 #include "cgraph.h"
42 #include "diagnostic-core.h"
43 #include "fold-const.h"
44 #include "stor-layout.h"
45 #include "varasm.h"
46 #include "flags.h"
47 #include "stmt.h"
48 #include "expr.h"
49 #include "expmed.h"
50 #include "output.h"
51 #include "langhooks.h"
52 #include "debug.h"
53 #include "common/common-target.h"
54 #include "asan.h"
55 #include "rtl-iter.h"
56 
57 #ifdef XCOFF_DEBUGGING_INFO
58 #include "xcoffout.h"		/* Needed for external data declarations.  */
59 #endif
60 
61 /* The (assembler) name of the first globally-visible object output.  */
62 extern GTY(()) const char *first_global_object_name;
63 extern GTY(()) const char *weak_global_object_name;
64 
65 const char *first_global_object_name;
66 const char *weak_global_object_name;
67 
68 struct addr_const;
69 struct constant_descriptor_rtx;
70 struct rtx_constant_pool;
71 
72 #define n_deferred_constants (crtl->varasm.deferred_constants)
73 
74 /* Number for making the label on the next
75    constant that is stored in memory.  */
76 
77 static GTY(()) int const_labelno;
78 
79 /* Carry information from ASM_DECLARE_OBJECT_NAME
80    to ASM_FINISH_DECLARE_OBJECT.  */
81 
82 int size_directive_output;
83 
84 /* The last decl for which assemble_variable was called,
85    if it did ASM_DECLARE_OBJECT_NAME.
86    If the last call to assemble_variable didn't do that,
87    this holds 0.  */
88 
89 tree last_assemble_variable_decl;
90 
91 /* The following global variable indicates if the first basic block
92    in a function belongs to the cold partition or not.  */
93 
94 bool first_function_block_is_cold;
95 
96 /* Whether we saw any functions with no_split_stack.  */
97 
98 static bool saw_no_split_stack;
99 
100 static const char *strip_reg_name (const char *);
101 static int contains_pointers_p (tree);
102 #ifdef ASM_OUTPUT_EXTERNAL
103 static bool incorporeal_function_p (tree);
104 #endif
105 static void decode_addr_const (tree, struct addr_const *);
106 static hashval_t const_hash_1 (const tree);
107 static int compare_constant (const tree, const tree);
108 static void output_constant_def_contents (rtx);
109 static void output_addressed_constants (tree);
110 static unsigned HOST_WIDE_INT output_constant (tree, unsigned HOST_WIDE_INT,
111 					       unsigned int, bool);
112 static void globalize_decl (tree);
113 static bool decl_readonly_section_1 (enum section_category);
114 #ifdef BSS_SECTION_ASM_OP
115 #ifdef ASM_OUTPUT_ALIGNED_BSS
116 static void asm_output_aligned_bss (FILE *, tree, const char *,
117 				    unsigned HOST_WIDE_INT, int)
118      ATTRIBUTE_UNUSED;
119 #endif
120 #endif /* BSS_SECTION_ASM_OP */
121 static void mark_weak (tree);
122 static void output_constant_pool (const char *, tree);
123 static void handle_vtv_comdat_section (section *, const_tree);
124 
125 /* Well-known sections, each one associated with some sort of *_ASM_OP.  */
126 section *text_section;
127 section *data_section;
128 section *readonly_data_section;
129 section *sdata_section;
130 section *ctors_section;
131 section *dtors_section;
132 section *bss_section;
133 section *sbss_section;
134 
135 /* Various forms of common section.  All are guaranteed to be nonnull.  */
136 section *tls_comm_section;
137 section *comm_section;
138 section *lcomm_section;
139 
140 /* A SECTION_NOSWITCH section used for declaring global BSS variables.
141    May be null.  */
142 section *bss_noswitch_section;
143 
144 /* The section that holds the main exception table, when known.  The section
145    is set either by the target's init_sections hook or by the first call to
146    switch_to_exception_section.  */
147 section *exception_section;
148 
149 /* The section that holds the DWARF2 frame unwind information, when known.
150    The section is set either by the target's init_sections hook or by the
151    first call to switch_to_eh_frame_section.  */
152 section *eh_frame_section;
153 
154 /* asm_out_file's current section.  This is NULL if no section has yet
155    been selected or if we lose track of what the current section is.  */
156 section *in_section;
157 
158 /* True if code for the current function is currently being directed
159    at the cold section.  */
160 bool in_cold_section_p;
161 
162 /* The following global holds the "function name" for the code in the
163    cold section of a function, if hot/cold function splitting is enabled
164    and there was actually code that went into the cold section.  A
165    pseudo function name is needed for the cold section of code for some
166    debugging tools that perform symbolization. */
167 tree cold_function_name = NULL_TREE;
168 
169 /* A linked list of all the unnamed sections.  */
170 static GTY(()) section *unnamed_sections;
171 
172 /* Return a nonzero value if DECL has a section attribute.  */
173 #define IN_NAMED_SECTION(DECL) \
174   (VAR_OR_FUNCTION_DECL_P (DECL) && DECL_SECTION_NAME (DECL) != NULL)
175 
176 struct section_hasher : ggc_ptr_hash<section>
177 {
178   typedef const char *compare_type;
179 
180   static hashval_t hash (section *);
181   static bool equal (section *, const char *);
182 };
183 
184 /* Hash table of named sections.  */
185 static GTY(()) hash_table<section_hasher> *section_htab;
186 
187 struct object_block_hasher : ggc_ptr_hash<object_block>
188 {
189   typedef const section *compare_type;
190 
191   static hashval_t hash (object_block *);
192   static bool equal (object_block *, const section *);
193 };
194 
195 /* A table of object_blocks, indexed by section.  */
196 static GTY(()) hash_table<object_block_hasher> *object_block_htab;
197 
198 /* The next number to use for internal anchor labels.  */
199 static GTY(()) int anchor_labelno;
200 
201 /* A pool of constants that can be shared between functions.  */
202 static GTY(()) struct rtx_constant_pool *shared_constant_pool;
203 
204 /* Helper routines for maintaining section_htab.  */
205 
206 bool
207 section_hasher::equal (section *old, const char *new_name)
208 {
209   return strcmp (old->named.name, new_name) == 0;
210 }
211 
212 hashval_t
213 section_hasher::hash (section *old)
214 {
215   return htab_hash_string (old->named.name);
216 }
217 
218 /* Return a hash value for section SECT.  */
219 
220 static hashval_t
221 hash_section (section *sect)
222 {
223   if (sect->common.flags & SECTION_NAMED)
224     return htab_hash_string (sect->named.name);
225   return sect->common.flags;
226 }
227 
228 /* Helper routines for maintaining object_block_htab.  */
229 
230 inline bool
231 object_block_hasher::equal (object_block *old, const section *new_section)
232 {
233   return old->sect == new_section;
234 }
235 
236 hashval_t
237 object_block_hasher::hash (object_block *old)
238 {
239   return hash_section (old->sect);
240 }
241 
242 /* Return a new unnamed section with the given fields.  */
243 
244 section *
245 get_unnamed_section (unsigned int flags, void (*callback) (const void *),
246 		     const void *data)
247 {
248   section *sect;
249 
250   sect = ggc_alloc<section> ();
251   sect->unnamed.common.flags = flags | SECTION_UNNAMED;
252   sect->unnamed.callback = callback;
253   sect->unnamed.data = data;
254   sect->unnamed.next = unnamed_sections;
255 
256   unnamed_sections = sect;
257   return sect;
258 }
259 
260 /* Return a SECTION_NOSWITCH section with the given fields.  */
261 
262 static section *
263 get_noswitch_section (unsigned int flags, noswitch_section_callback callback)
264 {
265   section *sect;
266 
267   sect = ggc_alloc<section> ();
268   sect->noswitch.common.flags = flags | SECTION_NOSWITCH;
269   sect->noswitch.callback = callback;
270 
271   return sect;
272 }
273 
274 /* Return the named section structure associated with NAME.  Create
275    a new section with the given fields if no such structure exists.  */
276 
277 section *
278 get_section (const char *name, unsigned int flags, tree decl)
279 {
280   section *sect, **slot;
281 
282   slot = section_htab->find_slot_with_hash (name, htab_hash_string (name),
283 					    INSERT);
284   flags |= SECTION_NAMED;
285   if (*slot == NULL)
286     {
287       sect = ggc_alloc<section> ();
288       sect->named.common.flags = flags;
289       sect->named.name = ggc_strdup (name);
290       sect->named.decl = decl;
291       *slot = sect;
292     }
293   else
294     {
295       sect = *slot;
296       if ((sect->common.flags & ~SECTION_DECLARED) != flags
297 	  && ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0)
298 	{
299 	  /* It is fine if one of the section flags is
300 	     SECTION_WRITE | SECTION_RELRO and the other has none of these
301 	     flags (i.e. read-only) in named sections and either the
302 	     section hasn't been declared yet or has been declared as writable.
303 	     In that case just make sure the resulting flags are
304 	     SECTION_WRITE | SECTION_RELRO, ie. writable only because of
305 	     relocations.  */
306 	  if (((sect->common.flags ^ flags) & (SECTION_WRITE | SECTION_RELRO))
307 	      == (SECTION_WRITE | SECTION_RELRO)
308 	      && (sect->common.flags
309 		  & ~(SECTION_DECLARED | SECTION_WRITE | SECTION_RELRO))
310 		 == (flags & ~(SECTION_WRITE | SECTION_RELRO))
311 	      && ((sect->common.flags & SECTION_DECLARED) == 0
312 		  || (sect->common.flags & SECTION_WRITE)))
313 	    {
314 	      sect->common.flags |= (SECTION_WRITE | SECTION_RELRO);
315 	      return sect;
316 	    }
317 	  /* Sanity check user variables for flag changes.  */
318 	  if (sect->named.decl != NULL
319 	      && DECL_P (sect->named.decl)
320 	      && decl != sect->named.decl)
321 	    {
322 	      if (decl != NULL && DECL_P (decl))
323 		error ("%+D causes a section type conflict with %D",
324 		       decl, sect->named.decl);
325 	      else
326 		error ("section type conflict with %D", sect->named.decl);
327 	      inform (DECL_SOURCE_LOCATION (sect->named.decl),
328 		      "%qD was declared here", sect->named.decl);
329 	    }
330 	  else if (decl != NULL && DECL_P (decl))
331 	    error ("%+D causes a section type conflict", decl);
332 	  else
333 	    error ("section type conflict");
334 	  /* Make sure we don't error about one section multiple times.  */
335 	  sect->common.flags |= SECTION_OVERRIDE;
336 	}
337     }
338   return sect;
339 }
340 
341 /* Return true if the current compilation mode benefits from having
342    objects grouped into blocks.  */
343 
344 static bool
345 use_object_blocks_p (void)
346 {
347   return flag_section_anchors;
348 }
349 
350 /* Return the object_block structure for section SECT.  Create a new
351    structure if we haven't created one already.  Return null if SECT
352    itself is null.  */
353 
354 static struct object_block *
355 get_block_for_section (section *sect)
356 {
357   struct object_block *block;
358 
359   if (sect == NULL)
360     return NULL;
361 
362   object_block **slot
363     = object_block_htab->find_slot_with_hash (sect, hash_section (sect),
364 					      INSERT);
365   block = *slot;
366   if (block == NULL)
367     {
368       block = ggc_cleared_alloc<object_block> ();
369       block->sect = sect;
370       *slot = block;
371     }
372   return block;
373 }
374 
375 /* Create a symbol with label LABEL and place it at byte offset
376    OFFSET in BLOCK.  OFFSET can be negative if the symbol's offset
377    is not yet known.  LABEL must be a garbage-collected string.  */
378 
379 static rtx
380 create_block_symbol (const char *label, struct object_block *block,
381 		     HOST_WIDE_INT offset)
382 {
383   rtx symbol;
384   unsigned int size;
385 
386   /* Create the extended SYMBOL_REF.  */
387   size = RTX_HDR_SIZE + sizeof (struct block_symbol);
388   symbol = (rtx) ggc_internal_alloc (size);
389 
390   /* Initialize the normal SYMBOL_REF fields.  */
391   memset (symbol, 0, size);
392   PUT_CODE (symbol, SYMBOL_REF);
393   PUT_MODE (symbol, Pmode);
394   XSTR (symbol, 0) = label;
395   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_HAS_BLOCK_INFO;
396 
397   /* Initialize the block_symbol stuff.  */
398   SYMBOL_REF_BLOCK (symbol) = block;
399   SYMBOL_REF_BLOCK_OFFSET (symbol) = offset;
400 
401   return symbol;
402 }
403 
404 /* Return a section with a particular name and with whatever SECTION_*
405    flags section_type_flags deems appropriate.  The name of the section
406    is taken from NAME if nonnull, otherwise it is taken from DECL's
407    DECL_SECTION_NAME.  DECL is the decl associated with the section
408    (see the section comment for details) and RELOC is as for
409    section_type_flags.  */
410 
411 section *
412 get_named_section (tree decl, const char *name, int reloc)
413 {
414   unsigned int flags;
415 
416   if (name == NULL)
417     {
418       gcc_assert (decl && DECL_P (decl) && DECL_SECTION_NAME (decl));
419       name = DECL_SECTION_NAME (decl);
420     }
421 
422   flags = targetm.section_type_flags (decl, name, reloc);
423   return get_section (name, flags, decl);
424 }
425 
426 /* Worker for resolve_unique_section.  */
427 
428 static bool
429 set_implicit_section (struct symtab_node *n, void *data ATTRIBUTE_UNUSED)
430 {
431   n->implicit_section = true;
432   return false;
433 }
434 
435 /* If required, set DECL_SECTION_NAME to a unique name.  */
436 
437 void
438 resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED,
439 			int flag_function_or_data_sections)
440 {
441   if (DECL_SECTION_NAME (decl) == NULL
442       && targetm_common.have_named_sections
443       && (flag_function_or_data_sections
444 	  || DECL_COMDAT_GROUP (decl)))
445     {
446       targetm.asm_out.unique_section (decl, reloc);
447       if (DECL_SECTION_NAME (decl))
448 	symtab_node::get (decl)->call_for_symbol_and_aliases
449 	  (set_implicit_section, NULL, true);
450     }
451 }
452 
453 #ifdef BSS_SECTION_ASM_OP
454 
455 #ifdef ASM_OUTPUT_ALIGNED_BSS
456 
457 /* Utility function for targets to use in implementing
458    ASM_OUTPUT_ALIGNED_BSS.
459    ??? It is believed that this function will work in most cases so such
460    support is localized here.  */
461 
462 static void
463 asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
464 			const char *name, unsigned HOST_WIDE_INT size,
465 			int align)
466 {
467   switch_to_section (bss_section);
468   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
469 #ifdef ASM_DECLARE_OBJECT_NAME
470   last_assemble_variable_decl = decl;
471   ASM_DECLARE_OBJECT_NAME (file, name, decl);
472 #else
473   /* Standard thing is just output label for the object.  */
474   ASM_OUTPUT_LABEL (file, name);
475 #endif /* ASM_DECLARE_OBJECT_NAME */
476   ASM_OUTPUT_SKIP (file, size ? size : 1);
477 }
478 
479 #endif
480 
481 #endif /* BSS_SECTION_ASM_OP */
482 
483 #ifndef USE_SELECT_SECTION_FOR_FUNCTIONS
484 /* Return the hot section for function DECL.  Return text_section for
485    null DECLs.  */
486 
487 static section *
488 hot_function_section (tree decl)
489 {
490   if (decl != NULL_TREE
491       && DECL_SECTION_NAME (decl) != NULL
492       && targetm_common.have_named_sections)
493     return get_named_section (decl, NULL, 0);
494   else
495     return text_section;
496 }
497 #endif
498 
499 /* Return section for TEXT_SECTION_NAME if DECL or DECL_SECTION_NAME (DECL)
500    is NULL.
501 
502    When DECL_SECTION_NAME is non-NULL and it is implicit section and
503    NAMED_SECTION_SUFFIX is non-NULL, then produce section called
504    concatenate the name with NAMED_SECTION_SUFFIX.
505    Otherwise produce "TEXT_SECTION_NAME.IMPLICIT_NAME".  */
506 
507 section *
508 get_named_text_section (tree decl,
509 		        const char *text_section_name,
510 		        const char *named_section_suffix)
511 {
512   if (decl && DECL_SECTION_NAME (decl))
513     {
514       if (named_section_suffix)
515 	{
516 	  const char *dsn = DECL_SECTION_NAME (decl);
517 	  const char *stripped_name;
518 	  char *name, *buffer;
519 
520 	  name = (char *) alloca (strlen (dsn) + 1);
521 	  memcpy (name, dsn,
522 		  strlen (dsn) + 1);
523 
524 	  stripped_name = targetm.strip_name_encoding (name);
525 
526 	  buffer = ACONCAT ((stripped_name, named_section_suffix, NULL));
527 	  return get_named_section (decl, buffer, 0);
528 	}
529       else if (symtab_node::get (decl)->implicit_section)
530 	{
531 	  const char *name;
532 
533 	  /* Do not try to split gnu_linkonce functions.  This gets somewhat
534 	     slipperly.  */
535 	  if (DECL_COMDAT_GROUP (decl) && !HAVE_COMDAT_GROUP)
536 	    return NULL;
537 	  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
538 	  name = targetm.strip_name_encoding (name);
539 	  return get_named_section (decl, ACONCAT ((text_section_name, ".",
540 				                   name, NULL)), 0);
541 	}
542       else
543 	return NULL;
544     }
545   return get_named_section (decl, text_section_name, 0);
546 }
547 
548 /* Choose named function section based on its frequency.  */
549 
550 section *
551 default_function_section (tree decl, enum node_frequency freq,
552 			  bool startup, bool exit)
553 {
554 #if defined HAVE_LD_EH_GC_SECTIONS && defined HAVE_LD_EH_GC_SECTIONS_BUG
555   /* Old GNU linkers have buggy --gc-section support, which sometimes
556      results in .gcc_except_table* sections being garbage collected.  */
557   if (decl
558       && symtab_node::get (decl)->implicit_section)
559     return NULL;
560 #endif
561 
562   if (!flag_reorder_functions
563       || !targetm_common.have_named_sections)
564     return NULL;
565   /* Startup code should go to startup subsection unless it is
566      unlikely executed (this happens especially with function splitting
567      where we can split away unnecessary parts of static constructors.  */
568   if (startup && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
569   {
570     /* If we do have a profile or(and) LTO phase is executed, we do not need
571        these ELF section.  */
572     if (!in_lto_p || !flag_profile_values)
573       return get_named_text_section (decl, ".text.startup", NULL);
574     else
575       return NULL;
576   }
577 
578   /* Similarly for exit.  */
579   if (exit && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
580     return get_named_text_section (decl, ".text.exit", NULL);
581 
582   /* Group cold functions together, similarly for hot code.  */
583   switch (freq)
584     {
585       case NODE_FREQUENCY_UNLIKELY_EXECUTED:
586 	return get_named_text_section (decl, ".text.unlikely", NULL);
587       case NODE_FREQUENCY_HOT:
588         /* If we do have a profile or(and) LTO phase is executed, we do not need
589            these ELF section.  */
590         if (!in_lto_p || !flag_profile_values)
591           return get_named_text_section (decl, ".text.hot", NULL);
592 	/* FALLTHRU */
593       default:
594 	return NULL;
595     }
596 }
597 
598 /* Return the section for function DECL.
599 
600    If DECL is NULL_TREE, return the text section.  We can be passed
601    NULL_TREE under some circumstances by dbxout.c at least.
602 
603    If FORCE_COLD is true, return cold function section ignoring
604    the frequency info of cgraph_node.  */
605 
606 static section *
607 function_section_1 (tree decl, bool force_cold)
608 {
609   section *section = NULL;
610   enum node_frequency freq = NODE_FREQUENCY_NORMAL;
611   bool startup = false, exit = false;
612 
613   if (decl)
614     {
615       struct cgraph_node *node = cgraph_node::get (decl);
616 
617       if (node)
618 	{
619 	  freq = node->frequency;
620 	  startup = node->only_called_at_startup;
621 	  exit = node->only_called_at_exit;
622 	}
623     }
624   if (force_cold)
625     freq = NODE_FREQUENCY_UNLIKELY_EXECUTED;
626 
627 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
628   if (decl != NULL_TREE
629       && DECL_SECTION_NAME (decl) != NULL)
630     {
631       if (targetm.asm_out.function_section)
632 	section = targetm.asm_out.function_section (decl, freq,
633 						    startup, exit);
634       if (section)
635 	return section;
636       return get_named_section (decl, NULL, 0);
637     }
638   else
639     return targetm.asm_out.select_section
640 	    (decl, freq == NODE_FREQUENCY_UNLIKELY_EXECUTED,
641 	     symtab_node::get (decl)->definition_alignment ());
642 #else
643   if (targetm.asm_out.function_section)
644     section = targetm.asm_out.function_section (decl, freq, startup, exit);
645   if (section)
646     return section;
647   return hot_function_section (decl);
648 #endif
649 }
650 
651 /* Return the section for function DECL.
652 
653    If DECL is NULL_TREE, return the text section.  We can be passed
654    NULL_TREE under some circumstances by dbxout.c at least.  */
655 
656 section *
657 function_section (tree decl)
658 {
659   /* Handle cases where function splitting code decides
660      to put function entry point into unlikely executed section
661      despite the fact that the function itself is not cold
662      (i.e. it is called rarely but contains a hot loop that is
663      better to live in hot subsection for the code locality).  */
664   return function_section_1 (decl,
665 			     first_function_block_is_cold);
666 }
667 
668 /* Return the section for the current function, take IN_COLD_SECTION_P
669    into account.  */
670 
671 section *
672 current_function_section (void)
673 {
674   return function_section_1 (current_function_decl, in_cold_section_p);
675 }
676 
677 /* Tell assembler to switch to unlikely-to-be-executed text section.  */
678 
679 section *
680 unlikely_text_section (void)
681 {
682   return function_section_1 (current_function_decl, true);
683 }
684 
685 /* When called within a function context, return true if the function
686    has been assigned a cold text section and if SECT is that section.
687    When called outside a function context, return true if SECT is the
688    default cold section.  */
689 
690 bool
691 unlikely_text_section_p (section *sect)
692 {
693   return sect == function_section_1 (current_function_decl, true);
694 }
695 
696 /* Return the read-only data section associated with function DECL.  */
697 
698 section *
699 default_function_rodata_section (tree decl)
700 {
701   if (decl != NULL_TREE && DECL_SECTION_NAME (decl))
702     {
703       const char *name = DECL_SECTION_NAME (decl);
704 
705       if (DECL_COMDAT_GROUP (decl) && HAVE_COMDAT_GROUP)
706         {
707 	  const char *dot;
708 	  size_t len;
709 	  char* rname;
710 
711 	  dot = strchr (name + 1, '.');
712 	  if (!dot)
713 	    dot = name;
714 	  len = strlen (dot) + 8;
715 	  rname = (char *) alloca (len);
716 
717 	  strcpy (rname, ".rodata");
718 	  strcat (rname, dot);
719 	  return get_section (rname, SECTION_LINKONCE, decl);
720 	}
721       /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo.  */
722       else if (DECL_COMDAT_GROUP (decl)
723 	       && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
724 	{
725 	  size_t len = strlen (name) + 1;
726 	  char *rname = (char *) alloca (len);
727 
728 	  memcpy (rname, name, len);
729 	  rname[14] = 'r';
730 	  return get_section (rname, SECTION_LINKONCE, decl);
731 	}
732       /* For .text.foo we want to use .rodata.foo.  */
733       else if (flag_function_sections && flag_data_sections
734 	       && strncmp (name, ".text.", 6) == 0)
735 	{
736 	  size_t len = strlen (name) + 1;
737 	  char *rname = (char *) alloca (len + 2);
738 
739 	  memcpy (rname, ".rodata", 7);
740 	  memcpy (rname + 7, name + 5, len - 5);
741 	  return get_section (rname, 0, decl);
742 	}
743     }
744 
745   return readonly_data_section;
746 }
747 
748 /* Return the read-only data section associated with function DECL
749    for targets where that section should be always the single
750    readonly data section.  */
751 
752 section *
753 default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
754 {
755   return readonly_data_section;
756 }
757 
758 /* A subroutine of mergeable_string_section and mergeable_constant_section.  */
759 
760 static const char *
761 function_mergeable_rodata_prefix (void)
762 {
763   section *s = targetm.asm_out.function_rodata_section (current_function_decl);
764   if (SECTION_STYLE (s) == SECTION_NAMED)
765     return s->named.name;
766   else
767     return targetm.asm_out.mergeable_rodata_prefix;
768 }
769 
770 /* Return the section to use for string merging.  */
771 
772 static section *
773 mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
774 			  unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
775 			  unsigned int flags ATTRIBUTE_UNUSED)
776 {
777   HOST_WIDE_INT len;
778 
779   if (HAVE_GAS_SHF_MERGE && flag_merge_constants
780       && TREE_CODE (decl) == STRING_CST
781       && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
782       && align <= 256
783       && (len = int_size_in_bytes (TREE_TYPE (decl))) > 0
784       && TREE_STRING_LENGTH (decl) >= len)
785     {
786       machine_mode mode;
787       unsigned int modesize;
788       const char *str;
789       HOST_WIDE_INT i;
790       int j, unit;
791       const char *prefix = function_mergeable_rodata_prefix ();
792       char *name = (char *) alloca (strlen (prefix) + 30);
793 
794       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
795       modesize = GET_MODE_BITSIZE (mode);
796       if (modesize >= 8 && modesize <= 256
797 	  && (modesize & (modesize - 1)) == 0)
798 	{
799 	  if (align < modesize)
800 	    align = modesize;
801 
802 	  str = TREE_STRING_POINTER (decl);
803 	  unit = GET_MODE_SIZE (mode);
804 
805 	  /* Check for embedded NUL characters.  */
806 	  for (i = 0; i < len; i += unit)
807 	    {
808 	      for (j = 0; j < unit; j++)
809 		if (str[i + j] != '\0')
810 		  break;
811 	      if (j == unit)
812 		break;
813 	    }
814 	  if (i == len - unit)
815 	    {
816 	      sprintf (name, "%s.str%d.%d", prefix,
817 		       modesize / 8, (int) (align / 8));
818 	      flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
819 	      return get_section (name, flags, NULL);
820 	    }
821 	}
822     }
823 
824   return readonly_data_section;
825 }
826 
827 /* Return the section to use for constant merging.  */
828 
829 section *
830 mergeable_constant_section (machine_mode mode ATTRIBUTE_UNUSED,
831 			    unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
832 			    unsigned int flags ATTRIBUTE_UNUSED)
833 {
834   unsigned int modesize = GET_MODE_BITSIZE (mode);
835 
836   if (HAVE_GAS_SHF_MERGE && flag_merge_constants
837       && mode != VOIDmode
838       && mode != BLKmode
839       && modesize <= align
840       && align >= 8
841       && align <= 256
842       && (align & (align - 1)) == 0)
843     {
844       const char *prefix = function_mergeable_rodata_prefix ();
845       char *name = (char *) alloca (strlen (prefix) + 30);
846 
847       sprintf (name, "%s.cst%d", prefix, (int) (align / 8));
848       flags |= (align / 8) | SECTION_MERGE;
849       return get_section (name, flags, NULL);
850     }
851   return readonly_data_section;
852 }
853 
854 /* Given NAME, a putative register name, discard any customary prefixes.  */
855 
856 static const char *
857 strip_reg_name (const char *name)
858 {
859 #ifdef REGISTER_PREFIX
860   if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
861     name += strlen (REGISTER_PREFIX);
862 #endif
863   if (name[0] == '%' || name[0] == '#')
864     name++;
865   return name;
866 }
867 
868 /* The user has asked for a DECL to have a particular name.  Set (or
869    change) it in such a way that we don't prefix an underscore to
870    it.  */
871 void
872 set_user_assembler_name (tree decl, const char *name)
873 {
874   char *starred = (char *) alloca (strlen (name) + 2);
875   starred[0] = '*';
876   strcpy (starred + 1, name);
877   symtab->change_decl_assembler_name (decl, get_identifier (starred));
878   SET_DECL_RTL (decl, NULL_RTX);
879 }
880 
881 /* Decode an `asm' spec for a declaration as a register name.
882    Return the register number, or -1 if nothing specified,
883    or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
884    or -3 if ASMSPEC is `cc' and is not recognized,
885    or -4 if ASMSPEC is `memory' and is not recognized.
886    Accept an exact spelling or a decimal number.
887    Prefixes such as % are optional.  */
888 
889 int
890 decode_reg_name_and_count (const char *asmspec, int *pnregs)
891 {
892   /* Presume just one register is clobbered.  */
893   *pnregs = 1;
894 
895   if (asmspec != 0)
896     {
897       int i;
898 
899       /* Get rid of confusing prefixes.  */
900       asmspec = strip_reg_name (asmspec);
901 
902       /* Allow a decimal number as a "register name".  */
903       for (i = strlen (asmspec) - 1; i >= 0; i--)
904 	if (! ISDIGIT (asmspec[i]))
905 	  break;
906       if (asmspec[0] != 0 && i < 0)
907 	{
908 	  i = atoi (asmspec);
909 	  if (i < FIRST_PSEUDO_REGISTER && i >= 0 && reg_names[i][0])
910 	    return i;
911 	  else
912 	    return -2;
913 	}
914 
915       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
916 	if (reg_names[i][0]
917 	    && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
918 	  return i;
919 
920 #ifdef OVERLAPPING_REGISTER_NAMES
921       {
922 	static const struct
923 	{
924 	  const char *const name;
925 	  const int number;
926 	  const int nregs;
927 	} table[] = OVERLAPPING_REGISTER_NAMES;
928 
929 	for (i = 0; i < (int) ARRAY_SIZE (table); i++)
930 	  if (table[i].name[0]
931 	      && ! strcmp (asmspec, table[i].name))
932 	    {
933 	      *pnregs = table[i].nregs;
934 	      return table[i].number;
935 	    }
936       }
937 #endif /* OVERLAPPING_REGISTER_NAMES */
938 
939 #ifdef ADDITIONAL_REGISTER_NAMES
940       {
941 	static const struct { const char *const name; const int number; } table[]
942 	  = ADDITIONAL_REGISTER_NAMES;
943 
944 	for (i = 0; i < (int) ARRAY_SIZE (table); i++)
945 	  if (table[i].name[0]
946 	      && ! strcmp (asmspec, table[i].name)
947 	      && reg_names[table[i].number][0])
948 	    return table[i].number;
949       }
950 #endif /* ADDITIONAL_REGISTER_NAMES */
951 
952       if (!strcmp (asmspec, "memory"))
953 	return -4;
954 
955       if (!strcmp (asmspec, "cc"))
956 	return -3;
957 
958       return -2;
959     }
960 
961   return -1;
962 }
963 
964 int
965 decode_reg_name (const char *name)
966 {
967   int count;
968   return decode_reg_name_and_count (name, &count);
969 }
970 
971 
972 /* Return true if DECL's initializer is suitable for a BSS section.  */
973 
974 bool
975 bss_initializer_p (const_tree decl, bool named)
976 {
977   /* Do not put non-common constants into the .bss section, they belong in
978      a readonly section, except when NAMED is true.  */
979   return ((!TREE_READONLY (decl) || DECL_COMMON (decl) || named)
980 	  && (DECL_INITIAL (decl) == NULL
981 	      /* In LTO we have no errors in program; error_mark_node is used
982 	         to mark offlined constructors.  */
983 	      || (DECL_INITIAL (decl) == error_mark_node
984 	          && !in_lto_p)
985 	      || (flag_zero_initialized_in_bss
986 	          && initializer_zerop (DECL_INITIAL (decl)))));
987 }
988 
989 /* Compute the alignment of variable specified by DECL.
990    DONT_OUTPUT_DATA is from assemble_variable.  */
991 
992 void
993 align_variable (tree decl, bool dont_output_data)
994 {
995   unsigned int align = DECL_ALIGN (decl);
996 
997   /* In the case for initialing an array whose length isn't specified,
998      where we have not yet been able to do the layout,
999      figure out the proper alignment now.  */
1000   if (dont_output_data && DECL_SIZE (decl) == 0
1001       && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1002     align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1003 
1004   /* Some object file formats have a maximum alignment which they support.
1005      In particular, a.out format supports a maximum alignment of 4.  */
1006   if (align > MAX_OFILE_ALIGNMENT)
1007     {
1008       error ("alignment of %q+D is greater than maximum object "
1009 	     "file alignment %d", decl,
1010 	     MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
1011       align = MAX_OFILE_ALIGNMENT;
1012     }
1013 
1014   if (! DECL_USER_ALIGN (decl))
1015     {
1016 #ifdef DATA_ABI_ALIGNMENT
1017       unsigned int data_abi_align
1018 	= DATA_ABI_ALIGNMENT (TREE_TYPE (decl), align);
1019       /* For backwards compatibility, don't assume the ABI alignment for
1020 	 TLS variables.  */
1021       if (! DECL_THREAD_LOCAL_P (decl) || data_abi_align <= BITS_PER_WORD)
1022 	align = data_abi_align;
1023 #endif
1024 
1025       /* On some machines, it is good to increase alignment sometimes.
1026 	 But as DECL_ALIGN is used both for actually emitting the variable
1027 	 and for code accessing the variable as guaranteed alignment, we
1028 	 can only increase the alignment if it is a performance optimization
1029 	 if the references to it must bind to the current definition.  */
1030       if (decl_binds_to_current_def_p (decl)
1031 	  && !DECL_VIRTUAL_P (decl))
1032 	{
1033 #ifdef DATA_ALIGNMENT
1034 	  unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1035 	  /* Don't increase alignment too much for TLS variables - TLS space
1036 	     is too precious.  */
1037 	  if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD)
1038 	    align = data_align;
1039 #endif
1040 	  if (DECL_INITIAL (decl) != 0
1041 	      /* In LTO we have no errors in program; error_mark_node is used
1042 		 to mark offlined constructors.  */
1043 	      && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))
1044 	    {
1045 	      unsigned int const_align
1046 		= CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
1047 	      /* Don't increase alignment too much for TLS variables - TLS
1048 		 space is too precious.  */
1049 	      if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)
1050 		align = const_align;
1051 	    }
1052 	}
1053     }
1054 
1055   /* Reset the alignment in case we have made it tighter, so we can benefit
1056      from it in get_pointer_alignment.  */
1057   SET_DECL_ALIGN (decl, align);
1058 }
1059 
1060 /* Return DECL_ALIGN (decl), possibly increased for optimization purposes
1061    beyond what align_variable returned.  */
1062 
1063 static unsigned int
1064 get_variable_align (tree decl)
1065 {
1066   unsigned int align = DECL_ALIGN (decl);
1067 
1068   /* For user aligned vars or static vars align_variable already did
1069      everything.  */
1070   if (DECL_USER_ALIGN (decl) || !TREE_PUBLIC (decl))
1071     return align;
1072 
1073 #ifdef DATA_ABI_ALIGNMENT
1074   if (DECL_THREAD_LOCAL_P (decl))
1075     align = DATA_ABI_ALIGNMENT (TREE_TYPE (decl), align);
1076 #endif
1077 
1078   /* For decls that bind to the current definition, align_variable
1079      did also everything, except for not assuming ABI required alignment
1080      of TLS variables.  For other vars, increase the alignment here
1081      as an optimization.  */
1082   if (!decl_binds_to_current_def_p (decl))
1083     {
1084       /* On some machines, it is good to increase alignment sometimes.  */
1085 #ifdef DATA_ALIGNMENT
1086       unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1087       /* Don't increase alignment too much for TLS variables - TLS space
1088          is too precious.  */
1089       if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD)
1090 	align = data_align;
1091 #endif
1092       if (DECL_INITIAL (decl) != 0
1093 	  /* In LTO we have no errors in program; error_mark_node is used
1094 	     to mark offlined constructors.  */
1095 	  && (in_lto_p || DECL_INITIAL (decl) != error_mark_node))
1096 	{
1097 	  unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl),
1098 							 align);
1099 	  /* Don't increase alignment too much for TLS variables - TLS space
1100 	     is too precious.  */
1101 	  if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD)
1102 	    align = const_align;
1103 	}
1104     }
1105 
1106   return align;
1107 }
1108 
1109 /* Return the section into which the given VAR_DECL or CONST_DECL
1110    should be placed.  PREFER_NOSWITCH_P is true if a noswitch
1111    section should be used wherever possible.  */
1112 
1113 section *
1114 get_variable_section (tree decl, bool prefer_noswitch_p)
1115 {
1116   addr_space_t as = ADDR_SPACE_GENERIC;
1117   int reloc;
1118   varpool_node *vnode = varpool_node::get (decl);
1119   if (vnode)
1120     {
1121       vnode = vnode->ultimate_alias_target ();
1122       decl = vnode->decl;
1123     }
1124 
1125   if (TREE_TYPE (decl) != error_mark_node)
1126     as = TYPE_ADDR_SPACE (TREE_TYPE (decl));
1127 
1128   /* We need the constructor to figure out reloc flag.  */
1129   if (vnode)
1130     vnode->get_constructor ();
1131 
1132   if (DECL_COMMON (decl))
1133     {
1134       /* If the decl has been given an explicit section name, or it resides
1135 	 in a non-generic address space, then it isn't common, and shouldn't
1136 	 be handled as such.  */
1137       gcc_assert (DECL_SECTION_NAME (decl) == NULL
1138 		  && ADDR_SPACE_GENERIC_P (as));
1139       if (DECL_THREAD_LOCAL_P (decl))
1140 	return tls_comm_section;
1141       else if (TREE_PUBLIC (decl) && bss_initializer_p (decl))
1142 	return comm_section;
1143     }
1144 
1145   if (DECL_INITIAL (decl) == error_mark_node)
1146     reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;
1147   else if (DECL_INITIAL (decl))
1148     reloc = compute_reloc_for_constant (DECL_INITIAL (decl));
1149   else
1150     reloc = 0;
1151 
1152   resolve_unique_section (decl, reloc, flag_data_sections);
1153   if (IN_NAMED_SECTION (decl))
1154     {
1155       section *sect = get_named_section (decl, NULL, reloc);
1156 
1157       if ((sect->common.flags & SECTION_BSS)
1158 	  && !bss_initializer_p (decl, true))
1159 	{
1160 	  error_at (DECL_SOURCE_LOCATION (decl),
1161 		    "only zero initializers are allowed in section %qs",
1162 		    sect->named.name);
1163 	  DECL_INITIAL (decl) = error_mark_node;
1164 	}
1165       return sect;
1166     }
1167 
1168   if (ADDR_SPACE_GENERIC_P (as)
1169       && !DECL_THREAD_LOCAL_P (decl)
1170       && !(prefer_noswitch_p && targetm.have_switchable_bss_sections)
1171       && bss_initializer_p (decl))
1172     {
1173       if (!TREE_PUBLIC (decl)
1174 	  && !((flag_sanitize & SANITIZE_ADDRESS)
1175 	       && asan_protect_global (decl)))
1176 	return lcomm_section;
1177       if (bss_noswitch_section)
1178 	return bss_noswitch_section;
1179     }
1180 
1181   return targetm.asm_out.select_section (decl, reloc,
1182 					 get_variable_align (decl));
1183 }
1184 
1185 /* Return the block into which object_block DECL should be placed.  */
1186 
1187 static struct object_block *
1188 get_block_for_decl (tree decl)
1189 {
1190   section *sect;
1191 
1192   if (VAR_P (decl))
1193     {
1194       /* The object must be defined in this translation unit.  */
1195       if (DECL_EXTERNAL (decl))
1196 	return NULL;
1197 
1198       /* There's no point using object blocks for something that is
1199 	 isolated by definition.  */
1200       if (DECL_COMDAT_GROUP (decl))
1201 	return NULL;
1202     }
1203 
1204   /* We can only calculate block offsets if the decl has a known
1205      constant size.  */
1206   if (DECL_SIZE_UNIT (decl) == NULL)
1207     return NULL;
1208   if (!tree_fits_uhwi_p (DECL_SIZE_UNIT (decl)))
1209     return NULL;
1210 
1211   /* Find out which section should contain DECL.  We cannot put it into
1212      an object block if it requires a standalone definition.  */
1213   if (VAR_P (decl))
1214       align_variable (decl, 0);
1215   sect = get_variable_section (decl, true);
1216   if (SECTION_STYLE (sect) == SECTION_NOSWITCH)
1217     return NULL;
1218 
1219   return get_block_for_section (sect);
1220 }
1221 
1222 /* Make sure block symbol SYMBOL is in block BLOCK.  */
1223 
1224 static void
1225 change_symbol_block (rtx symbol, struct object_block *block)
1226 {
1227   if (block != SYMBOL_REF_BLOCK (symbol))
1228     {
1229       gcc_assert (SYMBOL_REF_BLOCK_OFFSET (symbol) < 0);
1230       SYMBOL_REF_BLOCK (symbol) = block;
1231     }
1232 }
1233 
1234 /* Return true if it is possible to put DECL in an object_block.  */
1235 
1236 static bool
1237 use_blocks_for_decl_p (tree decl)
1238 {
1239   struct symtab_node *snode;
1240 
1241   /* Only data DECLs can be placed into object blocks.  */
1242   if (!VAR_P (decl) && TREE_CODE (decl) != CONST_DECL)
1243     return false;
1244 
1245   /* DECL_INITIAL (decl) set to decl is a hack used for some decls that
1246      are never used from code directly and we never want object block handling
1247      for those.  */
1248   if (DECL_INITIAL (decl) == decl)
1249     return false;
1250 
1251   /* If this decl is an alias, then we don't want to emit a
1252      definition.  */
1253   if (VAR_P (decl)
1254       && (snode = symtab_node::get (decl)) != NULL
1255       && snode->alias)
1256     return false;
1257 
1258   return targetm.use_blocks_for_decl_p (decl);
1259 }
1260 
1261 /* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS
1262    until we find an identifier that is not itself a transparent alias.
1263    Modify the alias passed to it by reference (and all aliases on the
1264    way to the ultimate target), such that they do not have to be
1265    followed again, and return the ultimate target of the alias
1266    chain.  */
1267 
1268 static inline tree
1269 ultimate_transparent_alias_target (tree *alias)
1270 {
1271   tree target = *alias;
1272 
1273   if (IDENTIFIER_TRANSPARENT_ALIAS (target))
1274     {
1275       gcc_assert (TREE_CHAIN (target));
1276       target = ultimate_transparent_alias_target (&TREE_CHAIN (target));
1277       gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
1278 		  && ! TREE_CHAIN (target));
1279       *alias = target;
1280     }
1281 
1282   return target;
1283 }
1284 
1285 /* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL.  DECL should
1286    have static storage duration.  In other words, it should not be an
1287    automatic variable, including PARM_DECLs.
1288 
1289    There is, however, one exception: this function handles variables
1290    explicitly placed in a particular register by the user.
1291 
1292    This is never called for PARM_DECL nodes.  */
1293 
1294 void
1295 make_decl_rtl (tree decl)
1296 {
1297   const char *name = 0;
1298   int reg_number;
1299   tree id;
1300   rtx x;
1301 
1302   /* Check that we are not being given an automatic variable.  */
1303   gcc_assert (TREE_CODE (decl) != PARM_DECL
1304 	      && TREE_CODE (decl) != RESULT_DECL);
1305 
1306   /* A weak alias has TREE_PUBLIC set but not the other bits.  */
1307   gcc_assert (!VAR_P (decl)
1308 	      || TREE_STATIC (decl)
1309 	      || TREE_PUBLIC (decl)
1310 	      || DECL_EXTERNAL (decl)
1311 	      || DECL_REGISTER (decl));
1312 
1313   /* And that we were not given a type or a label.  */
1314   gcc_assert (TREE_CODE (decl) != TYPE_DECL
1315 	      && TREE_CODE (decl) != LABEL_DECL);
1316 
1317   /* For a duplicate declaration, we can be called twice on the
1318      same DECL node.  Don't discard the RTL already made.  */
1319   if (DECL_RTL_SET_P (decl))
1320     {
1321       /* If the old RTL had the wrong mode, fix the mode.  */
1322       x = DECL_RTL (decl);
1323       if (GET_MODE (x) != DECL_MODE (decl))
1324 	SET_DECL_RTL (decl, adjust_address_nv (x, DECL_MODE (decl), 0));
1325 
1326       if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
1327 	return;
1328 
1329       /* ??? Another way to do this would be to maintain a hashed
1330 	 table of such critters.  Instead of adding stuff to a DECL
1331 	 to give certain attributes to it, we could use an external
1332 	 hash map from DECL to set of attributes.  */
1333 
1334       /* Let the target reassign the RTL if it wants.
1335 	 This is necessary, for example, when one machine specific
1336 	 decl attribute overrides another.  */
1337       targetm.encode_section_info (decl, DECL_RTL (decl), false);
1338 
1339       /* If the symbol has a SYMBOL_REF_BLOCK field, update it based
1340 	 on the new decl information.  */
1341       if (MEM_P (x)
1342 	  && GET_CODE (XEXP (x, 0)) == SYMBOL_REF
1343 	  && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (x, 0)))
1344 	change_symbol_block (XEXP (x, 0), get_block_for_decl (decl));
1345 
1346       return;
1347     }
1348 
1349   /* If this variable belongs to the global constant pool, retrieve the
1350      pre-computed RTL or recompute it in LTO mode.  */
1351   if (VAR_P (decl) && DECL_IN_CONSTANT_POOL (decl))
1352     {
1353       SET_DECL_RTL (decl, output_constant_def (DECL_INITIAL (decl), 1));
1354       return;
1355     }
1356 
1357   id = DECL_ASSEMBLER_NAME (decl);
1358   if (TREE_CODE (decl) == FUNCTION_DECL
1359       && cgraph_node::get (decl)
1360       && cgraph_node::get (decl)->instrumentation_clone)
1361     ultimate_transparent_alias_target (&id);
1362   name = IDENTIFIER_POINTER (id);
1363 
1364   if (name[0] != '*' && TREE_CODE (decl) != FUNCTION_DECL
1365       && DECL_REGISTER (decl))
1366     {
1367       error ("register name not specified for %q+D", decl);
1368     }
1369   else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
1370     {
1371       const char *asmspec = name+1;
1372       machine_mode mode = DECL_MODE (decl);
1373       reg_number = decode_reg_name (asmspec);
1374       /* First detect errors in declaring global registers.  */
1375       if (reg_number == -1)
1376 	error ("register name not specified for %q+D", decl);
1377       else if (reg_number < 0)
1378 	error ("invalid register name for %q+D", decl);
1379       else if (mode == BLKmode)
1380 	error ("data type of %q+D isn%'t suitable for a register",
1381 	       decl);
1382       else if (!in_hard_reg_set_p (accessible_reg_set, mode, reg_number))
1383 	error ("the register specified for %q+D cannot be accessed"
1384 	       " by the current target", decl);
1385       else if (!in_hard_reg_set_p (operand_reg_set, mode, reg_number))
1386 	error ("the register specified for %q+D is not general enough"
1387 	       " to be used as a register variable", decl);
1388       else if (!HARD_REGNO_MODE_OK (reg_number, mode))
1389 	error ("register specified for %q+D isn%'t suitable for data type",
1390                decl);
1391       /* Now handle properly declared static register variables.  */
1392       else
1393 	{
1394 	  int nregs;
1395 
1396 	  if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
1397 	    {
1398 	      DECL_INITIAL (decl) = 0;
1399 	      error ("global register variable has initial value");
1400 	    }
1401 	  if (TREE_THIS_VOLATILE (decl))
1402 	    warning (OPT_Wvolatile_register_var,
1403 		     "optimization may eliminate reads and/or "
1404 		     "writes to register variables");
1405 
1406 	  /* If the user specified one of the eliminables registers here,
1407 	     e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
1408 	     confused with that register and be eliminated.  This usage is
1409 	     somewhat suspect...  */
1410 
1411 	  SET_DECL_RTL (decl, gen_raw_REG (mode, reg_number));
1412 	  ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
1413 	  REG_USERVAR_P (DECL_RTL (decl)) = 1;
1414 
1415 	  if (TREE_STATIC (decl))
1416 	    {
1417 	      /* Make this register global, so not usable for anything
1418 		 else.  */
1419 #ifdef ASM_DECLARE_REGISTER_GLOBAL
1420 	      name = IDENTIFIER_POINTER (DECL_NAME (decl));
1421 	      ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
1422 #endif
1423 	      nregs = hard_regno_nregs[reg_number][mode];
1424 	      while (nregs > 0)
1425 		globalize_reg (decl, reg_number + --nregs);
1426 	    }
1427 
1428 	  /* As a register variable, it has no section.  */
1429 	  return;
1430 	}
1431       /* Avoid internal errors from invalid register
1432 	 specifications.  */
1433       SET_DECL_ASSEMBLER_NAME (decl, NULL_TREE);
1434       DECL_HARD_REGISTER (decl) = 0;
1435       /* Also avoid SSA inconsistencies by pretending this is an external
1436 	 decl now.  */
1437       DECL_EXTERNAL (decl) = 1;
1438       return;
1439     }
1440   /* Now handle ordinary static variables and functions (in memory).
1441      Also handle vars declared register invalidly.  */
1442   else if (name[0] == '*')
1443   {
1444 #ifdef REGISTER_PREFIX
1445     if (strlen (REGISTER_PREFIX) != 0)
1446       {
1447 	reg_number = decode_reg_name (name);
1448 	if (reg_number >= 0 || reg_number == -3)
1449 	  error ("register name given for non-register variable %q+D", decl);
1450       }
1451 #endif
1452   }
1453 
1454   /* Specifying a section attribute on a variable forces it into a
1455      non-.bss section, and thus it cannot be common.  */
1456   /* FIXME: In general this code should not be necessary because
1457      visibility pass is doing the same work.  But notice_global_symbol
1458      is called early and it needs to make DECL_RTL to get the name.
1459      we take care of recomputing the DECL_RTL after visibility is changed.  */
1460   if (VAR_P (decl)
1461       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
1462       && DECL_SECTION_NAME (decl) != NULL
1463       && DECL_INITIAL (decl) == NULL_TREE
1464       && DECL_COMMON (decl))
1465     DECL_COMMON (decl) = 0;
1466 
1467   /* Variables can't be both common and weak.  */
1468   if (VAR_P (decl) && DECL_WEAK (decl))
1469     DECL_COMMON (decl) = 0;
1470 
1471   if (use_object_blocks_p () && use_blocks_for_decl_p (decl))
1472     x = create_block_symbol (name, get_block_for_decl (decl), -1);
1473   else
1474     {
1475       machine_mode address_mode = Pmode;
1476       if (TREE_TYPE (decl) != error_mark_node)
1477 	{
1478 	  addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (decl));
1479 	  address_mode = targetm.addr_space.address_mode (as);
1480 	}
1481       x = gen_rtx_SYMBOL_REF (address_mode, name);
1482     }
1483   SYMBOL_REF_WEAK (x) = DECL_WEAK (decl);
1484   SET_SYMBOL_REF_DECL (x, decl);
1485 
1486   x = gen_rtx_MEM (DECL_MODE (decl), x);
1487   if (TREE_CODE (decl) != FUNCTION_DECL)
1488     set_mem_attributes (x, decl, 1);
1489   SET_DECL_RTL (decl, x);
1490 
1491   /* Optionally set flags or add text to the name to record information
1492      such as that it is a function name.
1493      If the name is changed, the macro ASM_OUTPUT_LABELREF
1494      will have to know how to strip this information.  */
1495   targetm.encode_section_info (decl, DECL_RTL (decl), true);
1496 }
1497 
1498 /* Like make_decl_rtl, but inhibit creation of new alias sets when
1499    calling make_decl_rtl.  Also, reset DECL_RTL before returning the
1500    rtl.  */
1501 
1502 rtx
1503 make_decl_rtl_for_debug (tree decl)
1504 {
1505   unsigned int save_aliasing_flag;
1506   rtx rtl;
1507 
1508   if (DECL_RTL_SET_P (decl))
1509     return DECL_RTL (decl);
1510 
1511   /* Kludge alert!  Somewhere down the call chain, make_decl_rtl will
1512      call new_alias_set.  If running with -fcompare-debug, sometimes
1513      we do not want to create alias sets that will throw the alias
1514      numbers off in the comparison dumps.  So... clearing
1515      flag_strict_aliasing will keep new_alias_set() from creating a
1516      new set.  */
1517   save_aliasing_flag = flag_strict_aliasing;
1518   flag_strict_aliasing = 0;
1519 
1520   rtl = DECL_RTL (decl);
1521   /* Reset DECL_RTL back, as various parts of the compiler expects
1522      DECL_RTL set meaning it is actually going to be output.  */
1523   SET_DECL_RTL (decl, NULL);
1524 
1525   flag_strict_aliasing = save_aliasing_flag;
1526   return rtl;
1527 }
1528 
1529 /* Output a string of literal assembler code
1530    for an `asm' keyword used between functions.  */
1531 
1532 void
1533 assemble_asm (tree string)
1534 {
1535   const char *p;
1536   app_enable ();
1537 
1538   if (TREE_CODE (string) == ADDR_EXPR)
1539     string = TREE_OPERAND (string, 0);
1540 
1541   p = TREE_STRING_POINTER (string);
1542   fprintf (asm_out_file, "%s%s\n", p[0] == '\t' ? "" : "\t", p);
1543 }
1544 
1545 /* Write the address of the entity given by SYMBOL to SEC.  */
1546 void
1547 assemble_addr_to_section (rtx symbol, section *sec)
1548 {
1549   switch_to_section (sec);
1550   assemble_align (POINTER_SIZE);
1551   assemble_integer (symbol, POINTER_SIZE_UNITS, POINTER_SIZE, 1);
1552 }
1553 
1554 /* Return the numbered .ctors.N (if CONSTRUCTOR_P) or .dtors.N (if
1555    not) section for PRIORITY.  */
1556 section *
1557 get_cdtor_priority_section (int priority, bool constructor_p)
1558 {
1559   /* Buffer conservatively large enough for the full range of a 32-bit
1560      int plus the text below.  */
1561   char buf[18];
1562 
1563   /* ??? This only works reliably with the GNU linker.  */
1564   sprintf (buf, "%s.%.5u",
1565 	   constructor_p ? ".ctors" : ".dtors",
1566 	   /* Invert the numbering so the linker puts us in the proper
1567 	      order; constructors are run from right to left, and the
1568 	      linker sorts in increasing order.  */
1569 	   MAX_INIT_PRIORITY - priority);
1570   return get_section (buf, SECTION_WRITE, NULL);
1571 }
1572 
1573 void
1574 default_named_section_asm_out_destructor (rtx symbol, int priority)
1575 {
1576   section *sec;
1577 
1578   if (priority != DEFAULT_INIT_PRIORITY)
1579     sec = get_cdtor_priority_section (priority,
1580 				      /*constructor_p=*/false);
1581   else
1582     sec = get_section (".dtors", SECTION_WRITE, NULL);
1583 
1584   assemble_addr_to_section (symbol, sec);
1585 }
1586 
1587 #ifdef DTORS_SECTION_ASM_OP
1588 void
1589 default_dtor_section_asm_out_destructor (rtx symbol,
1590 					 int priority ATTRIBUTE_UNUSED)
1591 {
1592   assemble_addr_to_section (symbol, dtors_section);
1593 }
1594 #endif
1595 
1596 void
1597 default_named_section_asm_out_constructor (rtx symbol, int priority)
1598 {
1599   section *sec;
1600 
1601   if (priority != DEFAULT_INIT_PRIORITY)
1602     sec = get_cdtor_priority_section (priority,
1603 				      /*constructor_p=*/true);
1604   else
1605     sec = get_section (".ctors", SECTION_WRITE, NULL);
1606 
1607   assemble_addr_to_section (symbol, sec);
1608 }
1609 
1610 #ifdef CTORS_SECTION_ASM_OP
1611 void
1612 default_ctor_section_asm_out_constructor (rtx symbol,
1613 					  int priority ATTRIBUTE_UNUSED)
1614 {
1615   assemble_addr_to_section (symbol, ctors_section);
1616 }
1617 #endif
1618 
1619 /* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
1620    a nonzero value if the constant pool should be output before the
1621    start of the function, or a zero value if the pool should output
1622    after the end of the function.  The default is to put it before the
1623    start.  */
1624 
1625 #ifndef CONSTANT_POOL_BEFORE_FUNCTION
1626 #define CONSTANT_POOL_BEFORE_FUNCTION 1
1627 #endif
1628 
1629 /* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going
1630    to be output to assembler.
1631    Set first_global_object_name and weak_global_object_name as appropriate.  */
1632 
1633 void
1634 notice_global_symbol (tree decl)
1635 {
1636   const char **t = &first_global_object_name;
1637 
1638   if (first_global_object_name
1639       || !TREE_PUBLIC (decl)
1640       || DECL_EXTERNAL (decl)
1641       || !DECL_NAME (decl)
1642       || (VAR_P (decl) && DECL_HARD_REGISTER (decl))
1643       || (TREE_CODE (decl) != FUNCTION_DECL
1644 	  && (!VAR_P (decl)
1645 	      || (DECL_COMMON (decl)
1646 		  && (DECL_INITIAL (decl) == 0
1647 		      || DECL_INITIAL (decl) == error_mark_node)))))
1648     return;
1649 
1650   /* We win when global object is found, but it is useful to know about weak
1651      symbol as well so we can produce nicer unique names.  */
1652   if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl) || flag_shlib)
1653     t = &weak_global_object_name;
1654 
1655   if (!*t)
1656     {
1657       tree id = DECL_ASSEMBLER_NAME (decl);
1658       ultimate_transparent_alias_target (&id);
1659       *t = ggc_strdup (targetm.strip_name_encoding (IDENTIFIER_POINTER (id)));
1660     }
1661 }
1662 
1663 /* If not using flag_reorder_blocks_and_partition, decide early whether the
1664    current function goes into the cold section, so that targets can use
1665    current_function_section during RTL expansion.  DECL describes the
1666    function.  */
1667 
1668 void
1669 decide_function_section (tree decl)
1670 {
1671   first_function_block_is_cold = false;
1672 
1673   if (flag_reorder_blocks_and_partition)
1674     /* We will decide in assemble_start_function.  */
1675     return;
1676 
1677  if (DECL_SECTION_NAME (decl))
1678     {
1679       struct cgraph_node *node = cgraph_node::get (current_function_decl);
1680       /* Calls to function_section rely on first_function_block_is_cold
1681 	 being accurate.  */
1682       first_function_block_is_cold = (node
1683 				      && node->frequency
1684 				      == NODE_FREQUENCY_UNLIKELY_EXECUTED);
1685     }
1686 
1687   in_cold_section_p = first_function_block_is_cold;
1688 }
1689 
1690 /* Get the function's name, as described by its RTL.  This may be
1691    different from the DECL_NAME name used in the source file.  */
1692 const char *
1693 get_fnname_from_decl (tree decl)
1694 {
1695   rtx x = DECL_RTL (decl);
1696   gcc_assert (MEM_P (x));
1697   x = XEXP (x, 0);
1698   gcc_assert (GET_CODE (x) == SYMBOL_REF);
1699   return XSTR (x, 0);
1700 }
1701 
1702 /* Output assembler code for the constant pool of a function and associated
1703    with defining the name of the function.  DECL describes the function.
1704    NAME is the function's name.  For the constant pool, we use the current
1705    constant pool data.  */
1706 
1707 void
1708 assemble_start_function (tree decl, const char *fnname)
1709 {
1710   int align;
1711   char tmp_label[100];
1712   bool hot_label_written = false;
1713 
1714   if (flag_reorder_blocks_and_partition)
1715     {
1716       ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno);
1717       crtl->subsections.hot_section_label = ggc_strdup (tmp_label);
1718       ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno);
1719       crtl->subsections.cold_section_label = ggc_strdup (tmp_label);
1720       ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno);
1721       crtl->subsections.hot_section_end_label = ggc_strdup (tmp_label);
1722       ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno);
1723       crtl->subsections.cold_section_end_label = ggc_strdup (tmp_label);
1724       const_labelno++;
1725       cold_function_name = NULL_TREE;
1726     }
1727   else
1728     {
1729       crtl->subsections.hot_section_label = NULL;
1730       crtl->subsections.cold_section_label = NULL;
1731       crtl->subsections.hot_section_end_label = NULL;
1732       crtl->subsections.cold_section_end_label = NULL;
1733     }
1734 
1735   /* The following code does not need preprocessing in the assembler.  */
1736 
1737   app_disable ();
1738 
1739   if (CONSTANT_POOL_BEFORE_FUNCTION)
1740     output_constant_pool (fnname, decl);
1741 
1742   align = symtab_node::get (decl)->definition_alignment ();
1743 
1744   /* Make sure the not and cold text (code) sections are properly
1745      aligned.  This is necessary here in the case where the function
1746      has both hot and cold sections, because we don't want to re-set
1747      the alignment when the section switch happens mid-function.  */
1748 
1749   if (flag_reorder_blocks_and_partition)
1750     {
1751       first_function_block_is_cold = false;
1752 
1753       switch_to_section (unlikely_text_section ());
1754       assemble_align (align);
1755       ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_label);
1756 
1757       /* When the function starts with a cold section, we need to explicitly
1758 	 align the hot section and write out the hot section label.
1759 	 But if the current function is a thunk, we do not have a CFG.  */
1760       if (!cfun->is_thunk
1761 	  && BB_PARTITION (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb) == BB_COLD_PARTITION)
1762 	{
1763 	  switch_to_section (text_section);
1764 	  assemble_align (align);
1765 	  ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_label);
1766 	  hot_label_written = true;
1767 	  first_function_block_is_cold = true;
1768 	}
1769       in_cold_section_p = first_function_block_is_cold;
1770     }
1771 
1772 
1773   /* Switch to the correct text section for the start of the function.  */
1774 
1775   switch_to_section (function_section (decl));
1776   if (flag_reorder_blocks_and_partition
1777       && !hot_label_written)
1778     ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_label);
1779 
1780   /* Tell assembler to move to target machine's alignment for functions.  */
1781   align = floor_log2 (align / BITS_PER_UNIT);
1782   if (align > 0)
1783     {
1784       ASM_OUTPUT_ALIGN (asm_out_file, align);
1785     }
1786 
1787   /* Handle a user-specified function alignment.
1788      Note that we still need to align to DECL_ALIGN, as above,
1789      because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all.  */
1790   if (! DECL_USER_ALIGN (decl)
1791       && align_functions_log > align
1792       && optimize_function_for_speed_p (cfun))
1793     {
1794 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1795       int align_log = align_functions_log;
1796 #endif
1797       int max_skip = align_functions - 1;
1798       if (flag_limit_function_alignment && crtl->max_insn_address > 0
1799 	  && max_skip >= crtl->max_insn_address)
1800 	max_skip = crtl->max_insn_address - 1;
1801 
1802 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1803       ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file, align_log, max_skip);
1804 #else
1805       ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1806 #endif
1807     }
1808 
1809 #ifdef ASM_OUTPUT_FUNCTION_PREFIX
1810   ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1811 #endif
1812 
1813   if (!DECL_IGNORED_P (decl))
1814     (*debug_hooks->begin_function) (decl);
1815 
1816   /* Make function name accessible from other files, if appropriate.  */
1817 
1818   if (TREE_PUBLIC (decl)
1819       || (cgraph_node::get (decl)->instrumentation_clone
1820 	  && cgraph_node::get (decl)->instrumented_version
1821 	  && TREE_PUBLIC (cgraph_node::get (decl)->instrumented_version->decl)))
1822     {
1823       notice_global_symbol (decl);
1824 
1825       globalize_decl (decl);
1826 
1827       maybe_assemble_visibility (decl);
1828     }
1829 
1830   if (DECL_PRESERVE_P (decl))
1831     targetm.asm_out.mark_decl_preserved (fnname);
1832 
1833   /* Do any machine/system dependent processing of the function name.  */
1834 #ifdef ASM_DECLARE_FUNCTION_NAME
1835   ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
1836 #else
1837   /* Standard thing is just output label for the function.  */
1838   ASM_OUTPUT_FUNCTION_LABEL (asm_out_file, fnname, current_function_decl);
1839 #endif /* ASM_DECLARE_FUNCTION_NAME */
1840 
1841   if (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (decl)))
1842     saw_no_split_stack = true;
1843 }
1844 
1845 /* Output assembler code associated with defining the size of the
1846    function.  DECL describes the function.  NAME is the function's name.  */
1847 
1848 void
1849 assemble_end_function (tree decl, const char *fnname ATTRIBUTE_UNUSED)
1850 {
1851 #ifdef ASM_DECLARE_FUNCTION_SIZE
1852   /* We could have switched section in the middle of the function.  */
1853   if (flag_reorder_blocks_and_partition)
1854     switch_to_section (function_section (decl));
1855   ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1856 #endif
1857   if (! CONSTANT_POOL_BEFORE_FUNCTION)
1858     {
1859       output_constant_pool (fnname, decl);
1860       switch_to_section (function_section (decl)); /* need to switch back */
1861     }
1862   /* Output labels for end of hot/cold text sections (to be used by
1863      debug info.)  */
1864   if (flag_reorder_blocks_and_partition)
1865     {
1866       section *save_text_section;
1867 
1868       save_text_section = in_section;
1869       switch_to_section (unlikely_text_section ());
1870 #ifdef ASM_DECLARE_COLD_FUNCTION_SIZE
1871       if (cold_function_name != NULL_TREE)
1872 	ASM_DECLARE_COLD_FUNCTION_SIZE (asm_out_file,
1873 					IDENTIFIER_POINTER (cold_function_name),
1874 					decl);
1875 #endif
1876       ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_end_label);
1877       if (first_function_block_is_cold)
1878 	switch_to_section (text_section);
1879       else
1880 	switch_to_section (function_section (decl));
1881       ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_end_label);
1882       switch_to_section (save_text_section);
1883     }
1884 }
1885 
1886 /* Assemble code to leave SIZE bytes of zeros.  */
1887 
1888 void
1889 assemble_zeros (unsigned HOST_WIDE_INT size)
1890 {
1891   /* Do no output if -fsyntax-only.  */
1892   if (flag_syntax_only)
1893     return;
1894 
1895 #ifdef ASM_NO_SKIP_IN_TEXT
1896   /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1897      so we must output 0s explicitly in the text section.  */
1898   if (ASM_NO_SKIP_IN_TEXT && (in_section->common.flags & SECTION_CODE) != 0)
1899     {
1900       unsigned HOST_WIDE_INT i;
1901       for (i = 0; i < size; i++)
1902 	assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
1903     }
1904   else
1905 #endif
1906     if (size > 0)
1907       ASM_OUTPUT_SKIP (asm_out_file, size);
1908 }
1909 
1910 /* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
1911 
1912 void
1913 assemble_align (int align)
1914 {
1915   if (align > BITS_PER_UNIT)
1916     {
1917       ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1918     }
1919 }
1920 
1921 /* Assemble a string constant with the specified C string as contents.  */
1922 
1923 void
1924 assemble_string (const char *p, int size)
1925 {
1926   int pos = 0;
1927   int maximum = 2000;
1928 
1929   /* If the string is very long, split it up.  */
1930 
1931   while (pos < size)
1932     {
1933       int thissize = size - pos;
1934       if (thissize > maximum)
1935 	thissize = maximum;
1936 
1937       ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
1938 
1939       pos += thissize;
1940       p += thissize;
1941     }
1942 }
1943 
1944 
1945 /* A noswitch_section_callback for lcomm_section.  */
1946 
1947 static bool
1948 emit_local (tree decl ATTRIBUTE_UNUSED,
1949 	    const char *name ATTRIBUTE_UNUSED,
1950 	    unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1951 	    unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1952 {
1953 #if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1954   unsigned int align = symtab_node::get (decl)->definition_alignment ();
1955   ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name,
1956 				 size, align);
1957   return true;
1958 #elif defined ASM_OUTPUT_ALIGNED_LOCAL
1959   unsigned int align = symtab_node::get (decl)->definition_alignment ();
1960   ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, align);
1961   return true;
1962 #else
1963   ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1964   return false;
1965 #endif
1966 }
1967 
1968 /* A noswitch_section_callback for bss_noswitch_section.  */
1969 
1970 #if defined ASM_OUTPUT_ALIGNED_BSS
1971 static bool
1972 emit_bss (tree decl ATTRIBUTE_UNUSED,
1973 	  const char *name ATTRIBUTE_UNUSED,
1974 	  unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1975 	  unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1976 {
1977   ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size,
1978 			  get_variable_align (decl));
1979   return true;
1980 }
1981 #endif
1982 
1983 /* A noswitch_section_callback for comm_section.  */
1984 
1985 static bool
1986 emit_common (tree decl ATTRIBUTE_UNUSED,
1987 	     const char *name ATTRIBUTE_UNUSED,
1988 	     unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1989 	     unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1990 {
1991 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1992   ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name,
1993 				  size, get_variable_align (decl));
1994   return true;
1995 #elif defined ASM_OUTPUT_ALIGNED_COMMON
1996   ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size,
1997 			     get_variable_align (decl));
1998   return true;
1999 #else
2000   ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
2001   return false;
2002 #endif
2003 }
2004 
2005 /* A noswitch_section_callback for tls_comm_section.  */
2006 
2007 static bool
2008 emit_tls_common (tree decl ATTRIBUTE_UNUSED,
2009 		 const char *name ATTRIBUTE_UNUSED,
2010 		 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
2011 		 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
2012 {
2013 #ifdef ASM_OUTPUT_TLS_COMMON
2014   ASM_OUTPUT_TLS_COMMON (asm_out_file, decl, name, size);
2015   return true;
2016 #else
2017   sorry ("thread-local COMMON data not implemented");
2018   return true;
2019 #endif
2020 }
2021 
2022 /* Assemble DECL given that it belongs in SECTION_NOSWITCH section SECT.
2023    NAME is the name of DECL's SYMBOL_REF.  */
2024 
2025 static void
2026 assemble_noswitch_variable (tree decl, const char *name, section *sect,
2027 			    unsigned int align)
2028 {
2029   unsigned HOST_WIDE_INT size, rounded;
2030 
2031   size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
2032   rounded = size;
2033 
2034   if ((flag_sanitize & SANITIZE_ADDRESS) && asan_protect_global (decl))
2035     size += asan_red_zone_size (size);
2036 
2037   /* Don't allocate zero bytes of common,
2038      since that means "undefined external" in the linker.  */
2039   if (size == 0)
2040     rounded = 1;
2041 
2042   /* Round size up to multiple of BIGGEST_ALIGNMENT bits
2043      so that each uninitialized object starts on such a boundary.  */
2044   rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
2045   rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2046 	     * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
2047 
2048   if (!sect->noswitch.callback (decl, name, size, rounded)
2049       && (unsigned HOST_WIDE_INT) (align / BITS_PER_UNIT) > rounded)
2050     error ("requested alignment for %q+D is greater than "
2051 	   "implemented alignment of %wu", decl, rounded);
2052 }
2053 
2054 /* A subroutine of assemble_variable.  Output the label and contents of
2055    DECL, whose address is a SYMBOL_REF with name NAME.  DONT_OUTPUT_DATA
2056    is as for assemble_variable.  */
2057 
2058 static void
2059 assemble_variable_contents (tree decl, const char *name,
2060 			    bool dont_output_data)
2061 {
2062   /* Do any machine/system dependent processing of the object.  */
2063 #ifdef ASM_DECLARE_OBJECT_NAME
2064   last_assemble_variable_decl = decl;
2065   ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
2066 #else
2067   /* Standard thing is just output label for the object.  */
2068   ASM_OUTPUT_LABEL (asm_out_file, name);
2069 #endif /* ASM_DECLARE_OBJECT_NAME */
2070 
2071   if (!dont_output_data)
2072     {
2073       /* Caller is supposed to use varpool_get_constructor when it wants
2074 	 to output the body.  */
2075       gcc_assert (!in_lto_p || DECL_INITIAL (decl) != error_mark_node);
2076       if (DECL_INITIAL (decl)
2077 	  && DECL_INITIAL (decl) != error_mark_node
2078 	  && !initializer_zerop (DECL_INITIAL (decl)))
2079 	/* Output the actual data.  */
2080 	output_constant (DECL_INITIAL (decl),
2081 			 tree_to_uhwi (DECL_SIZE_UNIT (decl)),
2082 			 get_variable_align (decl),
2083 			 false);
2084       else
2085 	/* Leave space for it.  */
2086 	assemble_zeros (tree_to_uhwi (DECL_SIZE_UNIT (decl)));
2087       targetm.asm_out.decl_end ();
2088     }
2089 }
2090 
2091 /* Write out assembly for the variable DECL, which is not defined in
2092    the current translation unit.  */
2093 void
2094 assemble_undefined_decl (tree decl)
2095 {
2096   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
2097   targetm.asm_out.assemble_undefined_decl (asm_out_file, name, decl);
2098 }
2099 
2100 /* Assemble everything that is needed for a variable or function declaration.
2101    Not used for automatic variables, and not used for function definitions.
2102    Should not be called for variables of incomplete structure type.
2103 
2104    TOP_LEVEL is nonzero if this variable has file scope.
2105    AT_END is nonzero if this is the special handling, at end of compilation,
2106    to define things that have had only tentative definitions.
2107    DONT_OUTPUT_DATA if nonzero means don't actually output the
2108    initial value (that will be done by the caller).  */
2109 
2110 void
2111 assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
2112 		   int at_end ATTRIBUTE_UNUSED, int dont_output_data)
2113 {
2114   const char *name;
2115   rtx decl_rtl, symbol;
2116   section *sect;
2117   unsigned int align;
2118   bool asan_protected = false;
2119 
2120   /* This function is supposed to handle VARIABLES.  Ensure we have one.  */
2121   gcc_assert (VAR_P (decl));
2122 
2123   /* Emulated TLS had better not get this far.  */
2124   gcc_checking_assert (targetm.have_tls || !DECL_THREAD_LOCAL_P (decl));
2125 
2126   last_assemble_variable_decl = 0;
2127 
2128   /* Normally no need to say anything here for external references,
2129      since assemble_external is called by the language-specific code
2130      when a declaration is first seen.  */
2131 
2132   if (DECL_EXTERNAL (decl))
2133     return;
2134 
2135   /* Do nothing for global register variables.  */
2136   if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl)))
2137     {
2138       TREE_ASM_WRITTEN (decl) = 1;
2139       return;
2140     }
2141 
2142   /* If type was incomplete when the variable was declared,
2143      see if it is complete now.  */
2144 
2145   if (DECL_SIZE (decl) == 0)
2146     layout_decl (decl, 0);
2147 
2148   /* Still incomplete => don't allocate it; treat the tentative defn
2149      (which is what it must have been) as an `extern' reference.  */
2150 
2151   if (!dont_output_data && DECL_SIZE (decl) == 0)
2152     {
2153       error ("storage size of %q+D isn%'t known", decl);
2154       TREE_ASM_WRITTEN (decl) = 1;
2155       return;
2156     }
2157 
2158   /* The first declaration of a variable that comes through this function
2159      decides whether it is global (in C, has external linkage)
2160      or local (in C, has internal linkage).  So do nothing more
2161      if this function has already run.  */
2162 
2163   if (TREE_ASM_WRITTEN (decl))
2164     return;
2165 
2166   /* Make sure targetm.encode_section_info is invoked before we set
2167      ASM_WRITTEN.  */
2168   decl_rtl = DECL_RTL (decl);
2169 
2170   TREE_ASM_WRITTEN (decl) = 1;
2171 
2172   /* Do no output if -fsyntax-only.  */
2173   if (flag_syntax_only)
2174     return;
2175 
2176   if (! dont_output_data
2177       && ! valid_constant_size_p (DECL_SIZE_UNIT (decl)))
2178     {
2179       error ("size of variable %q+D is too large", decl);
2180       return;
2181     }
2182 
2183   gcc_assert (MEM_P (decl_rtl));
2184   gcc_assert (GET_CODE (XEXP (decl_rtl, 0)) == SYMBOL_REF);
2185   symbol = XEXP (decl_rtl, 0);
2186 
2187   /* If this symbol belongs to the tree constant pool, output the constant
2188      if it hasn't already been written.  */
2189   if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
2190     {
2191       tree decl = SYMBOL_REF_DECL (symbol);
2192       if (!TREE_ASM_WRITTEN (DECL_INITIAL (decl)))
2193 	output_constant_def_contents (symbol);
2194       return;
2195     }
2196 
2197   app_disable ();
2198 
2199   name = XSTR (symbol, 0);
2200   if (TREE_PUBLIC (decl) && DECL_NAME (decl))
2201     notice_global_symbol (decl);
2202 
2203   /* Compute the alignment of this data.  */
2204 
2205   align_variable (decl, dont_output_data);
2206 
2207   if ((flag_sanitize & SANITIZE_ADDRESS)
2208       && asan_protect_global (decl))
2209     {
2210       asan_protected = true;
2211       SET_DECL_ALIGN (decl, MAX (DECL_ALIGN (decl),
2212 				 ASAN_RED_ZONE_SIZE * BITS_PER_UNIT));
2213     }
2214 
2215   set_mem_align (decl_rtl, DECL_ALIGN (decl));
2216 
2217   align = get_variable_align (decl);
2218 
2219   if (TREE_PUBLIC (decl))
2220     maybe_assemble_visibility (decl);
2221 
2222   if (DECL_PRESERVE_P (decl))
2223     targetm.asm_out.mark_decl_preserved (name);
2224 
2225   /* First make the assembler name(s) global if appropriate.  */
2226   sect = get_variable_section (decl, false);
2227   if (TREE_PUBLIC (decl)
2228       && (sect->common.flags & SECTION_COMMON) == 0)
2229     globalize_decl (decl);
2230 
2231   /* Output any data that we will need to use the address of.  */
2232   if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node)
2233     output_addressed_constants (DECL_INITIAL (decl));
2234 
2235   /* dbxout.c needs to know this.  */
2236   if (sect && (sect->common.flags & SECTION_CODE) != 0)
2237     DECL_IN_TEXT_SECTION (decl) = 1;
2238 
2239   /* If the decl is part of an object_block, make sure that the decl
2240      has been positioned within its block, but do not write out its
2241      definition yet.  output_object_blocks will do that later.  */
2242   if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol))
2243     {
2244       gcc_assert (!dont_output_data);
2245       place_block_symbol (symbol);
2246     }
2247   else if (SECTION_STYLE (sect) == SECTION_NOSWITCH)
2248     assemble_noswitch_variable (decl, name, sect, align);
2249   else
2250     {
2251       /* Special-case handling of vtv comdat sections.  */
2252       if (sect->named.name
2253 	  && (strcmp (sect->named.name, ".vtable_map_vars") == 0))
2254 	handle_vtv_comdat_section (sect, decl);
2255       else
2256 	switch_to_section (sect);
2257       if (align > BITS_PER_UNIT)
2258 	ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2259       assemble_variable_contents (decl, name, dont_output_data);
2260       if (asan_protected)
2261 	{
2262 	  unsigned HOST_WIDE_INT int size
2263 	    = tree_to_uhwi (DECL_SIZE_UNIT (decl));
2264 	  assemble_zeros (asan_red_zone_size (size));
2265 	}
2266     }
2267 }
2268 
2269 
2270 /* Given a function declaration (FN_DECL), this function assembles the
2271    function into the .preinit_array section.  */
2272 
2273 void
2274 assemble_vtv_preinit_initializer (tree fn_decl)
2275 {
2276   section *sect;
2277   unsigned flags = SECTION_WRITE;
2278   rtx symbol = XEXP (DECL_RTL (fn_decl), 0);
2279 
2280   flags |= SECTION_NOTYPE;
2281   sect = get_section (".preinit_array", flags, fn_decl);
2282   switch_to_section (sect);
2283   assemble_addr_to_section (symbol, sect);
2284 }
2285 
2286 /* Return 1 if type TYPE contains any pointers.  */
2287 
2288 static int
2289 contains_pointers_p (tree type)
2290 {
2291   switch (TREE_CODE (type))
2292     {
2293     case POINTER_TYPE:
2294     case REFERENCE_TYPE:
2295       /* I'm not sure whether OFFSET_TYPE needs this treatment,
2296 	 so I'll play safe and return 1.  */
2297     case OFFSET_TYPE:
2298       return 1;
2299 
2300     case RECORD_TYPE:
2301     case UNION_TYPE:
2302     case QUAL_UNION_TYPE:
2303       {
2304 	tree fields;
2305 	/* For a type that has fields, see if the fields have pointers.  */
2306 	for (fields = TYPE_FIELDS (type); fields; fields = DECL_CHAIN (fields))
2307 	  if (TREE_CODE (fields) == FIELD_DECL
2308 	      && contains_pointers_p (TREE_TYPE (fields)))
2309 	    return 1;
2310 	return 0;
2311       }
2312 
2313     case ARRAY_TYPE:
2314       /* An array type contains pointers if its element type does.  */
2315       return contains_pointers_p (TREE_TYPE (type));
2316 
2317     default:
2318       return 0;
2319     }
2320 }
2321 
2322 /* We delay assemble_external processing until
2323    the compilation unit is finalized.  This is the best we can do for
2324    right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay
2325    it all the way to final.  See PR 17982 for further discussion.  */
2326 static GTY(()) tree pending_assemble_externals;
2327 
2328 #ifdef ASM_OUTPUT_EXTERNAL
2329 /* Some targets delay some output to final using TARGET_ASM_FILE_END.
2330    As a result, assemble_external can be called after the list of externals
2331    is processed and the pointer set destroyed.  */
2332 static bool pending_assemble_externals_processed;
2333 
2334 /* Avoid O(external_decls**2) lookups in the pending_assemble_externals
2335    TREE_LIST in assemble_external.  */
2336 static hash_set<tree> *pending_assemble_externals_set;
2337 
2338 /* True if DECL is a function decl for which no out-of-line copy exists.
2339    It is assumed that DECL's assembler name has been set.  */
2340 
2341 static bool
2342 incorporeal_function_p (tree decl)
2343 {
2344   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
2345     {
2346       const char *name;
2347 
2348       if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
2349 	  && (DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA
2350 	      || DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA_WITH_ALIGN))
2351 	return true;
2352 
2353       name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
2354       /* Atomic or sync builtins which have survived this far will be
2355 	 resolved externally and therefore are not incorporeal.  */
2356       if (strncmp (name, "__builtin_", 10) == 0)
2357 	return true;
2358     }
2359   return false;
2360 }
2361 
2362 /* Actually do the tests to determine if this is necessary, and invoke
2363    ASM_OUTPUT_EXTERNAL.  */
2364 static void
2365 assemble_external_real (tree decl)
2366 {
2367   rtx rtl = DECL_RTL (decl);
2368 
2369   if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
2370       && !SYMBOL_REF_USED (XEXP (rtl, 0))
2371       && !incorporeal_function_p (decl))
2372     {
2373       /* Some systems do require some output.  */
2374       SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
2375       ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
2376     }
2377 }
2378 #endif
2379 
2380 void
2381 process_pending_assemble_externals (void)
2382 {
2383 #ifdef ASM_OUTPUT_EXTERNAL
2384   tree list;
2385   for (list = pending_assemble_externals; list; list = TREE_CHAIN (list))
2386     assemble_external_real (TREE_VALUE (list));
2387 
2388   pending_assemble_externals = 0;
2389   pending_assemble_externals_processed = true;
2390   delete pending_assemble_externals_set;
2391 #endif
2392 }
2393 
2394 /* This TREE_LIST contains any weak symbol declarations waiting
2395    to be emitted.  */
2396 static GTY(()) tree weak_decls;
2397 
2398 /* Output something to declare an external symbol to the assembler,
2399    and qualifiers such as weakness.  (Most assemblers don't need
2400    extern declaration, so we normally output nothing.)  Do nothing if
2401    DECL is not external.  */
2402 
2403 void
2404 assemble_external (tree decl ATTRIBUTE_UNUSED)
2405 {
2406   /*  Make sure that the ASM_OUT_FILE is open.
2407       If it's not, we should not be calling this function.  */
2408   gcc_assert (asm_out_file);
2409 
2410   /* In a perfect world, the following condition would be true.
2411      Sadly, the Java and Go front ends emit assembly *from the front end*,
2412      bypassing the call graph.  See PR52739.  Fix before GCC 4.8.  */
2413 #if 0
2414   /* This function should only be called if we are expanding, or have
2415      expanded, to RTL.
2416      Ideally, only final.c would be calling this function, but it is
2417      not clear whether that would break things somehow.  See PR 17982
2418      for further discussion.  */
2419   gcc_assert (state == EXPANSION
2420 	      || state == FINISHED);
2421 #endif
2422 
2423   if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl))
2424     return;
2425 
2426   /* We want to output annotation for weak and external symbols at
2427      very last to check if they are references or not.  */
2428 
2429   if (TARGET_SUPPORTS_WEAK
2430       && DECL_WEAK (decl)
2431       /* TREE_STATIC is a weird and abused creature which is not
2432 	 generally the right test for whether an entity has been
2433 	 locally emitted, inlined or otherwise not-really-extern, but
2434 	 for declarations that can be weak, it happens to be
2435 	 match.  */
2436       && !TREE_STATIC (decl)
2437       && lookup_attribute ("weak", DECL_ATTRIBUTES (decl))
2438       && value_member (decl, weak_decls) == NULL_TREE)
2439     weak_decls = tree_cons (NULL, decl, weak_decls);
2440 
2441 #ifdef ASM_OUTPUT_EXTERNAL
2442   if (pending_assemble_externals_processed)
2443     {
2444       assemble_external_real (decl);
2445       return;
2446     }
2447 
2448   if (! pending_assemble_externals_set->add (decl))
2449     pending_assemble_externals = tree_cons (NULL, decl,
2450 					    pending_assemble_externals);
2451 #endif
2452 }
2453 
2454 /* Similar, for calling a library function FUN.  */
2455 
2456 void
2457 assemble_external_libcall (rtx fun)
2458 {
2459   /* Declare library function name external when first used, if nec.  */
2460   if (! SYMBOL_REF_USED (fun))
2461     {
2462       SYMBOL_REF_USED (fun) = 1;
2463       targetm.asm_out.external_libcall (fun);
2464     }
2465 }
2466 
2467 /* Assemble a label named NAME.  */
2468 
2469 void
2470 assemble_label (FILE *file, const char *name)
2471 {
2472   ASM_OUTPUT_LABEL (file, name);
2473 }
2474 
2475 /* Set the symbol_referenced flag for ID.  */
2476 void
2477 mark_referenced (tree id)
2478 {
2479   TREE_SYMBOL_REFERENCED (id) = 1;
2480 }
2481 
2482 /* Set the symbol_referenced flag for DECL and notify callgraph.  */
2483 void
2484 mark_decl_referenced (tree decl)
2485 {
2486   if (TREE_CODE (decl) == FUNCTION_DECL)
2487     {
2488       /* Extern inline functions don't become needed when referenced.
2489 	 If we know a method will be emitted in other TU and no new
2490 	 functions can be marked reachable, just use the external
2491 	 definition.  */
2492       struct cgraph_node *node = cgraph_node::get_create (decl);
2493       if (!DECL_EXTERNAL (decl)
2494 	  && !node->definition)
2495 	node->mark_force_output ();
2496     }
2497   else if (VAR_P (decl))
2498     {
2499       varpool_node *node = varpool_node::get_create (decl);
2500       /* C++ frontend use mark_decl_references to force COMDAT variables
2501          to be output that might appear dead otherwise.  */
2502       node->force_output = true;
2503     }
2504   /* else do nothing - we can get various sorts of CST nodes here,
2505      which do not need to be marked.  */
2506 }
2507 
2508 
2509 /* Output to FILE (an assembly file) a reference to NAME.  If NAME
2510    starts with a *, the rest of NAME is output verbatim.  Otherwise
2511    NAME is transformed in a target-specific way (usually by the
2512    addition of an underscore).  */
2513 
2514 void
2515 assemble_name_raw (FILE *file, const char *name)
2516 {
2517   if (name[0] == '*')
2518     fputs (&name[1], file);
2519   else
2520     ASM_OUTPUT_LABELREF (file, name);
2521 }
2522 
2523 /* Like assemble_name_raw, but should be used when NAME might refer to
2524    an entity that is also represented as a tree (like a function or
2525    variable).  If NAME does refer to such an entity, that entity will
2526    be marked as referenced.  */
2527 
2528 void
2529 assemble_name (FILE *file, const char *name)
2530 {
2531   const char *real_name;
2532   tree id;
2533 
2534   real_name = targetm.strip_name_encoding (name);
2535 
2536   id = maybe_get_identifier (real_name);
2537   if (id)
2538     {
2539       tree id_orig = id;
2540 
2541       mark_referenced (id);
2542       ultimate_transparent_alias_target (&id);
2543       if (id != id_orig)
2544 	name = IDENTIFIER_POINTER (id);
2545       gcc_assert (! TREE_CHAIN (id));
2546     }
2547 
2548   assemble_name_raw (file, name);
2549 }
2550 
2551 /* Allocate SIZE bytes writable static space with a gensym name
2552    and return an RTX to refer to its address.  */
2553 
2554 rtx
2555 assemble_static_space (unsigned HOST_WIDE_INT size)
2556 {
2557   char name[17];
2558   const char *namestring;
2559   rtx x;
2560 
2561   ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
2562   ++const_labelno;
2563   namestring = ggc_strdup (name);
2564 
2565   x = gen_rtx_SYMBOL_REF (Pmode, namestring);
2566   SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
2567 
2568 #ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
2569   ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
2570 				 BIGGEST_ALIGNMENT);
2571 #else
2572 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
2573   ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
2574 #else
2575   {
2576     /* Round size up to multiple of BIGGEST_ALIGNMENT bits
2577        so that each uninitialized object starts on such a boundary.  */
2578     /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL.  */
2579     unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
2580       = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
2581 	 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2582 	 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
2583     ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
2584   }
2585 #endif
2586 #endif
2587   return x;
2588 }
2589 
2590 /* Assemble the static constant template for function entry trampolines.
2591    This is done at most once per compilation.
2592    Returns an RTX for the address of the template.  */
2593 
2594 static GTY(()) rtx initial_trampoline;
2595 
2596 rtx
2597 assemble_trampoline_template (void)
2598 {
2599   char label[256];
2600   const char *name;
2601   int align;
2602   rtx symbol;
2603 
2604   gcc_assert (targetm.asm_out.trampoline_template != NULL);
2605 
2606   if (initial_trampoline)
2607     return initial_trampoline;
2608 
2609   /* By default, put trampoline templates in read-only data section.  */
2610 
2611 #ifdef TRAMPOLINE_SECTION
2612   switch_to_section (TRAMPOLINE_SECTION);
2613 #else
2614   switch_to_section (readonly_data_section);
2615 #endif
2616 
2617   /* Write the assembler code to define one.  */
2618   align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
2619   if (align > 0)
2620     ASM_OUTPUT_ALIGN (asm_out_file, align);
2621 
2622   targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
2623   targetm.asm_out.trampoline_template (asm_out_file);
2624 
2625   /* Record the rtl to refer to it.  */
2626   ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
2627   name = ggc_strdup (label);
2628   symbol = gen_rtx_SYMBOL_REF (Pmode, name);
2629   SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2630 
2631   initial_trampoline = gen_const_mem (BLKmode, symbol);
2632   set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
2633   set_mem_size (initial_trampoline, TRAMPOLINE_SIZE);
2634 
2635   return initial_trampoline;
2636 }
2637 
2638 /* A and B are either alignments or offsets.  Return the minimum alignment
2639    that may be assumed after adding the two together.  */
2640 
2641 static inline unsigned
2642 min_align (unsigned int a, unsigned int b)
2643 {
2644   return least_bit_hwi (a | b);
2645 }
2646 
2647 /* Return the assembler directive for creating a given kind of integer
2648    object.  SIZE is the number of bytes in the object and ALIGNED_P
2649    indicates whether it is known to be aligned.  Return NULL if the
2650    assembly dialect has no such directive.
2651 
2652    The returned string should be printed at the start of a new line and
2653    be followed immediately by the object's initial value.  */
2654 
2655 const char *
2656 integer_asm_op (int size, int aligned_p)
2657 {
2658   struct asm_int_op *ops;
2659 
2660   if (aligned_p)
2661     ops = &targetm.asm_out.aligned_op;
2662   else
2663     ops = &targetm.asm_out.unaligned_op;
2664 
2665   switch (size)
2666     {
2667     case 1:
2668       return targetm.asm_out.byte_op;
2669     case 2:
2670       return ops->hi;
2671     case 4:
2672       return ops->si;
2673     case 8:
2674       return ops->di;
2675     case 16:
2676       return ops->ti;
2677     default:
2678       return NULL;
2679     }
2680 }
2681 
2682 /* Use directive OP to assemble an integer object X.  Print OP at the
2683    start of the line, followed immediately by the value of X.  */
2684 
2685 void
2686 assemble_integer_with_op (const char *op, rtx x)
2687 {
2688   fputs (op, asm_out_file);
2689   output_addr_const (asm_out_file, x);
2690   fputc ('\n', asm_out_file);
2691 }
2692 
2693 /* The default implementation of the asm_out.integer target hook.  */
2694 
2695 bool
2696 default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
2697 			  unsigned int size ATTRIBUTE_UNUSED,
2698 			  int aligned_p ATTRIBUTE_UNUSED)
2699 {
2700   const char *op = integer_asm_op (size, aligned_p);
2701   /* Avoid GAS bugs for large values.  Specifically negative values whose
2702      absolute value fits in a bfd_vma, but not in a bfd_signed_vma.  */
2703   if (size > UNITS_PER_WORD && size > POINTER_SIZE_UNITS)
2704     return false;
2705   return op && (assemble_integer_with_op (op, x), true);
2706 }
2707 
2708 /* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
2709    the alignment of the integer in bits.  Return 1 if we were able to output
2710    the constant, otherwise 0.  We must be able to output the constant,
2711    if FORCE is nonzero.  */
2712 
2713 bool
2714 assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
2715 {
2716   int aligned_p;
2717 
2718   aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
2719 
2720   /* See if the target hook can handle this kind of object.  */
2721   if (targetm.asm_out.integer (x, size, aligned_p))
2722     return true;
2723 
2724   /* If the object is a multi-byte one, try splitting it up.  Split
2725      it into words it if is multi-word, otherwise split it into bytes.  */
2726   if (size > 1)
2727     {
2728       machine_mode omode, imode;
2729       unsigned int subalign;
2730       unsigned int subsize, i;
2731       enum mode_class mclass;
2732 
2733       subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
2734       subalign = MIN (align, subsize * BITS_PER_UNIT);
2735       if (GET_CODE (x) == CONST_FIXED)
2736 	mclass = GET_MODE_CLASS (GET_MODE (x));
2737       else
2738 	mclass = MODE_INT;
2739 
2740       omode = mode_for_size (subsize * BITS_PER_UNIT, mclass, 0);
2741       imode = mode_for_size (size * BITS_PER_UNIT, mclass, 0);
2742 
2743       for (i = 0; i < size; i += subsize)
2744 	{
2745 	  rtx partial = simplify_subreg (omode, x, imode, i);
2746 	  if (!partial || !assemble_integer (partial, subsize, subalign, 0))
2747 	    break;
2748 	}
2749       if (i == size)
2750 	return true;
2751 
2752       /* If we've printed some of it, but not all of it, there's no going
2753 	 back now.  */
2754       gcc_assert (!i);
2755     }
2756 
2757   gcc_assert (!force);
2758 
2759   return false;
2760 }
2761 
2762 /* Assemble the floating-point constant D into an object of size MODE.  ALIGN
2763    is the alignment of the constant in bits.  If REVERSE is true, D is output
2764    in reverse storage order.  */
2765 
2766 void
2767 assemble_real (REAL_VALUE_TYPE d, machine_mode mode, unsigned int align,
2768 	       bool reverse)
2769 {
2770   long data[4] = {0, 0, 0, 0};
2771   int bitsize, nelts, nunits, units_per;
2772   rtx elt;
2773 
2774   /* This is hairy.  We have a quantity of known size.  real_to_target
2775      will put it into an array of *host* longs, 32 bits per element
2776      (even if long is more than 32 bits).  We need to determine the
2777      number of array elements that are occupied (nelts) and the number
2778      of *target* min-addressable units that will be occupied in the
2779      object file (nunits).  We cannot assume that 32 divides the
2780      mode's bitsize (size * BITS_PER_UNIT) evenly.
2781 
2782      size * BITS_PER_UNIT is used here to make sure that padding bits
2783      (which might appear at either end of the value; real_to_target
2784      will include the padding bits in its output array) are included.  */
2785 
2786   nunits = GET_MODE_SIZE (mode);
2787   bitsize = nunits * BITS_PER_UNIT;
2788   nelts = CEIL (bitsize, 32);
2789   units_per = 32 / BITS_PER_UNIT;
2790 
2791   real_to_target (data, &d, mode);
2792 
2793   /* Put out the first word with the specified alignment.  */
2794   if (reverse)
2795     elt = flip_storage_order (SImode, gen_int_mode (data[nelts - 1], SImode));
2796   else
2797     elt = GEN_INT (data[0]);
2798   assemble_integer (elt, MIN (nunits, units_per), align, 1);
2799   nunits -= units_per;
2800 
2801   /* Subsequent words need only 32-bit alignment.  */
2802   align = min_align (align, 32);
2803 
2804   for (int i = 1; i < nelts; i++)
2805     {
2806       if (reverse)
2807 	elt = flip_storage_order (SImode,
2808 				  gen_int_mode (data[nelts - 1 - i], SImode));
2809       else
2810 	elt = GEN_INT (data[i]);
2811       assemble_integer (elt, MIN (nunits, units_per), align, 1);
2812       nunits -= units_per;
2813     }
2814 }
2815 
2816 /* Given an expression EXP with a constant value,
2817    reduce it to the sum of an assembler symbol and an integer.
2818    Store them both in the structure *VALUE.
2819    EXP must be reducible.  */
2820 
2821 struct addr_const {
2822   rtx base;
2823   HOST_WIDE_INT offset;
2824 };
2825 
2826 static void
2827 decode_addr_const (tree exp, struct addr_const *value)
2828 {
2829   tree target = TREE_OPERAND (exp, 0);
2830   HOST_WIDE_INT offset = 0;
2831   rtx x;
2832 
2833   while (1)
2834     {
2835       if (TREE_CODE (target) == COMPONENT_REF
2836 	  && tree_fits_shwi_p (byte_position (TREE_OPERAND (target, 1))))
2837 	{
2838 	  offset += int_byte_position (TREE_OPERAND (target, 1));
2839 	  target = TREE_OPERAND (target, 0);
2840 	}
2841       else if (TREE_CODE (target) == ARRAY_REF
2842 	       || TREE_CODE (target) == ARRAY_RANGE_REF)
2843 	{
2844 	  /* Truncate big offset.  */
2845 	  offset += (TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (target)))
2846 		     * TREE_INT_CST_LOW (TREE_OPERAND (target, 1)));
2847 	  target = TREE_OPERAND (target, 0);
2848 	}
2849       else if (TREE_CODE (target) == MEM_REF
2850 	       && TREE_CODE (TREE_OPERAND (target, 0)) == ADDR_EXPR)
2851 	{
2852 	  offset += mem_ref_offset (target).to_short_addr ();
2853 	  target = TREE_OPERAND (TREE_OPERAND (target, 0), 0);
2854 	}
2855       else if (TREE_CODE (target) == INDIRECT_REF
2856 	       && TREE_CODE (TREE_OPERAND (target, 0)) == NOP_EXPR
2857 	       && TREE_CODE (TREE_OPERAND (TREE_OPERAND (target, 0), 0))
2858 		  == ADDR_EXPR)
2859 	target = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (target, 0), 0), 0);
2860       else
2861 	break;
2862     }
2863 
2864   switch (TREE_CODE (target))
2865     {
2866     case VAR_DECL:
2867     case FUNCTION_DECL:
2868       x = DECL_RTL (target);
2869       break;
2870 
2871     case LABEL_DECL:
2872       x = gen_rtx_MEM (FUNCTION_MODE,
2873 		       gen_rtx_LABEL_REF (Pmode, force_label_rtx (target)));
2874       break;
2875 
2876     case REAL_CST:
2877     case FIXED_CST:
2878     case STRING_CST:
2879     case COMPLEX_CST:
2880     case CONSTRUCTOR:
2881     case INTEGER_CST:
2882       x = output_constant_def (target, 1);
2883       break;
2884 
2885     case COMPOUND_LITERAL_EXPR:
2886       gcc_assert (COMPOUND_LITERAL_EXPR_DECL (target));
2887       x = DECL_RTL (COMPOUND_LITERAL_EXPR_DECL (target));
2888       break;
2889 
2890     default:
2891       gcc_unreachable ();
2892     }
2893 
2894   gcc_assert (MEM_P (x));
2895   x = XEXP (x, 0);
2896 
2897   value->base = x;
2898   value->offset = offset;
2899 }
2900 
2901 static GTY(()) hash_table<tree_descriptor_hasher> *const_desc_htab;
2902 
2903 static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
2904 
2905 /* Constant pool accessor function.  */
2906 
2907 hash_table<tree_descriptor_hasher> *
2908 constant_pool_htab (void)
2909 {
2910   return const_desc_htab;
2911 }
2912 
2913 /* Compute a hash code for a constant expression.  */
2914 
2915 hashval_t
2916 tree_descriptor_hasher::hash (constant_descriptor_tree *ptr)
2917 {
2918   return ptr->hash;
2919 }
2920 
2921 static hashval_t
2922 const_hash_1 (const tree exp)
2923 {
2924   const char *p;
2925   hashval_t hi;
2926   int len, i;
2927   enum tree_code code = TREE_CODE (exp);
2928 
2929   /* Either set P and LEN to the address and len of something to hash and
2930      exit the switch or return a value.  */
2931 
2932   switch (code)
2933     {
2934     case INTEGER_CST:
2935       p = (char *) &TREE_INT_CST_ELT (exp, 0);
2936       len = TREE_INT_CST_NUNITS (exp) * sizeof (HOST_WIDE_INT);
2937       break;
2938 
2939     case REAL_CST:
2940       return real_hash (TREE_REAL_CST_PTR (exp));
2941 
2942     case FIXED_CST:
2943       return fixed_hash (TREE_FIXED_CST_PTR (exp));
2944 
2945     case STRING_CST:
2946       p = TREE_STRING_POINTER (exp);
2947       len = TREE_STRING_LENGTH (exp);
2948       break;
2949 
2950     case COMPLEX_CST:
2951       return (const_hash_1 (TREE_REALPART (exp)) * 5
2952 	      + const_hash_1 (TREE_IMAGPART (exp)));
2953 
2954     case VECTOR_CST:
2955       {
2956 	unsigned i;
2957 
2958 	hi = 7 + VECTOR_CST_NELTS (exp);
2959 
2960 	for (i = 0; i < VECTOR_CST_NELTS (exp); ++i)
2961 	  hi = hi * 563 + const_hash_1 (VECTOR_CST_ELT (exp, i));
2962 
2963 	return hi;
2964       }
2965 
2966     case CONSTRUCTOR:
2967       {
2968 	unsigned HOST_WIDE_INT idx;
2969 	tree value;
2970 
2971 	hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
2972 
2973 	FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
2974 	  if (value)
2975 	    hi = hi * 603 + const_hash_1 (value);
2976 
2977 	return hi;
2978       }
2979 
2980     case ADDR_EXPR:
2981     case FDESC_EXPR:
2982       {
2983 	struct addr_const value;
2984 
2985 	decode_addr_const (exp, &value);
2986 	switch (GET_CODE (value.base))
2987 	  {
2988 	  case SYMBOL_REF:
2989 	    /* Don't hash the address of the SYMBOL_REF;
2990 	       only use the offset and the symbol name.  */
2991 	    hi = value.offset;
2992 	    p = XSTR (value.base, 0);
2993 	    for (i = 0; p[i] != 0; i++)
2994 	      hi = ((hi * 613) + (unsigned) (p[i]));
2995 	    break;
2996 
2997 	  case LABEL_REF:
2998 	    hi = (value.offset
2999 		  + CODE_LABEL_NUMBER (label_ref_label (value.base)) * 13);
3000 	    break;
3001 
3002 	  default:
3003 	    gcc_unreachable ();
3004 	  }
3005       }
3006       return hi;
3007 
3008     case PLUS_EXPR:
3009     case POINTER_PLUS_EXPR:
3010     case MINUS_EXPR:
3011       return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
3012 	      + const_hash_1 (TREE_OPERAND (exp, 1)));
3013 
3014     CASE_CONVERT:
3015       return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
3016 
3017     default:
3018       /* A language specific constant. Just hash the code.  */
3019       return code;
3020     }
3021 
3022   /* Compute hashing function.  */
3023   hi = len;
3024   for (i = 0; i < len; i++)
3025     hi = ((hi * 613) + (unsigned) (p[i]));
3026 
3027   return hi;
3028 }
3029 
3030 /* Wrapper of compare_constant, for the htab interface.  */
3031 bool
3032 tree_descriptor_hasher::equal (constant_descriptor_tree *c1,
3033 			       constant_descriptor_tree *c2)
3034 {
3035   if (c1->hash != c2->hash)
3036     return 0;
3037   return compare_constant (c1->value, c2->value);
3038 }
3039 
3040 /* Compare t1 and t2, and return 1 only if they are known to result in
3041    the same bit pattern on output.  */
3042 
3043 static int
3044 compare_constant (const tree t1, const tree t2)
3045 {
3046   enum tree_code typecode;
3047 
3048   if (t1 == NULL_TREE)
3049     return t2 == NULL_TREE;
3050   if (t2 == NULL_TREE)
3051     return 0;
3052 
3053   if (TREE_CODE (t1) != TREE_CODE (t2))
3054     return 0;
3055 
3056   switch (TREE_CODE (t1))
3057     {
3058     case INTEGER_CST:
3059       /* Integer constants are the same only if the same width of type.  */
3060       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
3061 	return 0;
3062       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
3063 	return 0;
3064       return tree_int_cst_equal (t1, t2);
3065 
3066     case REAL_CST:
3067       /* Real constants are the same only if the same width of type.  */
3068       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
3069 	return 0;
3070 
3071       return real_identical (&TREE_REAL_CST (t1), &TREE_REAL_CST (t2));
3072 
3073     case FIXED_CST:
3074       /* Fixed constants are the same only if the same width of type.  */
3075       if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
3076 	return 0;
3077 
3078       return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1), TREE_FIXED_CST (t2));
3079 
3080     case STRING_CST:
3081       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
3082 	return 0;
3083 
3084       return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
3085 	      && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
3086 			 TREE_STRING_LENGTH (t1)));
3087 
3088     case COMPLEX_CST:
3089       return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
3090 	      && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
3091 
3092     case VECTOR_CST:
3093       {
3094 	unsigned i;
3095 
3096         if (VECTOR_CST_NELTS (t1) != VECTOR_CST_NELTS (t2))
3097 	  return 0;
3098 
3099 	for (i = 0; i < VECTOR_CST_NELTS (t1); ++i)
3100 	  if (!compare_constant (VECTOR_CST_ELT (t1, i),
3101 				 VECTOR_CST_ELT (t2, i)))
3102 	    return 0;
3103 
3104 	return 1;
3105       }
3106 
3107     case CONSTRUCTOR:
3108       {
3109 	vec<constructor_elt, va_gc> *v1, *v2;
3110 	unsigned HOST_WIDE_INT idx;
3111 
3112 	typecode = TREE_CODE (TREE_TYPE (t1));
3113 	if (typecode != TREE_CODE (TREE_TYPE (t2)))
3114 	  return 0;
3115 
3116 	if (typecode == ARRAY_TYPE)
3117 	  {
3118 	    HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
3119 	    /* For arrays, check that mode, size and storage order match.  */
3120 	    if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
3121 		|| size_1 == -1
3122 		|| size_1 != int_size_in_bytes (TREE_TYPE (t2))
3123 		|| TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (t1))
3124 		   != TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (t2)))
3125 	      return 0;
3126 	  }
3127 	else
3128 	  {
3129 	    /* For record and union constructors, require exact type
3130                equality.  */
3131 	    if (TREE_TYPE (t1) != TREE_TYPE (t2))
3132 	      return 0;
3133 	  }
3134 
3135 	v1 = CONSTRUCTOR_ELTS (t1);
3136 	v2 = CONSTRUCTOR_ELTS (t2);
3137 	if (vec_safe_length (v1) != vec_safe_length (v2))
3138 	  return 0;
3139 
3140 	for (idx = 0; idx < vec_safe_length (v1); ++idx)
3141 	  {
3142 	    constructor_elt *c1 = &(*v1)[idx];
3143 	    constructor_elt *c2 = &(*v2)[idx];
3144 
3145 	    /* Check that each value is the same...  */
3146 	    if (!compare_constant (c1->value, c2->value))
3147 	      return 0;
3148 	    /* ... and that they apply to the same fields!  */
3149 	    if (typecode == ARRAY_TYPE)
3150 	      {
3151 		if (!compare_constant (c1->index, c2->index))
3152 		  return 0;
3153 	      }
3154 	    else
3155 	      {
3156 		if (c1->index != c2->index)
3157 		  return 0;
3158 	      }
3159 	  }
3160 
3161 	return 1;
3162       }
3163 
3164     case ADDR_EXPR:
3165     case FDESC_EXPR:
3166       {
3167 	struct addr_const value1, value2;
3168 	enum rtx_code code;
3169 	int ret;
3170 
3171 	decode_addr_const (t1, &value1);
3172 	decode_addr_const (t2, &value2);
3173 
3174 	if (value1.offset != value2.offset)
3175 	  return 0;
3176 
3177 	code = GET_CODE (value1.base);
3178 	if (code != GET_CODE (value2.base))
3179 	  return 0;
3180 
3181 	switch (code)
3182 	  {
3183 	  case SYMBOL_REF:
3184 	    ret = (strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
3185 	    break;
3186 
3187 	  case LABEL_REF:
3188 	    ret = (CODE_LABEL_NUMBER (label_ref_label (value1.base))
3189 		   == CODE_LABEL_NUMBER (label_ref_label (value2.base)));
3190 	    break;
3191 
3192 	  default:
3193 	    gcc_unreachable ();
3194 	  }
3195 	return ret;
3196       }
3197 
3198     case PLUS_EXPR:
3199     case POINTER_PLUS_EXPR:
3200     case MINUS_EXPR:
3201     case RANGE_EXPR:
3202       return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
3203 	      && compare_constant (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
3204 
3205     CASE_CONVERT:
3206     case VIEW_CONVERT_EXPR:
3207       return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
3208 
3209     default:
3210       return 0;
3211     }
3212 
3213   gcc_unreachable ();
3214 }
3215 
3216 /* Return the section into which constant EXP should be placed.  */
3217 
3218 static section *
3219 get_constant_section (tree exp, unsigned int align)
3220 {
3221   return targetm.asm_out.select_section (exp,
3222 					 compute_reloc_for_constant (exp),
3223 					 align);
3224 }
3225 
3226 /* Return the size of constant EXP in bytes.  */
3227 
3228 static HOST_WIDE_INT
3229 get_constant_size (tree exp)
3230 {
3231   HOST_WIDE_INT size;
3232 
3233   size = int_size_in_bytes (TREE_TYPE (exp));
3234   if (TREE_CODE (exp) == STRING_CST)
3235     size = MAX (TREE_STRING_LENGTH (exp), size);
3236   return size;
3237 }
3238 
3239 /* Subroutine of output_constant_def:
3240    No constant equal to EXP is known to have been output.
3241    Make a constant descriptor to enter EXP in the hash table.
3242    Assign the label number and construct RTL to refer to the
3243    constant's location in memory.
3244    Caller is responsible for updating the hash table.  */
3245 
3246 static struct constant_descriptor_tree *
3247 build_constant_desc (tree exp)
3248 {
3249   struct constant_descriptor_tree *desc;
3250   rtx symbol, rtl;
3251   char label[256];
3252   int labelno;
3253   tree decl;
3254 
3255   desc = ggc_alloc<constant_descriptor_tree> ();
3256   desc->value = exp;
3257 
3258   /* Create a string containing the label name, in LABEL.  */
3259   labelno = const_labelno++;
3260   ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
3261 
3262   /* Construct the VAR_DECL associated with the constant.  */
3263   decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (label),
3264 		     TREE_TYPE (exp));
3265   DECL_ARTIFICIAL (decl) = 1;
3266   DECL_IGNORED_P (decl) = 1;
3267   TREE_READONLY (decl) = 1;
3268   TREE_STATIC (decl) = 1;
3269   TREE_ADDRESSABLE (decl) = 1;
3270   /* We don't set the RTL yet as this would cause varpool to assume that the
3271      variable is referenced.  Moreover, it would just be dropped in LTO mode.
3272      Instead we set the flag that will be recognized in make_decl_rtl.  */
3273   DECL_IN_CONSTANT_POOL (decl) = 1;
3274   DECL_INITIAL (decl) = desc->value;
3275   /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most
3276      architectures so use DATA_ALIGNMENT as well, except for strings.  */
3277   if (TREE_CODE (exp) == STRING_CST)
3278     {
3279       SET_DECL_ALIGN (decl, CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl)));
3280     }
3281   else
3282     align_variable (decl, 0);
3283 
3284   /* Now construct the SYMBOL_REF and the MEM.  */
3285   if (use_object_blocks_p ())
3286     {
3287       int align = (TREE_CODE (decl) == CONST_DECL
3288 		   || (VAR_P (decl) && DECL_IN_CONSTANT_POOL (decl))
3289 		   ? DECL_ALIGN (decl)
3290 		   : symtab_node::get (decl)->definition_alignment ());
3291       section *sect = get_constant_section (exp, align);
3292       symbol = create_block_symbol (ggc_strdup (label),
3293 				    get_block_for_section (sect), -1);
3294     }
3295   else
3296     symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3297   SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
3298   SET_SYMBOL_REF_DECL (symbol, decl);
3299   TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3300 
3301   rtl = gen_const_mem (TYPE_MODE (TREE_TYPE (exp)), symbol);
3302   set_mem_attributes (rtl, exp, 1);
3303   set_mem_alias_set (rtl, 0);
3304 
3305   /* Putting EXP into the literal pool might have imposed a different
3306      alignment which should be visible in the RTX as well.  */
3307   set_mem_align (rtl, DECL_ALIGN (decl));
3308 
3309   /* We cannot share RTX'es in pool entries.
3310      Mark this piece of RTL as required for unsharing.  */
3311   RTX_FLAG (rtl, used) = 1;
3312 
3313   /* Set flags or add text to the name to record information, such as
3314      that it is a local symbol.  If the name is changed, the macro
3315      ASM_OUTPUT_LABELREF will have to know how to strip this
3316      information.  This call might invalidate our local variable
3317      SYMBOL; we can't use it afterward.  */
3318   targetm.encode_section_info (exp, rtl, true);
3319 
3320   desc->rtl = rtl;
3321 
3322   return desc;
3323 }
3324 
3325 /* Return an rtx representing a reference to constant data in memory
3326    for the constant expression EXP.
3327 
3328    If assembler code for such a constant has already been output,
3329    return an rtx to refer to it.
3330    Otherwise, output such a constant in memory
3331    and generate an rtx for it.
3332 
3333    If DEFER is nonzero, this constant can be deferred and output only
3334    if referenced in the function after all optimizations.
3335 
3336    `const_desc_table' records which constants already have label strings.  */
3337 
3338 rtx
3339 output_constant_def (tree exp, int defer)
3340 {
3341   struct constant_descriptor_tree *desc;
3342   struct constant_descriptor_tree key;
3343 
3344   /* Look up EXP in the table of constant descriptors.  If we didn't find
3345      it, create a new one.  */
3346   key.value = exp;
3347   key.hash = const_hash_1 (exp);
3348   constant_descriptor_tree **loc
3349     = const_desc_htab->find_slot_with_hash (&key, key.hash, INSERT);
3350 
3351   desc = *loc;
3352   if (desc == 0)
3353     {
3354       desc = build_constant_desc (exp);
3355       desc->hash = key.hash;
3356       *loc = desc;
3357     }
3358 
3359   maybe_output_constant_def_contents (desc, defer);
3360   return desc->rtl;
3361 }
3362 
3363 /* Subroutine of output_constant_def: Decide whether or not we need to
3364    output the constant DESC now, and if so, do it.  */
3365 static void
3366 maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
3367 				    int defer)
3368 {
3369   rtx symbol = XEXP (desc->rtl, 0);
3370   tree exp = desc->value;
3371 
3372   if (flag_syntax_only)
3373     return;
3374 
3375   if (TREE_ASM_WRITTEN (exp))
3376     /* Already output; don't do it again.  */
3377     return;
3378 
3379   /* We can always defer constants as long as the context allows
3380      doing so.  */
3381   if (defer)
3382     {
3383       /* Increment n_deferred_constants if it exists.  It needs to be at
3384 	 least as large as the number of constants actually referred to
3385 	 by the function.  If it's too small we'll stop looking too early
3386 	 and fail to emit constants; if it's too large we'll only look
3387 	 through the entire function when we could have stopped earlier.  */
3388       if (cfun)
3389 	n_deferred_constants++;
3390       return;
3391     }
3392 
3393   output_constant_def_contents (symbol);
3394 }
3395 
3396 /* Subroutine of output_constant_def_contents.  Output the definition
3397    of constant EXP, which is pointed to by label LABEL.  ALIGN is the
3398    constant's alignment in bits.  */
3399 
3400 static void
3401 assemble_constant_contents (tree exp, const char *label, unsigned int align)
3402 {
3403   HOST_WIDE_INT size;
3404 
3405   size = get_constant_size (exp);
3406 
3407   /* Do any machine/system dependent processing of the constant.  */
3408   targetm.asm_out.declare_constant_name (asm_out_file, label, exp, size);
3409 
3410   /* Output the value of EXP.  */
3411   output_constant (exp, size, align, false);
3412 
3413   targetm.asm_out.decl_end ();
3414 }
3415 
3416 /* We must output the constant data referred to by SYMBOL; do so.  */
3417 
3418 static void
3419 output_constant_def_contents (rtx symbol)
3420 {
3421   tree decl = SYMBOL_REF_DECL (symbol);
3422   tree exp = DECL_INITIAL (decl);
3423   bool asan_protected = false;
3424 
3425   /* Make sure any other constants whose addresses appear in EXP
3426      are assigned label numbers.  */
3427   output_addressed_constants (exp);
3428 
3429   /* We are no longer deferring this constant.  */
3430   TREE_ASM_WRITTEN (decl) = TREE_ASM_WRITTEN (exp) = 1;
3431 
3432   if ((flag_sanitize & SANITIZE_ADDRESS)
3433       && TREE_CODE (exp) == STRING_CST
3434       && asan_protect_global (exp))
3435     {
3436       asan_protected = true;
3437       SET_DECL_ALIGN (decl, MAX (DECL_ALIGN (decl),
3438 				 ASAN_RED_ZONE_SIZE * BITS_PER_UNIT));
3439     }
3440 
3441   /* If the constant is part of an object block, make sure that the
3442      decl has been positioned within its block, but do not write out
3443      its definition yet.  output_object_blocks will do that later.  */
3444   if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol))
3445     place_block_symbol (symbol);
3446   else
3447     {
3448       int align = (TREE_CODE (decl) == CONST_DECL
3449 		   || (VAR_P (decl) && DECL_IN_CONSTANT_POOL (decl))
3450 		   ? DECL_ALIGN (decl)
3451 		   : symtab_node::get (decl)->definition_alignment ());
3452       switch_to_section (get_constant_section (exp, align));
3453       if (align > BITS_PER_UNIT)
3454 	ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
3455       assemble_constant_contents (exp, XSTR (symbol, 0), align);
3456       if (asan_protected)
3457 	{
3458 	  HOST_WIDE_INT size = get_constant_size (exp);
3459 	  assemble_zeros (asan_red_zone_size (size));
3460 	}
3461     }
3462 }
3463 
3464 /* Look up EXP in the table of constant descriptors.  Return the rtl
3465    if it has been emitted, else null.  */
3466 
3467 rtx
3468 lookup_constant_def (tree exp)
3469 {
3470   struct constant_descriptor_tree key;
3471 
3472   key.value = exp;
3473   key.hash = const_hash_1 (exp);
3474   constant_descriptor_tree *desc
3475     = const_desc_htab->find_with_hash (&key, key.hash);
3476 
3477   return (desc ? desc->rtl : NULL_RTX);
3478 }
3479 
3480 /* Return a tree representing a reference to constant data in memory
3481    for the constant expression EXP.
3482 
3483    This is the counterpart of output_constant_def at the Tree level.  */
3484 
3485 tree
3486 tree_output_constant_def (tree exp)
3487 {
3488   struct constant_descriptor_tree *desc, key;
3489   tree decl;
3490 
3491   /* Look up EXP in the table of constant descriptors.  If we didn't find
3492      it, create a new one.  */
3493   key.value = exp;
3494   key.hash = const_hash_1 (exp);
3495   constant_descriptor_tree **loc
3496     = const_desc_htab->find_slot_with_hash (&key, key.hash, INSERT);
3497 
3498   desc = *loc;
3499   if (desc == 0)
3500     {
3501       desc = build_constant_desc (exp);
3502       desc->hash = key.hash;
3503       *loc = desc;
3504     }
3505 
3506   decl = SYMBOL_REF_DECL (XEXP (desc->rtl, 0));
3507   varpool_node::finalize_decl (decl);
3508   return decl;
3509 }
3510 
3511 struct GTY((chain_next ("%h.next"), for_user)) constant_descriptor_rtx {
3512   struct constant_descriptor_rtx *next;
3513   rtx mem;
3514   rtx sym;
3515   rtx constant;
3516   HOST_WIDE_INT offset;
3517   hashval_t hash;
3518   machine_mode mode;
3519   unsigned int align;
3520   int labelno;
3521   int mark;
3522 };
3523 
3524 struct const_rtx_desc_hasher : ggc_ptr_hash<constant_descriptor_rtx>
3525 {
3526   static hashval_t hash (constant_descriptor_rtx *);
3527   static bool equal (constant_descriptor_rtx *, constant_descriptor_rtx *);
3528 };
3529 
3530 /* Used in the hash tables to avoid outputting the same constant
3531    twice.  Unlike 'struct constant_descriptor_tree', RTX constants
3532    are output once per function, not once per file.  */
3533 /* ??? Only a few targets need per-function constant pools.  Most
3534    can use one per-file pool.  Should add a targetm bit to tell the
3535    difference.  */
3536 
3537 struct GTY(()) rtx_constant_pool {
3538   /* Pointers to first and last constant in pool, as ordered by offset.  */
3539   struct constant_descriptor_rtx *first;
3540   struct constant_descriptor_rtx *last;
3541 
3542   /* Hash facility for making memory-constants from constant rtl-expressions.
3543      It is used on RISC machines where immediate integer arguments and
3544      constant addresses are restricted so that such constants must be stored
3545      in memory.  */
3546   hash_table<const_rtx_desc_hasher> *const_rtx_htab;
3547 
3548   /* Current offset in constant pool (does not include any
3549      machine-specific header).  */
3550   HOST_WIDE_INT offset;
3551 };
3552 
3553 /* Hash and compare functions for const_rtx_htab.  */
3554 
3555 hashval_t
3556 const_rtx_desc_hasher::hash (constant_descriptor_rtx *desc)
3557 {
3558   return desc->hash;
3559 }
3560 
3561 bool
3562 const_rtx_desc_hasher::equal (constant_descriptor_rtx *x,
3563 			      constant_descriptor_rtx *y)
3564 {
3565   if (x->mode != y->mode)
3566     return 0;
3567   return rtx_equal_p (x->constant, y->constant);
3568 }
3569 
3570 /* Hash one component of a constant.  */
3571 
3572 static hashval_t
3573 const_rtx_hash_1 (const_rtx x)
3574 {
3575   unsigned HOST_WIDE_INT hwi;
3576   machine_mode mode;
3577   enum rtx_code code;
3578   hashval_t h;
3579   int i;
3580 
3581   code = GET_CODE (x);
3582   mode = GET_MODE (x);
3583   h = (hashval_t) code * 1048573 + mode;
3584 
3585   switch (code)
3586     {
3587     case CONST_INT:
3588       hwi = INTVAL (x);
3589 
3590     fold_hwi:
3591       {
3592 	int shift = sizeof (hashval_t) * CHAR_BIT;
3593 	const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
3594 
3595 	h ^= (hashval_t) hwi;
3596 	for (i = 1; i < n; ++i)
3597 	  {
3598 	    hwi >>= shift;
3599 	    h ^= (hashval_t) hwi;
3600 	  }
3601       }
3602       break;
3603 
3604     case CONST_WIDE_INT:
3605       hwi = GET_MODE_PRECISION (mode);
3606       {
3607 	for (i = 0; i < CONST_WIDE_INT_NUNITS (x); i++)
3608 	  hwi ^= CONST_WIDE_INT_ELT (x, i);
3609 	goto fold_hwi;
3610       }
3611 
3612     case CONST_DOUBLE:
3613       if (TARGET_SUPPORTS_WIDE_INT == 0 && mode == VOIDmode)
3614 	{
3615 	  hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
3616 	  goto fold_hwi;
3617 	}
3618       else
3619 	h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
3620       break;
3621 
3622     case CONST_FIXED:
3623       h ^= fixed_hash (CONST_FIXED_VALUE (x));
3624       break;
3625 
3626     case SYMBOL_REF:
3627       h ^= htab_hash_string (XSTR (x, 0));
3628       break;
3629 
3630     case LABEL_REF:
3631       h = h * 251 + CODE_LABEL_NUMBER (label_ref_label (x));
3632       break;
3633 
3634     case UNSPEC:
3635     case UNSPEC_VOLATILE:
3636       h = h * 251 + XINT (x, 1);
3637       break;
3638 
3639     default:
3640       break;
3641     }
3642 
3643   return h;
3644 }
3645 
3646 /* Compute a hash value for X, which should be a constant.  */
3647 
3648 static hashval_t
3649 const_rtx_hash (rtx x)
3650 {
3651   hashval_t h = 0;
3652   subrtx_iterator::array_type array;
3653   FOR_EACH_SUBRTX (iter, array, x, ALL)
3654     h = h * 509 + const_rtx_hash_1 (*iter);
3655   return h;
3656 }
3657 
3658 
3659 /* Create and return a new rtx constant pool.  */
3660 
3661 static struct rtx_constant_pool *
3662 create_constant_pool (void)
3663 {
3664   struct rtx_constant_pool *pool;
3665 
3666   pool = ggc_alloc<rtx_constant_pool> ();
3667   pool->const_rtx_htab = hash_table<const_rtx_desc_hasher>::create_ggc (31);
3668   pool->first = NULL;
3669   pool->last = NULL;
3670   pool->offset = 0;
3671   return pool;
3672 }
3673 
3674 /* Initialize constant pool hashing for a new function.  */
3675 
3676 void
3677 init_varasm_status (void)
3678 {
3679   crtl->varasm.pool = create_constant_pool ();
3680   crtl->varasm.deferred_constants = 0;
3681 }
3682 
3683 /* Given a MINUS expression, simplify it if both sides
3684    include the same symbol.  */
3685 
3686 rtx
3687 simplify_subtraction (rtx x)
3688 {
3689   rtx r = simplify_rtx (x);
3690   return r ? r : x;
3691 }
3692 
3693 /* Given a constant rtx X, make (or find) a memory constant for its value
3694    and return a MEM rtx to refer to it in memory.  */
3695 
3696 rtx
3697 force_const_mem (machine_mode mode, rtx x)
3698 {
3699   struct constant_descriptor_rtx *desc, tmp;
3700   struct rtx_constant_pool *pool;
3701   char label[256];
3702   rtx def, symbol;
3703   hashval_t hash;
3704   unsigned int align;
3705   constant_descriptor_rtx **slot;
3706 
3707   /* If we're not allowed to drop X into the constant pool, don't.  */
3708   if (targetm.cannot_force_const_mem (mode, x))
3709     return NULL_RTX;
3710 
3711   /* Record that this function has used a constant pool entry.  */
3712   crtl->uses_const_pool = 1;
3713 
3714   /* Decide which pool to use.  */
3715   pool = (targetm.use_blocks_for_constant_p (mode, x)
3716 	  ? shared_constant_pool
3717 	  : crtl->varasm.pool);
3718 
3719   /* Lookup the value in the hashtable.  */
3720   tmp.constant = x;
3721   tmp.mode = mode;
3722   hash = const_rtx_hash (x);
3723   slot = pool->const_rtx_htab->find_slot_with_hash (&tmp, hash, INSERT);
3724   desc = *slot;
3725 
3726   /* If the constant was already present, return its memory.  */
3727   if (desc)
3728     return copy_rtx (desc->mem);
3729 
3730   /* Otherwise, create a new descriptor.  */
3731   desc = ggc_alloc<constant_descriptor_rtx> ();
3732   *slot = desc;
3733 
3734   /* Align the location counter as required by EXP's data type.  */
3735   align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
3736 
3737   tree type = lang_hooks.types.type_for_mode (mode, 0);
3738   if (type != NULL_TREE)
3739     align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
3740 
3741   pool->offset += (align / BITS_PER_UNIT) - 1;
3742   pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3743 
3744   desc->next = NULL;
3745   desc->constant = copy_rtx (tmp.constant);
3746   desc->offset = pool->offset;
3747   desc->hash = hash;
3748   desc->mode = mode;
3749   desc->align = align;
3750   desc->labelno = const_labelno;
3751   desc->mark = 0;
3752 
3753   pool->offset += GET_MODE_SIZE (mode);
3754   if (pool->last)
3755     pool->last->next = desc;
3756   else
3757     pool->first = pool->last = desc;
3758   pool->last = desc;
3759 
3760   /* Create a string containing the label name, in LABEL.  */
3761   ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3762   ++const_labelno;
3763 
3764   /* Construct the SYMBOL_REF.  Make sure to mark it as belonging to
3765      the constants pool.  */
3766   if (use_object_blocks_p () && targetm.use_blocks_for_constant_p (mode, x))
3767     {
3768       section *sect = targetm.asm_out.select_rtx_section (mode, x, align);
3769       symbol = create_block_symbol (ggc_strdup (label),
3770 				    get_block_for_section (sect), -1);
3771     }
3772   else
3773     symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3774   desc->sym = symbol;
3775   SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL;
3776   CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3777   SET_SYMBOL_REF_CONSTANT (symbol, desc);
3778 
3779   /* Construct the MEM.  */
3780   desc->mem = def = gen_const_mem (mode, symbol);
3781   set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
3782   set_mem_align (def, align);
3783 
3784   /* If we're dropping a label to the constant pool, make sure we
3785      don't delete it.  */
3786   if (GET_CODE (x) == LABEL_REF)
3787     LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3788 
3789   return copy_rtx (def);
3790 }
3791 
3792 /* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
3793 
3794 rtx
3795 get_pool_constant (const_rtx addr)
3796 {
3797   return SYMBOL_REF_CONSTANT (addr)->constant;
3798 }
3799 
3800 /* Given a constant pool SYMBOL_REF, return the corresponding constant
3801    and whether it has been output or not.  */
3802 
3803 rtx
3804 get_pool_constant_mark (rtx addr, bool *pmarked)
3805 {
3806   struct constant_descriptor_rtx *desc;
3807 
3808   desc = SYMBOL_REF_CONSTANT (addr);
3809   *pmarked = (desc->mark != 0);
3810   return desc->constant;
3811 }
3812 
3813 /* Similar, return the mode.  */
3814 
3815 machine_mode
3816 get_pool_mode (const_rtx addr)
3817 {
3818   return SYMBOL_REF_CONSTANT (addr)->mode;
3819 }
3820 
3821 /* Return TRUE if and only if the constant pool has no entries.  Note
3822    that even entries we might end up choosing not to emit are counted
3823    here, so there is the potential for missed optimizations.  */
3824 
3825 bool
3826 constant_pool_empty_p (void)
3827 {
3828   return crtl->varasm.pool->first == NULL;
3829 }
3830 
3831 /* Worker function for output_constant_pool_1.  Emit assembly for X
3832    in MODE with known alignment ALIGN.  */
3833 
3834 static void
3835 output_constant_pool_2 (machine_mode mode, rtx x, unsigned int align)
3836 {
3837   switch (GET_MODE_CLASS (mode))
3838     {
3839     case MODE_FLOAT:
3840     case MODE_DECIMAL_FLOAT:
3841       {
3842 	gcc_assert (CONST_DOUBLE_AS_FLOAT_P (x));
3843 	assemble_real (*CONST_DOUBLE_REAL_VALUE (x), mode, align, false);
3844 	break;
3845       }
3846 
3847     case MODE_INT:
3848     case MODE_PARTIAL_INT:
3849     case MODE_FRACT:
3850     case MODE_UFRACT:
3851     case MODE_ACCUM:
3852     case MODE_UACCUM:
3853     case MODE_POINTER_BOUNDS:
3854       assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3855       break;
3856 
3857     case MODE_VECTOR_FLOAT:
3858     case MODE_VECTOR_INT:
3859     case MODE_VECTOR_FRACT:
3860     case MODE_VECTOR_UFRACT:
3861     case MODE_VECTOR_ACCUM:
3862     case MODE_VECTOR_UACCUM:
3863       {
3864 	int i, units;
3865         machine_mode submode = GET_MODE_INNER (mode);
3866 	unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
3867 
3868 	gcc_assert (GET_CODE (x) == CONST_VECTOR);
3869 	units = CONST_VECTOR_NUNITS (x);
3870 
3871 	for (i = 0; i < units; i++)
3872 	  {
3873 	    rtx elt = CONST_VECTOR_ELT (x, i);
3874 	    output_constant_pool_2 (submode, elt, i ? subalign : align);
3875 	  }
3876       }
3877       break;
3878 
3879     default:
3880       gcc_unreachable ();
3881     }
3882 }
3883 
3884 /* Worker function for output_constant_pool.  Emit constant DESC,
3885    giving it ALIGN bits of alignment.  */
3886 
3887 static void
3888 output_constant_pool_1 (struct constant_descriptor_rtx *desc,
3889 			unsigned int align)
3890 {
3891   rtx x, tmp;
3892 
3893   x = desc->constant;
3894 
3895   /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3896      whose CODE_LABEL has been deleted.  This can occur if a jump table
3897      is eliminated by optimization.  If so, write a constant of zero
3898      instead.  Note that this can also happen by turning the
3899      CODE_LABEL into a NOTE.  */
3900   /* ??? This seems completely and utterly wrong.  Certainly it's
3901      not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3902      functioning even with rtx_insn::deleted and friends.  */
3903 
3904   tmp = x;
3905   switch (GET_CODE (tmp))
3906     {
3907     case CONST:
3908       if (GET_CODE (XEXP (tmp, 0)) != PLUS
3909 	  || GET_CODE (XEXP (XEXP (tmp, 0), 0)) != LABEL_REF)
3910 	break;
3911       tmp = XEXP (XEXP (tmp, 0), 0);
3912       /* FALLTHRU  */
3913 
3914     case LABEL_REF:
3915       {
3916 	rtx_insn *insn = label_ref_label (tmp);
3917 	gcc_assert (!insn->deleted ());
3918 	gcc_assert (!NOTE_P (insn)
3919 		    || NOTE_KIND (insn) != NOTE_INSN_DELETED);
3920 	break;
3921       }
3922 
3923     default:
3924       break;
3925     }
3926 
3927 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3928   ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3929 				 align, desc->labelno, done);
3930 #endif
3931 
3932   assemble_align (align);
3933 
3934   /* Output the label.  */
3935   targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
3936 
3937   /* Output the data.
3938      Pass actual alignment value while emitting string constant to asm code
3939      as function 'output_constant_pool_1' explicitly passes the alignment as 1
3940      assuming that the data is already aligned which prevents the generation
3941      of fix-up table entries.  */
3942   output_constant_pool_2 (desc->mode, x, desc->align);
3943 
3944   /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3945      sections have proper size.  */
3946   if (align > GET_MODE_BITSIZE (desc->mode)
3947       && in_section
3948       && (in_section->common.flags & SECTION_MERGE))
3949     assemble_align (align);
3950 
3951 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3952  done:
3953 #endif
3954   return;
3955 }
3956 
3957 /* Recompute the offsets of entries in POOL, and the overall size of
3958    POOL.  Do this after calling mark_constant_pool to ensure that we
3959    are computing the offset values for the pool which we will actually
3960    emit.  */
3961 
3962 static void
3963 recompute_pool_offsets (struct rtx_constant_pool *pool)
3964 {
3965   struct constant_descriptor_rtx *desc;
3966   pool->offset = 0;
3967 
3968   for (desc = pool->first; desc ; desc = desc->next)
3969     if (desc->mark)
3970       {
3971 	  /* Recalculate offset.  */
3972 	unsigned int align = desc->align;
3973 	pool->offset += (align / BITS_PER_UNIT) - 1;
3974 	pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3975 	desc->offset = pool->offset;
3976 	pool->offset += GET_MODE_SIZE (desc->mode);
3977       }
3978 }
3979 
3980 /* Mark all constants that are referenced by SYMBOL_REFs in X.
3981    Emit referenced deferred strings.  */
3982 
3983 static void
3984 mark_constants_in_pattern (rtx insn)
3985 {
3986   subrtx_iterator::array_type array;
3987   FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
3988     {
3989       const_rtx x = *iter;
3990       if (GET_CODE (x) == SYMBOL_REF)
3991 	{
3992 	  if (CONSTANT_POOL_ADDRESS_P (x))
3993 	    {
3994 	      struct constant_descriptor_rtx *desc = SYMBOL_REF_CONSTANT (x);
3995 	      if (desc->mark == 0)
3996 		{
3997 		  desc->mark = 1;
3998 		  iter.substitute (desc->constant);
3999 		}
4000 	    }
4001 	  else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
4002 	    {
4003 	      tree decl = SYMBOL_REF_DECL (x);
4004 	      if (!TREE_ASM_WRITTEN (DECL_INITIAL (decl)))
4005 		{
4006 		  n_deferred_constants--;
4007 		  output_constant_def_contents (CONST_CAST_RTX (x));
4008 		}
4009 	    }
4010 	}
4011     }
4012 }
4013 
4014 /* Look through appropriate parts of INSN, marking all entries in the
4015    constant pool which are actually being used.  Entries that are only
4016    referenced by other constants are also marked as used.  Emit
4017    deferred strings that are used.  */
4018 
4019 static void
4020 mark_constants (rtx_insn *insn)
4021 {
4022   if (!INSN_P (insn))
4023     return;
4024 
4025   /* Insns may appear inside a SEQUENCE.  Only check the patterns of
4026      insns, not any notes that may be attached.  We don't want to mark
4027      a constant just because it happens to appear in a REG_EQUIV note.  */
4028   if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (PATTERN (insn)))
4029     {
4030       int i, n = seq->len ();
4031       for (i = 0; i < n; ++i)
4032 	{
4033 	  rtx subinsn = seq->element (i);
4034 	  if (INSN_P (subinsn))
4035 	    mark_constants_in_pattern (subinsn);
4036 	}
4037     }
4038   else
4039     mark_constants_in_pattern (insn);
4040 }
4041 
4042 /* Look through the instructions for this function, and mark all the
4043    entries in POOL which are actually being used.  Emit deferred constants
4044    which have indeed been used.  */
4045 
4046 static void
4047 mark_constant_pool (void)
4048 {
4049   rtx_insn *insn;
4050 
4051   if (!crtl->uses_const_pool && n_deferred_constants == 0)
4052     return;
4053 
4054   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4055     mark_constants (insn);
4056 }
4057 
4058 /* Write all the constants in POOL.  */
4059 
4060 static void
4061 output_constant_pool_contents (struct rtx_constant_pool *pool)
4062 {
4063   struct constant_descriptor_rtx *desc;
4064 
4065   for (desc = pool->first; desc ; desc = desc->next)
4066     if (desc->mark)
4067       {
4068 	/* If the constant is part of an object_block, make sure that
4069 	   the constant has been positioned within its block, but do not
4070 	   write out its definition yet.  output_object_blocks will do
4071 	   that later.  */
4072 	if (SYMBOL_REF_HAS_BLOCK_INFO_P (desc->sym)
4073 	    && SYMBOL_REF_BLOCK (desc->sym))
4074 	  place_block_symbol (desc->sym);
4075 	else
4076 	  {
4077 	    switch_to_section (targetm.asm_out.select_rtx_section
4078 			       (desc->mode, desc->constant, desc->align));
4079 	    output_constant_pool_1 (desc, desc->align);
4080 	  }
4081       }
4082 }
4083 
4084 /* Mark all constants that are used in the current function, then write
4085    out the function's private constant pool.  */
4086 
4087 static void
4088 output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
4089 		      tree fndecl ATTRIBUTE_UNUSED)
4090 {
4091   struct rtx_constant_pool *pool = crtl->varasm.pool;
4092 
4093   /* It is possible for gcc to call force_const_mem and then to later
4094      discard the instructions which refer to the constant.  In such a
4095      case we do not need to output the constant.  */
4096   mark_constant_pool ();
4097 
4098   /* Having marked the constant pool entries we'll actually emit, we
4099      now need to rebuild the offset information, which may have become
4100      stale.  */
4101   recompute_pool_offsets (pool);
4102 
4103 #ifdef ASM_OUTPUT_POOL_PROLOGUE
4104   ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
4105 #endif
4106 
4107   output_constant_pool_contents (pool);
4108 
4109 #ifdef ASM_OUTPUT_POOL_EPILOGUE
4110   ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
4111 #endif
4112 }
4113 
4114 /* Write the contents of the shared constant pool.  */
4115 
4116 void
4117 output_shared_constant_pool (void)
4118 {
4119   output_constant_pool_contents (shared_constant_pool);
4120 }
4121 
4122 /* Determine what kind of relocations EXP may need.  */
4123 
4124 int
4125 compute_reloc_for_constant (tree exp)
4126 {
4127   int reloc = 0, reloc2;
4128   tree tem;
4129 
4130   switch (TREE_CODE (exp))
4131     {
4132     case ADDR_EXPR:
4133     case FDESC_EXPR:
4134       /* Go inside any operations that get_inner_reference can handle and see
4135 	 if what's inside is a constant: no need to do anything here for
4136 	 addresses of variables or functions.  */
4137       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
4138 	   tem = TREE_OPERAND (tem, 0))
4139 	;
4140 
4141       if (TREE_CODE (tem) == MEM_REF
4142 	  && TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR)
4143 	{
4144 	  reloc = compute_reloc_for_constant (TREE_OPERAND (tem, 0));
4145 	  break;
4146 	}
4147 
4148       if (!targetm.binds_local_p (tem))
4149 	reloc |= 2;
4150       else
4151 	reloc |= 1;
4152       break;
4153 
4154     case PLUS_EXPR:
4155     case POINTER_PLUS_EXPR:
4156       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
4157       reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
4158       break;
4159 
4160     case MINUS_EXPR:
4161       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
4162       reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
4163       /* The difference of two local labels is computable at link time.  */
4164       if (reloc == 1 && reloc2 == 1)
4165 	reloc = 0;
4166       else
4167 	reloc |= reloc2;
4168       break;
4169 
4170     CASE_CONVERT:
4171     case VIEW_CONVERT_EXPR:
4172       reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
4173       break;
4174 
4175     case CONSTRUCTOR:
4176       {
4177 	unsigned HOST_WIDE_INT idx;
4178 	FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
4179 	  if (tem != 0)
4180 	    reloc |= compute_reloc_for_constant (tem);
4181       }
4182       break;
4183 
4184     default:
4185       break;
4186     }
4187   return reloc;
4188 }
4189 
4190 /* Find all the constants whose addresses are referenced inside of EXP,
4191    and make sure assembler code with a label has been output for each one.
4192    Indicate whether an ADDR_EXPR has been encountered.  */
4193 
4194 static void
4195 output_addressed_constants (tree exp)
4196 {
4197   tree tem;
4198 
4199   switch (TREE_CODE (exp))
4200     {
4201     case ADDR_EXPR:
4202     case FDESC_EXPR:
4203       /* Go inside any operations that get_inner_reference can handle and see
4204 	 if what's inside is a constant: no need to do anything here for
4205 	 addresses of variables or functions.  */
4206       for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
4207 	   tem = TREE_OPERAND (tem, 0))
4208 	;
4209 
4210       /* If we have an initialized CONST_DECL, retrieve the initializer.  */
4211       if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem))
4212 	tem = DECL_INITIAL (tem);
4213 
4214       if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
4215 	output_constant_def (tem, 0);
4216 
4217       if (TREE_CODE (tem) == MEM_REF)
4218 	output_addressed_constants (TREE_OPERAND (tem, 0));
4219       break;
4220 
4221     case PLUS_EXPR:
4222     case POINTER_PLUS_EXPR:
4223     case MINUS_EXPR:
4224       output_addressed_constants (TREE_OPERAND (exp, 1));
4225       gcc_fallthrough ();
4226 
4227     CASE_CONVERT:
4228     case VIEW_CONVERT_EXPR:
4229       output_addressed_constants (TREE_OPERAND (exp, 0));
4230       break;
4231 
4232     case CONSTRUCTOR:
4233       {
4234 	unsigned HOST_WIDE_INT idx;
4235 	FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
4236 	  if (tem != 0)
4237 	    output_addressed_constants (tem);
4238       }
4239       break;
4240 
4241     default:
4242       break;
4243     }
4244 }
4245 
4246 /* Whether a constructor CTOR is a valid static constant initializer if all
4247    its elements are.  This used to be internal to initializer_constant_valid_p
4248    and has been exposed to let other functions like categorize_ctor_elements
4249    evaluate the property while walking a constructor for other purposes.  */
4250 
4251 bool
4252 constructor_static_from_elts_p (const_tree ctor)
4253 {
4254   return (TREE_CONSTANT (ctor)
4255 	  && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE
4256 	      || TREE_CODE (TREE_TYPE (ctor)) == RECORD_TYPE
4257 	      || TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE));
4258 }
4259 
4260 static tree initializer_constant_valid_p_1 (tree value, tree endtype,
4261 					    tree *cache);
4262 
4263 /* A subroutine of initializer_constant_valid_p.  VALUE is a MINUS_EXPR,
4264    PLUS_EXPR or POINTER_PLUS_EXPR.  This looks for cases of VALUE
4265    which are valid when ENDTYPE is an integer of any size; in
4266    particular, this does not accept a pointer minus a constant.  This
4267    returns null_pointer_node if the VALUE is an absolute constant
4268    which can be used to initialize a static variable.  Otherwise it
4269    returns NULL.  */
4270 
4271 static tree
4272 narrowing_initializer_constant_valid_p (tree value, tree endtype, tree *cache)
4273 {
4274   tree op0, op1;
4275 
4276   if (!INTEGRAL_TYPE_P (endtype))
4277     return NULL_TREE;
4278 
4279   op0 = TREE_OPERAND (value, 0);
4280   op1 = TREE_OPERAND (value, 1);
4281 
4282   /* Like STRIP_NOPS except allow the operand mode to widen.  This
4283      works around a feature of fold that simplifies (int)(p1 - p2) to
4284      ((int)p1 - (int)p2) under the theory that the narrower operation
4285      is cheaper.  */
4286 
4287   while (CONVERT_EXPR_P (op0)
4288 	 || TREE_CODE (op0) == NON_LVALUE_EXPR)
4289     {
4290       tree inner = TREE_OPERAND (op0, 0);
4291       if (inner == error_mark_node
4292 	  || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4293 	  || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
4294 	      > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4295 	break;
4296       op0 = inner;
4297     }
4298 
4299   while (CONVERT_EXPR_P (op1)
4300 	 || TREE_CODE (op1) == NON_LVALUE_EXPR)
4301     {
4302       tree inner = TREE_OPERAND (op1, 0);
4303       if (inner == error_mark_node
4304 	  || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4305 	  || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
4306 	      > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
4307 	break;
4308       op1 = inner;
4309     }
4310 
4311   op0 = initializer_constant_valid_p_1 (op0, endtype, cache);
4312   if (!op0)
4313     return NULL_TREE;
4314 
4315   op1 = initializer_constant_valid_p_1 (op1, endtype,
4316 					cache ? cache + 2 : NULL);
4317   /* Both initializers must be known.  */
4318   if (op1)
4319     {
4320       if (op0 == op1
4321 	  && (op0 == null_pointer_node
4322 	      || TREE_CODE (value) == MINUS_EXPR))
4323 	return null_pointer_node;
4324 
4325       /* Support differences between labels.  */
4326       if (TREE_CODE (op0) == LABEL_DECL
4327 	  && TREE_CODE (op1) == LABEL_DECL)
4328 	return null_pointer_node;
4329 
4330       if (TREE_CODE (op0) == STRING_CST
4331 	  && TREE_CODE (op1) == STRING_CST
4332 	  && operand_equal_p (op0, op1, 1))
4333 	return null_pointer_node;
4334     }
4335 
4336   return NULL_TREE;
4337 }
4338 
4339 /* Helper function of initializer_constant_valid_p.
4340    Return nonzero if VALUE is a valid constant-valued expression
4341    for use in initializing a static variable; one that can be an
4342    element of a "constant" initializer.
4343 
4344    Return null_pointer_node if the value is absolute;
4345    if it is relocatable, return the variable that determines the relocation.
4346    We assume that VALUE has been folded as much as possible;
4347    therefore, we do not need to check for such things as
4348    arithmetic-combinations of integers.
4349 
4350    Use CACHE (pointer to 2 tree values) for caching if non-NULL.  */
4351 
4352 static tree
4353 initializer_constant_valid_p_1 (tree value, tree endtype, tree *cache)
4354 {
4355   tree ret;
4356 
4357   switch (TREE_CODE (value))
4358     {
4359     case CONSTRUCTOR:
4360       if (constructor_static_from_elts_p (value))
4361 	{
4362 	  unsigned HOST_WIDE_INT idx;
4363 	  tree elt;
4364 	  bool absolute = true;
4365 
4366 	  if (cache && cache[0] == value)
4367 	    return cache[1];
4368 	  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
4369 	    {
4370 	      tree reloc;
4371 	      reloc = initializer_constant_valid_p_1 (elt, TREE_TYPE (elt),
4372 						      NULL);
4373 	      if (!reloc
4374 		  /* An absolute value is required with reverse SSO.  */
4375 		  || (reloc != null_pointer_node
4376 		      && TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (value))
4377 		      && !AGGREGATE_TYPE_P (TREE_TYPE (elt))))
4378 		{
4379 		  if (cache)
4380 		    {
4381 		      cache[0] = value;
4382 		      cache[1] = NULL_TREE;
4383 		    }
4384 		  return NULL_TREE;
4385 		}
4386 	      if (reloc != null_pointer_node)
4387 		absolute = false;
4388 	    }
4389 	  /* For a non-absolute relocation, there is no single
4390 	     variable that can be "the variable that determines the
4391 	     relocation."  */
4392 	  if (cache)
4393 	    {
4394 	      cache[0] = value;
4395 	      cache[1] = absolute ? null_pointer_node : error_mark_node;
4396 	    }
4397 	  return absolute ? null_pointer_node : error_mark_node;
4398 	}
4399 
4400       return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
4401 
4402     case INTEGER_CST:
4403     case VECTOR_CST:
4404     case REAL_CST:
4405     case FIXED_CST:
4406     case STRING_CST:
4407     case COMPLEX_CST:
4408       return null_pointer_node;
4409 
4410     case ADDR_EXPR:
4411     case FDESC_EXPR:
4412       {
4413 	tree op0 = staticp (TREE_OPERAND (value, 0));
4414 	if (op0)
4415 	  {
4416 	    /* "&(*a).f" is like unto pointer arithmetic.  If "a" turns out
4417 	       to be a constant, this is old-skool offsetof-like nonsense.  */
4418 	    if (TREE_CODE (op0) == INDIRECT_REF
4419 		&& TREE_CONSTANT (TREE_OPERAND (op0, 0)))
4420 	      return null_pointer_node;
4421 	    /* Taking the address of a nested function involves a trampoline,
4422 	       unless we don't need or want one.  */
4423 	    if (TREE_CODE (op0) == FUNCTION_DECL
4424 		&& DECL_STATIC_CHAIN (op0)
4425 		&& !TREE_NO_TRAMPOLINE (value))
4426 	      return NULL_TREE;
4427 	    /* "&{...}" requires a temporary to hold the constructed
4428 	       object.  */
4429 	    if (TREE_CODE (op0) == CONSTRUCTOR)
4430 	      return NULL_TREE;
4431 	  }
4432 	return op0;
4433       }
4434 
4435     case NON_LVALUE_EXPR:
4436       return initializer_constant_valid_p_1 (TREE_OPERAND (value, 0),
4437 					     endtype, cache);
4438 
4439     case VIEW_CONVERT_EXPR:
4440       {
4441 	tree src = TREE_OPERAND (value, 0);
4442 	tree src_type = TREE_TYPE (src);
4443 	tree dest_type = TREE_TYPE (value);
4444 
4445 	/* Allow view-conversions from aggregate to non-aggregate type only
4446 	   if the bit pattern is fully preserved afterwards; otherwise, the
4447 	   RTL expander won't be able to apply a subsequent transformation
4448 	   to the underlying constructor.  */
4449 	if (AGGREGATE_TYPE_P (src_type) && !AGGREGATE_TYPE_P (dest_type))
4450 	  {
4451 	    if (TYPE_MODE (endtype) == TYPE_MODE (dest_type))
4452 	      return initializer_constant_valid_p_1 (src, endtype, cache);
4453 	    else
4454 	      return NULL_TREE;
4455 	  }
4456 
4457 	/* Allow all other kinds of view-conversion.  */
4458 	return initializer_constant_valid_p_1 (src, endtype, cache);
4459       }
4460 
4461     CASE_CONVERT:
4462       {
4463 	tree src = TREE_OPERAND (value, 0);
4464 	tree src_type = TREE_TYPE (src);
4465 	tree dest_type = TREE_TYPE (value);
4466 
4467 	/* Allow conversions between pointer types, floating-point
4468 	   types, and offset types.  */
4469 	if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type))
4470 	    || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type))
4471 	    || (TREE_CODE (dest_type) == OFFSET_TYPE
4472 		&& TREE_CODE (src_type) == OFFSET_TYPE))
4473 	  return initializer_constant_valid_p_1 (src, endtype, cache);
4474 
4475 	/* Allow length-preserving conversions between integer types.  */
4476 	if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)
4477 	    && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type)))
4478 	  return initializer_constant_valid_p_1 (src, endtype, cache);
4479 
4480 	/* Allow conversions between other integer types only if
4481 	   explicit value.  Don't allow sign-extension to a type larger
4482 	   than word and pointer, there aren't relocations that would
4483 	   allow to sign extend it to a wider type.  */
4484 	if (INTEGRAL_TYPE_P (dest_type)
4485 	    && INTEGRAL_TYPE_P (src_type)
4486 	    && (TYPE_UNSIGNED (src_type)
4487 		|| TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type)
4488 		|| TYPE_PRECISION (dest_type) <= BITS_PER_WORD
4489 		|| TYPE_PRECISION (dest_type) <= POINTER_SIZE))
4490 	  {
4491 	    tree inner = initializer_constant_valid_p_1 (src, endtype, cache);
4492 	    if (inner == null_pointer_node)
4493 	      return null_pointer_node;
4494 	    break;
4495 	  }
4496 
4497 	/* Allow (int) &foo provided int is as wide as a pointer.  */
4498 	if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)
4499 	    && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)))
4500 	  return initializer_constant_valid_p_1 (src, endtype, cache);
4501 
4502 	/* Likewise conversions from int to pointers, but also allow
4503 	   conversions from 0.  */
4504 	if ((POINTER_TYPE_P (dest_type)
4505 	     || TREE_CODE (dest_type) == OFFSET_TYPE)
4506 	    && INTEGRAL_TYPE_P (src_type))
4507 	  {
4508 	    if (TREE_CODE (src) == INTEGER_CST
4509 		&& TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type))
4510 	      return null_pointer_node;
4511 	    if (integer_zerop (src))
4512 	      return null_pointer_node;
4513 	    else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type))
4514 	      return initializer_constant_valid_p_1 (src, endtype, cache);
4515 	  }
4516 
4517 	/* Allow conversions to struct or union types if the value
4518 	   inside is okay.  */
4519 	if (TREE_CODE (dest_type) == RECORD_TYPE
4520 	    || TREE_CODE (dest_type) == UNION_TYPE)
4521 	  return initializer_constant_valid_p_1 (src, endtype, cache);
4522       }
4523       break;
4524 
4525     case POINTER_PLUS_EXPR:
4526     case PLUS_EXPR:
4527       /* Any valid floating-point constants will have been folded by now;
4528 	 with -frounding-math we hit this with addition of two constants.  */
4529       if (TREE_CODE (endtype) == REAL_TYPE)
4530 	return NULL_TREE;
4531       if (cache && cache[0] == value)
4532 	return cache[1];
4533       if (! INTEGRAL_TYPE_P (endtype)
4534 	  || TYPE_PRECISION (endtype) >= TYPE_PRECISION (TREE_TYPE (value)))
4535 	{
4536 	  tree ncache[4] = { NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE };
4537 	  tree valid0
4538 	    = initializer_constant_valid_p_1 (TREE_OPERAND (value, 0),
4539 					      endtype, ncache);
4540 	  tree valid1
4541 	    = initializer_constant_valid_p_1 (TREE_OPERAND (value, 1),
4542 					      endtype, ncache + 2);
4543 	  /* If either term is absolute, use the other term's relocation.  */
4544 	  if (valid0 == null_pointer_node)
4545 	    ret = valid1;
4546 	  else if (valid1 == null_pointer_node)
4547 	    ret = valid0;
4548 	  /* Support narrowing pointer differences.  */
4549 	  else
4550 	    ret = narrowing_initializer_constant_valid_p (value, endtype,
4551 							  ncache);
4552 	}
4553       else
4554       /* Support narrowing pointer differences.  */
4555 	ret = narrowing_initializer_constant_valid_p (value, endtype, NULL);
4556       if (cache)
4557 	{
4558 	  cache[0] = value;
4559 	  cache[1] = ret;
4560 	}
4561       return ret;
4562 
4563     case MINUS_EXPR:
4564       if (TREE_CODE (endtype) == REAL_TYPE)
4565 	return NULL_TREE;
4566       if (cache && cache[0] == value)
4567 	return cache[1];
4568       if (! INTEGRAL_TYPE_P (endtype)
4569 	  || TYPE_PRECISION (endtype) >= TYPE_PRECISION (TREE_TYPE (value)))
4570 	{
4571 	  tree ncache[4] = { NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE };
4572 	  tree valid0
4573 	    = initializer_constant_valid_p_1 (TREE_OPERAND (value, 0),
4574 					      endtype, ncache);
4575 	  tree valid1
4576 	    = initializer_constant_valid_p_1 (TREE_OPERAND (value, 1),
4577 					      endtype, ncache + 2);
4578 	  /* Win if second argument is absolute.  */
4579 	  if (valid1 == null_pointer_node)
4580 	    ret = valid0;
4581 	  /* Win if both arguments have the same relocation.
4582 	     Then the value is absolute.  */
4583 	  else if (valid0 == valid1 && valid0 != 0)
4584 	    ret = null_pointer_node;
4585 	  /* Since GCC guarantees that string constants are unique in the
4586 	     generated code, a subtraction between two copies of the same
4587 	     constant string is absolute.  */
4588 	  else if (valid0 && TREE_CODE (valid0) == STRING_CST
4589 		   && valid1 && TREE_CODE (valid1) == STRING_CST
4590 		   && operand_equal_p (valid0, valid1, 1))
4591 	    ret = null_pointer_node;
4592 	  /* Support narrowing differences.  */
4593 	  else
4594 	    ret = narrowing_initializer_constant_valid_p (value, endtype,
4595 							  ncache);
4596 	}
4597       else
4598 	/* Support narrowing differences.  */
4599 	ret = narrowing_initializer_constant_valid_p (value, endtype, NULL);
4600       if (cache)
4601 	{
4602 	  cache[0] = value;
4603 	  cache[1] = ret;
4604 	}
4605       return ret;
4606 
4607     default:
4608       break;
4609     }
4610 
4611   return NULL_TREE;
4612 }
4613 
4614 /* Return nonzero if VALUE is a valid constant-valued expression
4615    for use in initializing a static variable; one that can be an
4616    element of a "constant" initializer.
4617 
4618    Return null_pointer_node if the value is absolute;
4619    if it is relocatable, return the variable that determines the relocation.
4620    We assume that VALUE has been folded as much as possible;
4621    therefore, we do not need to check for such things as
4622    arithmetic-combinations of integers.  */
4623 tree
4624 initializer_constant_valid_p (tree value, tree endtype, bool reverse)
4625 {
4626   tree reloc = initializer_constant_valid_p_1 (value, endtype, NULL);
4627 
4628   /* An absolute value is required with reverse storage order.  */
4629   if (reloc
4630       && reloc != null_pointer_node
4631       && reverse
4632       && !AGGREGATE_TYPE_P (endtype)
4633       && !VECTOR_TYPE_P (endtype))
4634     reloc = NULL_TREE;
4635 
4636   return reloc;
4637 }
4638 
4639 /* Return true if VALUE is a valid constant-valued expression
4640    for use in initializing a static bit-field; one that can be
4641    an element of a "constant" initializer.  */
4642 
4643 bool
4644 initializer_constant_valid_for_bitfield_p (tree value)
4645 {
4646   /* For bitfields we support integer constants or possibly nested aggregates
4647      of such.  */
4648   switch (TREE_CODE (value))
4649     {
4650     case CONSTRUCTOR:
4651       {
4652 	unsigned HOST_WIDE_INT idx;
4653 	tree elt;
4654 
4655 	FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt)
4656 	  if (!initializer_constant_valid_for_bitfield_p (elt))
4657 	    return false;
4658 	return true;
4659       }
4660 
4661     case INTEGER_CST:
4662     case REAL_CST:
4663       return true;
4664 
4665     case VIEW_CONVERT_EXPR:
4666     case NON_LVALUE_EXPR:
4667       return
4668 	initializer_constant_valid_for_bitfield_p (TREE_OPERAND (value, 0));
4669 
4670     default:
4671       break;
4672     }
4673 
4674   return false;
4675 }
4676 
4677 /* output_constructor outer state of relevance in recursive calls, typically
4678    for nested aggregate bitfields.  */
4679 
4680 struct oc_outer_state {
4681   unsigned int bit_offset;  /* current position in ...  */
4682   int byte;                 /* ... the outer byte buffer.  */
4683 };
4684 
4685 static unsigned HOST_WIDE_INT
4686 output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int, bool,
4687 		    oc_outer_state *);
4688 
4689 /* Output assembler code for constant EXP, with no label.
4690    This includes the pseudo-op such as ".int" or ".byte", and a newline.
4691    Assumes output_addressed_constants has been done on EXP already.
4692 
4693    Generate at least SIZE bytes of assembler data, padding at the end
4694    with zeros if necessary.  SIZE must always be specified.  The returned
4695    value is the actual number of bytes of assembler data generated, which
4696    may be bigger than SIZE if the object contains a variable length field.
4697 
4698    SIZE is important for structure constructors,
4699    since trailing members may have been omitted from the constructor.
4700    It is also important for initialization of arrays from string constants
4701    since the full length of the string constant might not be wanted.
4702    It is also needed for initialization of unions, where the initializer's
4703    type is just one member, and that may not be as long as the union.
4704 
4705    There a case in which we would fail to output exactly SIZE bytes:
4706    for a structure constructor that wants to produce more than SIZE bytes.
4707    But such constructors will never be generated for any possible input.
4708 
4709    ALIGN is the alignment of the data in bits.
4710 
4711    If REVERSE is true, EXP is output in reverse storage order.  */
4712 
4713 static unsigned HOST_WIDE_INT
4714 output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align,
4715 		 bool reverse)
4716 {
4717   enum tree_code code;
4718   unsigned HOST_WIDE_INT thissize;
4719   rtx cst;
4720 
4721   if (size == 0 || flag_syntax_only)
4722     return size;
4723 
4724   /* See if we're trying to initialize a pointer in a non-default mode
4725      to the address of some declaration somewhere.  If the target says
4726      the mode is valid for pointers, assume the target has a way of
4727      resolving it.  */
4728   if (TREE_CODE (exp) == NOP_EXPR
4729       && POINTER_TYPE_P (TREE_TYPE (exp))
4730       && targetm.addr_space.valid_pointer_mode
4731 	   (TYPE_MODE (TREE_TYPE (exp)),
4732 	    TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)))))
4733     {
4734       tree saved_type = TREE_TYPE (exp);
4735 
4736       /* Peel off any intermediate conversions-to-pointer for valid
4737 	 pointer modes.  */
4738       while (TREE_CODE (exp) == NOP_EXPR
4739 	     && POINTER_TYPE_P (TREE_TYPE (exp))
4740 	     && targetm.addr_space.valid_pointer_mode
4741 		  (TYPE_MODE (TREE_TYPE (exp)),
4742 		   TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)))))
4743 	exp = TREE_OPERAND (exp, 0);
4744 
4745       /* If what we're left with is the address of something, we can
4746 	 convert the address to the final type and output it that
4747 	 way.  */
4748       if (TREE_CODE (exp) == ADDR_EXPR)
4749 	exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0));
4750       /* Likewise for constant ints.  */
4751       else if (TREE_CODE (exp) == INTEGER_CST)
4752 	exp = fold_convert (saved_type, exp);
4753 
4754     }
4755 
4756   /* Eliminate any conversions since we'll be outputting the underlying
4757      constant.  */
4758   while (CONVERT_EXPR_P (exp)
4759 	 || TREE_CODE (exp) == NON_LVALUE_EXPR
4760 	 || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
4761     {
4762       HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp));
4763       HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0)));
4764 
4765       /* Make sure eliminating the conversion is really a no-op, except with
4766 	 VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and
4767 	 union types to allow for Ada unchecked unions.  */
4768       if (type_size > op_size
4769 	  && TREE_CODE (exp) != VIEW_CONVERT_EXPR
4770 	  && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE)
4771 	/* Keep the conversion. */
4772 	break;
4773       else
4774 	exp = TREE_OPERAND (exp, 0);
4775     }
4776 
4777   code = TREE_CODE (TREE_TYPE (exp));
4778   thissize = int_size_in_bytes (TREE_TYPE (exp));
4779 
4780   /* Allow a constructor with no elements for any data type.
4781      This means to fill the space with zeros.  */
4782   if (TREE_CODE (exp) == CONSTRUCTOR
4783       && vec_safe_is_empty (CONSTRUCTOR_ELTS (exp)))
4784     {
4785       assemble_zeros (size);
4786       return size;
4787     }
4788 
4789   if (TREE_CODE (exp) == FDESC_EXPR)
4790     {
4791 #ifdef ASM_OUTPUT_FDESC
4792       HOST_WIDE_INT part = tree_to_shwi (TREE_OPERAND (exp, 1));
4793       tree decl = TREE_OPERAND (exp, 0);
4794       ASM_OUTPUT_FDESC (asm_out_file, decl, part);
4795 #else
4796       gcc_unreachable ();
4797 #endif
4798       return size;
4799     }
4800 
4801   /* Now output the underlying data.  If we've handling the padding, return.
4802      Otherwise, break and ensure SIZE is the size written.  */
4803   switch (code)
4804     {
4805     case BOOLEAN_TYPE:
4806     case INTEGER_TYPE:
4807     case ENUMERAL_TYPE:
4808     case POINTER_TYPE:
4809     case REFERENCE_TYPE:
4810     case OFFSET_TYPE:
4811     case FIXED_POINT_TYPE:
4812     case POINTER_BOUNDS_TYPE:
4813     case NULLPTR_TYPE:
4814       cst = expand_expr (exp, NULL_RTX, VOIDmode, EXPAND_INITIALIZER);
4815       if (reverse)
4816 	cst = flip_storage_order (TYPE_MODE (TREE_TYPE (exp)), cst);
4817       if (!assemble_integer (cst, MIN (size, thissize), align, 0))
4818 	error ("initializer for integer/fixed-point value is too complicated");
4819       break;
4820 
4821     case REAL_TYPE:
4822       if (TREE_CODE (exp) != REAL_CST)
4823 	error ("initializer for floating value is not a floating constant");
4824       else
4825 	assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)),
4826 		       align, reverse);
4827       break;
4828 
4829     case COMPLEX_TYPE:
4830       output_constant (TREE_REALPART (exp), thissize / 2, align, reverse);
4831       output_constant (TREE_IMAGPART (exp), thissize / 2,
4832 		       min_align (align, BITS_PER_UNIT * (thissize / 2)),
4833 		       reverse);
4834       break;
4835 
4836     case ARRAY_TYPE:
4837     case VECTOR_TYPE:
4838       switch (TREE_CODE (exp))
4839 	{
4840 	case CONSTRUCTOR:
4841 	  return output_constructor (exp, size, align, reverse, NULL);
4842 	case STRING_CST:
4843 	  thissize
4844 	    = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp), size);
4845 	  assemble_string (TREE_STRING_POINTER (exp), thissize);
4846 	  break;
4847 	case VECTOR_CST:
4848 	  {
4849 	    machine_mode inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
4850 	    unsigned int nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
4851 	    int elt_size = GET_MODE_SIZE (inner);
4852 	    output_constant (VECTOR_CST_ELT (exp, 0), elt_size, align,
4853 			     reverse);
4854 	    thissize = elt_size;
4855 	    for (unsigned int i = 1; i < VECTOR_CST_NELTS (exp); i++)
4856 	      {
4857 		output_constant (VECTOR_CST_ELT (exp, i), elt_size, nalign,
4858 				 reverse);
4859 		thissize += elt_size;
4860 	      }
4861 	    break;
4862 	  }
4863 	default:
4864 	  gcc_unreachable ();
4865 	}
4866       break;
4867 
4868     case RECORD_TYPE:
4869     case UNION_TYPE:
4870       gcc_assert (TREE_CODE (exp) == CONSTRUCTOR);
4871       return output_constructor (exp, size, align, reverse, NULL);
4872 
4873     case ERROR_MARK:
4874       return 0;
4875 
4876     default:
4877       gcc_unreachable ();
4878     }
4879 
4880   if (size > thissize)
4881     assemble_zeros (size - thissize);
4882 
4883   return size;
4884 }
4885 
4886 /* Subroutine of output_constructor, used for computing the size of
4887    arrays of unspecified length.  VAL must be a CONSTRUCTOR of an array
4888    type with an unspecified upper bound.  */
4889 
4890 static unsigned HOST_WIDE_INT
4891 array_size_for_constructor (tree val)
4892 {
4893   tree max_index;
4894   unsigned HOST_WIDE_INT cnt;
4895   tree index, value, tmp;
4896   offset_int i;
4897 
4898   /* This code used to attempt to handle string constants that are not
4899      arrays of single-bytes, but nothing else does, so there's no point in
4900      doing it here.  */
4901   if (TREE_CODE (val) == STRING_CST)
4902     return TREE_STRING_LENGTH (val);
4903 
4904   max_index = NULL_TREE;
4905   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value)
4906     {
4907       if (TREE_CODE (index) == RANGE_EXPR)
4908 	index = TREE_OPERAND (index, 1);
4909       if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4910 	max_index = index;
4911     }
4912 
4913   if (max_index == NULL_TREE)
4914     return 0;
4915 
4916   /* Compute the total number of array elements.  */
4917   tmp = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)));
4918   i = wi::to_offset (max_index) - wi::to_offset (tmp) + 1;
4919 
4920   /* Multiply by the array element unit size to find number of bytes.  */
4921   i *= wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
4922 
4923   gcc_assert (wi::fits_uhwi_p (i));
4924   return i.to_uhwi ();
4925 }
4926 
4927 /* Other datastructures + helpers for output_constructor.  */
4928 
4929 /* output_constructor local state to support interaction with helpers.  */
4930 
4931 struct oc_local_state {
4932 
4933   /* Received arguments.  */
4934   tree exp;                     /* Constructor expression.  */
4935   tree type;                    /* Type of constructor expression.  */
4936   unsigned HOST_WIDE_INT size;  /* # bytes to output - pad if necessary.  */
4937   unsigned int align;           /* Known initial alignment.  */
4938   tree min_index;               /* Lower bound if specified for an array.  */
4939 
4940   /* Output processing state.  */
4941   HOST_WIDE_INT total_bytes;  /* # bytes output so far / current position.  */
4942   int byte;                   /* Part of a bitfield byte yet to be output.  */
4943   int last_relative_index;    /* Implicit or explicit index of the last
4944 				 array element output within a bitfield.  */
4945   bool byte_buffer_in_use;    /* Whether BYTE is in use.  */
4946   bool reverse;               /* Whether reverse storage order is in use.  */
4947 
4948   /* Current element.  */
4949   tree field;      /* Current field decl in a record.  */
4950   tree val;        /* Current element value.  */
4951   tree index;      /* Current element index.  */
4952 
4953 };
4954 
4955 /* Helper for output_constructor.  From the current LOCAL state, output a
4956    RANGE_EXPR element.  */
4957 
4958 static void
4959 output_constructor_array_range (oc_local_state *local)
4960 {
4961   unsigned HOST_WIDE_INT fieldsize
4962     = int_size_in_bytes (TREE_TYPE (local->type));
4963 
4964   HOST_WIDE_INT lo_index
4965     = tree_to_shwi (TREE_OPERAND (local->index, 0));
4966   HOST_WIDE_INT hi_index
4967     = tree_to_shwi (TREE_OPERAND (local->index, 1));
4968   HOST_WIDE_INT index;
4969 
4970   unsigned int align2
4971     = min_align (local->align, fieldsize * BITS_PER_UNIT);
4972 
4973   for (index = lo_index; index <= hi_index; index++)
4974     {
4975       /* Output the element's initial value.  */
4976       if (local->val == NULL_TREE)
4977 	assemble_zeros (fieldsize);
4978       else
4979 	fieldsize
4980 	  = output_constant (local->val, fieldsize, align2, local->reverse);
4981 
4982       /* Count its size.  */
4983       local->total_bytes += fieldsize;
4984     }
4985 }
4986 
4987 /* Helper for output_constructor.  From the current LOCAL state, output a
4988    field element that is not true bitfield or part of an outer one.  */
4989 
4990 static void
4991 output_constructor_regular_field (oc_local_state *local)
4992 {
4993   /* Field size and position.  Since this structure is static, we know the
4994      positions are constant.  */
4995   unsigned HOST_WIDE_INT fieldsize;
4996   HOST_WIDE_INT fieldpos;
4997 
4998   unsigned int align2;
4999 
5000   /* Output any buffered-up bit-fields preceding this element.  */
5001   if (local->byte_buffer_in_use)
5002     {
5003       assemble_integer (GEN_INT (local->byte), 1, BITS_PER_UNIT, 1);
5004       local->total_bytes++;
5005       local->byte_buffer_in_use = false;
5006     }
5007 
5008   if (local->index != NULL_TREE)
5009     {
5010       /* Perform the index calculation in modulo arithmetic but
5011 	 sign-extend the result because Ada has negative DECL_FIELD_OFFSETs
5012 	 but we are using an unsigned sizetype.  */
5013       unsigned prec = TYPE_PRECISION (sizetype);
5014       offset_int idx = wi::sext (wi::to_offset (local->index)
5015 				 - wi::to_offset (local->min_index), prec);
5016       fieldpos = (idx * wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (local->val))))
5017 	.to_short_addr ();
5018     }
5019   else if (local->field != NULL_TREE)
5020     fieldpos = int_byte_position (local->field);
5021   else
5022     fieldpos = 0;
5023 
5024   /* Advance to offset of this element.
5025      Note no alignment needed in an array, since that is guaranteed
5026      if each element has the proper size.  */
5027   if (local->field != NULL_TREE || local->index != NULL_TREE)
5028     {
5029       if (fieldpos > local->total_bytes)
5030 	{
5031 	  assemble_zeros (fieldpos - local->total_bytes);
5032 	  local->total_bytes = fieldpos;
5033 	}
5034       else
5035 	/* Must not go backwards.  */
5036 	gcc_assert (fieldpos == local->total_bytes);
5037     }
5038 
5039   /* Find the alignment of this element.  */
5040   align2 = min_align (local->align, BITS_PER_UNIT * fieldpos);
5041 
5042   /* Determine size this element should occupy.  */
5043   if (local->field)
5044     {
5045       fieldsize = 0;
5046 
5047       /* If this is an array with an unspecified upper bound,
5048 	 the initializer determines the size.  */
5049       /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
5050 	 but we cannot do this until the deprecated support for
5051 	 initializing zero-length array members is removed.  */
5052       if (TREE_CODE (TREE_TYPE (local->field)) == ARRAY_TYPE
5053 	  && (!TYPE_DOMAIN (TREE_TYPE (local->field))
5054 	      || !TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (local->field)))))
5055 	{
5056 	  fieldsize = array_size_for_constructor (local->val);
5057 	  /* Given a non-empty initialization, this field had better
5058 	     be last.  Given a flexible array member, the next field
5059 	     on the chain is a TYPE_DECL of the enclosing struct.  */
5060 	  const_tree next = DECL_CHAIN (local->field);
5061 	  gcc_assert (!fieldsize || !next || TREE_CODE (next) != FIELD_DECL);
5062 	}
5063       else
5064 	fieldsize = tree_to_uhwi (DECL_SIZE_UNIT (local->field));
5065     }
5066   else
5067     fieldsize = int_size_in_bytes (TREE_TYPE (local->type));
5068 
5069   /* Output the element's initial value.  */
5070   if (local->val == NULL_TREE)
5071     assemble_zeros (fieldsize);
5072   else
5073     fieldsize
5074       = output_constant (local->val, fieldsize, align2, local->reverse);
5075 
5076   /* Count its size.  */
5077   local->total_bytes += fieldsize;
5078 }
5079 
5080 /* Helper for output_constructor.  From the LOCAL state, output an element
5081    that is a true bitfield or part of an outer one.  BIT_OFFSET is the offset
5082    from the start of a possibly ongoing outer byte buffer.  */
5083 
5084 static void
5085 output_constructor_bitfield (oc_local_state *local, unsigned int bit_offset)
5086 {
5087   /* Bit size of this element.  */
5088   HOST_WIDE_INT ebitsize
5089     = (local->field
5090        ? tree_to_uhwi (DECL_SIZE (local->field))
5091        : tree_to_uhwi (TYPE_SIZE (TREE_TYPE (local->type))));
5092 
5093   /* Relative index of this element if this is an array component.  */
5094   HOST_WIDE_INT relative_index
5095     = (!local->field
5096        ? (local->index
5097 	  ? (tree_to_shwi (local->index)
5098 	     - tree_to_shwi (local->min_index))
5099 	  : local->last_relative_index + 1)
5100        : 0);
5101 
5102   /* Bit position of this element from the start of the containing
5103      constructor.  */
5104   HOST_WIDE_INT constructor_relative_ebitpos
5105       = (local->field
5106 	 ? int_bit_position (local->field)
5107 	 : ebitsize * relative_index);
5108 
5109   /* Bit position of this element from the start of a possibly ongoing
5110      outer byte buffer.  */
5111   HOST_WIDE_INT byte_relative_ebitpos
5112     = bit_offset + constructor_relative_ebitpos;
5113 
5114   /* From the start of a possibly ongoing outer byte buffer, offsets to
5115      the first bit of this element and to the first bit past the end of
5116      this element.  */
5117   HOST_WIDE_INT next_offset = byte_relative_ebitpos;
5118   HOST_WIDE_INT end_offset = byte_relative_ebitpos + ebitsize;
5119 
5120   local->last_relative_index = relative_index;
5121 
5122   if (local->val == NULL_TREE)
5123     local->val = integer_zero_node;
5124 
5125   while (TREE_CODE (local->val) == VIEW_CONVERT_EXPR
5126 	 || TREE_CODE (local->val) == NON_LVALUE_EXPR)
5127     local->val = TREE_OPERAND (local->val, 0);
5128 
5129   if (TREE_CODE (local->val) != INTEGER_CST
5130       && TREE_CODE (local->val) != CONSTRUCTOR)
5131     {
5132       error ("invalid initial value for member %qE", DECL_NAME (local->field));
5133       return;
5134     }
5135 
5136   /* If this field does not start in this (or next) byte, skip some bytes.  */
5137   if (next_offset / BITS_PER_UNIT != local->total_bytes)
5138     {
5139       /* Output remnant of any bit field in previous bytes.  */
5140       if (local->byte_buffer_in_use)
5141 	{
5142 	  assemble_integer (GEN_INT (local->byte), 1, BITS_PER_UNIT, 1);
5143 	  local->total_bytes++;
5144 	  local->byte_buffer_in_use = false;
5145 	}
5146 
5147       /* If still not at proper byte, advance to there.  */
5148       if (next_offset / BITS_PER_UNIT != local->total_bytes)
5149 	{
5150 	  gcc_assert (next_offset / BITS_PER_UNIT >= local->total_bytes);
5151 	  assemble_zeros (next_offset / BITS_PER_UNIT - local->total_bytes);
5152 	  local->total_bytes = next_offset / BITS_PER_UNIT;
5153 	}
5154     }
5155 
5156   /* Set up the buffer if necessary.  */
5157   if (!local->byte_buffer_in_use)
5158     {
5159       local->byte = 0;
5160       if (ebitsize > 0)
5161 	local->byte_buffer_in_use = true;
5162     }
5163 
5164   /* If this is nested constructor, recurse passing the bit offset and the
5165      pending data, then retrieve the new pending data afterwards.  */
5166   if (TREE_CODE (local->val) == CONSTRUCTOR)
5167     {
5168       oc_outer_state temp_state;
5169       temp_state.bit_offset = next_offset % BITS_PER_UNIT;
5170       temp_state.byte = local->byte;
5171       local->total_bytes
5172 	+= output_constructor (local->val, 0, 0, local->reverse, &temp_state);
5173       local->byte = temp_state.byte;
5174       return;
5175     }
5176 
5177   /* Otherwise, we must split the element into pieces that fall within
5178      separate bytes, and combine each byte with previous or following
5179      bit-fields.  */
5180   while (next_offset < end_offset)
5181     {
5182       int this_time;
5183       int shift;
5184       unsigned HOST_WIDE_INT value;
5185       HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
5186       HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
5187 
5188       /* Advance from byte to byte within this element when necessary.  */
5189       while (next_byte != local->total_bytes)
5190 	{
5191 	  assemble_integer (GEN_INT (local->byte), 1, BITS_PER_UNIT, 1);
5192 	  local->total_bytes++;
5193 	  local->byte = 0;
5194 	}
5195 
5196       /* Number of bits we can process at once (all part of the same byte).  */
5197       this_time = MIN (end_offset - next_offset, BITS_PER_UNIT - next_bit);
5198       if (local->reverse ? !BYTES_BIG_ENDIAN : BYTES_BIG_ENDIAN)
5199 	{
5200 	  /* For big-endian data, take the most significant bits (of the
5201 	     bits that are significant) first and put them into bytes from
5202 	     the most significant end.  */
5203 	  shift = end_offset - next_offset - this_time;
5204 
5205 	  /* Don't try to take a bunch of bits that cross
5206 	     the word boundary in the INTEGER_CST.  We can
5207 	     only select bits from one element.  */
5208 	  if ((shift / HOST_BITS_PER_WIDE_INT)
5209 	      != ((shift + this_time - 1) / HOST_BITS_PER_WIDE_INT))
5210 	    {
5211 	      const int end = shift + this_time - 1;
5212 	      shift = end & -HOST_BITS_PER_WIDE_INT;
5213 	      this_time = end - shift + 1;
5214 	    }
5215 
5216 	  /* Now get the bits we want to insert.  */
5217 	  value = wi::extract_uhwi (wi::to_widest (local->val),
5218 				    shift, this_time);
5219 
5220 	  /* Get the result.  This works only when:
5221 	     1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
5222 	  local->byte |= value << (BITS_PER_UNIT - this_time - next_bit);
5223 	}
5224       else
5225 	{
5226 	  /* On little-endian machines, take the least significant bits of
5227 	     the value first and pack them starting at the least significant
5228 	     bits of the bytes.  */
5229 	  shift = next_offset - byte_relative_ebitpos;
5230 
5231 	  /* Don't try to take a bunch of bits that cross
5232 	     the word boundary in the INTEGER_CST.  We can
5233 	     only select bits from one element.  */
5234 	  if ((shift / HOST_BITS_PER_WIDE_INT)
5235 	      != ((shift + this_time - 1) / HOST_BITS_PER_WIDE_INT))
5236 	    this_time
5237 	      = HOST_BITS_PER_WIDE_INT - (shift & (HOST_BITS_PER_WIDE_INT - 1));
5238 
5239 	  /* Now get the bits we want to insert.  */
5240 	  value = wi::extract_uhwi (wi::to_widest (local->val),
5241 				    shift, this_time);
5242 
5243 	  /* Get the result.  This works only when:
5244 	     1 <= this_time <= HOST_BITS_PER_WIDE_INT.  */
5245 	  local->byte |= value << next_bit;
5246 	}
5247 
5248       next_offset += this_time;
5249       local->byte_buffer_in_use = true;
5250     }
5251 }
5252 
5253 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
5254    Generate at least SIZE bytes, padding if necessary.  OUTER designates the
5255    caller output state of relevance in recursive invocations.  */
5256 
5257 static unsigned HOST_WIDE_INT
5258 output_constructor (tree exp, unsigned HOST_WIDE_INT size, unsigned int align,
5259 		    bool reverse, oc_outer_state *outer)
5260 {
5261   unsigned HOST_WIDE_INT cnt;
5262   constructor_elt *ce;
5263   oc_local_state local;
5264 
5265   /* Setup our local state to communicate with helpers.  */
5266   local.exp = exp;
5267   local.type = TREE_TYPE (exp);
5268   local.size = size;
5269   local.align = align;
5270   if (TREE_CODE (local.type) == ARRAY_TYPE && TYPE_DOMAIN (local.type))
5271     local.min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (local.type));
5272   else
5273     local.min_index = integer_zero_node;
5274 
5275   local.total_bytes = 0;
5276   local.byte_buffer_in_use = outer != NULL;
5277   local.byte = outer ? outer->byte : 0;
5278   local.last_relative_index = -1;
5279   /* The storage order is specified for every aggregate type.  */
5280   if (AGGREGATE_TYPE_P (local.type))
5281     local.reverse = TYPE_REVERSE_STORAGE_ORDER (local.type);
5282   else
5283     local.reverse = reverse;
5284 
5285   gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT);
5286 
5287   /* As CE goes through the elements of the constant, FIELD goes through the
5288      structure fields if the constant is a structure.  If the constant is a
5289      union, we override this by getting the field from the TREE_LIST element.
5290      But the constant could also be an array.  Then FIELD is zero.
5291 
5292      There is always a maximum of one element in the chain LINK for unions
5293      (even if the initializer in a source program incorrectly contains
5294      more one).  */
5295 
5296   if (TREE_CODE (local.type) == RECORD_TYPE)
5297     local.field = TYPE_FIELDS (local.type);
5298   else
5299     local.field = NULL_TREE;
5300 
5301   for (cnt = 0;
5302        vec_safe_iterate (CONSTRUCTOR_ELTS (exp), cnt, &ce);
5303        cnt++, local.field = local.field ? DECL_CHAIN (local.field) : 0)
5304     {
5305       local.val = ce->value;
5306       local.index = NULL_TREE;
5307 
5308       /* The element in a union constructor specifies the proper field
5309 	 or index.  */
5310       if (RECORD_OR_UNION_TYPE_P (local.type) && ce->index != NULL_TREE)
5311 	local.field = ce->index;
5312 
5313       else if (TREE_CODE (local.type) == ARRAY_TYPE)
5314 	local.index = ce->index;
5315 
5316       if (local.field && flag_verbose_asm)
5317 	fprintf (asm_out_file, "%s %s:\n",
5318 		 ASM_COMMENT_START,
5319 		 DECL_NAME (local.field)
5320 		 ? IDENTIFIER_POINTER (DECL_NAME (local.field))
5321 		 : "<anonymous>");
5322 
5323       /* Eliminate the marker that makes a cast not be an lvalue.  */
5324       if (local.val != NULL_TREE)
5325 	STRIP_NOPS (local.val);
5326 
5327       /* Output the current element, using the appropriate helper ...  */
5328 
5329       /* For an array slice not part of an outer bitfield.  */
5330       if (!outer
5331 	  && local.index != NULL_TREE
5332 	  && TREE_CODE (local.index) == RANGE_EXPR)
5333 	output_constructor_array_range (&local);
5334 
5335       /* For a field that is neither a true bitfield nor part of an outer one,
5336 	 known to be at least byte aligned and multiple-of-bytes long.  */
5337       else if (!outer
5338 	       && (local.field == NULL_TREE
5339 		   || !CONSTRUCTOR_BITFIELD_P (local.field)))
5340 	output_constructor_regular_field (&local);
5341 
5342       /* For a true bitfield or part of an outer one.  Only INTEGER_CSTs are
5343 	 supported for scalar fields, so we may need to convert first.  */
5344       else
5345         {
5346 	  if (TREE_CODE (local.val) == REAL_CST)
5347 	    local.val
5348 	      = fold_unary (VIEW_CONVERT_EXPR,
5349 			    build_nonstandard_integer_type
5350 			    (TYPE_PRECISION (TREE_TYPE (local.val)), 0),
5351 			    local.val);
5352 	  output_constructor_bitfield (&local, outer ? outer->bit_offset : 0);
5353 	}
5354     }
5355 
5356   /* If we are not at toplevel, save the pending data for our caller.
5357      Otherwise output the pending data and padding zeros as needed. */
5358   if (outer)
5359     outer->byte = local.byte;
5360   else
5361     {
5362       if (local.byte_buffer_in_use)
5363 	{
5364 	  assemble_integer (GEN_INT (local.byte), 1, BITS_PER_UNIT, 1);
5365 	  local.total_bytes++;
5366 	}
5367 
5368       if ((unsigned HOST_WIDE_INT)local.total_bytes < local.size)
5369 	{
5370 	  assemble_zeros (local.size - local.total_bytes);
5371 	  local.total_bytes = local.size;
5372 	}
5373     }
5374 
5375   return local.total_bytes;
5376 }
5377 
5378 /* Mark DECL as weak.  */
5379 
5380 static void
5381 mark_weak (tree decl)
5382 {
5383   if (DECL_WEAK (decl))
5384     return;
5385 
5386   struct symtab_node *n = symtab_node::get (decl);
5387   if (n && n->refuse_visibility_changes)
5388     error ("%+D declared weak after being used", decl);
5389   DECL_WEAK (decl) = 1;
5390 
5391   if (DECL_RTL_SET_P (decl)
5392       && MEM_P (DECL_RTL (decl))
5393       && XEXP (DECL_RTL (decl), 0)
5394       && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
5395     SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
5396 }
5397 
5398 /* Merge weak status between NEWDECL and OLDDECL.  */
5399 
5400 void
5401 merge_weak (tree newdecl, tree olddecl)
5402 {
5403   if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
5404     {
5405       if (DECL_WEAK (newdecl) && TARGET_SUPPORTS_WEAK)
5406         {
5407           tree *pwd;
5408           /* We put the NEWDECL on the weak_decls list at some point
5409              and OLDDECL as well.  Keep just OLDDECL on the list.  */
5410 	  for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
5411 	    if (TREE_VALUE (*pwd) == newdecl)
5412 	      {
5413 	        *pwd = TREE_CHAIN (*pwd);
5414 		break;
5415 	      }
5416         }
5417       return;
5418     }
5419 
5420   if (DECL_WEAK (newdecl))
5421     {
5422       tree wd;
5423 
5424       /* NEWDECL is weak, but OLDDECL is not.  */
5425 
5426       /* If we already output the OLDDECL, we're in trouble; we can't
5427 	 go back and make it weak.  This should never happen in
5428 	 unit-at-a-time compilation.  */
5429       gcc_assert (!TREE_ASM_WRITTEN (olddecl));
5430 
5431       /* If we've already generated rtl referencing OLDDECL, we may
5432 	 have done so in a way that will not function properly with
5433 	 a weak symbol.  Again in unit-at-a-time this should be
5434 	 impossible.  */
5435       gcc_assert (!TREE_USED (olddecl)
5436 	          || !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)));
5437 
5438       /* PR 49899: You cannot convert a static function into a weak, public function.  */
5439       if (! TREE_PUBLIC (olddecl) && TREE_PUBLIC (newdecl))
5440 	error ("weak declaration of %q+D being applied to a already "
5441 	       "existing, static definition", newdecl);
5442 
5443       if (TARGET_SUPPORTS_WEAK)
5444 	{
5445 	  /* We put the NEWDECL on the weak_decls list at some point.
5446 	     Replace it with the OLDDECL.  */
5447 	  for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
5448 	    if (TREE_VALUE (wd) == newdecl)
5449 	      {
5450 		TREE_VALUE (wd) = olddecl;
5451 		break;
5452 	      }
5453 	  /* We may not find the entry on the list.  If NEWDECL is a
5454 	     weak alias, then we will have already called
5455 	     globalize_decl to remove the entry; in that case, we do
5456 	     not need to do anything.  */
5457 	}
5458 
5459       /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping.  */
5460       mark_weak (olddecl);
5461     }
5462   else
5463     /* OLDDECL was weak, but NEWDECL was not explicitly marked as
5464        weak.  Just update NEWDECL to indicate that it's weak too.  */
5465     mark_weak (newdecl);
5466 }
5467 
5468 /* Declare DECL to be a weak symbol.  */
5469 
5470 void
5471 declare_weak (tree decl)
5472 {
5473   gcc_assert (TREE_CODE (decl) != FUNCTION_DECL || !TREE_ASM_WRITTEN (decl));
5474   if (! TREE_PUBLIC (decl))
5475     {
5476       error ("weak declaration of %q+D must be public", decl);
5477       return;
5478     }
5479   else if (!TARGET_SUPPORTS_WEAK)
5480     warning (0, "weak declaration of %q+D not supported", decl);
5481 
5482   mark_weak (decl);
5483   if (!lookup_attribute ("weak", DECL_ATTRIBUTES (decl)))
5484     DECL_ATTRIBUTES (decl)
5485       = tree_cons (get_identifier ("weak"), NULL, DECL_ATTRIBUTES (decl));
5486 }
5487 
5488 static void
5489 weak_finish_1 (tree decl)
5490 {
5491 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
5492   const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5493 #endif
5494 
5495   if (! TREE_USED (decl))
5496     return;
5497 
5498 #ifdef ASM_WEAKEN_DECL
5499   ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
5500 #else
5501 #ifdef ASM_WEAKEN_LABEL
5502   ASM_WEAKEN_LABEL (asm_out_file, name);
5503 #else
5504 #ifdef ASM_OUTPUT_WEAK_ALIAS
5505   {
5506     static bool warn_once = 0;
5507     if (! warn_once)
5508       {
5509 	warning (0, "only weak aliases are supported in this configuration");
5510 	warn_once = 1;
5511       }
5512     return;
5513   }
5514 #endif
5515 #endif
5516 #endif
5517 }
5518 
5519 /* Fiven an assembly name, find the decl it is associated with.  */
5520 static tree
5521 find_decl (tree target)
5522 {
5523   symtab_node *node = symtab_node::get_for_asmname (target);
5524   if (node)
5525     return node->decl;
5526   return NULL_TREE;
5527 }
5528 
5529 /* This TREE_LIST contains weakref targets.  */
5530 
5531 static GTY(()) tree weakref_targets;
5532 
5533 /* Emit any pending weak declarations.  */
5534 
5535 void
5536 weak_finish (void)
5537 {
5538   tree t;
5539 
5540   for (t = weakref_targets; t; t = TREE_CHAIN (t))
5541     {
5542       tree alias_decl = TREE_PURPOSE (t);
5543       tree target = ultimate_transparent_alias_target (&TREE_VALUE (t));
5544 
5545       if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl)))
5546 	/* Remove alias_decl from the weak list, but leave entries for
5547 	   the target alone.  */
5548 	target = NULL_TREE;
5549 #ifndef ASM_OUTPUT_WEAKREF
5550       else if (! TREE_SYMBOL_REFERENCED (target))
5551 	{
5552 	  /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not
5553 	     defined, otherwise we and weak_finish_1 would use
5554 	     different macros.  */
5555 # if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL
5556 	  ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target));
5557 # else
5558 	  tree decl = find_decl (target);
5559 
5560 	  if (! decl)
5561 	    {
5562 	      decl = build_decl (DECL_SOURCE_LOCATION (alias_decl),
5563 				 TREE_CODE (alias_decl), target,
5564 				 TREE_TYPE (alias_decl));
5565 
5566 	      DECL_EXTERNAL (decl) = 1;
5567 	      TREE_PUBLIC (decl) = 1;
5568 	      DECL_ARTIFICIAL (decl) = 1;
5569 	      TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl);
5570 	      TREE_USED (decl) = 1;
5571 	    }
5572 
5573 	  weak_finish_1 (decl);
5574 # endif
5575 	}
5576 #endif
5577 
5578       {
5579 	tree *p;
5580 	tree t2;
5581 
5582 	/* Remove the alias and the target from the pending weak list
5583 	   so that we do not emit any .weak directives for the former,
5584 	   nor multiple .weak directives for the latter.  */
5585 	for (p = &weak_decls; (t2 = *p) ; )
5586 	  {
5587 	    if (TREE_VALUE (t2) == alias_decl
5588 		|| target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2)))
5589 	      *p = TREE_CHAIN (t2);
5590 	    else
5591 	      p = &TREE_CHAIN (t2);
5592 	  }
5593 
5594 	/* Remove other weakrefs to the same target, to speed things up.  */
5595 	for (p = &TREE_CHAIN (t); (t2 = *p) ; )
5596 	  {
5597 	    if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2)))
5598 	      *p = TREE_CHAIN (t2);
5599 	    else
5600 	      p = &TREE_CHAIN (t2);
5601 	  }
5602       }
5603     }
5604 
5605   for (t = weak_decls; t; t = TREE_CHAIN (t))
5606     {
5607       tree decl = TREE_VALUE (t);
5608 
5609       weak_finish_1 (decl);
5610     }
5611 }
5612 
5613 /* Emit the assembly bits to indicate that DECL is globally visible.  */
5614 
5615 static void
5616 globalize_decl (tree decl)
5617 {
5618 
5619 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
5620   if (DECL_WEAK (decl))
5621     {
5622       const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
5623       tree *p, t;
5624 
5625 #ifdef ASM_WEAKEN_DECL
5626       ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
5627 #else
5628       ASM_WEAKEN_LABEL (asm_out_file, name);
5629 #endif
5630 
5631       /* Remove this function from the pending weak list so that
5632 	 we do not emit multiple .weak directives for it.  */
5633       for (p = &weak_decls; (t = *p) ; )
5634 	{
5635 	  if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
5636 	    *p = TREE_CHAIN (t);
5637 	  else
5638 	    p = &TREE_CHAIN (t);
5639 	}
5640 
5641       /* Remove weakrefs to the same target from the pending weakref
5642 	 list, for the same reason.  */
5643       for (p = &weakref_targets; (t = *p) ; )
5644 	{
5645 	  if (DECL_ASSEMBLER_NAME (decl)
5646 	      == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5647 	    *p = TREE_CHAIN (t);
5648 	  else
5649 	    p = &TREE_CHAIN (t);
5650 	}
5651 
5652       return;
5653     }
5654 #endif
5655 
5656   targetm.asm_out.globalize_decl_name (asm_out_file, decl);
5657 }
5658 
5659 vec<alias_pair, va_gc> *alias_pairs;
5660 
5661 /* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
5662    or ASM_OUTPUT_DEF_FROM_DECLS.  The function defines the symbol whose
5663    tree node is DECL to have the value of the tree node TARGET.  */
5664 
5665 void
5666 do_assemble_alias (tree decl, tree target)
5667 {
5668   tree id;
5669 
5670   /* Emulated TLS had better not get this var.  */
5671   gcc_assert (!(!targetm.have_tls
5672 		&& VAR_P (decl)
5673 		&& DECL_THREAD_LOCAL_P (decl)));
5674 
5675   if (TREE_ASM_WRITTEN (decl))
5676     return;
5677 
5678   id = DECL_ASSEMBLER_NAME (decl);
5679   ultimate_transparent_alias_target (&id);
5680   ultimate_transparent_alias_target (&target);
5681 
5682   /* We must force creation of DECL_RTL for debug info generation, even though
5683      we don't use it here.  */
5684   make_decl_rtl (decl);
5685 
5686   TREE_ASM_WRITTEN (decl) = 1;
5687   TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
5688   TREE_ASM_WRITTEN (id) = 1;
5689 
5690   if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5691     {
5692       if (!TREE_SYMBOL_REFERENCED (target))
5693 	weakref_targets = tree_cons (decl, target, weakref_targets);
5694 
5695 #ifdef ASM_OUTPUT_WEAKREF
5696       ASM_OUTPUT_WEAKREF (asm_out_file, decl,
5697 			  IDENTIFIER_POINTER (id),
5698 			  IDENTIFIER_POINTER (target));
5699 #else
5700       if (!TARGET_SUPPORTS_WEAK)
5701 	{
5702 	  error_at (DECL_SOURCE_LOCATION (decl),
5703 		    "weakref is not supported in this configuration");
5704 	  return;
5705 	}
5706 #endif
5707       return;
5708     }
5709 
5710 #ifdef ASM_OUTPUT_DEF
5711   tree orig_decl = decl;
5712 
5713   if (TREE_CODE (decl) == FUNCTION_DECL
5714       && cgraph_node::get (decl)->instrumentation_clone
5715       && cgraph_node::get (decl)->instrumented_version)
5716     orig_decl = cgraph_node::get (decl)->instrumented_version->decl;
5717 
5718   /* Make name accessible from other files, if appropriate.  */
5719 
5720   if (TREE_PUBLIC (decl) || TREE_PUBLIC (orig_decl))
5721     {
5722       globalize_decl (decl);
5723       maybe_assemble_visibility (decl);
5724     }
5725   if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
5726     {
5727 #if defined (ASM_OUTPUT_TYPE_DIRECTIVE)
5728       if (targetm.has_ifunc_p ())
5729 	ASM_OUTPUT_TYPE_DIRECTIVE
5730 	  (asm_out_file, IDENTIFIER_POINTER (id),
5731 	   IFUNC_ASM_TYPE);
5732       else
5733 #endif
5734 	error_at (DECL_SOURCE_LOCATION (decl),
5735 		  "ifunc is not supported on this target");
5736     }
5737 
5738 # ifdef ASM_OUTPUT_DEF_FROM_DECLS
5739   ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
5740 # else
5741   ASM_OUTPUT_DEF (asm_out_file,
5742 		  IDENTIFIER_POINTER (id),
5743 		  IDENTIFIER_POINTER (target));
5744 # endif
5745 #elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
5746   {
5747     const char *name;
5748     tree *p, t;
5749 
5750     name = IDENTIFIER_POINTER (id);
5751 # ifdef ASM_WEAKEN_DECL
5752     ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
5753 # else
5754     ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
5755 # endif
5756     /* Remove this function from the pending weak list so that
5757        we do not emit multiple .weak directives for it.  */
5758     for (p = &weak_decls; (t = *p) ; )
5759       if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t))
5760 	  || id == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
5761 	*p = TREE_CHAIN (t);
5762       else
5763 	p = &TREE_CHAIN (t);
5764 
5765     /* Remove weakrefs to the same target from the pending weakref
5766        list, for the same reason.  */
5767     for (p = &weakref_targets; (t = *p) ; )
5768       {
5769 	if (id == ultimate_transparent_alias_target (&TREE_VALUE (t)))
5770 	  *p = TREE_CHAIN (t);
5771 	else
5772 	  p = &TREE_CHAIN (t);
5773       }
5774   }
5775 #endif
5776 }
5777 
5778 /* Emit an assembler directive to make the symbol for DECL an alias to
5779    the symbol for TARGET.  */
5780 
5781 void
5782 assemble_alias (tree decl, tree target)
5783 {
5784   tree target_decl;
5785 
5786   if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
5787     {
5788       tree alias = DECL_ASSEMBLER_NAME (decl);
5789 
5790       ultimate_transparent_alias_target (&target);
5791 
5792       if (alias == target)
5793 	error ("weakref %q+D ultimately targets itself", decl);
5794       if (TREE_PUBLIC (decl))
5795 	error ("weakref %q+D must have static linkage", decl);
5796     }
5797   else
5798     {
5799 #if !defined (ASM_OUTPUT_DEF)
5800 # if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
5801       error_at (DECL_SOURCE_LOCATION (decl),
5802 		"alias definitions not supported in this configuration");
5803       TREE_ASM_WRITTEN (decl) = 1;
5804       return;
5805 # else
5806       if (!DECL_WEAK (decl))
5807 	{
5808 	  if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
5809 	    error_at (DECL_SOURCE_LOCATION (decl),
5810 		      "ifunc is not supported in this configuration");
5811 	  else
5812 	    error_at (DECL_SOURCE_LOCATION (decl),
5813 		      "only weak aliases are supported in this configuration");
5814 	  TREE_ASM_WRITTEN (decl) = 1;
5815 	  return;
5816 	}
5817 # endif
5818 #endif
5819     }
5820   TREE_USED (decl) = 1;
5821 
5822   /* Allow aliases to aliases.  */
5823   if (TREE_CODE (decl) == FUNCTION_DECL)
5824     cgraph_node::get_create (decl)->alias = true;
5825   else
5826     varpool_node::get_create (decl)->alias = true;
5827 
5828   /* If the target has already been emitted, we don't have to queue the
5829      alias.  This saves a tad of memory.  */
5830   if (symtab->global_info_ready)
5831     target_decl = find_decl (target);
5832   else
5833     target_decl= NULL;
5834   if ((target_decl && TREE_ASM_WRITTEN (target_decl))
5835       || symtab->state >= EXPANSION)
5836     do_assemble_alias (decl, target);
5837   else
5838     {
5839       alias_pair p = {decl, target};
5840       vec_safe_push (alias_pairs, p);
5841     }
5842 }
5843 
5844 /* Record and output a table of translations from original function
5845    to its transaction aware clone.  Note that tm_pure functions are
5846    considered to be their own clone.  */
5847 
5848 struct tm_clone_hasher : ggc_cache_ptr_hash<tree_map>
5849 {
5850   static hashval_t hash (tree_map *m) { return tree_map_hash (m); }
5851   static bool equal (tree_map *a, tree_map *b) { return tree_map_eq (a, b); }
5852 
5853   static int
5854   keep_cache_entry (tree_map *&e)
5855   {
5856     return ggc_marked_p (e->base.from);
5857   }
5858 };
5859 
5860 static GTY((cache)) hash_table<tm_clone_hasher> *tm_clone_hash;
5861 
5862 void
5863 record_tm_clone_pair (tree o, tree n)
5864 {
5865   struct tree_map **slot, *h;
5866 
5867   if (tm_clone_hash == NULL)
5868     tm_clone_hash = hash_table<tm_clone_hasher>::create_ggc (32);
5869 
5870   h = ggc_alloc<tree_map> ();
5871   h->hash = htab_hash_pointer (o);
5872   h->base.from = o;
5873   h->to = n;
5874 
5875   slot = tm_clone_hash->find_slot_with_hash (h, h->hash, INSERT);
5876   *slot = h;
5877 }
5878 
5879 tree
5880 get_tm_clone_pair (tree o)
5881 {
5882   if (tm_clone_hash)
5883     {
5884       struct tree_map *h, in;
5885 
5886       in.base.from = o;
5887       in.hash = htab_hash_pointer (o);
5888       h = tm_clone_hash->find_with_hash (&in, in.hash);
5889       if (h)
5890 	return h->to;
5891     }
5892   return NULL_TREE;
5893 }
5894 
5895 struct tm_alias_pair
5896 {
5897   unsigned int uid;
5898   tree from;
5899   tree to;
5900 };
5901 
5902 
5903 /* Dump the actual pairs to the .tm_clone_table section.  */
5904 
5905 static void
5906 dump_tm_clone_pairs (vec<tm_alias_pair> tm_alias_pairs)
5907 {
5908   unsigned i;
5909   tm_alias_pair *p;
5910   bool switched = false;
5911 
5912   FOR_EACH_VEC_ELT (tm_alias_pairs, i, p)
5913     {
5914       tree src = p->from;
5915       tree dst = p->to;
5916       struct cgraph_node *src_n = cgraph_node::get (src);
5917       struct cgraph_node *dst_n = cgraph_node::get (dst);
5918 
5919       /* The function ipa_tm_create_version() marks the clone as needed if
5920 	 the original function was needed.  But we also mark the clone as
5921 	 needed if we ever called the clone indirectly through
5922 	 TM_GETTMCLONE.  If neither of these are true, we didn't generate
5923 	 a clone, and we didn't call it indirectly... no sense keeping it
5924 	 in the clone table.  */
5925       if (!dst_n || !dst_n->definition)
5926 	continue;
5927 
5928       /* This covers the case where we have optimized the original
5929 	 function away, and only access the transactional clone.  */
5930       if (!src_n || !src_n->definition)
5931 	continue;
5932 
5933       if (!switched)
5934 	{
5935 	  switch_to_section (targetm.asm_out.tm_clone_table_section ());
5936 	  assemble_align (POINTER_SIZE);
5937 	  switched = true;
5938 	}
5939 
5940       assemble_integer (XEXP (DECL_RTL (src), 0),
5941 			POINTER_SIZE_UNITS, POINTER_SIZE, 1);
5942       assemble_integer (XEXP (DECL_RTL (dst), 0),
5943 			POINTER_SIZE_UNITS, POINTER_SIZE, 1);
5944     }
5945 }
5946 
5947 /* Provide a default for the tm_clone_table section.  */
5948 
5949 section *
5950 default_clone_table_section (void)
5951 {
5952   return get_named_section (NULL, ".tm_clone_table", 3);
5953 }
5954 
5955 /* Helper comparison function for qsorting by the DECL_UID stored in
5956    alias_pair->emitted_diags.  */
5957 
5958 static int
5959 tm_alias_pair_cmp (const void *x, const void *y)
5960 {
5961   const tm_alias_pair *p1 = (const tm_alias_pair *) x;
5962   const tm_alias_pair *p2 = (const tm_alias_pair *) y;
5963   if (p1->uid < p2->uid)
5964     return -1;
5965   if (p1->uid > p2->uid)
5966     return 1;
5967   return 0;
5968 }
5969 
5970 void
5971 finish_tm_clone_pairs (void)
5972 {
5973   vec<tm_alias_pair> tm_alias_pairs = vNULL;
5974 
5975   if (tm_clone_hash == NULL)
5976     return;
5977 
5978   /* We need a determenistic order for the .tm_clone_table, otherwise
5979      we will get bootstrap comparison failures, so dump the hash table
5980      to a vector, sort it, and dump the vector.  */
5981 
5982   /* Dump the hashtable to a vector.  */
5983   tree_map *map;
5984   hash_table<tm_clone_hasher>::iterator iter;
5985   FOR_EACH_HASH_TABLE_ELEMENT (*tm_clone_hash, map, tree_map *, iter)
5986     {
5987       tm_alias_pair p = {DECL_UID (map->base.from), map->base.from, map->to};
5988       tm_alias_pairs.safe_push (p);
5989     }
5990   /* Sort it.  */
5991   tm_alias_pairs.qsort (tm_alias_pair_cmp);
5992 
5993   /* Dump it.  */
5994   dump_tm_clone_pairs (tm_alias_pairs);
5995 
5996   tm_clone_hash->empty ();
5997   tm_clone_hash = NULL;
5998   tm_alias_pairs.release ();
5999 }
6000 
6001 
6002 /* Emit an assembler directive to set symbol for DECL visibility to
6003    the visibility type VIS, which must not be VISIBILITY_DEFAULT.  */
6004 
6005 void
6006 default_assemble_visibility (tree decl ATTRIBUTE_UNUSED,
6007 			     int vis ATTRIBUTE_UNUSED)
6008 {
6009 #ifdef HAVE_GAS_HIDDEN
6010   static const char * const visibility_types[] = {
6011     NULL, "protected", "hidden", "internal"
6012   };
6013 
6014   const char *name, *type;
6015   tree id;
6016 
6017   id = DECL_ASSEMBLER_NAME (decl);
6018   ultimate_transparent_alias_target (&id);
6019   name = IDENTIFIER_POINTER (id);
6020 
6021   type = visibility_types[vis];
6022 
6023   fprintf (asm_out_file, "\t.%s\t", type);
6024   assemble_name (asm_out_file, name);
6025   fprintf (asm_out_file, "\n");
6026 #else
6027   if (!DECL_ARTIFICIAL (decl))
6028     warning (OPT_Wattributes, "visibility attribute not supported "
6029 	     "in this configuration; ignored");
6030 #endif
6031 }
6032 
6033 /* A helper function to call assemble_visibility when needed for a decl.  */
6034 
6035 int
6036 maybe_assemble_visibility (tree decl)
6037 {
6038   enum symbol_visibility vis = DECL_VISIBILITY (decl);
6039 
6040   if (TREE_CODE (decl) == FUNCTION_DECL
6041       && cgraph_node::get (decl)
6042       && cgraph_node::get (decl)->instrumentation_clone
6043       && cgraph_node::get (decl)->instrumented_version)
6044     vis = DECL_VISIBILITY (cgraph_node::get (decl)->instrumented_version->decl);
6045 
6046   if (vis != VISIBILITY_DEFAULT)
6047     {
6048       targetm.asm_out.assemble_visibility (decl, vis);
6049       return 1;
6050     }
6051   else
6052     return 0;
6053 }
6054 
6055 /* Returns 1 if the target configuration supports defining public symbols
6056    so that one of them will be chosen at link time instead of generating a
6057    multiply-defined symbol error, whether through the use of weak symbols or
6058    a target-specific mechanism for having duplicates discarded.  */
6059 
6060 int
6061 supports_one_only (void)
6062 {
6063   if (SUPPORTS_ONE_ONLY)
6064     return 1;
6065   return TARGET_SUPPORTS_WEAK;
6066 }
6067 
6068 /* Set up DECL as a public symbol that can be defined in multiple
6069    translation units without generating a linker error.  */
6070 
6071 void
6072 make_decl_one_only (tree decl, tree comdat_group)
6073 {
6074   struct symtab_node *symbol;
6075   gcc_assert (VAR_OR_FUNCTION_DECL_P (decl));
6076 
6077   TREE_PUBLIC (decl) = 1;
6078 
6079   if (VAR_P (decl))
6080     symbol = varpool_node::get_create (decl);
6081   else
6082     symbol = cgraph_node::get_create (decl);
6083 
6084   if (SUPPORTS_ONE_ONLY)
6085     {
6086 #ifdef MAKE_DECL_ONE_ONLY
6087       MAKE_DECL_ONE_ONLY (decl);
6088 #endif
6089       symbol->set_comdat_group (comdat_group);
6090     }
6091   else if (VAR_P (decl)
6092            && (DECL_INITIAL (decl) == 0
6093 	       || (!in_lto_p && DECL_INITIAL (decl) == error_mark_node)))
6094     DECL_COMMON (decl) = 1;
6095   else
6096     {
6097       gcc_assert (TARGET_SUPPORTS_WEAK);
6098       DECL_WEAK (decl) = 1;
6099     }
6100 }
6101 
6102 void
6103 init_varasm_once (void)
6104 {
6105   section_htab = hash_table<section_hasher>::create_ggc (31);
6106   object_block_htab = hash_table<object_block_hasher>::create_ggc (31);
6107   const_desc_htab = hash_table<tree_descriptor_hasher>::create_ggc (1009);
6108 
6109   shared_constant_pool = create_constant_pool ();
6110 
6111 #ifdef TEXT_SECTION_ASM_OP
6112   text_section = get_unnamed_section (SECTION_CODE, output_section_asm_op,
6113 				      TEXT_SECTION_ASM_OP);
6114 #endif
6115 
6116 #ifdef DATA_SECTION_ASM_OP
6117   data_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
6118 				      DATA_SECTION_ASM_OP);
6119 #endif
6120 
6121 #ifdef SDATA_SECTION_ASM_OP
6122   sdata_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op,
6123 				       SDATA_SECTION_ASM_OP);
6124 #endif
6125 
6126 #ifdef READONLY_DATA_SECTION_ASM_OP
6127   readonly_data_section = get_unnamed_section (0, output_section_asm_op,
6128 					       READONLY_DATA_SECTION_ASM_OP);
6129 #endif
6130 
6131 #ifdef CTORS_SECTION_ASM_OP
6132   ctors_section = get_unnamed_section (0, output_section_asm_op,
6133 				       CTORS_SECTION_ASM_OP);
6134 #endif
6135 
6136 #ifdef DTORS_SECTION_ASM_OP
6137   dtors_section = get_unnamed_section (0, output_section_asm_op,
6138 				       DTORS_SECTION_ASM_OP);
6139 #endif
6140 
6141 #ifdef BSS_SECTION_ASM_OP
6142   bss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
6143 				     output_section_asm_op,
6144 				     BSS_SECTION_ASM_OP);
6145 #endif
6146 
6147 #ifdef SBSS_SECTION_ASM_OP
6148   sbss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS,
6149 				      output_section_asm_op,
6150 				      SBSS_SECTION_ASM_OP);
6151 #endif
6152 
6153   tls_comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
6154 					   | SECTION_COMMON, emit_tls_common);
6155   lcomm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
6156 					| SECTION_COMMON, emit_local);
6157   comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS
6158 				       | SECTION_COMMON, emit_common);
6159 
6160 #if defined ASM_OUTPUT_ALIGNED_BSS
6161   bss_noswitch_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS,
6162 					       emit_bss);
6163 #endif
6164 
6165   targetm.asm_out.init_sections ();
6166 
6167   if (readonly_data_section == NULL)
6168     readonly_data_section = text_section;
6169 
6170 #ifdef ASM_OUTPUT_EXTERNAL
6171   pending_assemble_externals_set = new hash_set<tree>;
6172 #endif
6173 }
6174 
6175 enum tls_model
6176 decl_default_tls_model (const_tree decl)
6177 {
6178   enum tls_model kind;
6179   bool is_local;
6180 
6181   is_local = targetm.binds_local_p (decl);
6182   if (!flag_shlib)
6183     {
6184       if (is_local)
6185 	kind = TLS_MODEL_LOCAL_EXEC;
6186       else
6187 	kind = TLS_MODEL_INITIAL_EXEC;
6188     }
6189 
6190   /* Local dynamic is inefficient when we're not combining the
6191      parts of the address.  */
6192   else if (optimize && is_local)
6193     kind = TLS_MODEL_LOCAL_DYNAMIC;
6194   else
6195     kind = TLS_MODEL_GLOBAL_DYNAMIC;
6196   if (kind < flag_tls_default)
6197     kind = flag_tls_default;
6198 
6199   return kind;
6200 }
6201 
6202 /* Select a set of attributes for section NAME based on the properties
6203    of DECL and whether or not RELOC indicates that DECL's initializer
6204    might contain runtime relocations.
6205 
6206    We make the section read-only and executable for a function decl,
6207    read-only for a const data decl, and writable for a non-const data decl.  */
6208 
6209 unsigned int
6210 default_section_type_flags (tree decl, const char *name, int reloc)
6211 {
6212   unsigned int flags;
6213 
6214   if (decl && TREE_CODE (decl) == FUNCTION_DECL)
6215     flags = SECTION_CODE;
6216   else if (decl)
6217     {
6218       enum section_category category
6219 	= categorize_decl_for_section (decl, reloc);
6220       if (decl_readonly_section_1 (category))
6221 	flags = 0;
6222       else if (category == SECCAT_DATA_REL_RO
6223 	       || category == SECCAT_DATA_REL_RO_LOCAL)
6224 	flags = SECTION_WRITE | SECTION_RELRO;
6225       else
6226 	flags = SECTION_WRITE;
6227     }
6228   else
6229     {
6230       flags = SECTION_WRITE;
6231       if (strcmp (name, ".data.rel.ro") == 0
6232 	  || strcmp (name, ".data.rel.ro.local") == 0)
6233 	flags |= SECTION_RELRO;
6234     }
6235 
6236   if (decl && DECL_P (decl) && DECL_COMDAT_GROUP (decl))
6237     flags |= SECTION_LINKONCE;
6238 
6239   if (strcmp (name, ".vtable_map_vars") == 0)
6240     flags |= SECTION_LINKONCE;
6241 
6242   if (decl && VAR_P (decl) && DECL_THREAD_LOCAL_P (decl))
6243     flags |= SECTION_TLS | SECTION_WRITE;
6244 
6245   if (strcmp (name, ".bss") == 0
6246       || strncmp (name, ".bss.", 5) == 0
6247       || strncmp (name, ".gnu.linkonce.b.", 16) == 0
6248       || strcmp (name, ".persistent.bss") == 0
6249       || strcmp (name, ".sbss") == 0
6250       || strncmp (name, ".sbss.", 6) == 0
6251       || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
6252     flags |= SECTION_BSS;
6253 
6254   if (strcmp (name, ".tdata") == 0
6255       || strncmp (name, ".tdata.", 7) == 0
6256       || strncmp (name, ".gnu.linkonce.td.", 17) == 0)
6257     flags |= SECTION_TLS;
6258 
6259   if (strcmp (name, ".tbss") == 0
6260       || strncmp (name, ".tbss.", 6) == 0
6261       || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
6262     flags |= SECTION_TLS | SECTION_BSS;
6263 
6264   /* These three sections have special ELF types.  They are neither
6265      SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
6266      want to print a section type (@progbits or @nobits).  If someone
6267      is silly enough to emit code or TLS variables to one of these
6268      sections, then don't handle them specially.  */
6269   if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
6270       && (strcmp (name, ".init_array") == 0
6271 	  || strcmp (name, ".fini_array") == 0
6272 	  || strcmp (name, ".preinit_array") == 0))
6273     flags |= SECTION_NOTYPE;
6274 
6275   return flags;
6276 }
6277 
6278 /* Return true if the target supports some form of global BSS,
6279    either through bss_noswitch_section, or by selecting a BSS
6280    section in TARGET_ASM_SELECT_SECTION.  */
6281 
6282 bool
6283 have_global_bss_p (void)
6284 {
6285   return bss_noswitch_section || targetm.have_switchable_bss_sections;
6286 }
6287 
6288 /* Output assembly to switch to section NAME with attribute FLAGS.
6289    Four variants for common object file formats.  */
6290 
6291 void
6292 default_no_named_section (const char *name ATTRIBUTE_UNUSED,
6293 			  unsigned int flags ATTRIBUTE_UNUSED,
6294 			  tree decl ATTRIBUTE_UNUSED)
6295 {
6296   /* Some object formats don't support named sections at all.  The
6297      front-end should already have flagged this as an error.  */
6298   gcc_unreachable ();
6299 }
6300 
6301 #ifndef TLS_SECTION_ASM_FLAG
6302 #define TLS_SECTION_ASM_FLAG 'T'
6303 #endif
6304 
6305 void
6306 default_elf_asm_named_section (const char *name, unsigned int flags,
6307 			       tree decl)
6308 {
6309   char flagchars[11], *f = flagchars;
6310   unsigned int numeric_value = 0;
6311 
6312   /* If we have already declared this section, we can use an
6313      abbreviated form to switch back to it -- unless this section is
6314      part of a COMDAT groups, in which case GAS requires the full
6315      declaration every time.  */
6316   if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
6317       && (flags & SECTION_DECLARED))
6318     {
6319       fprintf (asm_out_file, "\t.section\t%s\n", name);
6320       return;
6321     }
6322 
6323   /* If we have a machine specific flag, then use the numeric value to pass
6324      this on to GAS.  */
6325   if (targetm.asm_out.elf_flags_numeric (flags, &numeric_value))
6326       snprintf (f, sizeof (flagchars), "0x%08x", numeric_value);
6327   else
6328     {
6329       if (!(flags & SECTION_DEBUG))
6330 	*f++ = 'a';
6331 #if defined (HAVE_GAS_SECTION_EXCLUDE) && HAVE_GAS_SECTION_EXCLUDE == 1
6332       if (flags & SECTION_EXCLUDE)
6333 	*f++ = 'e';
6334 #endif
6335       if (flags & SECTION_WRITE)
6336 	*f++ = 'w';
6337       if (flags & SECTION_CODE)
6338 	*f++ = 'x';
6339       if (flags & SECTION_SMALL)
6340 	*f++ = 's';
6341       if (flags & SECTION_MERGE)
6342 	*f++ = 'M';
6343       if (flags & SECTION_STRINGS)
6344 	*f++ = 'S';
6345       if (flags & SECTION_TLS)
6346 	*f++ = TLS_SECTION_ASM_FLAG;
6347       if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
6348 	*f++ = 'G';
6349 #ifdef MACH_DEP_SECTION_ASM_FLAG
6350       if (flags & SECTION_MACH_DEP)
6351 	*f++ = MACH_DEP_SECTION_ASM_FLAG;
6352 #endif
6353       *f = '\0';
6354     }
6355 
6356   fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
6357 
6358   if (!(flags & SECTION_NOTYPE))
6359     {
6360       const char *type;
6361       const char *format;
6362 
6363       if (flags & SECTION_BSS)
6364 	type = "nobits";
6365       else
6366 	type = "progbits";
6367 
6368       format = ",@%s";
6369       /* On platforms that use "@" as the assembly comment character,
6370 	 use "%" instead.  */
6371       if (strcmp (ASM_COMMENT_START, "@") == 0)
6372 	format = ",%%%s";
6373       fprintf (asm_out_file, format, type);
6374 
6375       if (flags & SECTION_ENTSIZE)
6376 	fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
6377       if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
6378 	{
6379 	  if (TREE_CODE (decl) == IDENTIFIER_NODE)
6380 	    fprintf (asm_out_file, ",%s,comdat", IDENTIFIER_POINTER (decl));
6381 	  else
6382 	    fprintf (asm_out_file, ",%s,comdat",
6383 		     IDENTIFIER_POINTER (DECL_COMDAT_GROUP (decl)));
6384 	}
6385     }
6386 
6387   putc ('\n', asm_out_file);
6388 }
6389 
6390 void
6391 default_coff_asm_named_section (const char *name, unsigned int flags,
6392 				tree decl ATTRIBUTE_UNUSED)
6393 {
6394   char flagchars[8], *f = flagchars;
6395 
6396   if (flags & SECTION_WRITE)
6397     *f++ = 'w';
6398   if (flags & SECTION_CODE)
6399     *f++ = 'x';
6400   *f = '\0';
6401 
6402   fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
6403 }
6404 
6405 void
6406 default_pe_asm_named_section (const char *name, unsigned int flags,
6407 			      tree decl)
6408 {
6409   default_coff_asm_named_section (name, flags, decl);
6410 
6411   if (flags & SECTION_LINKONCE)
6412     {
6413       /* Functions may have been compiled at various levels of
6414          optimization so we can't use `same_size' here.
6415          Instead, have the linker pick one.  */
6416       fprintf (asm_out_file, "\t.linkonce %s\n",
6417 	       (flags & SECTION_CODE ? "discard" : "same_size"));
6418     }
6419 }
6420 
6421 /* The lame default section selector.  */
6422 
6423 section *
6424 default_select_section (tree decl, int reloc,
6425 			unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
6426 {
6427   if (DECL_P (decl))
6428     {
6429       if (decl_readonly_section (decl, reloc))
6430 	return readonly_data_section;
6431     }
6432   else if (TREE_CODE (decl) == CONSTRUCTOR)
6433     {
6434       if (! ((flag_pic && reloc)
6435 	     || !TREE_READONLY (decl)
6436 	     || TREE_SIDE_EFFECTS (decl)
6437 	     || !TREE_CONSTANT (decl)))
6438 	return readonly_data_section;
6439     }
6440   else if (TREE_CODE (decl) == STRING_CST)
6441     return readonly_data_section;
6442   else if (! (flag_pic && reloc))
6443     return readonly_data_section;
6444 
6445   return data_section;
6446 }
6447 
6448 enum section_category
6449 categorize_decl_for_section (const_tree decl, int reloc)
6450 {
6451   enum section_category ret;
6452 
6453   if (TREE_CODE (decl) == FUNCTION_DECL)
6454     return SECCAT_TEXT;
6455   else if (TREE_CODE (decl) == STRING_CST)
6456     {
6457       if ((flag_sanitize & SANITIZE_ADDRESS)
6458 	  && asan_protect_global (CONST_CAST_TREE (decl)))
6459       /* or !flag_merge_constants */
6460         return SECCAT_RODATA;
6461       else
6462 	return SECCAT_RODATA_MERGE_STR;
6463     }
6464   else if (VAR_P (decl))
6465     {
6466       if (bss_initializer_p (decl))
6467 	ret = SECCAT_BSS;
6468       else if (! TREE_READONLY (decl)
6469 	       || TREE_SIDE_EFFECTS (decl)
6470 	       || (DECL_INITIAL (decl)
6471 		   && ! TREE_CONSTANT (DECL_INITIAL (decl))))
6472 	{
6473 	  /* Here the reloc_rw_mask is not testing whether the section should
6474 	     be read-only or not, but whether the dynamic link will have to
6475 	     do something.  If so, we wish to segregate the data in order to
6476 	     minimize cache misses inside the dynamic linker.  */
6477 	  if (reloc & targetm.asm_out.reloc_rw_mask ())
6478 	    ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL;
6479 	  else
6480 	    ret = SECCAT_DATA;
6481 	}
6482       else if (reloc & targetm.asm_out.reloc_rw_mask ())
6483 	ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO;
6484       else if (reloc || flag_merge_constants < 2
6485 	       || ((flag_sanitize & SANITIZE_ADDRESS)
6486 		   && asan_protect_global (CONST_CAST_TREE (decl))))
6487 	/* C and C++ don't allow different variables to share the same
6488 	   location.  -fmerge-all-constants allows even that (at the
6489 	   expense of not conforming).  */
6490 	ret = SECCAT_RODATA;
6491       else if (DECL_INITIAL (decl)
6492 	       && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
6493 	ret = SECCAT_RODATA_MERGE_STR_INIT;
6494       else
6495 	ret = SECCAT_RODATA_MERGE_CONST;
6496     }
6497   else if (TREE_CODE (decl) == CONSTRUCTOR)
6498     {
6499       if ((reloc & targetm.asm_out.reloc_rw_mask ())
6500 	  || TREE_SIDE_EFFECTS (decl)
6501 	  || ! TREE_CONSTANT (decl))
6502 	ret = SECCAT_DATA;
6503       else
6504 	ret = SECCAT_RODATA;
6505     }
6506   else
6507     ret = SECCAT_RODATA;
6508 
6509   /* There are no read-only thread-local sections.  */
6510   if (VAR_P (decl) && DECL_THREAD_LOCAL_P (decl))
6511     {
6512       /* Note that this would be *just* SECCAT_BSS, except that there's
6513 	 no concept of a read-only thread-local-data section.  */
6514       if (ret == SECCAT_BSS
6515 	       || (flag_zero_initialized_in_bss
6516 		   && initializer_zerop (DECL_INITIAL (decl))))
6517 	ret = SECCAT_TBSS;
6518       else
6519 	ret = SECCAT_TDATA;
6520     }
6521 
6522   /* If the target uses small data sections, select it.  */
6523   else if (targetm.in_small_data_p (decl))
6524     {
6525       if (ret == SECCAT_BSS)
6526 	ret = SECCAT_SBSS;
6527       else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
6528 	ret = SECCAT_SRODATA;
6529       else
6530 	ret = SECCAT_SDATA;
6531     }
6532 
6533   return ret;
6534 }
6535 
6536 static bool
6537 decl_readonly_section_1 (enum section_category category)
6538 {
6539   switch (category)
6540     {
6541     case SECCAT_RODATA:
6542     case SECCAT_RODATA_MERGE_STR:
6543     case SECCAT_RODATA_MERGE_STR_INIT:
6544     case SECCAT_RODATA_MERGE_CONST:
6545     case SECCAT_SRODATA:
6546       return true;
6547     default:
6548       return false;
6549     }
6550 }
6551 
6552 bool
6553 decl_readonly_section (const_tree decl, int reloc)
6554 {
6555   return decl_readonly_section_1 (categorize_decl_for_section (decl, reloc));
6556 }
6557 
6558 /* Select a section based on the above categorization.  */
6559 
6560 section *
6561 default_elf_select_section (tree decl, int reloc,
6562 			    unsigned HOST_WIDE_INT align)
6563 {
6564   const char *sname;
6565   switch (categorize_decl_for_section (decl, reloc))
6566     {
6567     case SECCAT_TEXT:
6568       /* We're not supposed to be called on FUNCTION_DECLs.  */
6569       gcc_unreachable ();
6570     case SECCAT_RODATA:
6571       return readonly_data_section;
6572     case SECCAT_RODATA_MERGE_STR:
6573       return mergeable_string_section (decl, align, 0);
6574     case SECCAT_RODATA_MERGE_STR_INIT:
6575       return mergeable_string_section (DECL_INITIAL (decl), align, 0);
6576     case SECCAT_RODATA_MERGE_CONST:
6577       return mergeable_constant_section (DECL_MODE (decl), align, 0);
6578     case SECCAT_SRODATA:
6579       sname = ".sdata2";
6580       break;
6581     case SECCAT_DATA:
6582       return data_section;
6583     case SECCAT_DATA_REL:
6584       sname = ".data.rel";
6585       break;
6586     case SECCAT_DATA_REL_LOCAL:
6587       sname = ".data.rel.local";
6588       break;
6589     case SECCAT_DATA_REL_RO:
6590       sname = ".data.rel.ro";
6591       break;
6592     case SECCAT_DATA_REL_RO_LOCAL:
6593       sname = ".data.rel.ro.local";
6594       break;
6595     case SECCAT_SDATA:
6596       sname = ".sdata";
6597       break;
6598     case SECCAT_TDATA:
6599       sname = ".tdata";
6600       break;
6601     case SECCAT_BSS:
6602       if (bss_section)
6603 	return bss_section;
6604       sname = ".bss";
6605       break;
6606     case SECCAT_SBSS:
6607       sname = ".sbss";
6608       break;
6609     case SECCAT_TBSS:
6610       sname = ".tbss";
6611       break;
6612     default:
6613       gcc_unreachable ();
6614     }
6615 
6616   return get_named_section (decl, sname, reloc);
6617 }
6618 
6619 /* Construct a unique section name based on the decl name and the
6620    categorization performed above.  */
6621 
6622 void
6623 default_unique_section (tree decl, int reloc)
6624 {
6625   /* We only need to use .gnu.linkonce if we don't have COMDAT groups.  */
6626   bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
6627   const char *prefix, *name, *linkonce;
6628   char *string;
6629   tree id;
6630 
6631   switch (categorize_decl_for_section (decl, reloc))
6632     {
6633     case SECCAT_TEXT:
6634       prefix = one_only ? ".t" : ".text";
6635       break;
6636     case SECCAT_RODATA:
6637     case SECCAT_RODATA_MERGE_STR:
6638     case SECCAT_RODATA_MERGE_STR_INIT:
6639     case SECCAT_RODATA_MERGE_CONST:
6640       prefix = one_only ? ".r" : ".rodata";
6641       break;
6642     case SECCAT_SRODATA:
6643       prefix = one_only ? ".s2" : ".sdata2";
6644       break;
6645     case SECCAT_DATA:
6646       prefix = one_only ? ".d" : ".data";
6647       break;
6648     case SECCAT_DATA_REL:
6649       prefix = one_only ? ".d.rel" : ".data.rel";
6650       break;
6651     case SECCAT_DATA_REL_LOCAL:
6652       prefix = one_only ? ".d.rel.local" : ".data.rel.local";
6653       break;
6654     case SECCAT_DATA_REL_RO:
6655       prefix = one_only ? ".d.rel.ro" : ".data.rel.ro";
6656       break;
6657     case SECCAT_DATA_REL_RO_LOCAL:
6658       prefix = one_only ? ".d.rel.ro.local" : ".data.rel.ro.local";
6659       break;
6660     case SECCAT_SDATA:
6661       prefix = one_only ? ".s" : ".sdata";
6662       break;
6663     case SECCAT_BSS:
6664       prefix = one_only ? ".b" : ".bss";
6665       break;
6666     case SECCAT_SBSS:
6667       prefix = one_only ? ".sb" : ".sbss";
6668       break;
6669     case SECCAT_TDATA:
6670       prefix = one_only ? ".td" : ".tdata";
6671       break;
6672     case SECCAT_TBSS:
6673       prefix = one_only ? ".tb" : ".tbss";
6674       break;
6675     default:
6676       gcc_unreachable ();
6677     }
6678 
6679   id = DECL_ASSEMBLER_NAME (decl);
6680   ultimate_transparent_alias_target (&id);
6681   name = IDENTIFIER_POINTER (id);
6682   name = targetm.strip_name_encoding (name);
6683 
6684   /* If we're using one_only, then there needs to be a .gnu.linkonce
6685      prefix to the section name.  */
6686   linkonce = one_only ? ".gnu.linkonce" : "";
6687 
6688   string = ACONCAT ((linkonce, prefix, ".", name, NULL));
6689 
6690   set_decl_section_name (decl, string);
6691 }
6692 
6693 /* Subroutine of compute_reloc_for_rtx for leaf rtxes.  */
6694 
6695 static int
6696 compute_reloc_for_rtx_1 (const_rtx x)
6697 {
6698   switch (GET_CODE (x))
6699     {
6700     case SYMBOL_REF:
6701       return SYMBOL_REF_LOCAL_P (x) ? 1 : 2;
6702     case LABEL_REF:
6703       return 1;
6704     default:
6705       return 0;
6706     }
6707 }
6708 
6709 /* Like compute_reloc_for_constant, except for an RTX.  The return value
6710    is a mask for which bit 1 indicates a global relocation, and bit 0
6711    indicates a local relocation.  */
6712 
6713 static int
6714 compute_reloc_for_rtx (const_rtx x)
6715 {
6716   switch (GET_CODE (x))
6717     {
6718     case SYMBOL_REF:
6719     case LABEL_REF:
6720       return compute_reloc_for_rtx_1 (x);
6721 
6722     case CONST:
6723       {
6724 	int reloc = 0;
6725 	subrtx_iterator::array_type array;
6726 	FOR_EACH_SUBRTX (iter, array, x, ALL)
6727 	  reloc |= compute_reloc_for_rtx_1 (*iter);
6728 	return reloc;
6729       }
6730 
6731     default:
6732       return 0;
6733     }
6734 }
6735 
6736 section *
6737 default_select_rtx_section (machine_mode mode ATTRIBUTE_UNUSED,
6738 			    rtx x,
6739 			    unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
6740 {
6741   if (compute_reloc_for_rtx (x) & targetm.asm_out.reloc_rw_mask ())
6742     return data_section;
6743   else
6744     return readonly_data_section;
6745 }
6746 
6747 section *
6748 default_elf_select_rtx_section (machine_mode mode, rtx x,
6749 				unsigned HOST_WIDE_INT align)
6750 {
6751   int reloc = compute_reloc_for_rtx (x);
6752 
6753   /* ??? Handle small data here somehow.  */
6754 
6755   if (reloc & targetm.asm_out.reloc_rw_mask ())
6756     {
6757       if (reloc == 1)
6758 	return get_named_section (NULL, ".data.rel.ro.local", 1);
6759       else
6760 	return get_named_section (NULL, ".data.rel.ro", 3);
6761     }
6762 
6763   return mergeable_constant_section (mode, align, 0);
6764 }
6765 
6766 /* Set the generally applicable flags on the SYMBOL_REF for EXP.  */
6767 
6768 void
6769 default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
6770 {
6771   rtx symbol;
6772   int flags;
6773 
6774   /* Careful not to prod global register variables.  */
6775   if (!MEM_P (rtl))
6776     return;
6777   symbol = XEXP (rtl, 0);
6778   if (GET_CODE (symbol) != SYMBOL_REF)
6779     return;
6780 
6781   flags = SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_HAS_BLOCK_INFO;
6782   if (TREE_CODE (decl) == FUNCTION_DECL)
6783     flags |= SYMBOL_FLAG_FUNCTION;
6784   if (targetm.binds_local_p (decl))
6785     flags |= SYMBOL_FLAG_LOCAL;
6786   if (VAR_P (decl) && DECL_THREAD_LOCAL_P (decl))
6787     flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT;
6788   else if (targetm.in_small_data_p (decl))
6789     flags |= SYMBOL_FLAG_SMALL;
6790   /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names?  Without
6791      being PUBLIC, the thing *must* be defined in this translation unit.
6792      Prevent this buglet from being propagated into rtl code as well.  */
6793   if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
6794     flags |= SYMBOL_FLAG_EXTERNAL;
6795 
6796   SYMBOL_REF_FLAGS (symbol) = flags;
6797 }
6798 
6799 /* By default, we do nothing for encode_section_info, so we need not
6800    do anything but discard the '*' marker.  */
6801 
6802 const char *
6803 default_strip_name_encoding (const char *str)
6804 {
6805   return str + (*str == '*');
6806 }
6807 
6808 #ifdef ASM_OUTPUT_DEF
6809 /* The default implementation of TARGET_ASM_OUTPUT_ANCHOR.  Define the
6810    anchor relative to ".", the current section position.  */
6811 
6812 void
6813 default_asm_output_anchor (rtx symbol)
6814 {
6815   char buffer[100];
6816 
6817   sprintf (buffer, "*. + " HOST_WIDE_INT_PRINT_DEC,
6818 	   SYMBOL_REF_BLOCK_OFFSET (symbol));
6819   ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer);
6820 }
6821 #endif
6822 
6823 /* The default implementation of TARGET_USE_ANCHORS_FOR_SYMBOL_P.  */
6824 
6825 bool
6826 default_use_anchors_for_symbol_p (const_rtx symbol)
6827 {
6828   section *sect;
6829   tree decl;
6830 
6831   /* Don't use anchors for mergeable sections.  The linker might move
6832      the objects around.  */
6833   sect = SYMBOL_REF_BLOCK (symbol)->sect;
6834   if (sect->common.flags & SECTION_MERGE)
6835     return false;
6836 
6837   /* Don't use anchors for small data sections.  The small data register
6838      acts as an anchor for such sections.  */
6839   if (sect->common.flags & SECTION_SMALL)
6840     return false;
6841 
6842   decl = SYMBOL_REF_DECL (symbol);
6843   if (decl && DECL_P (decl))
6844     {
6845       /* Don't use section anchors for decls that might be defined or
6846 	 usurped by other modules.  */
6847       if (TREE_PUBLIC (decl) && !decl_binds_to_current_def_p (decl))
6848 	return false;
6849 
6850       /* Don't use section anchors for decls that will be placed in a
6851 	 small data section.  */
6852       /* ??? Ideally, this check would be redundant with the SECTION_SMALL
6853 	 one above.  The problem is that we only use SECTION_SMALL for
6854 	 sections that should be marked as small in the section directive.  */
6855       if (targetm.in_small_data_p (decl))
6856 	return false;
6857 
6858       /* Don't use section anchors for decls that won't fit inside a single
6859 	 anchor range to reduce the amount of instructions required to refer
6860 	 to the entire declaration.  */
6861       if (DECL_SIZE_UNIT (decl) == NULL_TREE
6862 	  || !tree_fits_uhwi_p (DECL_SIZE_UNIT (decl))
6863 	  || (tree_to_uhwi (DECL_SIZE_UNIT (decl))
6864 	      >= (unsigned HOST_WIDE_INT) targetm.max_anchor_offset))
6865 	return false;
6866 
6867     }
6868   return true;
6869 }
6870 
6871 /* Return true when RESOLUTION indicate that symbol will be bound to the
6872    definition provided by current .o file.  */
6873 
6874 static bool
6875 resolution_to_local_definition_p (enum ld_plugin_symbol_resolution resolution)
6876 {
6877   return (resolution == LDPR_PREVAILING_DEF
6878 	  || resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
6879 	  || resolution == LDPR_PREVAILING_DEF_IRONLY);
6880 }
6881 
6882 /* Return true when RESOLUTION indicate that symbol will be bound locally
6883    within current executable or DSO.  */
6884 
6885 static bool
6886 resolution_local_p (enum ld_plugin_symbol_resolution resolution)
6887 {
6888   return (resolution == LDPR_PREVAILING_DEF
6889 	  || resolution == LDPR_PREVAILING_DEF_IRONLY
6890 	  || resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
6891 	  || resolution == LDPR_PREEMPTED_REG
6892 	  || resolution == LDPR_PREEMPTED_IR
6893 	  || resolution == LDPR_RESOLVED_IR
6894 	  || resolution == LDPR_RESOLVED_EXEC);
6895 }
6896 
6897 /* COMMON_LOCAL_P is true means that the linker can guarantee that an
6898    uninitialized common symbol in the executable will still be defined
6899    (through COPY relocation) in the executable.  */
6900 
6901 bool
6902 default_binds_local_p_3 (const_tree exp, bool shlib, bool weak_dominate,
6903 			 bool extern_protected_data, bool common_local_p)
6904 {
6905   /* A non-decl is an entry in the constant pool.  */
6906   if (!DECL_P (exp))
6907     return true;
6908 
6909   /* Weakrefs may not bind locally, even though the weakref itself is always
6910      static and therefore local.  Similarly, the resolver for ifunc functions
6911      might resolve to a non-local function.
6912      FIXME: We can resolve the weakref case more curefuly by looking at the
6913      weakref alias.  */
6914   if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp))
6915       || (TREE_CODE (exp) == FUNCTION_DECL
6916 	  && lookup_attribute ("ifunc", DECL_ATTRIBUTES (exp))))
6917     return false;
6918 
6919   /* Static variables are always local.  */
6920   if (! TREE_PUBLIC (exp))
6921     return true;
6922 
6923   /* With resolution file in hand, take look into resolutions.
6924      We can't just return true for resolved_locally symbols,
6925      because dynamic linking might overwrite symbols
6926      in shared libraries.  */
6927   bool resolved_locally = false;
6928 
6929   bool uninited_common = (DECL_COMMON (exp)
6930 			  && (DECL_INITIAL (exp) == NULL
6931 			      || (!in_lto_p
6932 				  && DECL_INITIAL (exp) == error_mark_node)));
6933 
6934   /* A non-external variable is defined locally only if it isn't
6935      uninitialized COMMON variable or common_local_p is true.  */
6936   bool defined_locally = (!DECL_EXTERNAL (exp)
6937 			  && (!uninited_common || common_local_p));
6938   if (symtab_node *node = symtab_node::get (exp))
6939     {
6940       if (node->in_other_partition)
6941 	defined_locally = true;
6942       if (node->can_be_discarded_p ())
6943 	;
6944       else if (resolution_to_local_definition_p (node->resolution))
6945 	defined_locally = resolved_locally = true;
6946       else if (resolution_local_p (node->resolution))
6947 	resolved_locally = true;
6948     }
6949   if (defined_locally && weak_dominate && !shlib)
6950     resolved_locally = true;
6951 
6952   /* Undefined weak symbols are never defined locally.  */
6953   if (DECL_WEAK (exp) && !defined_locally)
6954     return false;
6955 
6956   /* A symbol is local if the user has said explicitly that it will be,
6957      or if we have a definition for the symbol.  We cannot infer visibility
6958      for undefined symbols.  */
6959   if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT
6960       && (TREE_CODE (exp) == FUNCTION_DECL
6961 	  || !extern_protected_data
6962 	  || DECL_VISIBILITY (exp) != VISIBILITY_PROTECTED)
6963       && (DECL_VISIBILITY_SPECIFIED (exp) || defined_locally))
6964     return true;
6965 
6966   /* If PIC, then assume that any global name can be overridden by
6967      symbols resolved from other modules.  */
6968   if (shlib)
6969     return false;
6970 
6971   /* Variables defined outside this object might not be local.  */
6972   if (DECL_EXTERNAL (exp) && !resolved_locally)
6973     return false;
6974 
6975   /* Non-dominant weak symbols are not defined locally.  */
6976   if (DECL_WEAK (exp) && !resolved_locally)
6977     return false;
6978 
6979   /* Uninitialized COMMON variable may be unified with symbols
6980      resolved from other modules.  */
6981   if (uninited_common && !resolved_locally)
6982     return false;
6983 
6984   /* Otherwise we're left with initialized (or non-common) global data
6985      which is of necessity defined locally.  */
6986   return true;
6987 }
6988 
6989 /* Assume ELF-ish defaults, since that's pretty much the most liberal
6990    wrt cross-module name binding.  */
6991 
6992 bool
6993 default_binds_local_p (const_tree exp)
6994 {
6995   return default_binds_local_p_3 (exp, flag_shlib != 0, true, false, false);
6996 }
6997 
6998 /* Similar to default_binds_local_p, but common symbol may be local and
6999    extern protected data is non-local.  */
7000 
7001 bool
7002 default_binds_local_p_2 (const_tree exp)
7003 {
7004   return default_binds_local_p_3 (exp, flag_shlib != 0, true, true,
7005 				  !flag_pic);
7006 }
7007 
7008 bool
7009 default_binds_local_p_1 (const_tree exp, int shlib)
7010 {
7011   return default_binds_local_p_3 (exp, shlib != 0, false, false, false);
7012 }
7013 
7014 /* Return true when references to DECL must bind to current definition in
7015    final executable.
7016 
7017    The condition is usually equivalent to whether the function binds to the
7018    current module (shared library or executable), that is to binds_local_p.
7019    We use this fact to avoid need for another target hook and implement
7020    the logic using binds_local_p and just special cases where
7021    decl_binds_to_current_def_p is stronger than binds_local_p.  In particular
7022    the weak definitions (that can be overwritten at linktime by other
7023    definition from different object file) and when resolution info is available
7024    we simply use the knowledge passed to us by linker plugin.  */
7025 bool
7026 decl_binds_to_current_def_p (const_tree decl)
7027 {
7028   gcc_assert (DECL_P (decl));
7029   if (!targetm.binds_local_p (decl))
7030     return false;
7031   if (!TREE_PUBLIC (decl))
7032     return true;
7033 
7034   /* When resolution is available, just use it.  */
7035   if (symtab_node *node = symtab_node::get (decl))
7036     {
7037       if (node->resolution != LDPR_UNKNOWN
7038 	  && !node->can_be_discarded_p ())
7039 	return resolution_to_local_definition_p (node->resolution);
7040     }
7041 
7042   /* Otherwise we have to assume the worst for DECL_WEAK (hidden weaks
7043      binds locally but still can be overwritten), DECL_COMMON (can be merged
7044      with a non-common definition somewhere in the same module) or
7045      DECL_EXTERNAL.
7046      This rely on fact that binds_local_p behave as decl_replaceable_p
7047      for all other declaration types.  */
7048   if (DECL_WEAK (decl))
7049     return false;
7050   if (DECL_COMMON (decl)
7051       && (DECL_INITIAL (decl) == NULL
7052 	  || (!in_lto_p && DECL_INITIAL (decl) == error_mark_node)))
7053     return false;
7054   if (DECL_EXTERNAL (decl))
7055     return false;
7056   return true;
7057 }
7058 
7059 /* A replaceable function or variable is one which may be replaced
7060    at link-time with an entirely different definition, provided that the
7061    replacement has the same type.  For example, functions declared
7062    with __attribute__((weak)) on most systems are replaceable.
7063 
7064    COMDAT functions are not replaceable, since all definitions of the
7065    function must be equivalent.  It is important that COMDAT functions
7066    not be treated as replaceable so that use of C++ template
7067    instantiations is not penalized.  */
7068 
7069 bool
7070 decl_replaceable_p (tree decl)
7071 {
7072   gcc_assert (DECL_P (decl));
7073   if (!TREE_PUBLIC (decl) || DECL_COMDAT (decl))
7074     return false;
7075   if (!flag_semantic_interposition
7076       && !DECL_WEAK (decl))
7077     return false;
7078   return !decl_binds_to_current_def_p (decl);
7079 }
7080 
7081 /* Default function to output code that will globalize a label.  A
7082    target must define GLOBAL_ASM_OP or provide its own function to
7083    globalize a label.  */
7084 #ifdef GLOBAL_ASM_OP
7085 void
7086 default_globalize_label (FILE * stream, const char *name)
7087 {
7088   fputs (GLOBAL_ASM_OP, stream);
7089   assemble_name (stream, name);
7090   putc ('\n', stream);
7091 }
7092 #endif /* GLOBAL_ASM_OP */
7093 
7094 /* Default function to output code that will globalize a declaration.  */
7095 void
7096 default_globalize_decl_name (FILE * stream, tree decl)
7097 {
7098   const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
7099   targetm.asm_out.globalize_label (stream, name);
7100 }
7101 
7102 /* Default function to output a label for unwind information.  The
7103    default is to do nothing.  A target that needs nonlocal labels for
7104    unwind information must provide its own function to do this.  */
7105 void
7106 default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
7107 			   tree decl ATTRIBUTE_UNUSED,
7108 			   int for_eh ATTRIBUTE_UNUSED,
7109 			   int empty ATTRIBUTE_UNUSED)
7110 {
7111 }
7112 
7113 /* Default function to output a label to divide up the exception table.
7114    The default is to do nothing.  A target that needs/wants to divide
7115    up the table must provide it's own function to do this.  */
7116 void
7117 default_emit_except_table_label (FILE * stream ATTRIBUTE_UNUSED)
7118 {
7119 }
7120 
7121 /* This is how to output an internal numbered label where PREFIX is
7122    the class of label and LABELNO is the number within the class.  */
7123 
7124 void
7125 default_generate_internal_label (char *buf, const char *prefix,
7126 				 unsigned long labelno)
7127 {
7128   ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
7129 }
7130 
7131 /* This is how to output an internal numbered label where PREFIX is
7132    the class of label and LABELNO is the number within the class.  */
7133 
7134 void
7135 default_internal_label (FILE *stream, const char *prefix,
7136 			unsigned long labelno)
7137 {
7138   char *const buf = (char *) alloca (40 + strlen (prefix));
7139   ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
7140   ASM_OUTPUT_INTERNAL_LABEL (stream, buf);
7141 }
7142 
7143 
7144 /* The default implementation of ASM_DECLARE_CONSTANT_NAME.  */
7145 
7146 void
7147 default_asm_declare_constant_name (FILE *file, const char *name,
7148 				   const_tree exp ATTRIBUTE_UNUSED,
7149 				   HOST_WIDE_INT size ATTRIBUTE_UNUSED)
7150 {
7151   assemble_label (file, name);
7152 }
7153 
7154 /* This is the default behavior at the beginning of a file.  It's
7155    controlled by two other target-hook toggles.  */
7156 void
7157 default_file_start (void)
7158 {
7159   if (targetm.asm_file_start_app_off
7160       && !(flag_verbose_asm || flag_debug_asm || flag_dump_rtl_in_asm))
7161     fputs (ASM_APP_OFF, asm_out_file);
7162 
7163   if (targetm.asm_file_start_file_directive)
7164     {
7165       /* LTO produced units have no meaningful main_input_filename.  */
7166       if (in_lto_p)
7167 	output_file_directive (asm_out_file, "<artificial>");
7168       else
7169 	output_file_directive (asm_out_file, main_input_filename);
7170     }
7171 }
7172 
7173 /* This is a generic routine suitable for use as TARGET_ASM_FILE_END
7174    which emits a special section directive used to indicate whether or
7175    not this object file needs an executable stack.  This is primarily
7176    a GNU extension to ELF but could be used on other targets.  */
7177 
7178 int trampolines_created;
7179 
7180 void
7181 file_end_indicate_exec_stack (void)
7182 {
7183   unsigned int flags = SECTION_DEBUG;
7184   if (trampolines_created)
7185     flags |= SECTION_CODE;
7186 
7187   switch_to_section (get_section (".note.GNU-stack", flags, NULL));
7188 }
7189 
7190 /* Emit a special section directive to indicate that this object file
7191    was compiled with -fsplit-stack.  This is used to let the linker
7192    detect calls between split-stack code and non-split-stack code, so
7193    that it can modify the split-stack code to allocate a sufficiently
7194    large stack.  We emit another special section if there are any
7195    functions in this file which have the no_split_stack attribute, to
7196    prevent the linker from warning about being unable to convert the
7197    functions if they call non-split-stack code.  */
7198 
7199 void
7200 file_end_indicate_split_stack (void)
7201 {
7202   if (flag_split_stack)
7203     {
7204       switch_to_section (get_section (".note.GNU-split-stack", SECTION_DEBUG,
7205 				      NULL));
7206       if (saw_no_split_stack)
7207 	switch_to_section (get_section (".note.GNU-no-split-stack",
7208 					SECTION_DEBUG, NULL));
7209     }
7210 }
7211 
7212 /* Output DIRECTIVE (a C string) followed by a newline.  This is used as
7213    a get_unnamed_section callback.  */
7214 
7215 void
7216 output_section_asm_op (const void *directive)
7217 {
7218   fprintf (asm_out_file, "%s\n", (const char *) directive);
7219 }
7220 
7221 /* Emit assembly code to switch to section NEW_SECTION.  Do nothing if
7222    the current section is NEW_SECTION.  */
7223 
7224 void
7225 switch_to_section (section *new_section)
7226 {
7227   if (in_section == new_section)
7228     return;
7229 
7230   if (new_section->common.flags & SECTION_FORGET)
7231     in_section = NULL;
7232   else
7233     in_section = new_section;
7234 
7235   switch (SECTION_STYLE (new_section))
7236     {
7237     case SECTION_NAMED:
7238       targetm.asm_out.named_section (new_section->named.name,
7239 				     new_section->named.common.flags,
7240 				     new_section->named.decl);
7241       break;
7242 
7243     case SECTION_UNNAMED:
7244       new_section->unnamed.callback (new_section->unnamed.data);
7245       break;
7246 
7247     case SECTION_NOSWITCH:
7248       gcc_unreachable ();
7249       break;
7250     }
7251 
7252   new_section->common.flags |= SECTION_DECLARED;
7253 }
7254 
7255 /* If block symbol SYMBOL has not yet been assigned an offset, place
7256    it at the end of its block.  */
7257 
7258 void
7259 place_block_symbol (rtx symbol)
7260 {
7261   unsigned HOST_WIDE_INT size, mask, offset;
7262   struct constant_descriptor_rtx *desc;
7263   unsigned int alignment;
7264   struct object_block *block;
7265   tree decl;
7266 
7267   gcc_assert (SYMBOL_REF_BLOCK (symbol));
7268   if (SYMBOL_REF_BLOCK_OFFSET (symbol) >= 0)
7269     return;
7270 
7271   /* Work out the symbol's size and alignment.  */
7272   if (CONSTANT_POOL_ADDRESS_P (symbol))
7273     {
7274       desc = SYMBOL_REF_CONSTANT (symbol);
7275       alignment = desc->align;
7276       size = GET_MODE_SIZE (desc->mode);
7277     }
7278   else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
7279     {
7280       decl = SYMBOL_REF_DECL (symbol);
7281       gcc_checking_assert (DECL_IN_CONSTANT_POOL (decl));
7282       alignment = DECL_ALIGN (decl);
7283       size = get_constant_size (DECL_INITIAL (decl));
7284       if ((flag_sanitize & SANITIZE_ADDRESS)
7285 	  && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST
7286 	  && asan_protect_global (DECL_INITIAL (decl)))
7287 	{
7288 	  size += asan_red_zone_size (size);
7289 	  alignment = MAX (alignment,
7290 			   ASAN_RED_ZONE_SIZE * BITS_PER_UNIT);
7291 	}
7292     }
7293   else
7294     {
7295       struct symtab_node *snode;
7296       decl = SYMBOL_REF_DECL (symbol);
7297 
7298       snode = symtab_node::get (decl);
7299       if (snode->alias)
7300 	{
7301 	  rtx target = DECL_RTL (snode->ultimate_alias_target ()->decl);
7302 
7303 	  gcc_assert (MEM_P (target)
7304 		      && GET_CODE (XEXP (target, 0)) == SYMBOL_REF
7305 		      && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (target, 0)));
7306 	  target = XEXP (target, 0);
7307 	  place_block_symbol (target);
7308 	  SYMBOL_REF_BLOCK_OFFSET (symbol) = SYMBOL_REF_BLOCK_OFFSET (target);
7309 	  return;
7310 	}
7311       alignment = get_variable_align (decl);
7312       size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
7313       if ((flag_sanitize & SANITIZE_ADDRESS)
7314 	  && asan_protect_global (decl))
7315 	{
7316 	  size += asan_red_zone_size (size);
7317 	  alignment = MAX (alignment,
7318 			   ASAN_RED_ZONE_SIZE * BITS_PER_UNIT);
7319 	}
7320     }
7321 
7322   /* Calculate the object's offset from the start of the block.  */
7323   block = SYMBOL_REF_BLOCK (symbol);
7324   mask = alignment / BITS_PER_UNIT - 1;
7325   offset = (block->size + mask) & ~mask;
7326   SYMBOL_REF_BLOCK_OFFSET (symbol) = offset;
7327 
7328   /* Record the block's new alignment and size.  */
7329   block->alignment = MAX (block->alignment, alignment);
7330   block->size = offset + size;
7331 
7332   vec_safe_push (block->objects, symbol);
7333 }
7334 
7335 /* Return the anchor that should be used to address byte offset OFFSET
7336    from the first object in BLOCK.  MODEL is the TLS model used
7337    to access it.  */
7338 
7339 rtx
7340 get_section_anchor (struct object_block *block, HOST_WIDE_INT offset,
7341 		    enum tls_model model)
7342 {
7343   char label[100];
7344   unsigned int begin, middle, end;
7345   unsigned HOST_WIDE_INT min_offset, max_offset, range, bias, delta;
7346   rtx anchor;
7347 
7348   /* Work out the anchor's offset.  Use an offset of 0 for the first
7349      anchor so that we don't pessimize the case where we take the address
7350      of a variable at the beginning of the block.  This is particularly
7351      useful when a block has only one variable assigned to it.
7352 
7353      We try to place anchors RANGE bytes apart, so there can then be
7354      anchors at +/-RANGE, +/-2 * RANGE, and so on, up to the limits of
7355      a ptr_mode offset.  With some target settings, the lowest such
7356      anchor might be out of range for the lowest ptr_mode offset;
7357      likewise the highest anchor for the highest offset.  Use anchors
7358      at the extreme ends of the ptr_mode range in such cases.
7359 
7360      All arithmetic uses unsigned integers in order to avoid
7361      signed overflow.  */
7362   max_offset = (unsigned HOST_WIDE_INT) targetm.max_anchor_offset;
7363   min_offset = (unsigned HOST_WIDE_INT) targetm.min_anchor_offset;
7364   range = max_offset - min_offset + 1;
7365   if (range == 0)
7366     offset = 0;
7367   else
7368     {
7369       bias = HOST_WIDE_INT_1U << (GET_MODE_BITSIZE (ptr_mode) - 1);
7370       if (offset < 0)
7371 	{
7372 	  delta = -(unsigned HOST_WIDE_INT) offset + max_offset;
7373 	  delta -= delta % range;
7374 	  if (delta > bias)
7375 	    delta = bias;
7376 	  offset = (HOST_WIDE_INT) (-delta);
7377 	}
7378       else
7379 	{
7380 	  delta = (unsigned HOST_WIDE_INT) offset - min_offset;
7381 	  delta -= delta % range;
7382 	  if (delta > bias - 1)
7383 	    delta = bias - 1;
7384 	  offset = (HOST_WIDE_INT) delta;
7385 	}
7386     }
7387 
7388   /* Do a binary search to see if there's already an anchor we can use.
7389      Set BEGIN to the new anchor's index if not.  */
7390   begin = 0;
7391   end = vec_safe_length (block->anchors);
7392   while (begin != end)
7393     {
7394       middle = (end + begin) / 2;
7395       anchor = (*block->anchors)[middle];
7396       if (SYMBOL_REF_BLOCK_OFFSET (anchor) > offset)
7397 	end = middle;
7398       else if (SYMBOL_REF_BLOCK_OFFSET (anchor) < offset)
7399 	begin = middle + 1;
7400       else if (SYMBOL_REF_TLS_MODEL (anchor) > model)
7401 	end = middle;
7402       else if (SYMBOL_REF_TLS_MODEL (anchor) < model)
7403 	begin = middle + 1;
7404       else
7405 	return anchor;
7406     }
7407 
7408   /* Create a new anchor with a unique label.  */
7409   ASM_GENERATE_INTERNAL_LABEL (label, "LANCHOR", anchor_labelno++);
7410   anchor = create_block_symbol (ggc_strdup (label), block, offset);
7411   SYMBOL_REF_FLAGS (anchor) |= SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_ANCHOR;
7412   SYMBOL_REF_FLAGS (anchor) |= model << SYMBOL_FLAG_TLS_SHIFT;
7413 
7414   /* Insert it at index BEGIN.  */
7415   vec_safe_insert (block->anchors, begin, anchor);
7416   return anchor;
7417 }
7418 
7419 /* Output the objects in BLOCK.  */
7420 
7421 static void
7422 output_object_block (struct object_block *block)
7423 {
7424   struct constant_descriptor_rtx *desc;
7425   unsigned int i;
7426   HOST_WIDE_INT offset;
7427   tree decl;
7428   rtx symbol;
7429 
7430   if (!block->objects)
7431     return;
7432 
7433   /* Switch to the section and make sure that the first byte is
7434      suitably aligned.  */
7435   /* Special case VTV comdat sections similar to assemble_variable.  */
7436   if (SECTION_STYLE (block->sect) == SECTION_NAMED
7437       && block->sect->named.name
7438       && (strcmp (block->sect->named.name, ".vtable_map_vars") == 0))
7439     handle_vtv_comdat_section (block->sect, block->sect->named.decl);
7440   else
7441     switch_to_section (block->sect);
7442 
7443   assemble_align (block->alignment);
7444 
7445   /* Define the values of all anchors relative to the current section
7446      position.  */
7447   FOR_EACH_VEC_SAFE_ELT (block->anchors, i, symbol)
7448     targetm.asm_out.output_anchor (symbol);
7449 
7450   /* Output the objects themselves.  */
7451   offset = 0;
7452   FOR_EACH_VEC_ELT (*block->objects, i, symbol)
7453     {
7454       /* Move to the object's offset, padding with zeros if necessary.  */
7455       assemble_zeros (SYMBOL_REF_BLOCK_OFFSET (symbol) - offset);
7456       offset = SYMBOL_REF_BLOCK_OFFSET (symbol);
7457       if (CONSTANT_POOL_ADDRESS_P (symbol))
7458 	{
7459 	  desc = SYMBOL_REF_CONSTANT (symbol);
7460 	  /* Pass 1 for align as we have already laid out everything in the block.
7461 	     So aligning shouldn't be necessary.  */
7462 	  output_constant_pool_1 (desc, 1);
7463 	  offset += GET_MODE_SIZE (desc->mode);
7464 	}
7465       else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol))
7466 	{
7467 	  HOST_WIDE_INT size;
7468 	  decl = SYMBOL_REF_DECL (symbol);
7469 	  assemble_constant_contents
7470 	       (DECL_INITIAL (decl), XSTR (symbol, 0), DECL_ALIGN (decl));
7471 
7472 	  size = get_constant_size (DECL_INITIAL (decl));
7473 	  offset += size;
7474 	  if ((flag_sanitize & SANITIZE_ADDRESS)
7475 	      && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST
7476 	      && asan_protect_global (DECL_INITIAL (decl)))
7477 	    {
7478 	      size = asan_red_zone_size (size);
7479 	      assemble_zeros (size);
7480 	      offset += size;
7481 	    }
7482 	}
7483       else
7484 	{
7485 	  HOST_WIDE_INT size;
7486 	  decl = SYMBOL_REF_DECL (symbol);
7487 	  assemble_variable_contents (decl, XSTR (symbol, 0), false);
7488 	  size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
7489 	  offset += size;
7490 	  if ((flag_sanitize & SANITIZE_ADDRESS)
7491 	      && asan_protect_global (decl))
7492 	    {
7493 	      size = asan_red_zone_size (size);
7494 	      assemble_zeros (size);
7495 	      offset += size;
7496 	    }
7497 	}
7498     }
7499 }
7500 
7501 /* A callback for qsort to compare object_blocks.  */
7502 
7503 static int
7504 output_object_block_compare (const void *x, const void *y)
7505 {
7506   object_block *p1 = *(object_block * const*)x;
7507   object_block *p2 = *(object_block * const*)y;
7508 
7509   if (p1->sect->common.flags & SECTION_NAMED
7510       && !(p2->sect->common.flags & SECTION_NAMED))
7511     return 1;
7512 
7513   if (!(p1->sect->common.flags & SECTION_NAMED)
7514       && p2->sect->common.flags & SECTION_NAMED)
7515     return -1;
7516 
7517   if (p1->sect->common.flags & SECTION_NAMED
7518       && p2->sect->common.flags & SECTION_NAMED)
7519     return strcmp (p1->sect->named.name, p2->sect->named.name);
7520 
7521   unsigned f1 = p1->sect->common.flags;
7522   unsigned f2 = p2->sect->common.flags;
7523   if (f1 == f2)
7524     return 0;
7525   return f1 < f2 ? -1 : 1;
7526 }
7527 
7528 /* Output the definitions of all object_blocks.  */
7529 
7530 void
7531 output_object_blocks (void)
7532 {
7533   vec<object_block *, va_heap> v;
7534   v.create (object_block_htab->elements ());
7535   object_block *obj;
7536   hash_table<object_block_hasher>::iterator hi;
7537 
7538   FOR_EACH_HASH_TABLE_ELEMENT (*object_block_htab, obj, object_block *, hi)
7539     v.quick_push (obj);
7540 
7541   /* Sort them in order to output them in a deterministic manner,
7542      otherwise we may get .rodata sections in different orders with
7543      and without -g.  */
7544   v.qsort (output_object_block_compare);
7545   unsigned i;
7546   FOR_EACH_VEC_ELT (v, i, obj)
7547     output_object_block (obj);
7548 
7549   v.release ();
7550 }
7551 
7552 /* This function provides a possible implementation of the
7553    TARGET_ASM_RECORD_GCC_SWITCHES target hook for ELF targets.  When triggered
7554    by -frecord-gcc-switches it creates a new mergeable, string section in the
7555    assembler output file called TARGET_ASM_RECORD_GCC_SWITCHES_SECTION which
7556    contains the switches in ASCII format.
7557 
7558    FIXME: This code does not correctly handle double quote characters
7559    that appear inside strings, (it strips them rather than preserving them).
7560    FIXME: ASM_OUTPUT_ASCII, as defined in config/elfos.h will not emit NUL
7561    characters - instead it treats them as sub-string separators.  Since
7562    we want to emit NUL strings terminators into the object file we have to use
7563    ASM_OUTPUT_SKIP.  */
7564 
7565 int
7566 elf_record_gcc_switches (print_switch_type type, const char * name)
7567 {
7568   switch (type)
7569     {
7570     case SWITCH_TYPE_PASSED:
7571       ASM_OUTPUT_ASCII (asm_out_file, name, strlen (name));
7572       ASM_OUTPUT_SKIP (asm_out_file, HOST_WIDE_INT_1U);
7573       break;
7574 
7575     case SWITCH_TYPE_DESCRIPTIVE:
7576       if (name == NULL)
7577 	{
7578 	  /* Distinguish between invocations where name is NULL.  */
7579 	  static bool started = false;
7580 
7581 	  if (!started)
7582 	    {
7583 	      section * sec;
7584 
7585 	      sec = get_section (targetm.asm_out.record_gcc_switches_section,
7586 				 SECTION_DEBUG
7587 				 | SECTION_MERGE
7588 				 | SECTION_STRINGS
7589 				 | (SECTION_ENTSIZE & 1),
7590 				 NULL);
7591 	      switch_to_section (sec);
7592 	      started = true;
7593 	    }
7594 	}
7595 
7596     default:
7597       break;
7598     }
7599 
7600   /* The return value is currently ignored by the caller, but must be 0.
7601      For -fverbose-asm the return value would be the number of characters
7602      emitted into the assembler file.  */
7603   return 0;
7604 }
7605 
7606 /* Emit text to declare externally defined symbols. It is needed to
7607    properly support non-default visibility.  */
7608 void
7609 default_elf_asm_output_external (FILE *file ATTRIBUTE_UNUSED,
7610 				 tree decl,
7611 				 const char *name ATTRIBUTE_UNUSED)
7612 {
7613   /* We output the name if and only if TREE_SYMBOL_REFERENCED is
7614      set in order to avoid putting out names that are never really
7615      used.  Always output visibility specified in the source.  */
7616   if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
7617       && (DECL_VISIBILITY_SPECIFIED (decl)
7618 	  || targetm.binds_local_p (decl)))
7619     maybe_assemble_visibility (decl);
7620 }
7621 
7622 /* The default hook for TARGET_ASM_OUTPUT_SOURCE_FILENAME.  */
7623 
7624 void
7625 default_asm_output_source_filename (FILE *file, const char *name)
7626 {
7627 #ifdef ASM_OUTPUT_SOURCE_FILENAME
7628   ASM_OUTPUT_SOURCE_FILENAME (file, name);
7629 #else
7630   fprintf (file, "\t.file\t");
7631   output_quoted_string (file, name);
7632   putc ('\n', file);
7633 #endif
7634 }
7635 
7636 /* Output a file name in the form wanted by System V.  */
7637 
7638 void
7639 output_file_directive (FILE *asm_file, const char *input_name)
7640 {
7641   int len;
7642   const char *na;
7643 
7644   if (input_name == NULL)
7645     input_name = "<stdin>";
7646   else
7647     input_name = remap_debug_filename (input_name);
7648 
7649   len = strlen (input_name);
7650   na = input_name + len;
7651 
7652   /* NA gets INPUT_NAME sans directory names.  */
7653   while (na > input_name)
7654     {
7655       if (IS_DIR_SEPARATOR (na[-1]))
7656 	break;
7657       na--;
7658     }
7659 
7660   targetm.asm_out.output_source_filename (asm_file, na);
7661 }
7662 
7663 /* Create a DEBUG_EXPR_DECL / DEBUG_EXPR pair from RTL expression
7664    EXP.  */
7665 rtx
7666 make_debug_expr_from_rtl (const_rtx exp)
7667 {
7668   tree ddecl = make_node (DEBUG_EXPR_DECL), type;
7669   machine_mode mode = GET_MODE (exp);
7670   rtx dval;
7671 
7672   DECL_ARTIFICIAL (ddecl) = 1;
7673   if (REG_P (exp) && REG_EXPR (exp))
7674     type = TREE_TYPE (REG_EXPR (exp));
7675   else if (MEM_P (exp) && MEM_EXPR (exp))
7676     type = TREE_TYPE (MEM_EXPR (exp));
7677   else
7678     type = NULL_TREE;
7679   if (type && TYPE_MODE (type) == mode)
7680     TREE_TYPE (ddecl) = type;
7681   else
7682     TREE_TYPE (ddecl) = lang_hooks.types.type_for_mode (mode, 1);
7683   SET_DECL_MODE (ddecl, mode);
7684   dval = gen_rtx_DEBUG_EXPR (mode);
7685   DEBUG_EXPR_TREE_DECL (dval) = ddecl;
7686   SET_DECL_RTL (ddecl, dval);
7687   return dval;
7688 }
7689 
7690 #ifdef ELF_ASCII_ESCAPES
7691 /* Default ASM_OUTPUT_LIMITED_STRING for ELF targets.  */
7692 
7693 void
7694 default_elf_asm_output_limited_string (FILE *f, const char *s)
7695 {
7696   int escape;
7697   unsigned char c;
7698 
7699   fputs (STRING_ASM_OP, f);
7700   putc ('"', f);
7701   while (*s != '\0')
7702     {
7703       c = *s;
7704       escape = ELF_ASCII_ESCAPES[c];
7705       switch (escape)
7706 	{
7707 	case 0:
7708 	  putc (c, f);
7709 	  break;
7710 	case 1:
7711 	  putc ('\\', f);
7712 	  putc ('0'+((c>>6)&7), f);
7713 	  putc ('0'+((c>>3)&7), f);
7714 	  putc ('0'+(c&7), f);
7715 	  break;
7716 	default:
7717 	  putc ('\\', f);
7718 	  putc (escape, f);
7719 	  break;
7720 	}
7721       s++;
7722     }
7723   putc ('\"', f);
7724   putc ('\n', f);
7725 }
7726 
7727 /* Default ASM_OUTPUT_ASCII for ELF targets.  */
7728 
7729 void
7730 default_elf_asm_output_ascii (FILE *f, const char *s, unsigned int len)
7731 {
7732   const char *limit = s + len;
7733   const char *last_null = NULL;
7734   unsigned bytes_in_chunk = 0;
7735   unsigned char c;
7736   int escape;
7737 
7738   for (; s < limit; s++)
7739     {
7740       const char *p;
7741 
7742       if (bytes_in_chunk >= 60)
7743 	{
7744 	  putc ('\"', f);
7745 	  putc ('\n', f);
7746 	  bytes_in_chunk = 0;
7747 	}
7748 
7749       if (s > last_null)
7750 	{
7751 	  for (p = s; p < limit && *p != '\0'; p++)
7752 	    continue;
7753 	  last_null = p;
7754 	}
7755       else
7756 	p = last_null;
7757 
7758       if (p < limit && (p - s) <= (long) ELF_STRING_LIMIT)
7759 	{
7760 	  if (bytes_in_chunk > 0)
7761 	    {
7762 	      putc ('\"', f);
7763 	      putc ('\n', f);
7764 	      bytes_in_chunk = 0;
7765 	    }
7766 
7767 	  default_elf_asm_output_limited_string (f, s);
7768 	  s = p;
7769 	}
7770       else
7771 	{
7772 	  if (bytes_in_chunk == 0)
7773 	    fputs (ASCII_DATA_ASM_OP "\"", f);
7774 
7775 	  c = *s;
7776 	  escape = ELF_ASCII_ESCAPES[c];
7777 	  switch (escape)
7778 	    {
7779 	    case 0:
7780 	      putc (c, f);
7781 	      bytes_in_chunk++;
7782 	      break;
7783 	    case 1:
7784 	      putc ('\\', f);
7785 	      putc ('0'+((c>>6)&7), f);
7786 	      putc ('0'+((c>>3)&7), f);
7787 	      putc ('0'+(c&7), f);
7788 	      bytes_in_chunk += 4;
7789 	      break;
7790 	    default:
7791 	      putc ('\\', f);
7792 	      putc (escape, f);
7793 	      bytes_in_chunk += 2;
7794 	      break;
7795 	    }
7796 
7797 	}
7798     }
7799 
7800   if (bytes_in_chunk > 0)
7801     {
7802       putc ('\"', f);
7803       putc ('\n', f);
7804     }
7805 }
7806 #endif
7807 
7808 static GTY(()) section *elf_init_array_section;
7809 static GTY(()) section *elf_fini_array_section;
7810 
7811 static section *
7812 get_elf_initfini_array_priority_section (int priority,
7813 					 bool constructor_p)
7814 {
7815   section *sec;
7816   if (priority != DEFAULT_INIT_PRIORITY)
7817     {
7818       char buf[18];
7819       sprintf (buf, "%s.%.5u",
7820 	       constructor_p ? ".init_array" : ".fini_array",
7821 	       priority);
7822       sec = get_section (buf, SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
7823     }
7824   else
7825     {
7826       if (constructor_p)
7827 	{
7828 	  if (elf_init_array_section == NULL)
7829 	    elf_init_array_section
7830 	      = get_section (".init_array",
7831 			     SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
7832 	  sec = elf_init_array_section;
7833 	}
7834       else
7835 	{
7836 	  if (elf_fini_array_section == NULL)
7837 	    elf_fini_array_section
7838 	      = get_section (".fini_array",
7839 			     SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
7840 	  sec = elf_fini_array_section;
7841 	}
7842     }
7843   return sec;
7844 }
7845 
7846 /* Use .init_array section for constructors. */
7847 
7848 void
7849 default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
7850 {
7851   section *sec = get_elf_initfini_array_priority_section (priority,
7852 							  true);
7853   assemble_addr_to_section (symbol, sec);
7854 }
7855 
7856 /* Use .fini_array section for destructors. */
7857 
7858 void
7859 default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
7860 {
7861   section *sec = get_elf_initfini_array_priority_section (priority,
7862 							  false);
7863   assemble_addr_to_section (symbol, sec);
7864 }
7865 
7866 /* Default TARGET_ASM_OUTPUT_IDENT hook.
7867 
7868    This is a bit of a cheat.  The real default is a no-op, but this
7869    hook is the default for all targets with a .ident directive.  */
7870 
7871 void
7872 default_asm_output_ident_directive (const char *ident_str)
7873 {
7874   const char *ident_asm_op = "\t.ident\t";
7875 
7876   /* If we are still in the front end, do not write out the string
7877      to asm_out_file.  Instead, add a fake top-level asm statement.
7878      This allows the front ends to use this hook without actually
7879      writing to asm_out_file, to handle #ident or Pragma Ident.  */
7880   if (symtab->state == PARSING)
7881     {
7882       char *buf = ACONCAT ((ident_asm_op, "\"", ident_str, "\"\n", NULL));
7883       symtab->finalize_toplevel_asm (build_string (strlen (buf), buf));
7884     }
7885   else
7886     fprintf (asm_out_file, "%s\"%s\"\n", ident_asm_op, ident_str);
7887 }
7888 
7889 
7890 /* This function ensures that vtable_map variables are not only
7891    in the comdat section, but that each variable has its own unique
7892    comdat name.  Without this the variables end up in the same section
7893    with a single comdat name.
7894 
7895    FIXME:  resolve_unique_section needs to deal better with
7896    decls with both DECL_SECTION_NAME and DECL_ONE_ONLY.  Once
7897    that is fixed, this if-else statement can be replaced with
7898    a single call to "switch_to_section (sect)".  */
7899 
7900 static void
7901 handle_vtv_comdat_section (section *sect, const_tree decl ATTRIBUTE_UNUSED)
7902 {
7903 #if defined (OBJECT_FORMAT_ELF)
7904   targetm.asm_out.named_section (sect->named.name,
7905 				 sect->named.common.flags
7906 				 | SECTION_LINKONCE,
7907 				 DECL_NAME (decl));
7908   in_section = sect;
7909 #else
7910   /* Neither OBJECT_FORMAT_PE, nor OBJECT_FORMAT_COFF is set here.
7911      Therefore the following check is used.
7912      In case a the target is PE or COFF a comdat group section
7913      is created, e.g. .vtable_map_vars$foo. The linker places
7914      everything in .vtable_map_vars at the end.
7915 
7916      A fix could be made in
7917      gcc/config/i386/winnt.c: i386_pe_unique_section.  */
7918   if (TARGET_PECOFF)
7919     {
7920       char *name;
7921 
7922       if (TREE_CODE (DECL_NAME (decl)) == IDENTIFIER_NODE)
7923 	name = ACONCAT ((sect->named.name, "$",
7924 			 IDENTIFIER_POINTER (DECL_NAME (decl)), NULL));
7925       else
7926 	name = ACONCAT ((sect->named.name, "$",
7927 			 IDENTIFIER_POINTER (DECL_COMDAT_GROUP (DECL_NAME (decl))),
7928 			 NULL));
7929 
7930       targetm.asm_out.named_section (name,
7931 				     sect->named.common.flags
7932 				     | SECTION_LINKONCE,
7933 				     DECL_NAME (decl));
7934       in_section = sect;
7935     }
7936   else
7937     switch_to_section (sect);
7938 #endif
7939 }
7940 
7941 #include "gt-varasm.h"
7942