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