varasm.c revision 50397
1/* Output variables, constants and external declarations, for GNU compiler.
2   Copyright (C) 1987, 88, 89, 92-97, 1998 Free Software Foundation, Inc.
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING.  If not, write to
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA.  */
20
21
22/* This file handles generation of all the assembler code
23   *except* the instructions of a function.
24   This includes declarations of variables and their initial values.
25
26   We also output the assembler code for constants stored in memory
27   and are responsible for combining constants with the same value.  */
28
29#include "config.h"
30#include "system.h"
31#include <setjmp.h>
32/* #include <stab.h> */
33#include "rtl.h"
34#include "tree.h"
35#include "flags.h"
36#include "except.h"
37#include "function.h"
38#include "expr.h"
39#include "output.h"
40#include "hard-reg-set.h"
41#include "regs.h"
42#include "defaults.h"
43#include "real.h"
44#include "toplev.h"
45#include "dbxout.h"
46#include "sdbout.h"
47
48#include "obstack.h"
49#include "c-pragma.h"
50
51#ifdef XCOFF_DEBUGGING_INFO
52#include "xcoffout.h"
53#endif
54
55#ifndef TRAMPOLINE_ALIGNMENT
56#define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY
57#endif
58
59#ifndef ASM_STABS_OP
60#define ASM_STABS_OP ".stabs"
61#endif
62
63/* Define the prefix to use when check_memory_usage_flag is enable.  */
64#ifdef NO_DOLLAR_IN_LABEL
65#ifdef NO_DOT_IN_LABEL
66#define CHKR_PREFIX "chkr_prefix_"
67#else /* !NO_DOT_IN_LABEL */
68#define CHKR_PREFIX "chkr."
69#endif
70#else /* !NO_DOLLAR_IN_LABEL */
71#define CHKR_PREFIX "chkr$"
72#endif
73#define CHKR_PREFIX_SIZE (sizeof (CHKR_PREFIX) - 1)
74
75/* This macro gets just the user-specified name
76   out of the string in a SYMBOL_REF.  On most machines,
77   we discard the * if any and that's all.  */
78#ifndef STRIP_NAME_ENCODING
79#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
80  (VAR) = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*'))
81#endif
82
83/* File in which assembler code is being written.  */
84
85extern FILE *asm_out_file;
86
87/* The (assembler) name of the first globally-visible object output.  */
88char *first_global_object_name;
89char *weak_global_object_name;
90
91extern struct obstack *current_obstack;
92extern struct obstack *saveable_obstack;
93extern struct obstack *rtl_obstack;
94extern struct obstack permanent_obstack;
95#define obstack_chunk_alloc xmalloc
96
97/* Number for making the label on the next
98   constant that is stored in memory.  */
99
100int const_labelno;
101
102/* Number for making the label on the next
103   static variable internal to a function.  */
104
105int var_labelno;
106
107/* Carry information from ASM_DECLARE_OBJECT_NAME
108   to ASM_FINISH_DECLARE_OBJECT.  */
109
110int size_directive_output;
111
112/* The last decl for which assemble_variable was called,
113   if it did ASM_DECLARE_OBJECT_NAME.
114   If the last call to assemble_variable didn't do that,
115   this holds 0.  */
116
117tree last_assemble_variable_decl;
118
119
120#ifdef HANDLE_PRAGMA_WEAK
121/* Any weak symbol declarations waiting to be emitted.  */
122
123struct weak_syms
124{
125  struct weak_syms *next;
126  char *name;
127  char *value;
128};
129
130static struct weak_syms *weak_decls;
131#endif
132
133/* Nonzero if at least one function definition has been seen.  */
134
135static int function_defined;
136
137struct addr_const;
138struct constant_descriptor;
139struct rtx_const;
140struct pool_constant;
141
142static char *strip_reg_name		PROTO((char *));
143static int contains_pointers_p		PROTO((tree));
144static void decode_addr_const		PROTO((tree, struct addr_const *));
145static int const_hash			PROTO((tree));
146static int compare_constant		PROTO((tree,
147					       struct constant_descriptor *));
148static char *compare_constant_1		PROTO((tree, char *));
149static struct constant_descriptor *record_constant PROTO((tree));
150static void record_constant_1		PROTO((tree));
151static tree copy_constant		PROTO((tree));
152static void output_constant_def_contents  PROTO((tree, int, int));
153static void decode_rtx_const		PROTO((enum machine_mode, rtx,
154					       struct rtx_const *));
155static int const_hash_rtx		PROTO((enum machine_mode, rtx));
156static int compare_constant_rtx		PROTO((enum machine_mode, rtx,
157					       struct constant_descriptor *));
158static struct constant_descriptor *record_constant_rtx PROTO((enum machine_mode,
159							      rtx));
160static struct pool_constant *find_pool_constant PROTO((rtx));
161static void mark_constant_pool		PROTO((void));
162static void mark_constants		PROTO((rtx));
163static int output_addressed_constants	PROTO((tree));
164static void output_after_function_constants PROTO((void));
165static void output_constructor		PROTO((tree, int));
166#ifdef ASM_OUTPUT_BSS
167static void asm_output_bss		PROTO((FILE *, tree, char *, int, int));
168#endif
169#ifdef BSS_SECTION_ASM_OP
170#ifdef ASM_OUTPUT_ALIGNED_BSS
171static void asm_output_aligned_bss	PROTO((FILE *, tree, char *, int, int));
172#endif
173#endif /* BSS_SECTION_ASM_OP */
174
175static enum in_section { no_section, in_text, in_data, in_named
176#ifdef BSS_SECTION_ASM_OP
177  , in_bss
178#endif
179#ifdef EH_FRAME_SECTION_ASM_OP
180  , in_eh_frame
181#endif
182#ifdef EXTRA_SECTIONS
183  , EXTRA_SECTIONS
184#endif
185} in_section = no_section;
186
187/* Return a non-zero value if DECL has a section attribute.  */
188#define IN_NAMED_SECTION(DECL) \
189  ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
190   && DECL_SECTION_NAME (DECL) != NULL_TREE)
191
192/* Text of section name when in_section == in_named.  */
193static char *in_named_name;
194
195/* Define functions like text_section for any extra sections.  */
196#ifdef EXTRA_SECTION_FUNCTIONS
197EXTRA_SECTION_FUNCTIONS
198#endif
199
200/* Tell assembler to switch to text section.  */
201
202void
203text_section ()
204{
205  if (in_section != in_text)
206    {
207      fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
208      in_section = in_text;
209    }
210}
211
212/* Tell assembler to switch to data section.  */
213
214void
215data_section ()
216{
217  if (in_section != in_data)
218    {
219      if (flag_shared_data)
220	{
221#ifdef SHARED_SECTION_ASM_OP
222	  fprintf (asm_out_file, "%s\n", SHARED_SECTION_ASM_OP);
223#else
224	  fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
225#endif
226	}
227      else
228	fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
229
230      in_section = in_data;
231    }
232}
233
234/* Tell assembler to switch to read-only data section.  This is normally
235   the text section.  */
236
237void
238readonly_data_section ()
239{
240#ifdef READONLY_DATA_SECTION
241  READONLY_DATA_SECTION ();  /* Note this can call data_section.  */
242#else
243  text_section ();
244#endif
245}
246
247/* Determine if we're in the text section.  */
248
249int
250in_text_section ()
251{
252  return in_section == in_text;
253}
254
255/* Determine if we're in the data section.  */
256
257int
258in_data_section ()
259{
260  return in_section == in_data;
261}
262
263/* Tell assembler to change to section NAME for DECL.
264   If DECL is NULL, just switch to section NAME.
265   If NAME is NULL, get the name from DECL.
266   If RELOC is 1, the initializer for DECL contains relocs.  */
267
268void
269named_section (decl, name, reloc)
270     tree decl;
271     char *name;
272     int reloc;
273{
274  if (decl != NULL_TREE
275      && TREE_CODE_CLASS (TREE_CODE (decl)) != 'd')
276    abort ();
277  if (name == NULL)
278    name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
279
280  if (in_section != in_named || strcmp (name, in_named_name))
281    {
282#ifdef ASM_OUTPUT_SECTION_NAME
283      ASM_OUTPUT_SECTION_NAME (asm_out_file, decl, name, reloc);
284#else
285      /* Section attributes are not supported if this macro isn't provided -
286	 some host formats don't support them at all.  The front-end should
287	 already have flagged this as an error.  */
288      abort ();
289#endif
290
291      in_named_name = obstack_alloc (&permanent_obstack, strlen (name) + 1);
292      strcpy (in_named_name, name);
293      in_section = in_named;
294    }
295}
296
297#ifdef ASM_OUTPUT_SECTION_NAME
298#ifndef UNIQUE_SECTION
299#define UNIQUE_SECTION(DECL,RELOC)				\
300do {								\
301  int len;							\
302  char *name, *string;						\
303								\
304  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL));	\
305  /* Strip off any encoding in name.  */			\
306  STRIP_NAME_ENCODING (name, name);				\
307								\
308  len = strlen (name) + 1;					\
309  string = alloca (len + 1);					\
310  sprintf (string, ".%s", name);				\
311								\
312  DECL_SECTION_NAME (DECL) = build_string (len, string);	\
313} while (0)
314#endif
315#ifndef UNIQUE_SECTION_P
316#define UNIQUE_SECTION_P(DECL) 0
317#endif
318#endif
319
320#ifdef BSS_SECTION_ASM_OP
321
322/* Tell the assembler to switch to the bss section.  */
323
324void
325bss_section ()
326{
327  if (in_section != in_bss)
328    {
329#ifdef SHARED_BSS_SECTION_ASM_OP
330      if (flag_shared_data)
331	fprintf (asm_out_file, "%s\n", SHARED_BSS_SECTION_ASM_OP);
332      else
333#endif
334	fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);
335
336      in_section = in_bss;
337    }
338}
339
340#ifdef ASM_OUTPUT_BSS
341
342/* Utility function for ASM_OUTPUT_BSS for targets to use if
343   they don't support alignments in .bss.
344   ??? It is believed that this function will work in most cases so such
345   support is localized here.  */
346
347static void
348asm_output_bss (file, decl, name, size, rounded)
349     FILE *file;
350     tree decl;
351     char *name;
352     int size, rounded;
353{
354  ASM_GLOBALIZE_LABEL (file, name);
355  bss_section ();
356#ifdef ASM_DECLARE_OBJECT_NAME
357  last_assemble_variable_decl = decl;
358  ASM_DECLARE_OBJECT_NAME (file, name, decl);
359#else
360  /* Standard thing is just output label for the object.  */
361  ASM_OUTPUT_LABEL (file, name);
362#endif /* ASM_DECLARE_OBJECT_NAME */
363  ASM_OUTPUT_SKIP (file, rounded);
364}
365
366#endif
367
368#ifdef ASM_OUTPUT_ALIGNED_BSS
369
370/* Utility function for targets to use in implementing
371   ASM_OUTPUT_ALIGNED_BSS.
372   ??? It is believed that this function will work in most cases so such
373   support is localized here.  */
374
375static void
376asm_output_aligned_bss (file, decl, name, size, align)
377     FILE *file;
378     tree decl;
379     char *name;
380     int size, align;
381{
382  ASM_GLOBALIZE_LABEL (file, name);
383  bss_section ();
384  ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
385#ifdef ASM_DECLARE_OBJECT_NAME
386  last_assemble_variable_decl = decl;
387  ASM_DECLARE_OBJECT_NAME (file, name, decl);
388#else
389  /* Standard thing is just output label for the object.  */
390  ASM_OUTPUT_LABEL (file, name);
391#endif /* ASM_DECLARE_OBJECT_NAME */
392  ASM_OUTPUT_SKIP (file, size ? size : 1);
393}
394
395#endif
396
397#endif /* BSS_SECTION_ASM_OP */
398
399#ifdef EH_FRAME_SECTION_ASM_OP
400void
401eh_frame_section ()
402{
403  if (in_section != in_eh_frame)
404    {
405      fprintf (asm_out_file, "%s\n", EH_FRAME_SECTION_ASM_OP);
406      in_section = in_eh_frame;
407    }
408}
409#endif
410
411/* Switch to the section for function DECL.
412
413   If DECL is NULL_TREE, switch to the text section.
414   ??? It's not clear that we will ever be passed NULL_TREE, but it's
415   safer to handle it.  */
416
417void
418function_section (decl)
419     tree decl;
420{
421  if (decl != NULL_TREE
422      && DECL_SECTION_NAME (decl) != NULL_TREE)
423    named_section (decl, (char *) 0, 0);
424  else
425    text_section ();
426}
427
428/* Switch to section for variable DECL.
429
430   RELOC is the `reloc' argument to SELECT_SECTION.  */
431
432void
433variable_section (decl, reloc)
434     tree decl;
435     int reloc;
436{
437  if (IN_NAMED_SECTION (decl))
438    named_section (decl, NULL, reloc);
439  else
440    {
441      /* C++ can have const variables that get initialized from constructors,
442	 and thus can not be in a readonly section.  We prevent this by
443	 verifying that the initial value is constant for objects put in a
444	 readonly section.
445
446	 error_mark_node is used by the C front end to indicate that the
447	 initializer has not been seen yet.  In this case, we assume that
448	 the initializer must be constant.
449
450	 C++ uses error_mark_node for variables that have complicated
451	 initializers, but these variables go in BSS so we won't be called
452	 for them.  */
453
454#ifdef SELECT_SECTION
455      SELECT_SECTION (decl, reloc);
456#else
457      if (DECL_READONLY_SECTION (decl, reloc))
458	readonly_data_section ();
459      else
460	data_section ();
461#endif
462    }
463}
464
465/* Tell assembler to switch to the section for the exception handling
466   table.  */
467
468void
469exception_section ()
470{
471#if defined (EXCEPTION_SECTION)
472  EXCEPTION_SECTION ();
473#else
474#ifdef ASM_OUTPUT_SECTION_NAME
475  named_section (NULL_TREE, ".gcc_except_table", 0);
476#else
477  if (flag_pic)
478    data_section ();
479  else
480    readonly_data_section ();
481#endif
482#endif
483}
484
485/* Create the rtl to represent a function, for a function definition.
486   DECL is a FUNCTION_DECL node which describes which function.
487   The rtl is stored into DECL.  */
488
489void
490make_function_rtl (decl)
491     tree decl;
492{
493  char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
494  char *new_name = name;
495
496  /* Rename a nested function to avoid conflicts.  */
497  if (decl_function_context (decl) != 0
498      && DECL_INITIAL (decl) != 0
499      && DECL_RTL (decl) == 0)
500    {
501      char *label;
502
503      name = IDENTIFIER_POINTER (DECL_NAME (decl));
504      ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
505      name = obstack_copy0 (saveable_obstack, label, strlen (label));
506      var_labelno++;
507    }
508  else
509    {
510      /* When -fprefix-function-name is used, every function name is
511         prefixed.  Even static functions are prefixed because they
512         could be declared latter.  Note that a nested function name
513         is not prefixed.  */
514      if (flag_prefix_function_name)
515        {
516          new_name = (char *) alloca (strlen (name) + CHKR_PREFIX_SIZE + 1);
517          strcpy (new_name, CHKR_PREFIX);
518          strcpy (new_name + CHKR_PREFIX_SIZE, name);
519          name = obstack_copy0 (saveable_obstack, new_name, strlen (new_name));
520        }
521    }
522
523  if (DECL_RTL (decl) == 0)
524    {
525      DECL_RTL (decl)
526	= gen_rtx_MEM (DECL_MODE (decl),
527		       gen_rtx_SYMBOL_REF (Pmode, name));
528
529      /* Optionally set flags or add text to the name to record information
530	 such as that it is a function name.  If the name is changed, the macro
531	 ASM_OUTPUT_LABELREF will have to know how to strip this information.  */
532#ifdef ENCODE_SECTION_INFO
533      ENCODE_SECTION_INFO (decl);
534#endif
535    }
536  else
537    {
538      /* ??? Another way to do this would be to do what halfpic.c does
539	 and maintain a hashed table of such critters.  */
540      /* ??? Another way to do this would be to pass a flag bit to
541	 ENCODE_SECTION_INFO saying whether this is a new decl or not.  */
542      /* Let the target reassign the RTL if it wants.
543	 This is necessary, for example, when one machine specific
544	 decl attribute overrides another.  */
545#ifdef REDO_SECTION_INFO_P
546      if (REDO_SECTION_INFO_P (decl))
547	ENCODE_SECTION_INFO (decl);
548#endif
549    }
550
551  /* Record at least one function has been defined.  */
552  function_defined = 1;
553}
554
555/* Given NAME, a putative register name, discard any customary prefixes.  */
556
557static char *
558strip_reg_name (name)
559     char *name;
560{
561#ifdef REGISTER_PREFIX
562  if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
563    name += strlen (REGISTER_PREFIX);
564#endif
565  if (name[0] == '%' || name[0] == '#')
566    name++;
567  return name;
568}
569
570/* Decode an `asm' spec for a declaration as a register name.
571   Return the register number, or -1 if nothing specified,
572   or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
573   or -3 if ASMSPEC is `cc' and is not recognized,
574   or -4 if ASMSPEC is `memory' and is not recognized.
575   Accept an exact spelling or a decimal number.
576   Prefixes such as % are optional.  */
577
578int
579decode_reg_name (asmspec)
580     char *asmspec;
581{
582  if (asmspec != 0)
583    {
584      int i;
585
586      /* Get rid of confusing prefixes.  */
587      asmspec = strip_reg_name (asmspec);
588
589      /* Allow a decimal number as a "register name".  */
590      for (i = strlen (asmspec) - 1; i >= 0; i--)
591	if (! (asmspec[i] >= '0' && asmspec[i] <= '9'))
592	  break;
593      if (asmspec[0] != 0 && i < 0)
594	{
595	  i = atoi (asmspec);
596	  if (i < FIRST_PSEUDO_REGISTER && i >= 0)
597	    return i;
598	  else
599	    return -2;
600	}
601
602      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
603	if (reg_names[i][0]
604	    && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
605	  return i;
606
607#ifdef ADDITIONAL_REGISTER_NAMES
608      {
609	static struct { char *name; int number; } table[]
610	  = ADDITIONAL_REGISTER_NAMES;
611
612	for (i = 0; i < sizeof (table) / sizeof (table[0]); i++)
613	  if (! strcmp (asmspec, table[i].name))
614	    return table[i].number;
615      }
616#endif /* ADDITIONAL_REGISTER_NAMES */
617
618      if (!strcmp (asmspec, "memory"))
619	return -4;
620
621      if (!strcmp (asmspec, "cc"))
622	return -3;
623
624      return -2;
625    }
626
627  return -1;
628}
629
630/* Create the DECL_RTL for a declaration for a static or external variable
631   or static or external function.
632   ASMSPEC, if not 0, is the string which the user specified
633   as the assembler symbol name.
634   TOP_LEVEL is nonzero if this is a file-scope variable.
635
636   This is never called for PARM_DECL nodes.  */
637
638void
639make_decl_rtl (decl, asmspec, top_level)
640     tree decl;
641     char *asmspec;
642     int top_level;
643{
644  register char *name = 0;
645  int reg_number;
646
647  reg_number = decode_reg_name (asmspec);
648
649  if (DECL_ASSEMBLER_NAME (decl) != NULL_TREE)
650    name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
651
652  if (reg_number == -2)
653    {
654      /* ASMSPEC is given, and not the name of a register.  */
655      name = (char *) obstack_alloc (saveable_obstack,
656				     strlen (asmspec) + 2);
657      name[0] = '*';
658      strcpy (&name[1], asmspec);
659    }
660
661  /* For a duplicate declaration, we can be called twice on the
662     same DECL node.  Don't discard the RTL already made.  */
663  if (DECL_RTL (decl) == 0)
664    {
665      /* First detect errors in declaring global registers.  */
666      if (TREE_CODE (decl) != FUNCTION_DECL
667	  && DECL_REGISTER (decl) && reg_number == -1)
668	error_with_decl (decl,
669			 "register name not specified for `%s'");
670      else if (TREE_CODE (decl) != FUNCTION_DECL
671	       && DECL_REGISTER (decl) && reg_number < 0)
672	error_with_decl (decl,
673			 "invalid register name for `%s'");
674      else if ((reg_number >= 0 || reg_number == -3)
675	       && (TREE_CODE (decl) == FUNCTION_DECL
676		   && ! DECL_REGISTER (decl)))
677	error_with_decl (decl,
678			 "register name given for non-register variable `%s'");
679      else if (TREE_CODE (decl) != FUNCTION_DECL
680	       && DECL_REGISTER (decl)
681	       && TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
682	error_with_decl (decl,
683			 "data type of `%s' isn't suitable for a register");
684      else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)
685	       && ! HARD_REGNO_MODE_OK (reg_number,
686					TYPE_MODE (TREE_TYPE (decl))))
687	error_with_decl (decl,
688			 "register number for `%s' isn't suitable for data type");
689      /* Now handle properly declared static register variables.  */
690      else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
691	{
692	  int nregs;
693
694	  if (DECL_INITIAL (decl) != 0 && top_level)
695	    {
696	      DECL_INITIAL (decl) = 0;
697	      error ("global register variable has initial value");
698	    }
699	  if (fixed_regs[reg_number] == 0
700	      && function_defined && top_level)
701	    error ("global register variable follows a function definition");
702	  if (TREE_THIS_VOLATILE (decl))
703	    warning ("volatile register variables don't work as you might wish");
704
705	  /* If the user specified one of the eliminables registers here,
706	     e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
707	     confused with that register and be eliminated.  Although this
708	     usage is somewhat suspect, we nevertheless use the following
709	     kludge to avoid setting DECL_RTL to frame_pointer_rtx.  */
710
711	  DECL_RTL (decl)
712	    = gen_rtx_REG (DECL_MODE (decl), FIRST_PSEUDO_REGISTER);
713	  REGNO (DECL_RTL (decl)) = reg_number;
714	  REG_USERVAR_P (DECL_RTL (decl)) = 1;
715
716	  if (top_level)
717	    {
718	      /* Make this register global, so not usable for anything
719		 else.  */
720	      nregs = HARD_REGNO_NREGS (reg_number, DECL_MODE (decl));
721	      while (nregs > 0)
722		globalize_reg (reg_number + --nregs);
723	    }
724	}
725      /* Specifying a section attribute on a variable forces it into a
726         non-.bss section, and thus it cannot be common. */
727      else if (TREE_CODE (decl) == VAR_DECL
728	       && DECL_SECTION_NAME (decl) != NULL_TREE
729	       && DECL_INITIAL (decl) == NULL_TREE
730	       && DECL_COMMON (decl))
731          DECL_COMMON (decl) = 0;
732
733      /* Now handle ordinary static variables and functions (in memory).
734	 Also handle vars declared register invalidly.  */
735      if (DECL_RTL (decl) == 0)
736	{
737	  /* Can't use just the variable's own name for a variable
738	     whose scope is less than the whole file.
739	     Concatenate a distinguishing number.  */
740	  if (!top_level && !TREE_PUBLIC (decl) && asmspec == 0)
741	    {
742	      char *label;
743
744	      ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
745	      name = obstack_copy0 (saveable_obstack, label, strlen (label));
746	      var_labelno++;
747	    }
748
749	  if (name == 0)
750	    abort ();
751
752	  /* When -fprefix-function-name is used, the functions
753	     names are prefixed.  Only nested function names are not
754	     prefixed.  */
755	  if (flag_prefix_function_name && TREE_CODE (decl) == FUNCTION_DECL)
756	    {
757	      char *new_name;
758	      new_name = (char *) alloca (strlen (name) + CHKR_PREFIX_SIZE
759	      				  + 1);
760	      strcpy (new_name, CHKR_PREFIX);
761	      strcpy (new_name + CHKR_PREFIX_SIZE, name);
762	      name = obstack_copy0 (saveable_obstack,
763	      			   new_name, strlen (new_name));
764	    }
765
766	  DECL_RTL (decl) = gen_rtx_MEM (DECL_MODE (decl),
767					 gen_rtx_SYMBOL_REF (Pmode, name));
768	  MEM_ALIAS_SET (DECL_RTL (decl)) = get_alias_set (decl);
769
770	  /* If this variable is to be treated as volatile, show its
771	     tree node has side effects.  If it has side effects, either
772	     because of this test or from TREE_THIS_VOLATILE also
773	     being set, show the MEM is volatile.  */
774	  if (flag_volatile_global && TREE_CODE (decl) == VAR_DECL
775	      && TREE_PUBLIC (decl))
776	    TREE_SIDE_EFFECTS (decl) = 1;
777	  if (TREE_SIDE_EFFECTS (decl))
778	    MEM_VOLATILE_P (DECL_RTL (decl)) = 1;
779
780	  if (TREE_READONLY (decl))
781	    RTX_UNCHANGING_P (DECL_RTL (decl)) = 1;
782	  MEM_IN_STRUCT_P (DECL_RTL (decl))
783	    = AGGREGATE_TYPE_P (TREE_TYPE (decl));
784
785	  /* Optionally set flags or add text to the name to record information
786	     such as that it is a function name.
787	     If the name is changed, the macro ASM_OUTPUT_LABELREF
788	     will have to know how to strip this information.  */
789#ifdef ENCODE_SECTION_INFO
790	  ENCODE_SECTION_INFO (decl);
791#endif
792	}
793    }
794  else
795    {
796      /* If the old RTL had the wrong mode, fix the mode.  */
797      if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
798	{
799	  rtx rtl = DECL_RTL (decl);
800	  PUT_MODE (rtl, DECL_MODE (decl));
801	}
802
803      /* ??? Another way to do this would be to do what halfpic.c does
804	 and maintain a hashed table of such critters.  */
805      /* ??? Another way to do this would be to pass a flag bit to
806	 ENCODE_SECTION_INFO saying whether this is a new decl or not.  */
807      /* Let the target reassign the RTL if it wants.
808	 This is necessary, for example, when one machine specific
809	 decl attribute overrides another.  */
810#ifdef REDO_SECTION_INFO_P
811      if (REDO_SECTION_INFO_P (decl))
812	ENCODE_SECTION_INFO (decl);
813#endif
814    }
815}
816
817/* Make the rtl for variable VAR be volatile.
818   Use this only for static variables.  */
819
820void
821make_var_volatile (var)
822     tree var;
823{
824  if (GET_CODE (DECL_RTL (var)) != MEM)
825    abort ();
826
827  MEM_VOLATILE_P (DECL_RTL (var)) = 1;
828}
829
830/* Output alignment directive to align for constant expression EXP.  */
831
832void
833assemble_constant_align (exp)
834     tree exp;
835{
836  int align;
837
838  /* Align the location counter as required by EXP's data type.  */
839  align = TYPE_ALIGN (TREE_TYPE (exp));
840#ifdef CONSTANT_ALIGNMENT
841  align = CONSTANT_ALIGNMENT (exp, align);
842#endif
843
844  if (align > BITS_PER_UNIT)
845    ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
846}
847
848/* Output a string of literal assembler code
849   for an `asm' keyword used between functions.  */
850
851void
852assemble_asm (string)
853     tree string;
854{
855  app_enable ();
856
857  if (TREE_CODE (string) == ADDR_EXPR)
858    string = TREE_OPERAND (string, 0);
859
860  fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
861}
862
863#if 0 /* This should no longer be needed, because
864	 flag_gnu_linker should be 0 on these systems,
865	 which should prevent any output
866	 if ASM_OUTPUT_CONSTRUCTOR and ASM_OUTPUT_DESTRUCTOR are absent.  */
867#if !(defined(DBX_DEBUGGING_INFO) && !defined(FASCIST_ASSEMBLER))
868#ifndef ASM_OUTPUT_CONSTRUCTOR
869#define ASM_OUTPUT_CONSTRUCTOR(file, name)
870#endif
871#ifndef ASM_OUTPUT_DESTRUCTOR
872#define ASM_OUTPUT_DESTRUCTOR(file, name)
873#endif
874#endif
875#endif /* 0 */
876
877/* Record an element in the table of global destructors.
878   How this is done depends on what sort of assembler and linker
879   are in use.
880
881   NAME should be the name of a global function to be called
882   at exit time.  This name is output using assemble_name.  */
883
884void
885assemble_destructor (name)
886     char *name;
887{
888#ifdef ASM_OUTPUT_DESTRUCTOR
889  ASM_OUTPUT_DESTRUCTOR (asm_out_file, name);
890#else
891  if (flag_gnu_linker)
892    {
893      /* Now tell GNU LD that this is part of the static destructor set.  */
894      /* This code works for any machine provided you use GNU as/ld.  */
895      fprintf (asm_out_file, "%s \"___DTOR_LIST__\",22,0,0,", ASM_STABS_OP);
896      assemble_name (asm_out_file, name);
897      fputc ('\n', asm_out_file);
898    }
899#endif
900}
901
902/* Likewise for global constructors.  */
903
904void
905assemble_constructor (name)
906     char *name;
907{
908#ifdef ASM_OUTPUT_CONSTRUCTOR
909  ASM_OUTPUT_CONSTRUCTOR (asm_out_file, name);
910#else
911  if (flag_gnu_linker)
912    {
913      /* Now tell GNU LD that this is part of the static constructor set.  */
914      /* This code works for any machine provided you use GNU as/ld.  */
915      fprintf (asm_out_file, "%s \"___CTOR_LIST__\",22,0,0,", ASM_STABS_OP);
916      assemble_name (asm_out_file, name);
917      fputc ('\n', asm_out_file);
918    }
919#endif
920}
921
922/* Likewise for entries we want to record for garbage collection.
923   Garbage collection is still under development.  */
924
925void
926assemble_gc_entry (name)
927     char *name;
928{
929#ifdef ASM_OUTPUT_GC_ENTRY
930  ASM_OUTPUT_GC_ENTRY (asm_out_file, name);
931#else
932  if (flag_gnu_linker)
933    {
934      /* Now tell GNU LD that this is part of the static constructor set.  */
935      fprintf (asm_out_file, "%s \"___PTR_LIST__\",22,0,0,", ASM_STABS_OP);
936      assemble_name (asm_out_file, name);
937      fputc ('\n', asm_out_file);
938    }
939#endif
940}
941
942/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
943   a non-zero value if the constant pool should be output before the
944   start of the function, or a zero value if the pool should output
945   after the end of the function.  The default is to put it before the
946   start.  */
947
948#ifndef CONSTANT_POOL_BEFORE_FUNCTION
949#define CONSTANT_POOL_BEFORE_FUNCTION 1
950#endif
951
952/* Output assembler code for the constant pool of a function and associated
953   with defining the name of the function.  DECL describes the function.
954   NAME is the function's name.  For the constant pool, we use the current
955   constant pool data.  */
956
957void
958assemble_start_function (decl, fnname)
959     tree decl;
960     char *fnname;
961{
962  int align;
963
964  /* The following code does not need preprocessing in the assembler.  */
965
966  app_disable ();
967
968  if (CONSTANT_POOL_BEFORE_FUNCTION)
969    output_constant_pool (fnname, decl);
970
971#ifdef ASM_OUTPUT_SECTION_NAME
972  /* If the function is to be put in its own section and it's not in a section
973     already, indicate so.  */
974  if ((flag_function_sections
975       && DECL_SECTION_NAME (decl) == NULL_TREE)
976      || UNIQUE_SECTION_P (decl))
977    UNIQUE_SECTION (decl, 0);
978#endif
979
980  function_section (decl);
981
982  /* Tell assembler to move to target machine's alignment for functions.  */
983  align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
984  if (align > 0)
985    ASM_OUTPUT_ALIGN (asm_out_file, align);
986
987#ifdef ASM_OUTPUT_FUNCTION_PREFIX
988  ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
989#endif
990
991#ifdef SDB_DEBUGGING_INFO
992  /* Output SDB definition of the function.  */
993  if (write_symbols == SDB_DEBUG)
994    sdbout_mark_begin_function ();
995#endif
996
997#ifdef DBX_DEBUGGING_INFO
998  /* Output DBX definition of the function.  */
999  if (write_symbols == DBX_DEBUG)
1000    dbxout_begin_function (decl);
1001#endif
1002
1003  /* Make function name accessible from other files, if appropriate.  */
1004
1005  if (TREE_PUBLIC (decl))
1006    {
1007      if (! first_global_object_name)
1008	{
1009	  char *p;
1010	  char **name;
1011
1012	  if (! DECL_WEAK (decl) && ! DECL_ONE_ONLY (decl))
1013	    name = &first_global_object_name;
1014	  else
1015	    name = &weak_global_object_name;
1016
1017	  STRIP_NAME_ENCODING (p, fnname);
1018	  *name = permalloc (strlen (p) + 1);
1019	  strcpy (*name, p);
1020	}
1021
1022#ifdef ASM_WEAKEN_LABEL
1023      if (DECL_WEAK (decl))
1024	ASM_WEAKEN_LABEL (asm_out_file, fnname);
1025      else
1026#endif
1027      ASM_GLOBALIZE_LABEL (asm_out_file, fnname);
1028    }
1029
1030  /* Do any machine/system dependent processing of the function name */
1031#ifdef ASM_DECLARE_FUNCTION_NAME
1032  ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
1033#else
1034  /* Standard thing is just output label for the function.  */
1035  ASM_OUTPUT_LABEL (asm_out_file, fnname);
1036#endif /* ASM_DECLARE_FUNCTION_NAME */
1037}
1038
1039/* Output assembler code associated with defining the size of the
1040   function.  DECL describes the function.  NAME is the function's name.  */
1041
1042void
1043assemble_end_function (decl, fnname)
1044     tree decl;
1045     char *fnname;
1046{
1047#ifdef ASM_DECLARE_FUNCTION_SIZE
1048  ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1049#endif
1050  if (! CONSTANT_POOL_BEFORE_FUNCTION)
1051    {
1052      output_constant_pool (fnname, decl);
1053      function_section (decl);	/* need to switch back */
1054    }
1055
1056  /* Output any constants which should appear after the function.  */
1057  output_after_function_constants ();
1058}
1059
1060/* Assemble code to leave SIZE bytes of zeros.  */
1061
1062void
1063assemble_zeros (size)
1064     int size;
1065{
1066#ifdef ASM_NO_SKIP_IN_TEXT
1067  /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1068     so we must output 0s explicitly in the text section.  */
1069  if (ASM_NO_SKIP_IN_TEXT && in_text_section ())
1070    {
1071      int i;
1072
1073      for (i = 0; i < size - 20; i += 20)
1074	{
1075#ifdef ASM_BYTE_OP
1076	  fprintf (asm_out_file,
1077		   "%s 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n", ASM_BYTE_OP);
1078#else
1079	  fprintf (asm_out_file,
1080		   "\tbyte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n");
1081#endif
1082	}
1083      if (i < size)
1084        {
1085#ifdef ASM_BYTE_OP
1086	  fprintf (asm_out_file, "%s 0", ASM_BYTE_OP);
1087#else
1088	  fprintf (asm_out_file, "\tbyte 0");
1089#endif
1090	  i++;
1091	  for (; i < size; i++)
1092	    fprintf (asm_out_file, ",0");
1093	  fprintf (asm_out_file, "\n");
1094	}
1095    }
1096  else
1097#endif
1098    if (size > 0)
1099      ASM_OUTPUT_SKIP (asm_out_file, size);
1100}
1101
1102/* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
1103
1104void
1105assemble_align (align)
1106     int align;
1107{
1108  if (align > BITS_PER_UNIT)
1109    ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1110}
1111
1112/* Assemble a string constant with the specified C string as contents.  */
1113
1114void
1115assemble_string (p, size)
1116     char *p;
1117     int size;
1118{
1119  int pos = 0;
1120  int maximum = 2000;
1121
1122  /* If the string is very long, split it up.  */
1123
1124  while (pos < size)
1125    {
1126      int thissize = size - pos;
1127      if (thissize > maximum)
1128	thissize = maximum;
1129
1130      ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
1131
1132      pos += thissize;
1133      p += thissize;
1134    }
1135}
1136
1137
1138/* Assemble everything that is needed for a variable or function declaration.
1139   Not used for automatic variables, and not used for function definitions.
1140   Should not be called for variables of incomplete structure type.
1141
1142   TOP_LEVEL is nonzero if this variable has file scope.
1143   AT_END is nonzero if this is the special handling, at end of compilation,
1144   to define things that have had only tentative definitions.
1145   DONT_OUTPUT_DATA if nonzero means don't actually output the
1146   initial value (that will be done by the caller).  */
1147
1148void
1149assemble_variable (decl, top_level, at_end, dont_output_data)
1150     tree decl;
1151     int top_level;
1152     int at_end;
1153     int dont_output_data;
1154{
1155  register char *name;
1156  unsigned int align;
1157  tree size_tree;
1158  int reloc = 0;
1159  enum in_section saved_in_section;
1160
1161  last_assemble_variable_decl = 0;
1162
1163  if (GET_CODE (DECL_RTL (decl)) == REG)
1164    {
1165      /* Do output symbol info for global register variables, but do nothing
1166	 else for them.  */
1167
1168      if (TREE_ASM_WRITTEN (decl))
1169	return;
1170      TREE_ASM_WRITTEN (decl) = 1;
1171
1172#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
1173      /* File-scope global variables are output here.  */
1174      if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
1175	   && top_level)
1176	dbxout_symbol (decl, 0);
1177#endif
1178#ifdef SDB_DEBUGGING_INFO
1179      if (write_symbols == SDB_DEBUG && top_level
1180	  /* Leave initialized global vars for end of compilation;
1181	     see comment in compile_file.  */
1182	  && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
1183	sdbout_symbol (decl, 0);
1184#endif
1185
1186      /* Don't output any DWARF debugging information for variables here.
1187	 In the case of local variables, the information for them is output
1188	 when we do our recursive traversal of the tree representation for
1189	 the entire containing function.  In the case of file-scope variables,
1190	 we output information for all of them at the very end of compilation
1191	 while we are doing our final traversal of the chain of file-scope
1192	 declarations.  */
1193
1194      return;
1195    }
1196
1197  /* Normally no need to say anything here for external references,
1198     since assemble_external is called by the language-specific code
1199     when a declaration is first seen.  */
1200
1201  if (DECL_EXTERNAL (decl))
1202    return;
1203
1204  /* Output no assembler code for a function declaration.
1205     Only definitions of functions output anything.  */
1206
1207  if (TREE_CODE (decl) == FUNCTION_DECL)
1208    return;
1209
1210  /* If type was incomplete when the variable was declared,
1211     see if it is complete now.  */
1212
1213  if (DECL_SIZE (decl) == 0)
1214    layout_decl (decl, 0);
1215
1216  /* Still incomplete => don't allocate it; treat the tentative defn
1217     (which is what it must have been) as an `extern' reference.  */
1218
1219  if (!dont_output_data && DECL_SIZE (decl) == 0)
1220    {
1221      error_with_file_and_line (DECL_SOURCE_FILE (decl),
1222				DECL_SOURCE_LINE (decl),
1223				"storage size of `%s' isn't known",
1224				IDENTIFIER_POINTER (DECL_NAME (decl)));
1225      TREE_ASM_WRITTEN (decl) = 1;
1226      return;
1227    }
1228
1229  /* The first declaration of a variable that comes through this function
1230     decides whether it is global (in C, has external linkage)
1231     or local (in C, has internal linkage).  So do nothing more
1232     if this function has already run.  */
1233
1234  if (TREE_ASM_WRITTEN (decl))
1235    return;
1236
1237  TREE_ASM_WRITTEN (decl) = 1;
1238
1239  app_disable ();
1240
1241  if (! dont_output_data)
1242    {
1243      int size;
1244
1245      if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
1246	goto finish;
1247
1248      /* This is better than explicit arithmetic, since it avoids overflow.  */
1249      size_tree = size_binop (CEIL_DIV_EXPR,
1250			      DECL_SIZE (decl), size_int (BITS_PER_UNIT));
1251
1252      size = TREE_INT_CST_LOW (size_tree);
1253      if (TREE_INT_CST_HIGH (size_tree) != 0
1254	  || size != TREE_INT_CST_LOW (size_tree))
1255	{
1256	  error_with_decl (decl, "size of variable `%s' is too large");
1257	  goto finish;
1258	}
1259    }
1260
1261  name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
1262
1263  if (TREE_PUBLIC (decl) && DECL_NAME (decl)
1264      && ! first_global_object_name
1265      && ! (DECL_COMMON (decl) && (DECL_INITIAL (decl) == 0
1266				   || DECL_INITIAL (decl) == error_mark_node))
1267      && ! DECL_WEAK (decl)
1268      && ! DECL_ONE_ONLY (decl))
1269    {
1270      char *p;
1271
1272      STRIP_NAME_ENCODING (p, name);
1273      first_global_object_name = permalloc (strlen (p) + 1);
1274      strcpy (first_global_object_name, p);
1275    }
1276
1277  /* Compute the alignment of this data.  */
1278
1279  align = DECL_ALIGN (decl);
1280
1281  /* In the case for initialing an array whose length isn't specified,
1282     where we have not yet been able to do the layout,
1283     figure out the proper alignment now.  */
1284  if (dont_output_data && DECL_SIZE (decl) == 0
1285      && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1286    align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1287
1288  /* Some object file formats have a maximum alignment which they support.
1289     In particular, a.out format supports a maximum alignment of 4.  */
1290#ifndef MAX_OFILE_ALIGNMENT
1291#define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
1292#endif
1293  if (align > MAX_OFILE_ALIGNMENT)
1294    {
1295      warning_with_decl (decl,
1296	"alignment of `%s' is greater than maximum object file alignment. Using %d.",
1297                    MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
1298      align = MAX_OFILE_ALIGNMENT;
1299    }
1300
1301  /* On some machines, it is good to increase alignment sometimes.  */
1302#ifdef DATA_ALIGNMENT
1303  align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1304#endif
1305#ifdef CONSTANT_ALIGNMENT
1306  if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
1307    align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
1308#endif
1309
1310  /* Reset the alignment in case we have made it tighter, so we can benefit
1311     from it in get_pointer_alignment.  */
1312  DECL_ALIGN (decl) = align;
1313
1314  /* Handle uninitialized definitions.  */
1315
1316  if ((DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node)
1317      /* If the target can't output uninitialized but not common global data
1318	 in .bss, then we have to use .data.  */
1319#if ! defined (ASM_OUTPUT_BSS) && ! defined (ASM_OUTPUT_ALIGNED_BSS)
1320      && DECL_COMMON (decl)
1321#endif
1322      && ! dont_output_data)
1323    {
1324      int size = TREE_INT_CST_LOW (size_tree);
1325      int rounded = size;
1326
1327      /* Don't allocate zero bytes of common,
1328	 since that means "undefined external" in the linker.  */
1329      if (size == 0) rounded = 1;
1330      /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1331	 so that each uninitialized object starts on such a boundary.  */
1332      rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1333      rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1334		 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1335
1336#if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
1337      if ( (DECL_ALIGN (decl) / BITS_PER_UNIT) > rounded)
1338         warning_with_decl
1339           (decl, "requested alignment for %s is greater than implemented alignment of %d.",rounded);
1340#endif
1341
1342#ifdef DBX_DEBUGGING_INFO
1343      /* File-scope global variables are output here.  */
1344      if (write_symbols == DBX_DEBUG && top_level)
1345	dbxout_symbol (decl, 0);
1346#endif
1347#ifdef SDB_DEBUGGING_INFO
1348      if (write_symbols == SDB_DEBUG && top_level
1349	  /* Leave initialized global vars for end of compilation;
1350	     see comment in compile_file.  */
1351	  && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
1352	sdbout_symbol (decl, 0);
1353#endif
1354
1355      /* Don't output any DWARF debugging information for variables here.
1356	 In the case of local variables, the information for them is output
1357	 when we do our recursive traversal of the tree representation for
1358	 the entire containing function.  In the case of file-scope variables,
1359	 we output information for all of them at the very end of compilation
1360	 while we are doing our final traversal of the chain of file-scope
1361	 declarations.  */
1362
1363#if 0 /* ??? We should either delete this or add a comment describing what
1364	 it was intended to do and why we shouldn't delete it.  */
1365      if (flag_shared_data)
1366	data_section ();
1367#endif
1368
1369      if (TREE_PUBLIC (decl)
1370#if defined (ASM_OUTPUT_BSS) || defined (ASM_OUTPUT_ALIGNED_BSS)
1371	  && DECL_COMMON (decl)
1372#endif
1373	  )
1374	{
1375#ifdef ASM_OUTPUT_SHARED_COMMON
1376	  if (flag_shared_data)
1377	    ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
1378	  else
1379#endif
1380	      {
1381#ifdef ASM_OUTPUT_ALIGNED_DECL_COMMON
1382		ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size,
1383						   DECL_ALIGN (decl));
1384#else
1385#ifdef ASM_OUTPUT_ALIGNED_COMMON
1386		ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size,
1387					   DECL_ALIGN (decl));
1388#else
1389		ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
1390#endif
1391#endif
1392	      }
1393	}
1394#if defined (ASM_OUTPUT_BSS) || defined (ASM_OUTPUT_ALIGNED_BSS)
1395      else if (TREE_PUBLIC (decl))
1396	{
1397#ifdef ASM_OUTPUT_SHARED_BSS
1398	  if (flag_shared_data)
1399	    ASM_OUTPUT_SHARED_BSS (asm_out_file, decl, name, size, rounded);
1400	  else
1401#endif
1402	      {
1403#ifdef ASM_OUTPUT_ALIGNED_BSS
1404		ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size,
1405					DECL_ALIGN (decl));
1406#else
1407		ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded);
1408#endif
1409	      }
1410	}
1411#endif /* ASM_OUTPUT_BSS || ASM_OUTPUT_ALIGNED_BSS */
1412      else
1413	{
1414#ifdef ASM_OUTPUT_SHARED_LOCAL
1415	  if (flag_shared_data)
1416	    ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
1417	  else
1418#endif
1419	      {
1420#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
1421		ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size,
1422						  DECL_ALIGN (decl));
1423#else
1424#ifdef ASM_OUTPUT_ALIGNED_LOCAL
1425		ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size,
1426					  DECL_ALIGN (decl));
1427#else
1428		ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1429#endif
1430#endif
1431	      }
1432	}
1433      goto finish;
1434    }
1435
1436  /* Handle initialized definitions.
1437     Also handle uninitialized global definitions if -fno-common and the
1438     target doesn't support ASM_OUTPUT_BSS.  */
1439
1440  /* First make the assembler name(s) global if appropriate.  */
1441  if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1442    {
1443#ifdef ASM_WEAKEN_LABEL
1444      if (DECL_WEAK (decl))
1445	ASM_WEAKEN_LABEL (asm_out_file, name);
1446      else
1447#endif
1448      ASM_GLOBALIZE_LABEL (asm_out_file, name);
1449    }
1450#if 0
1451  for (d = equivalents; d; d = TREE_CHAIN (d))
1452    {
1453      tree e = TREE_VALUE (d);
1454      if (TREE_PUBLIC (e) && DECL_NAME (e))
1455	ASM_GLOBALIZE_LABEL (asm_out_file,
1456			     XSTR (XEXP (DECL_RTL (e), 0), 0));
1457    }
1458#endif
1459
1460  /* Output any data that we will need to use the address of.  */
1461  if (DECL_INITIAL (decl) == error_mark_node)
1462    reloc = contains_pointers_p (TREE_TYPE (decl));
1463  else if (DECL_INITIAL (decl))
1464    reloc = output_addressed_constants (DECL_INITIAL (decl));
1465
1466#ifdef ASM_OUTPUT_SECTION_NAME
1467  if (UNIQUE_SECTION_P (decl))
1468    UNIQUE_SECTION (decl, reloc);
1469#endif
1470
1471  /* Switch to the appropriate section.  */
1472  variable_section (decl, reloc);
1473
1474  /* dbxout.c needs to know this.  */
1475  if (in_text_section ())
1476    DECL_IN_TEXT_SECTION (decl) = 1;
1477
1478  /* Record current section so we can restore it if dbxout.c clobbers it.  */
1479  saved_in_section = in_section;
1480
1481  /* Output the dbx info now that we have chosen the section.  */
1482
1483#ifdef DBX_DEBUGGING_INFO
1484  /* File-scope global variables are output here.  */
1485  if (write_symbols == DBX_DEBUG && top_level)
1486    dbxout_symbol (decl, 0);
1487#endif
1488#ifdef SDB_DEBUGGING_INFO
1489  if (write_symbols == SDB_DEBUG && top_level
1490      /* Leave initialized global vars for end of compilation;
1491	 see comment in compile_file.  */
1492      && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
1493    sdbout_symbol (decl, 0);
1494#endif
1495
1496  /* Don't output any DWARF debugging information for variables here.
1497     In the case of local variables, the information for them is output
1498     when we do our recursive traversal of the tree representation for
1499     the entire containing function.  In the case of file-scope variables,
1500     we output information for all of them at the very end of compilation
1501     while we are doing our final traversal of the chain of file-scope
1502     declarations.  */
1503
1504  /* If the debugging output changed sections, reselect the section
1505     that's supposed to be selected.  */
1506  if (in_section != saved_in_section)
1507    variable_section (decl, reloc);
1508
1509  /* Output the alignment of this data.  */
1510  if (align > BITS_PER_UNIT)
1511    ASM_OUTPUT_ALIGN (asm_out_file,
1512		      floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT));
1513
1514  /* Do any machine/system dependent processing of the object.  */
1515#ifdef ASM_DECLARE_OBJECT_NAME
1516  last_assemble_variable_decl = decl;
1517  ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
1518#else
1519  /* Standard thing is just output label for the object.  */
1520  ASM_OUTPUT_LABEL (asm_out_file, name);
1521#endif /* ASM_DECLARE_OBJECT_NAME */
1522
1523  if (!dont_output_data)
1524    {
1525      if (DECL_INITIAL (decl))
1526	/* Output the actual data.  */
1527	output_constant (DECL_INITIAL (decl), TREE_INT_CST_LOW (size_tree));
1528      else
1529	/* Leave space for it.  */
1530	assemble_zeros (TREE_INT_CST_LOW (size_tree));
1531    }
1532
1533 finish:
1534#ifdef XCOFF_DEBUGGING_INFO
1535  /* Unfortunately, the IBM assembler cannot handle stabx before the actual
1536     declaration.  When something like ".stabx  "aa:S-2",aa,133,0" is emitted
1537     and `aa' hasn't been output yet, the assembler generates a stab entry with
1538     a value of zero, in addition to creating an unnecessary external entry
1539     for `aa'.  Hence, we must postpone dbxout_symbol to here at the end.  */
1540
1541  /* File-scope global variables are output here.  */
1542  if (write_symbols == XCOFF_DEBUG && top_level)
1543    {
1544      saved_in_section = in_section;
1545
1546      dbxout_symbol (decl, 0);
1547
1548      if (in_section != saved_in_section)
1549	variable_section (decl, reloc);
1550    }
1551#else
1552  /* There must be a statement after a label.  */
1553  ;
1554#endif
1555}
1556
1557/* Return 1 if type TYPE contains any pointers.  */
1558
1559static int
1560contains_pointers_p (type)
1561     tree type;
1562{
1563  switch (TREE_CODE (type))
1564    {
1565    case POINTER_TYPE:
1566    case REFERENCE_TYPE:
1567      /* I'm not sure whether OFFSET_TYPE needs this treatment,
1568	 so I'll play safe and return 1.  */
1569    case OFFSET_TYPE:
1570      return 1;
1571
1572    case RECORD_TYPE:
1573    case UNION_TYPE:
1574    case QUAL_UNION_TYPE:
1575      {
1576	tree fields;
1577	/* For a type that has fields, see if the fields have pointers.  */
1578	for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
1579	  if (TREE_CODE (fields) == FIELD_DECL
1580	      && contains_pointers_p (TREE_TYPE (fields)))
1581	    return 1;
1582	return 0;
1583      }
1584
1585    case ARRAY_TYPE:
1586      /* An array type contains pointers if its element type does.  */
1587      return contains_pointers_p (TREE_TYPE (type));
1588
1589    default:
1590      return 0;
1591    }
1592}
1593
1594/* Output something to declare an external symbol to the assembler.
1595   (Most assemblers don't need this, so we normally output nothing.)
1596   Do nothing if DECL is not external.  */
1597
1598void
1599assemble_external (decl)
1600     tree decl;
1601{
1602#ifdef ASM_OUTPUT_EXTERNAL
1603  if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd'
1604      && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
1605    {
1606      rtx rtl = DECL_RTL (decl);
1607
1608      if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
1609	  && ! SYMBOL_REF_USED (XEXP (rtl, 0)))
1610	{
1611	  /* Some systems do require some output.  */
1612	  SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
1613	  ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
1614	}
1615    }
1616#endif
1617}
1618
1619/* Similar, for calling a library function FUN.  */
1620
1621void
1622assemble_external_libcall (fun)
1623     rtx fun;
1624{
1625#ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
1626  /* Declare library function name external when first used, if nec.  */
1627  if (! SYMBOL_REF_USED (fun))
1628    {
1629      SYMBOL_REF_USED (fun) = 1;
1630      ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
1631    }
1632#endif
1633}
1634
1635/* Declare the label NAME global.  */
1636
1637void
1638assemble_global (name)
1639     char *name;
1640{
1641  ASM_GLOBALIZE_LABEL (asm_out_file, name);
1642}
1643
1644/* Assemble a label named NAME.  */
1645
1646void
1647assemble_label (name)
1648     char *name;
1649{
1650  ASM_OUTPUT_LABEL (asm_out_file, name);
1651}
1652
1653/* Output to FILE a reference to the assembler name of a C-level name NAME.
1654   If NAME starts with a *, the rest of NAME is output verbatim.
1655   Otherwise NAME is transformed in an implementation-defined way
1656   (usually by the addition of an underscore).
1657   Many macros in the tm file are defined to call this function.  */
1658
1659void
1660assemble_name (file, name)
1661     FILE *file;
1662     char *name;
1663{
1664  char *real_name;
1665  tree id;
1666
1667  STRIP_NAME_ENCODING (real_name, name);
1668  if (flag_prefix_function_name
1669      && ! bcmp (real_name, CHKR_PREFIX, CHKR_PREFIX_SIZE))
1670    real_name = real_name + CHKR_PREFIX_SIZE;
1671
1672  id = maybe_get_identifier (real_name);
1673  if (id)
1674    TREE_SYMBOL_REFERENCED (id) = 1;
1675
1676  if (name[0] == '*')
1677    fputs (&name[1], file);
1678  else
1679    ASM_OUTPUT_LABELREF (file, name);
1680}
1681
1682/* Allocate SIZE bytes writable static space with a gensym name
1683   and return an RTX to refer to its address.  */
1684
1685rtx
1686assemble_static_space (size)
1687     int size;
1688{
1689  char name[12];
1690  char *namestring;
1691  rtx x;
1692
1693#if 0
1694  if (flag_shared_data)
1695    data_section ();
1696#endif
1697
1698  ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1699  ++const_labelno;
1700
1701  namestring = (char *) obstack_alloc (saveable_obstack,
1702				       strlen (name) + 2);
1703  strcpy (namestring, name);
1704
1705  x = gen_rtx_SYMBOL_REF (Pmode, namestring);
1706
1707#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
1708  ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
1709				 BIGGEST_ALIGNMENT);
1710#else
1711#ifdef ASM_OUTPUT_ALIGNED_LOCAL
1712  ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
1713#else
1714  {
1715    /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1716       so that each uninitialized object starts on such a boundary.  */
1717    int rounded = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1718		   / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1719		   * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1720    ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1721  }
1722#endif
1723#endif
1724  return x;
1725}
1726
1727/* Assemble the static constant template for function entry trampolines.
1728   This is done at most once per compilation.
1729   Returns an RTX for the address of the template.  */
1730
1731#ifdef TRAMPOLINE_TEMPLATE
1732rtx
1733assemble_trampoline_template ()
1734{
1735  char label[256];
1736  char *name;
1737  int align;
1738
1739  /* By default, put trampoline templates in read-only data section.  */
1740
1741#ifdef TRAMPOLINE_SECTION
1742  TRAMPOLINE_SECTION ();
1743#else
1744  readonly_data_section ();
1745#endif
1746
1747  /* Write the assembler code to define one.  */
1748  align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
1749  if (align > 0)
1750    ASM_OUTPUT_ALIGN (asm_out_file, align);
1751
1752  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LTRAMP", 0);
1753  TRAMPOLINE_TEMPLATE (asm_out_file);
1754
1755  /* Record the rtl to refer to it.  */
1756  ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1757  name
1758    = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
1759  return gen_rtx_SYMBOL_REF (Pmode, name);
1760}
1761#endif
1762
1763/* Assemble the integer constant X into an object of SIZE bytes.
1764   X must be either a CONST_INT or CONST_DOUBLE.
1765
1766   Return 1 if we were able to output the constant, otherwise 0.  If FORCE is
1767   non-zero, abort if we can't output the constant.  */
1768
1769int
1770assemble_integer (x, size, force)
1771     rtx x;
1772     int size;
1773     int force;
1774{
1775  /* First try to use the standard 1, 2, 4, 8, and 16 byte
1776     ASM_OUTPUT... macros.  */
1777
1778  switch (size)
1779    {
1780#ifdef ASM_OUTPUT_CHAR
1781    case 1:
1782      ASM_OUTPUT_CHAR (asm_out_file, x);
1783      return 1;
1784#endif
1785
1786#ifdef ASM_OUTPUT_SHORT
1787    case 2:
1788      ASM_OUTPUT_SHORT (asm_out_file, x);
1789      return 1;
1790#endif
1791
1792#ifdef ASM_OUTPUT_INT
1793    case 4:
1794      ASM_OUTPUT_INT (asm_out_file, x);
1795      return 1;
1796#endif
1797
1798#ifdef ASM_OUTPUT_DOUBLE_INT
1799    case 8:
1800      ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
1801      return 1;
1802#endif
1803
1804#ifdef ASM_OUTPUT_QUADRUPLE_INT
1805    case 16:
1806      ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
1807      return 1;
1808#endif
1809    }
1810
1811  /* If we couldn't do it that way, there are two other possibilities: First,
1812     if the machine can output an explicit byte and this is a 1 byte constant,
1813     we can use ASM_OUTPUT_BYTE.  */
1814
1815#ifdef ASM_OUTPUT_BYTE
1816  if (size == 1 && GET_CODE (x) == CONST_INT)
1817    {
1818      ASM_OUTPUT_BYTE (asm_out_file, INTVAL (x));
1819      return 1;
1820    }
1821#endif
1822
1823  /* Finally, if SIZE is larger than a single word, try to output the constant
1824     one word at a time.  */
1825
1826  if (size > UNITS_PER_WORD)
1827    {
1828      int i;
1829      enum machine_mode mode
1830	= mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1831      rtx word;
1832
1833      for (i = 0; i < size / UNITS_PER_WORD; i++)
1834	{
1835	  word = operand_subword (x, i, 0, mode);
1836
1837	  if (word == 0)
1838	    break;
1839
1840	  if (! assemble_integer (word, UNITS_PER_WORD, 0))
1841	    break;
1842	}
1843
1844      if (i == size / UNITS_PER_WORD)
1845	return 1;
1846      /* If we output at least one word and then could not finish,
1847	 there is no valid way to continue.  */
1848      if (i > 0)
1849	abort ();
1850    }
1851
1852  if (force)
1853    abort ();
1854
1855  return 0;
1856}
1857
1858/* Assemble the floating-point constant D into an object of size MODE.  */
1859
1860void
1861assemble_real (d, mode)
1862     REAL_VALUE_TYPE d;
1863     enum machine_mode mode;
1864{
1865  jmp_buf output_constant_handler;
1866
1867  if (setjmp (output_constant_handler))
1868    {
1869      error ("floating point trap outputting a constant");
1870#ifdef REAL_IS_NOT_DOUBLE
1871      bzero ((char *) &d, sizeof d);
1872      d = dconst0;
1873#else
1874      d = 0;
1875#endif
1876    }
1877
1878  set_float_handler (output_constant_handler);
1879
1880  switch (mode)
1881    {
1882#ifdef ASM_OUTPUT_BYTE_FLOAT
1883    case QFmode:
1884      ASM_OUTPUT_BYTE_FLOAT (asm_out_file, d);
1885      break;
1886#endif
1887#ifdef ASM_OUTPUT_SHORT_FLOAT
1888    case HFmode:
1889      ASM_OUTPUT_SHORT_FLOAT (asm_out_file, d);
1890      break;
1891#endif
1892#ifdef ASM_OUTPUT_THREE_QUARTER_FLOAT
1893    case TQFmode:
1894      ASM_OUTPUT_THREE_QUARTER_FLOAT (asm_out_file, d);
1895      break;
1896#endif
1897#ifdef ASM_OUTPUT_FLOAT
1898    case SFmode:
1899      ASM_OUTPUT_FLOAT (asm_out_file, d);
1900      break;
1901#endif
1902
1903#ifdef ASM_OUTPUT_DOUBLE
1904    case DFmode:
1905      ASM_OUTPUT_DOUBLE (asm_out_file, d);
1906      break;
1907#endif
1908
1909#ifdef ASM_OUTPUT_LONG_DOUBLE
1910    case XFmode:
1911    case TFmode:
1912      ASM_OUTPUT_LONG_DOUBLE (asm_out_file, d);
1913      break;
1914#endif
1915
1916    default:
1917      abort ();
1918    }
1919
1920  set_float_handler (NULL_PTR);
1921}
1922
1923/* Here we combine duplicate floating constants to make
1924   CONST_DOUBLE rtx's, and force those out to memory when necessary.  */
1925
1926/* Chain of all CONST_DOUBLE rtx's constructed for the current function.
1927   They are chained through the CONST_DOUBLE_CHAIN.
1928   A CONST_DOUBLE rtx has CONST_DOUBLE_MEM != cc0_rtx iff it is on this chain.
1929   In that case, CONST_DOUBLE_MEM is either a MEM,
1930   or const0_rtx if no MEM has been made for this CONST_DOUBLE yet.
1931
1932   (CONST_DOUBLE_MEM is used only for top-level functions.
1933   See force_const_mem for explanation.)  */
1934
1935static rtx const_double_chain;
1936
1937/* Return a CONST_DOUBLE or CONST_INT for a value specified as a pair of ints.
1938   For an integer, I0 is the low-order word and I1 is the high-order word.
1939   For a real number, I0 is the word with the low address
1940   and I1 is the word with the high address.  */
1941
1942rtx
1943immed_double_const (i0, i1, mode)
1944     HOST_WIDE_INT i0, i1;
1945     enum machine_mode mode;
1946{
1947  register rtx r;
1948
1949  if (GET_MODE_CLASS (mode) == MODE_INT
1950      || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
1951    {
1952      /* We clear out all bits that don't belong in MODE, unless they and our
1953	 sign bit are all one.  So we get either a reasonable negative value
1954	 or a reasonable unsigned value for this mode.  */
1955      int width = GET_MODE_BITSIZE (mode);
1956      if (width < HOST_BITS_PER_WIDE_INT
1957	  && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
1958	      != ((HOST_WIDE_INT) (-1) << (width - 1))))
1959	i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
1960      else if (width == HOST_BITS_PER_WIDE_INT
1961	       && ! (i1 == ~0 && i0 < 0))
1962	i1 = 0;
1963      else if (width > 2 * HOST_BITS_PER_WIDE_INT)
1964	/* We cannot represent this value as a constant.  */
1965	abort ();
1966
1967      /* If this would be an entire word for the target, but is not for
1968	 the host, then sign-extend on the host so that the number will look
1969	 the same way on the host that it would on the target.
1970
1971	 For example, when building a 64 bit alpha hosted 32 bit sparc
1972	 targeted compiler, then we want the 32 bit unsigned value -1 to be
1973	 represented as a 64 bit value -1, and not as 0x00000000ffffffff.
1974	 The later confuses the sparc backend.  */
1975
1976      if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width
1977	  && (i0 & ((HOST_WIDE_INT) 1 << (width - 1))))
1978	i0 |= ((HOST_WIDE_INT) (-1) << width);
1979
1980      /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a CONST_INT.
1981
1982	 ??? Strictly speaking, this is wrong if we create a CONST_INT
1983	 for a large unsigned constant with the size of MODE being
1984	 HOST_BITS_PER_WIDE_INT and later try to interpret that constant in a
1985	 wider mode.  In that case we will mis-interpret it as a negative
1986	 number.
1987
1988	 Unfortunately, the only alternative is to make a CONST_DOUBLE
1989	 for any constant in any mode if it is an unsigned constant larger
1990	 than the maximum signed integer in an int on the host.  However,
1991	 doing this will break everyone that always expects to see a CONST_INT
1992	 for SImode and smaller.
1993
1994	 We have always been making CONST_INTs in this case, so nothing new
1995	 is being broken.  */
1996
1997      if (width <= HOST_BITS_PER_WIDE_INT)
1998	i1 = (i0 < 0) ? ~(HOST_WIDE_INT) 0 : 0;
1999
2000      /* If this integer fits in one word, return a CONST_INT.  */
2001      if ((i1 == 0 && i0 >= 0)
2002	  || (i1 == ~0 && i0 < 0))
2003	return GEN_INT (i0);
2004
2005      /* We use VOIDmode for integers.  */
2006      mode = VOIDmode;
2007    }
2008
2009  /* Search the chain for an existing CONST_DOUBLE with the right value.
2010     If one is found, return it.  */
2011
2012  for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
2013    if (CONST_DOUBLE_LOW (r) == i0 && CONST_DOUBLE_HIGH (r) == i1
2014	&& GET_MODE (r) == mode)
2015      return r;
2016
2017  /* No; make a new one and add it to the chain.
2018
2019     We may be called by an optimizer which may be discarding any memory
2020     allocated during its processing (such as combine and loop).  However,
2021     we will be leaving this constant on the chain, so we cannot tolerate
2022     freed memory.  So switch to saveable_obstack for this allocation
2023     and then switch back if we were in current_obstack.  */
2024
2025  push_obstacks_nochange ();
2026  rtl_in_saveable_obstack ();
2027  r = gen_rtx_CONST_DOUBLE (mode, NULL_RTX, i0, i1);
2028  pop_obstacks ();
2029
2030  /* Don't touch const_double_chain in nested function; see force_const_mem.
2031     Also, don't touch it if not inside any function.  */
2032  if (outer_function_chain == 0 && current_function_decl != 0)
2033    {
2034      CONST_DOUBLE_CHAIN (r) = const_double_chain;
2035      const_double_chain = r;
2036    }
2037
2038  /* Store const0_rtx in mem-slot since this CONST_DOUBLE is on the chain.
2039     Actual use of mem-slot is only through force_const_mem.  */
2040
2041  CONST_DOUBLE_MEM (r) = const0_rtx;
2042
2043  return r;
2044}
2045
2046/* Return a CONST_DOUBLE for a specified `double' value
2047   and machine mode.  */
2048
2049rtx
2050immed_real_const_1 (d, mode)
2051     REAL_VALUE_TYPE d;
2052     enum machine_mode mode;
2053{
2054  union real_extract u;
2055  register rtx r;
2056
2057  /* Get the desired `double' value as a sequence of ints
2058     since that is how they are stored in a CONST_DOUBLE.  */
2059
2060  u.d = d;
2061
2062  /* Detect special cases.  */
2063
2064  if (REAL_VALUES_IDENTICAL (dconst0, d))
2065    return CONST0_RTX (mode);
2066  /* Check for NaN first, because some ports (specifically the i386) do not
2067     emit correct ieee-fp code by default, and thus will generate a core
2068     dump here if we pass a NaN to REAL_VALUES_EQUAL and if REAL_VALUES_EQUAL
2069     does a floating point comparison.  */
2070  else if (! REAL_VALUE_ISNAN (d) && REAL_VALUES_EQUAL (dconst1, d))
2071    return CONST1_RTX (mode);
2072
2073  if (sizeof u == sizeof (HOST_WIDE_INT))
2074    return immed_double_const (u.i[0], 0, mode);
2075  if (sizeof u == 2 * sizeof (HOST_WIDE_INT))
2076    return immed_double_const (u.i[0], u.i[1], mode);
2077
2078  /* The rest of this function handles the case where
2079     a float value requires more than 2 ints of space.
2080     It will be deleted as dead code on machines that don't need it.  */
2081
2082  /* Search the chain for an existing CONST_DOUBLE with the right value.
2083     If one is found, return it.  */
2084
2085  for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
2086    if (! bcmp ((char *) &CONST_DOUBLE_LOW (r), (char *) &u, sizeof u)
2087	&& GET_MODE (r) == mode)
2088      return r;
2089
2090  /* No; make a new one and add it to the chain.
2091
2092     We may be called by an optimizer which may be discarding any memory
2093     allocated during its processing (such as combine and loop).  However,
2094     we will be leaving this constant on the chain, so we cannot tolerate
2095     freed memory.  So switch to saveable_obstack for this allocation
2096     and then switch back if we were in current_obstack.  */
2097
2098  push_obstacks_nochange ();
2099  rtl_in_saveable_obstack ();
2100  r = rtx_alloc (CONST_DOUBLE);
2101  PUT_MODE (r, mode);
2102  bcopy ((char *) &u, (char *) &CONST_DOUBLE_LOW (r), sizeof u);
2103  pop_obstacks ();
2104
2105  /* Don't touch const_double_chain in nested function; see force_const_mem.
2106     Also, don't touch it if not inside any function.  */
2107  if (outer_function_chain == 0 && current_function_decl != 0)
2108    {
2109      CONST_DOUBLE_CHAIN (r) = const_double_chain;
2110      const_double_chain = r;
2111    }
2112
2113  /* Store const0_rtx in CONST_DOUBLE_MEM since this CONST_DOUBLE is on the
2114     chain, but has not been allocated memory.  Actual use of CONST_DOUBLE_MEM
2115     is only through force_const_mem.  */
2116
2117  CONST_DOUBLE_MEM (r) = const0_rtx;
2118
2119  return r;
2120}
2121
2122/* Return a CONST_DOUBLE rtx for a value specified by EXP,
2123   which must be a REAL_CST tree node.  */
2124
2125rtx
2126immed_real_const (exp)
2127     tree exp;
2128{
2129  return immed_real_const_1 (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)));
2130}
2131
2132/* At the end of a function, forget the memory-constants
2133   previously made for CONST_DOUBLEs.  Mark them as not on real_constant_chain.
2134   Also clear out real_constant_chain and clear out all the chain-pointers.  */
2135
2136void
2137clear_const_double_mem ()
2138{
2139  register rtx r, next;
2140
2141  /* Don't touch CONST_DOUBLE_MEM for nested functions.
2142     See force_const_mem for explanation.  */
2143  if (outer_function_chain != 0)
2144    return;
2145
2146  for (r = const_double_chain; r; r = next)
2147    {
2148      next = CONST_DOUBLE_CHAIN (r);
2149      CONST_DOUBLE_CHAIN (r) = 0;
2150      CONST_DOUBLE_MEM (r) = cc0_rtx;
2151    }
2152  const_double_chain = 0;
2153}
2154
2155/* Given an expression EXP with a constant value,
2156   reduce it to the sum of an assembler symbol and an integer.
2157   Store them both in the structure *VALUE.
2158   Abort if EXP does not reduce.  */
2159
2160struct addr_const
2161{
2162  rtx base;
2163  HOST_WIDE_INT offset;
2164};
2165
2166static void
2167decode_addr_const (exp, value)
2168     tree exp;
2169     struct addr_const *value;
2170{
2171  register tree target = TREE_OPERAND (exp, 0);
2172  register int offset = 0;
2173  register rtx x;
2174
2175  while (1)
2176    {
2177      if (TREE_CODE (target) == COMPONENT_REF
2178	  && (TREE_CODE (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1)))
2179	      == INTEGER_CST))
2180	{
2181	  offset += TREE_INT_CST_LOW (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1))) / BITS_PER_UNIT;
2182	  target = TREE_OPERAND (target, 0);
2183	}
2184      else if (TREE_CODE (target) == ARRAY_REF)
2185	{
2186	  if (TREE_CODE (TREE_OPERAND (target, 1)) != INTEGER_CST
2187	      || TREE_CODE (TYPE_SIZE (TREE_TYPE (target))) != INTEGER_CST)
2188	    abort ();
2189	  offset += ((TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (target)))
2190		      * TREE_INT_CST_LOW (TREE_OPERAND (target, 1)))
2191		     / BITS_PER_UNIT);
2192	  target = TREE_OPERAND (target, 0);
2193	}
2194      else
2195	break;
2196    }
2197
2198  switch (TREE_CODE (target))
2199    {
2200    case VAR_DECL:
2201    case FUNCTION_DECL:
2202      x = DECL_RTL (target);
2203      break;
2204
2205    case LABEL_DECL:
2206      x = gen_rtx_MEM (FUNCTION_MODE,
2207		       gen_rtx_LABEL_REF (VOIDmode,
2208					  label_rtx (TREE_OPERAND (exp, 0))));
2209      break;
2210
2211    case REAL_CST:
2212    case STRING_CST:
2213    case COMPLEX_CST:
2214    case CONSTRUCTOR:
2215    case INTEGER_CST:
2216      x = TREE_CST_RTL (target);
2217      break;
2218
2219    default:
2220      abort ();
2221    }
2222
2223  if (GET_CODE (x) != MEM)
2224    abort ();
2225  x = XEXP (x, 0);
2226
2227  value->base = x;
2228  value->offset = offset;
2229}
2230
2231/* Uniquize all constants that appear in memory.
2232   Each constant in memory thus far output is recorded
2233   in `const_hash_table' with a `struct constant_descriptor'
2234   that contains a polish representation of the value of
2235   the constant.
2236
2237   We cannot store the trees in the hash table
2238   because the trees may be temporary.  */
2239
2240struct constant_descriptor
2241{
2242  struct constant_descriptor *next;
2243  char *label;
2244  char contents[1];
2245};
2246
2247#define HASHBITS 30
2248#define MAX_HASH_TABLE 1009
2249static struct constant_descriptor *const_hash_table[MAX_HASH_TABLE];
2250
2251/* Compute a hash code for a constant expression.  */
2252
2253static int
2254const_hash (exp)
2255     tree exp;
2256{
2257  register char *p;
2258  register int len, hi, i;
2259  register enum tree_code code = TREE_CODE (exp);
2260
2261  /* Either set P and LEN to the address and len of something to hash and
2262     exit the switch or return a value.  */
2263
2264  switch (code)
2265    {
2266    case INTEGER_CST:
2267      p = (char *) &TREE_INT_CST_LOW (exp);
2268      len = 2 * sizeof TREE_INT_CST_LOW (exp);
2269      break;
2270
2271    case REAL_CST:
2272      p = (char *) &TREE_REAL_CST (exp);
2273      len = sizeof TREE_REAL_CST (exp);
2274      break;
2275
2276    case STRING_CST:
2277      p = TREE_STRING_POINTER (exp);
2278      len = TREE_STRING_LENGTH (exp);
2279      break;
2280
2281    case COMPLEX_CST:
2282      return (const_hash (TREE_REALPART (exp)) * 5
2283	      + const_hash (TREE_IMAGPART (exp)));
2284
2285    case CONSTRUCTOR:
2286      if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2287	{
2288	  len = int_size_in_bytes (TREE_TYPE (exp));
2289	  p = (char *) alloca (len);
2290	  get_set_constructor_bytes (exp, (unsigned char *) p, len);
2291	  break;
2292	}
2293      else
2294	{
2295	  register tree link;
2296
2297	  /* For record type, include the type in the hashing.
2298	     We do not do so for array types
2299	     because (1) the sizes of the elements are sufficient
2300	     and (2) distinct array types can have the same constructor.
2301	     Instead, we include the array size because the constructor could
2302	     be shorter.  */
2303	  if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2304	    hi = ((unsigned long) TREE_TYPE (exp) & ((1 << HASHBITS) - 1))
2305	      % MAX_HASH_TABLE;
2306	  else
2307	    hi = ((5 + int_size_in_bytes (TREE_TYPE (exp)))
2308		  & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
2309
2310	  for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2311	    if (TREE_VALUE (link))
2312	      hi
2313		= (hi * 603 + const_hash (TREE_VALUE (link))) % MAX_HASH_TABLE;
2314
2315	  return hi;
2316	}
2317
2318    case ADDR_EXPR:
2319      {
2320	struct addr_const value;
2321
2322	decode_addr_const (exp, &value);
2323	if (GET_CODE (value.base) == SYMBOL_REF)
2324	  {
2325	    /* Don't hash the address of the SYMBOL_REF;
2326	       only use the offset and the symbol name.  */
2327	    hi = value.offset;
2328	    p = XSTR (value.base, 0);
2329	    for (i = 0; p[i] != 0; i++)
2330	      hi = ((hi * 613) + (unsigned) (p[i]));
2331	  }
2332	else if (GET_CODE (value.base) == LABEL_REF)
2333	  hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2334
2335	hi &= (1 << HASHBITS) - 1;
2336	hi %= MAX_HASH_TABLE;
2337      }
2338      return hi;
2339
2340    case PLUS_EXPR:
2341    case MINUS_EXPR:
2342      return (const_hash (TREE_OPERAND (exp, 0)) * 9
2343	      + const_hash (TREE_OPERAND (exp, 1)));
2344
2345    case NOP_EXPR:
2346    case CONVERT_EXPR:
2347    case NON_LVALUE_EXPR:
2348      return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
2349
2350    default:
2351      abort ();
2352    }
2353
2354  /* Compute hashing function */
2355  hi = len;
2356  for (i = 0; i < len; i++)
2357    hi = ((hi * 613) + (unsigned) (p[i]));
2358
2359  hi &= (1 << HASHBITS) - 1;
2360  hi %= MAX_HASH_TABLE;
2361  return hi;
2362}
2363
2364/* Compare a constant expression EXP with a constant-descriptor DESC.
2365   Return 1 if DESC describes a constant with the same value as EXP.  */
2366
2367static int
2368compare_constant (exp, desc)
2369     tree exp;
2370     struct constant_descriptor *desc;
2371{
2372  return 0 != compare_constant_1 (exp, desc->contents);
2373}
2374
2375/* Compare constant expression EXP with a substring P of a constant descriptor.
2376   If they match, return a pointer to the end of the substring matched.
2377   If they do not match, return 0.
2378
2379   Since descriptors are written in polish prefix notation,
2380   this function can be used recursively to test one operand of EXP
2381   against a subdescriptor, and if it succeeds it returns the
2382   address of the subdescriptor for the next operand.  */
2383
2384static char *
2385compare_constant_1 (exp, p)
2386     tree exp;
2387     char *p;
2388{
2389  register char *strp;
2390  register int len;
2391  register enum tree_code code = TREE_CODE (exp);
2392
2393  if (code != (enum tree_code) *p++)
2394    return 0;
2395
2396  /* Either set STRP, P and LEN to pointers and length to compare and exit the
2397     switch, or return the result of the comparison.  */
2398
2399  switch (code)
2400    {
2401    case INTEGER_CST:
2402      /* Integer constants are the same only if the same width of type.  */
2403      if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
2404	return 0;
2405
2406      strp = (char *) &TREE_INT_CST_LOW (exp);
2407      len = 2 * sizeof TREE_INT_CST_LOW (exp);
2408      break;
2409
2410    case REAL_CST:
2411      /* Real constants are the same only if the same width of type.  */
2412      if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
2413	return 0;
2414
2415      strp = (char *) &TREE_REAL_CST (exp);
2416      len = sizeof TREE_REAL_CST (exp);
2417      break;
2418
2419    case STRING_CST:
2420      if (flag_writable_strings)
2421	return 0;
2422
2423      if (*p++ != TYPE_MODE (TREE_TYPE (exp)))
2424	return 0;
2425
2426      strp = TREE_STRING_POINTER (exp);
2427      len = TREE_STRING_LENGTH (exp);
2428      if (bcmp ((char *) &TREE_STRING_LENGTH (exp), p,
2429		sizeof TREE_STRING_LENGTH (exp)))
2430	return 0;
2431
2432      p += sizeof TREE_STRING_LENGTH (exp);
2433      break;
2434
2435    case COMPLEX_CST:
2436      p = compare_constant_1 (TREE_REALPART (exp), p);
2437      if (p == 0)
2438	return 0;
2439
2440      return compare_constant_1 (TREE_IMAGPART (exp), p);
2441
2442    case CONSTRUCTOR:
2443      if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2444	{
2445	  int xlen = len = int_size_in_bytes (TREE_TYPE (exp));
2446
2447	  strp = (char *) alloca (len);
2448	  get_set_constructor_bytes (exp, (unsigned char *) strp, len);
2449	  if (bcmp ((char *) &xlen, p, sizeof xlen))
2450	    return 0;
2451
2452	  p += sizeof xlen;
2453	  break;
2454	}
2455      else
2456	{
2457	  register tree link;
2458	  int length = list_length (CONSTRUCTOR_ELTS (exp));
2459	  tree type;
2460	  int have_purpose = 0;
2461
2462	  for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2463	    if (TREE_PURPOSE (link))
2464	      have_purpose = 1;
2465
2466	  if (bcmp ((char *) &length, p, sizeof length))
2467	    return 0;
2468
2469	  p += sizeof length;
2470
2471	  /* For record constructors, insist that the types match.
2472	     For arrays, just verify both constructors are for arrays.
2473	     Then insist that either both or none have any TREE_PURPOSE
2474	     values.  */
2475	  if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2476	    type = TREE_TYPE (exp);
2477	  else
2478	    type = 0;
2479
2480	  if (bcmp ((char *) &type, p, sizeof type))
2481	    return 0;
2482
2483	  p += sizeof type;
2484
2485	  if (bcmp ((char *) &have_purpose, p, sizeof have_purpose))
2486	    return 0;
2487
2488	  p += sizeof have_purpose;
2489
2490	  /* For arrays, insist that the size in bytes match.  */
2491	  if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
2492	    {
2493	      HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
2494
2495	      if (bcmp ((char *) &size, p, sizeof size))
2496		return 0;
2497
2498	      p += sizeof size;
2499	    }
2500
2501	  for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2502	    {
2503	      if (TREE_VALUE (link))
2504		{
2505		  if ((p = compare_constant_1 (TREE_VALUE (link), p)) == 0)
2506		    return 0;
2507		}
2508	      else
2509		{
2510		  tree zero = 0;
2511
2512		  if (bcmp ((char *) &zero, p, sizeof zero))
2513		    return 0;
2514
2515		  p += sizeof zero;
2516		}
2517
2518	      if (TREE_PURPOSE (link)
2519		  && TREE_CODE (TREE_PURPOSE (link)) == FIELD_DECL)
2520		{
2521		  if (bcmp ((char *) &TREE_PURPOSE (link), p,
2522			    sizeof TREE_PURPOSE (link)))
2523		    return 0;
2524
2525		  p += sizeof TREE_PURPOSE (link);
2526		}
2527	      else if (TREE_PURPOSE (link))
2528		{
2529		  if ((p = compare_constant_1 (TREE_PURPOSE (link), p)) == 0)
2530		    return 0;
2531		}
2532	      else if (have_purpose)
2533		{
2534		  int zero = 0;
2535
2536		  if (bcmp ((char *) &zero, p, sizeof zero))
2537		    return 0;
2538
2539		  p += sizeof zero;
2540		}
2541	    }
2542
2543	  return p;
2544	}
2545
2546    case ADDR_EXPR:
2547      {
2548	struct addr_const value;
2549
2550	decode_addr_const (exp, &value);
2551	strp = (char *) &value.offset;
2552	len = sizeof value.offset;
2553	/* Compare the offset.  */
2554	while (--len >= 0)
2555	  if (*p++ != *strp++)
2556	    return 0;
2557
2558	/* Compare symbol name.  */
2559	strp = XSTR (value.base, 0);
2560	len = strlen (strp) + 1;
2561      }
2562      break;
2563
2564    case PLUS_EXPR:
2565    case MINUS_EXPR:
2566      p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
2567      if (p == 0)
2568	return 0;
2569
2570      return compare_constant_1 (TREE_OPERAND (exp, 1), p);
2571
2572    case NOP_EXPR:
2573    case CONVERT_EXPR:
2574    case NON_LVALUE_EXPR:
2575      return compare_constant_1 (TREE_OPERAND (exp, 0), p);
2576
2577    default:
2578      abort ();
2579    }
2580
2581  /* Compare constant contents.  */
2582  while (--len >= 0)
2583    if (*p++ != *strp++)
2584      return 0;
2585
2586  return p;
2587}
2588
2589/* Construct a constant descriptor for the expression EXP.
2590   It is up to the caller to enter the descriptor in the hash table.  */
2591
2592static struct constant_descriptor *
2593record_constant (exp)
2594     tree exp;
2595{
2596  struct constant_descriptor *next = 0;
2597  char *label = 0;
2598
2599  /* Make a struct constant_descriptor.  The first two pointers will
2600     be filled in later.  Here we just leave space for them.  */
2601
2602  obstack_grow (&permanent_obstack, (char *) &next, sizeof next);
2603  obstack_grow (&permanent_obstack, (char *) &label, sizeof label);
2604  record_constant_1 (exp);
2605  return (struct constant_descriptor *) obstack_finish (&permanent_obstack);
2606}
2607
2608/* Add a description of constant expression EXP
2609   to the object growing in `permanent_obstack'.
2610   No need to return its address; the caller will get that
2611   from the obstack when the object is complete.  */
2612
2613static void
2614record_constant_1 (exp)
2615     tree exp;
2616{
2617  register char *strp;
2618  register int len;
2619  register enum tree_code code = TREE_CODE (exp);
2620
2621  obstack_1grow (&permanent_obstack, (unsigned int) code);
2622
2623  switch (code)
2624    {
2625    case INTEGER_CST:
2626      obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
2627      strp = (char *) &TREE_INT_CST_LOW (exp);
2628      len = 2 * sizeof TREE_INT_CST_LOW (exp);
2629      break;
2630
2631    case REAL_CST:
2632      obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
2633      strp = (char *) &TREE_REAL_CST (exp);
2634      len = sizeof TREE_REAL_CST (exp);
2635      break;
2636
2637    case STRING_CST:
2638      if (flag_writable_strings)
2639	return;
2640
2641      obstack_1grow (&permanent_obstack, TYPE_MODE (TREE_TYPE (exp)));
2642      strp = TREE_STRING_POINTER (exp);
2643      len = TREE_STRING_LENGTH (exp);
2644      obstack_grow (&permanent_obstack, (char *) &TREE_STRING_LENGTH (exp),
2645		    sizeof TREE_STRING_LENGTH (exp));
2646      break;
2647
2648    case COMPLEX_CST:
2649      record_constant_1 (TREE_REALPART (exp));
2650      record_constant_1 (TREE_IMAGPART (exp));
2651      return;
2652
2653    case CONSTRUCTOR:
2654      if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2655	{
2656	  int nbytes = int_size_in_bytes (TREE_TYPE (exp));
2657	  obstack_grow (&permanent_obstack, &nbytes, sizeof (nbytes));
2658	  obstack_blank (&permanent_obstack, nbytes);
2659	  get_set_constructor_bytes
2660	    (exp, (unsigned char *) permanent_obstack.next_free-nbytes,
2661	     nbytes);
2662	  return;
2663	}
2664      else
2665	{
2666	  register tree link;
2667	  int length = list_length (CONSTRUCTOR_ELTS (exp));
2668	  tree type;
2669	  int have_purpose = 0;
2670
2671	  for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2672	    if (TREE_PURPOSE (link))
2673	      have_purpose = 1;
2674
2675	  obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
2676
2677	  /* For record constructors, insist that the types match.
2678	     For arrays, just verify both constructors are for arrays.
2679	     Then insist that either both or none have any TREE_PURPOSE
2680	     values.  */
2681	  if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2682	    type = TREE_TYPE (exp);
2683	  else
2684	    type = 0;
2685	  obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
2686	  obstack_grow (&permanent_obstack, (char *) &have_purpose,
2687			sizeof have_purpose);
2688
2689	  /* For arrays, insist that the size in bytes match.  */
2690	  if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
2691	    {
2692	      HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
2693	      obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
2694	    }
2695
2696	  for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2697	    {
2698	      if (TREE_VALUE (link))
2699		record_constant_1 (TREE_VALUE (link));
2700	      else
2701		{
2702		  tree zero = 0;
2703
2704		  obstack_grow (&permanent_obstack,
2705				(char *) &zero, sizeof zero);
2706		}
2707
2708	      if (TREE_PURPOSE (link)
2709		  && TREE_CODE (TREE_PURPOSE (link)) == FIELD_DECL)
2710		obstack_grow (&permanent_obstack,
2711			      (char *) &TREE_PURPOSE (link),
2712			      sizeof TREE_PURPOSE (link));
2713	      else if (TREE_PURPOSE (link))
2714		record_constant_1 (TREE_PURPOSE (link));
2715	      else if (have_purpose)
2716		{
2717		  int zero = 0;
2718
2719		  obstack_grow (&permanent_obstack,
2720				(char *) &zero, sizeof zero);
2721		}
2722	    }
2723	}
2724      return;
2725
2726    case ADDR_EXPR:
2727      {
2728	struct addr_const value;
2729
2730	decode_addr_const (exp, &value);
2731	/* Record the offset.  */
2732	obstack_grow (&permanent_obstack,
2733		      (char *) &value.offset, sizeof value.offset);
2734	/* Record the symbol name.  */
2735	obstack_grow (&permanent_obstack, XSTR (value.base, 0),
2736		      strlen (XSTR (value.base, 0)) + 1);
2737      }
2738      return;
2739
2740    case PLUS_EXPR:
2741    case MINUS_EXPR:
2742      record_constant_1 (TREE_OPERAND (exp, 0));
2743      record_constant_1 (TREE_OPERAND (exp, 1));
2744      return;
2745
2746    case NOP_EXPR:
2747    case CONVERT_EXPR:
2748    case NON_LVALUE_EXPR:
2749      record_constant_1 (TREE_OPERAND (exp, 0));
2750      return;
2751
2752    default:
2753      abort ();
2754    }
2755
2756  /* Record constant contents.  */
2757  obstack_grow (&permanent_obstack, strp, len);
2758}
2759
2760/* Record a list of constant expressions that were passed to
2761   output_constant_def but that could not be output right away.  */
2762
2763struct deferred_constant
2764{
2765  struct deferred_constant *next;
2766  tree exp;
2767  int reloc;
2768  int labelno;
2769};
2770
2771static struct deferred_constant *deferred_constants;
2772
2773/* Another list of constants which should be output after the
2774   function.  */
2775static struct deferred_constant *after_function_constants;
2776
2777/* Nonzero means defer output of addressed subconstants
2778   (i.e., those for which output_constant_def is called.)  */
2779static int defer_addressed_constants_flag;
2780
2781/* Start deferring output of subconstants.  */
2782
2783void
2784defer_addressed_constants ()
2785{
2786  defer_addressed_constants_flag++;
2787}
2788
2789/* Stop deferring output of subconstants,
2790   and output now all those that have been deferred.  */
2791
2792void
2793output_deferred_addressed_constants ()
2794{
2795  struct deferred_constant *p, *next;
2796
2797  defer_addressed_constants_flag--;
2798
2799  if (defer_addressed_constants_flag > 0)
2800    return;
2801
2802  for (p = deferred_constants; p; p = next)
2803    {
2804      output_constant_def_contents (p->exp, p->reloc, p->labelno);
2805      next = p->next;
2806      free (p);
2807    }
2808
2809  deferred_constants = 0;
2810}
2811
2812/* Output any constants which should appear after a function.  */
2813
2814static void
2815output_after_function_constants ()
2816{
2817  struct deferred_constant *p, *next;
2818
2819  for (p = after_function_constants; p; p = next)
2820    {
2821      output_constant_def_contents (p->exp, p->reloc, p->labelno);
2822      next = p->next;
2823      free (p);
2824    }
2825
2826  after_function_constants = 0;
2827}
2828
2829/* Make a copy of the whole tree structure for a constant.
2830   This handles the same types of nodes that compare_constant
2831   and record_constant handle.  */
2832
2833static tree
2834copy_constant (exp)
2835     tree exp;
2836{
2837  switch (TREE_CODE (exp))
2838    {
2839    case ADDR_EXPR:
2840      /* For ADDR_EXPR, we do not want to copy the decl whose address
2841	 is requested.  We do want to copy constants though.  */
2842      if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
2843	return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2844		       copy_constant (TREE_OPERAND (exp, 0)));
2845      else
2846	return copy_node (exp);
2847
2848    case INTEGER_CST:
2849    case REAL_CST:
2850    case STRING_CST:
2851      return copy_node (exp);
2852
2853    case COMPLEX_CST:
2854      return build_complex (TREE_TYPE (exp),
2855			    copy_constant (TREE_REALPART (exp)),
2856			    copy_constant (TREE_IMAGPART (exp)));
2857
2858    case PLUS_EXPR:
2859    case MINUS_EXPR:
2860      return build (TREE_CODE (exp), TREE_TYPE (exp),
2861		    copy_constant (TREE_OPERAND (exp, 0)),
2862		    copy_constant (TREE_OPERAND (exp, 1)));
2863
2864    case NOP_EXPR:
2865    case CONVERT_EXPR:
2866    case NON_LVALUE_EXPR:
2867      return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2868		     copy_constant (TREE_OPERAND (exp, 0)));
2869
2870    case CONSTRUCTOR:
2871      {
2872	tree copy = copy_node (exp);
2873	tree list = copy_list (CONSTRUCTOR_ELTS (exp));
2874	tree tail;
2875
2876	CONSTRUCTOR_ELTS (copy) = list;
2877	for (tail = list; tail; tail = TREE_CHAIN (tail))
2878	  TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
2879	if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2880	  for (tail = list; tail; tail = TREE_CHAIN (tail))
2881	    TREE_PURPOSE (tail) = copy_constant (TREE_PURPOSE (tail));
2882
2883	return copy;
2884      }
2885
2886    default:
2887      abort ();
2888    }
2889}
2890
2891/* Return an rtx representing a reference to constant data in memory
2892   for the constant expression EXP.
2893
2894   If assembler code for such a constant has already been output,
2895   return an rtx to refer to it.
2896   Otherwise, output such a constant in memory (or defer it for later)
2897   and generate an rtx for it.
2898
2899   The TREE_CST_RTL of EXP is set up to point to that rtx.
2900   The const_hash_table records which constants already have label strings.  */
2901
2902rtx
2903output_constant_def (exp)
2904     tree exp;
2905{
2906  register int hash;
2907  register struct constant_descriptor *desc;
2908  char label[256];
2909  char *found = 0;
2910  int reloc;
2911  register rtx def;
2912
2913  if (TREE_CST_RTL (exp))
2914    return TREE_CST_RTL (exp);
2915
2916  /* Make sure any other constants whose addresses appear in EXP
2917     are assigned label numbers.  */
2918
2919  reloc = output_addressed_constants (exp);
2920
2921  /* Compute hash code of EXP.  Search the descriptors for that hash code
2922     to see if any of them describes EXP.  If yes, the descriptor records
2923     the label number already assigned.  */
2924
2925  hash = const_hash (exp) % MAX_HASH_TABLE;
2926
2927  for (desc = const_hash_table[hash]; desc; desc = desc->next)
2928    if (compare_constant (exp, desc))
2929      {
2930	found = desc->label;
2931	break;
2932      }
2933
2934  if (found == 0)
2935    {
2936      /* No constant equal to EXP is known to have been output.
2937	 Make a constant descriptor to enter EXP in the hash table.
2938	 Assign the label number and record it in the descriptor for
2939	 future calls to this function to find.  */
2940
2941      /* Create a string containing the label name, in LABEL.  */
2942      ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2943
2944      desc = record_constant (exp);
2945      desc->next = const_hash_table[hash];
2946      desc->label
2947	= (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
2948      const_hash_table[hash] = desc;
2949    }
2950  else
2951    {
2952      /* Create a string containing the label name, in LABEL.  */
2953      ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2954    }
2955
2956  /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
2957
2958  push_obstacks_nochange ();
2959  if (TREE_PERMANENT (exp))
2960    end_temporary_allocation ();
2961
2962  def = gen_rtx_SYMBOL_REF (Pmode, desc->label);
2963
2964  TREE_CST_RTL (exp)
2965    = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), def);
2966  RTX_UNCHANGING_P (TREE_CST_RTL (exp)) = 1;
2967  if (AGGREGATE_TYPE_P (TREE_TYPE (exp)))
2968    MEM_IN_STRUCT_P (TREE_CST_RTL (exp)) = 1;
2969
2970  pop_obstacks ();
2971
2972  /* Optionally set flags or add text to the name to record information
2973     such as that it is a function name.  If the name is changed, the macro
2974     ASM_OUTPUT_LABELREF will have to know how to strip this information.  */
2975#ifdef ENCODE_SECTION_INFO
2976  ENCODE_SECTION_INFO (exp);
2977#endif
2978
2979  /* If this is the first time we've seen this particular constant,
2980     output it (or defer its output for later).  */
2981  if (found == 0)
2982    {
2983      int after_function = 0;
2984
2985#ifdef CONSTANT_AFTER_FUNCTION_P
2986      if (current_function_decl != 0
2987	  && CONSTANT_AFTER_FUNCTION_P (exp))
2988	after_function = 1;
2989#endif
2990
2991      if (defer_addressed_constants_flag || after_function)
2992	{
2993	  struct deferred_constant *p;
2994	  p = (struct deferred_constant *) xmalloc (sizeof (struct deferred_constant));
2995
2996	  push_obstacks_nochange ();
2997	  suspend_momentary ();
2998	  p->exp = copy_constant (exp);
2999	  pop_obstacks ();
3000	  p->reloc = reloc;
3001	  p->labelno = const_labelno++;
3002	  if (after_function)
3003	    {
3004	      p->next = after_function_constants;
3005	      after_function_constants = p;
3006	    }
3007	  else
3008	    {
3009	      p->next = deferred_constants;
3010	      deferred_constants = p;
3011	    }
3012	}
3013      else
3014	output_constant_def_contents (exp, reloc, const_labelno++);
3015    }
3016
3017  return TREE_CST_RTL (exp);
3018}
3019
3020/* Now output assembler code to define the label for EXP,
3021   and follow it with the data of EXP.  */
3022
3023static void
3024output_constant_def_contents (exp, reloc, labelno)
3025     tree exp;
3026     int reloc;
3027     int labelno;
3028{
3029  int align;
3030
3031  if (IN_NAMED_SECTION (exp))
3032    named_section (exp, NULL, reloc);
3033  else
3034    {
3035      /* First switch to text section, except for writable strings.  */
3036#ifdef SELECT_SECTION
3037      SELECT_SECTION (exp, reloc);
3038#else
3039      if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
3040	  || (flag_pic && reloc))
3041	data_section ();
3042      else
3043	readonly_data_section ();
3044#endif
3045    }
3046
3047  /* Align the location counter as required by EXP's data type.  */
3048  align = TYPE_ALIGN (TREE_TYPE (exp));
3049#ifdef CONSTANT_ALIGNMENT
3050  align = CONSTANT_ALIGNMENT (exp, align);
3051#endif
3052
3053  if (align > BITS_PER_UNIT)
3054    ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
3055
3056  /* Output the label itself.  */
3057  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", labelno);
3058
3059  /* Output the value of EXP.  */
3060  output_constant (exp,
3061		   (TREE_CODE (exp) == STRING_CST
3062		    ? TREE_STRING_LENGTH (exp)
3063		    : int_size_in_bytes (TREE_TYPE (exp))));
3064
3065}
3066
3067/* Similar hash facility for making memory-constants
3068   from constant rtl-expressions.  It is used on RISC machines
3069   where immediate integer arguments and constant addresses are restricted
3070   so that such constants must be stored in memory.
3071
3072   This pool of constants is reinitialized for each function
3073   so each function gets its own constants-pool that comes right before it.
3074
3075   All structures allocated here are discarded when functions are saved for
3076   inlining, so they do not need to be allocated permanently.  */
3077
3078#define MAX_RTX_HASH_TABLE 61
3079static struct constant_descriptor **const_rtx_hash_table;
3080
3081/* Structure to represent sufficient information about a constant so that
3082   it can be output when the constant pool is output, so that function
3083   integration can be done, and to simplify handling on machines that reference
3084   constant pool as base+displacement.  */
3085
3086struct pool_constant
3087{
3088  struct constant_descriptor *desc;
3089  struct pool_constant *next;
3090  enum machine_mode mode;
3091  rtx constant;
3092  int labelno;
3093  int align;
3094  int offset;
3095  int mark;
3096};
3097
3098/* Pointers to first and last constant in pool.  */
3099
3100static struct pool_constant *first_pool, *last_pool;
3101
3102/* Current offset in constant pool (does not include any machine-specific
3103   header.  */
3104
3105static int pool_offset;
3106
3107/* Structure used to maintain hash table mapping symbols used to their
3108   corresponding constants.  */
3109
3110struct pool_sym
3111{
3112  char *label;
3113  struct pool_constant *pool;
3114  struct pool_sym *next;
3115};
3116
3117static struct pool_sym **const_rtx_sym_hash_table;
3118
3119/* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
3120   The argument is XSTR (... , 0)  */
3121
3122#define SYMHASH(LABEL)	\
3123  ((((unsigned long) (LABEL)) & ((1 << HASHBITS) - 1))  % MAX_RTX_HASH_TABLE)
3124
3125/* Initialize constant pool hashing for next function.  */
3126
3127void
3128init_const_rtx_hash_table ()
3129{
3130  const_rtx_hash_table
3131    = ((struct constant_descriptor **)
3132       oballoc (MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *)));
3133  const_rtx_sym_hash_table
3134    = ((struct pool_sym **)
3135       oballoc (MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *)));
3136  bzero ((char *) const_rtx_hash_table,
3137	 MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *));
3138  bzero ((char *) const_rtx_sym_hash_table,
3139	 MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *));
3140
3141  first_pool = last_pool = 0;
3142  pool_offset = 0;
3143}
3144
3145/* Save and restore status for a nested function.  */
3146
3147void
3148save_varasm_status (p, context)
3149     struct function *p;
3150     tree context;
3151{
3152  p->const_rtx_hash_table = const_rtx_hash_table;
3153  p->const_rtx_sym_hash_table = const_rtx_sym_hash_table;
3154  p->first_pool = first_pool;
3155  p->last_pool = last_pool;
3156  p->pool_offset = pool_offset;
3157  p->const_double_chain = const_double_chain;
3158
3159  /* If we are pushing to toplevel, we can't reuse const_double_chain.  */
3160  if (context == NULL_TREE)
3161    const_double_chain = 0;
3162}
3163
3164void
3165restore_varasm_status (p)
3166     struct function *p;
3167{
3168  const_rtx_hash_table = p->const_rtx_hash_table;
3169  const_rtx_sym_hash_table = p->const_rtx_sym_hash_table;
3170  first_pool = p->first_pool;
3171  last_pool = p->last_pool;
3172  pool_offset = p->pool_offset;
3173  const_double_chain = p->const_double_chain;
3174}
3175
3176enum kind { RTX_DOUBLE, RTX_INT };
3177
3178struct rtx_const
3179{
3180#ifdef ONLY_INT_FIELDS
3181  unsigned int kind : 16;
3182  unsigned int mode : 16;
3183#else
3184  enum kind kind : 16;
3185  enum machine_mode mode : 16;
3186#endif
3187  union {
3188    union real_extract du;
3189    struct addr_const addr;
3190    struct {HOST_WIDE_INT high, low;} di;
3191  } un;
3192};
3193
3194/* Express an rtx for a constant integer (perhaps symbolic)
3195   as the sum of a symbol or label plus an explicit integer.
3196   They are stored into VALUE.  */
3197
3198static void
3199decode_rtx_const (mode, x, value)
3200     enum machine_mode mode;
3201     rtx x;
3202     struct rtx_const *value;
3203{
3204  /* Clear the whole structure, including any gaps.  */
3205
3206  {
3207    int *p = (int *) value;
3208    int *end = (int *) (value + 1);
3209    while (p < end)
3210      *p++ = 0;
3211  }
3212
3213  value->kind = RTX_INT;	/* Most usual kind.  */
3214  value->mode = mode;
3215
3216  switch (GET_CODE (x))
3217    {
3218    case CONST_DOUBLE:
3219      value->kind = RTX_DOUBLE;
3220      if (GET_MODE (x) != VOIDmode)
3221	{
3222	  value->mode = GET_MODE (x);
3223	  bcopy ((char *) &CONST_DOUBLE_LOW (x),
3224		 (char *) &value->un.du, sizeof value->un.du);
3225	}
3226      else
3227	{
3228	  value->un.di.low = CONST_DOUBLE_LOW (x);
3229	  value->un.di.high = CONST_DOUBLE_HIGH (x);
3230	}
3231      break;
3232
3233    case CONST_INT:
3234      value->un.addr.offset = INTVAL (x);
3235      break;
3236
3237    case SYMBOL_REF:
3238    case LABEL_REF:
3239    case PC:
3240      value->un.addr.base = x;
3241      break;
3242
3243    case CONST:
3244      x = XEXP (x, 0);
3245      if (GET_CODE (x) == PLUS)
3246	{
3247	  value->un.addr.base = XEXP (x, 0);
3248	  if (GET_CODE (XEXP (x, 1)) != CONST_INT)
3249	    abort ();
3250	  value->un.addr.offset = INTVAL (XEXP (x, 1));
3251	}
3252      else if (GET_CODE (x) == MINUS)
3253	{
3254	  value->un.addr.base = XEXP (x, 0);
3255	  if (GET_CODE (XEXP (x, 1)) != CONST_INT)
3256	    abort ();
3257	  value->un.addr.offset = - INTVAL (XEXP (x, 1));
3258	}
3259      else
3260	abort ();
3261      break;
3262
3263    default:
3264      abort ();
3265    }
3266
3267  if (value->kind == RTX_INT && value->un.addr.base != 0)
3268    switch (GET_CODE (value->un.addr.base))
3269      {
3270      case SYMBOL_REF:
3271      case LABEL_REF:
3272	/* Use the string's address, not the SYMBOL_REF's address,
3273	   for the sake of addresses of library routines.
3274	   For a LABEL_REF, compare labels.  */
3275	value->un.addr.base = XEXP (value->un.addr.base, 0);
3276
3277      default:
3278	break;
3279      }
3280}
3281
3282/* Given a MINUS expression, simplify it if both sides
3283   include the same symbol.  */
3284
3285rtx
3286simplify_subtraction (x)
3287     rtx x;
3288{
3289  struct rtx_const val0, val1;
3290
3291  decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
3292  decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
3293
3294  if (val0.un.addr.base == val1.un.addr.base)
3295    return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
3296  return x;
3297}
3298
3299/* Compute a hash code for a constant RTL expression.  */
3300
3301static int
3302const_hash_rtx (mode, x)
3303     enum machine_mode mode;
3304     rtx x;
3305{
3306  register int hi;
3307  register size_t i;
3308
3309  struct rtx_const value;
3310  decode_rtx_const (mode, x, &value);
3311
3312  /* Compute hashing function */
3313  hi = 0;
3314  for (i = 0; i < sizeof value / sizeof (int); i++)
3315    hi += ((int *) &value)[i];
3316
3317  hi &= (1 << HASHBITS) - 1;
3318  hi %= MAX_RTX_HASH_TABLE;
3319  return hi;
3320}
3321
3322/* Compare a constant rtl object X with a constant-descriptor DESC.
3323   Return 1 if DESC describes a constant with the same value as X.  */
3324
3325static int
3326compare_constant_rtx (mode, x, desc)
3327     enum machine_mode mode;
3328     rtx x;
3329     struct constant_descriptor *desc;
3330{
3331  register int *p = (int *) desc->contents;
3332  register int *strp;
3333  register int len;
3334  struct rtx_const value;
3335
3336  decode_rtx_const (mode, x, &value);
3337  strp = (int *) &value;
3338  len = sizeof value / sizeof (int);
3339
3340  /* Compare constant contents.  */
3341  while (--len >= 0)
3342    if (*p++ != *strp++)
3343      return 0;
3344
3345  return 1;
3346}
3347
3348/* Construct a constant descriptor for the rtl-expression X.
3349   It is up to the caller to enter the descriptor in the hash table.  */
3350
3351static struct constant_descriptor *
3352record_constant_rtx (mode, x)
3353     enum machine_mode mode;
3354     rtx x;
3355{
3356  struct constant_descriptor *ptr;
3357  char *label;
3358  struct rtx_const value;
3359
3360  decode_rtx_const (mode, x, &value);
3361
3362  /* Put these things in the saveable obstack so we can ensure it won't
3363     be freed if we are called from combine or some other phase that discards
3364     memory allocated from function_obstack (current_obstack).  */
3365  obstack_grow (saveable_obstack, &ptr, sizeof ptr);
3366  obstack_grow (saveable_obstack, &label, sizeof label);
3367
3368  /* Record constant contents.  */
3369  obstack_grow (saveable_obstack, &value, sizeof value);
3370
3371  return (struct constant_descriptor *) obstack_finish (saveable_obstack);
3372}
3373
3374/* Given a constant rtx X, make (or find) a memory constant for its value
3375   and return a MEM rtx to refer to it in memory.  */
3376
3377rtx
3378force_const_mem (mode, x)
3379     enum machine_mode mode;
3380     rtx x;
3381{
3382  register int hash;
3383  register struct constant_descriptor *desc;
3384  char label[256];
3385  char *found = 0;
3386  rtx def;
3387
3388  /* If we want this CONST_DOUBLE in the same mode as it is in memory
3389     (this will always be true for floating CONST_DOUBLEs that have been
3390     placed in memory, but not for VOIDmode (integer) CONST_DOUBLEs),
3391     use the previous copy.  Otherwise, make a new one.  Note that in
3392     the unlikely event that this same CONST_DOUBLE is used in two different
3393     modes in an alternating fashion, we will allocate a lot of different
3394     memory locations, but this should be extremely rare.  */
3395
3396  /* Don't use CONST_DOUBLE_MEM in a nested function.
3397     Nested functions have their own constant pools,
3398     so they can't share the same values in CONST_DOUBLE_MEM
3399     with the containing function.  */
3400  if (outer_function_chain == 0)
3401    if (GET_CODE (x) == CONST_DOUBLE
3402	&& GET_CODE (CONST_DOUBLE_MEM (x)) == MEM
3403	&& GET_MODE (CONST_DOUBLE_MEM (x)) == mode)
3404      return CONST_DOUBLE_MEM (x);
3405
3406  /* Compute hash code of X.  Search the descriptors for that hash code
3407     to see if any of them describes X.  If yes, the descriptor records
3408     the label number already assigned.  */
3409
3410  hash = const_hash_rtx (mode, x);
3411
3412  for (desc = const_rtx_hash_table[hash]; desc; desc = desc->next)
3413    if (compare_constant_rtx (mode, x, desc))
3414      {
3415	found = desc->label;
3416	break;
3417      }
3418
3419  if (found == 0)
3420    {
3421      register struct pool_constant *pool;
3422      register struct pool_sym *sym;
3423      int align;
3424
3425      /* No constant equal to X is known to have been output.
3426	 Make a constant descriptor to enter X in the hash table.
3427	 Assign the label number and record it in the descriptor for
3428	 future calls to this function to find.  */
3429
3430      desc = record_constant_rtx (mode, x);
3431      desc->next = const_rtx_hash_table[hash];
3432      const_rtx_hash_table[hash] = desc;
3433
3434      /* Align the location counter as required by EXP's data type.  */
3435      align = (mode == VOIDmode) ? UNITS_PER_WORD : GET_MODE_SIZE (mode);
3436      if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
3437	align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
3438#ifdef CONSTANT_ALIGNMENT
3439      align = CONSTANT_ALIGNMENT (make_tree (type_for_mode (mode, 0), x),
3440				 align * BITS_PER_UNIT) / BITS_PER_UNIT;
3441#endif
3442
3443      pool_offset += align - 1;
3444      pool_offset &= ~ (align - 1);
3445
3446      /* If RTL is not being placed into the saveable obstack, make a
3447	 copy of X that is in the saveable obstack in case we are
3448	 being called from combine or some other phase that discards
3449	 memory it allocates.  We used to only do this if it is a
3450	 CONST; however, reload can allocate a CONST_INT when
3451	 eliminating registers.  */
3452      if (rtl_obstack != saveable_obstack
3453	  && (GET_CODE (x) == CONST || GET_CODE (x) == CONST_INT))
3454	{
3455	  push_obstacks_nochange ();
3456	  rtl_in_saveable_obstack ();
3457
3458	  if (GET_CODE (x) == CONST)
3459	    x = gen_rtx_CONST (GET_MODE (x),
3460			       gen_rtx_PLUS (GET_MODE (x),
3461					     XEXP (XEXP (x, 0), 0),
3462					     XEXP (XEXP (x, 0), 1)));
3463	  else
3464	    x = GEN_INT (INTVAL (x));
3465
3466	  pop_obstacks ();
3467	}
3468
3469      /* Allocate a pool constant descriptor, fill it in, and chain it in.  */
3470
3471      pool = (struct pool_constant *) savealloc (sizeof (struct pool_constant));
3472      pool->desc = desc;
3473      pool->constant = x;
3474      pool->mode = mode;
3475      pool->labelno = const_labelno;
3476      pool->align = align;
3477      pool->offset = pool_offset;
3478      pool->mark = 1;
3479      pool->next = 0;
3480
3481      if (last_pool == 0)
3482	first_pool = pool;
3483      else
3484	last_pool->next = pool;
3485
3486      last_pool = pool;
3487      pool_offset += GET_MODE_SIZE (mode);
3488
3489      /* Create a string containing the label name, in LABEL.  */
3490      ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3491
3492      ++const_labelno;
3493
3494      desc->label = found
3495	= (char *) obstack_copy0 (saveable_obstack, label, strlen (label));
3496
3497      /* Add label to symbol hash table.  */
3498      hash = SYMHASH (found);
3499      sym = (struct pool_sym *) savealloc (sizeof (struct pool_sym));
3500      sym->label = found;
3501      sym->pool = pool;
3502      sym->next = const_rtx_sym_hash_table[hash];
3503      const_rtx_sym_hash_table[hash] = sym;
3504    }
3505
3506  /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
3507
3508  def = gen_rtx_MEM (mode, gen_rtx_SYMBOL_REF (Pmode, found));
3509
3510  RTX_UNCHANGING_P (def) = 1;
3511  /* Mark the symbol_ref as belonging to this constants pool.  */
3512  CONSTANT_POOL_ADDRESS_P (XEXP (def, 0)) = 1;
3513  current_function_uses_const_pool = 1;
3514
3515  if (outer_function_chain == 0)
3516    if (GET_CODE (x) == CONST_DOUBLE)
3517      {
3518	if (CONST_DOUBLE_MEM (x) == cc0_rtx)
3519	  {
3520	    CONST_DOUBLE_CHAIN (x) = const_double_chain;
3521	    const_double_chain = x;
3522	  }
3523	CONST_DOUBLE_MEM (x) = def;
3524      }
3525
3526  return def;
3527}
3528
3529/* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3530   the corresponding pool_constant structure.  */
3531
3532static struct pool_constant *
3533find_pool_constant (addr)
3534     rtx addr;
3535{
3536  struct pool_sym *sym;
3537  char *label = XSTR (addr, 0);
3538
3539  for (sym = const_rtx_sym_hash_table[SYMHASH (label)]; sym; sym = sym->next)
3540    if (sym->label == label)
3541      return sym->pool;
3542
3543  abort ();
3544}
3545
3546/* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
3547
3548rtx
3549get_pool_constant (addr)
3550     rtx addr;
3551{
3552  return (find_pool_constant (addr))->constant;
3553}
3554
3555/* Similar, return the mode.  */
3556
3557enum machine_mode
3558get_pool_mode (addr)
3559     rtx addr;
3560{
3561  return (find_pool_constant (addr))->mode;
3562}
3563
3564/* Similar, return the offset in the constant pool.  */
3565
3566int
3567get_pool_offset (addr)
3568     rtx addr;
3569{
3570  return (find_pool_constant (addr))->offset;
3571}
3572
3573/* Return the size of the constant pool.  */
3574
3575int
3576get_pool_size ()
3577{
3578  return pool_offset;
3579}
3580
3581/* Write all the constants in the constant pool.  */
3582
3583void
3584output_constant_pool (fnname, fndecl)
3585     char *fnname;
3586     tree fndecl;
3587{
3588  struct pool_constant *pool;
3589  rtx x;
3590  union real_extract u;
3591
3592  /* It is possible for gcc to call force_const_mem and then to later
3593     discard the instructions which refer to the constant.  In such a
3594     case we do not need to output the constant.  */
3595  if (optimize >= 0 && flag_expensive_optimizations)
3596    mark_constant_pool ();
3597
3598#ifdef ASM_OUTPUT_POOL_PROLOGUE
3599  ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
3600#endif
3601
3602  for (pool = first_pool; pool; pool = pool->next)
3603    {
3604      x = pool->constant;
3605
3606      if (! pool->mark)
3607	continue;
3608
3609      /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3610	 whose CODE_LABEL has been deleted.  This can occur if a jump table
3611	 is eliminated by optimization.  If so, write a constant of zero
3612	 instead.  Note that this can also happen by turning the
3613	 CODE_LABEL into a NOTE.  */
3614      if (((GET_CODE (x) == LABEL_REF
3615	    && (INSN_DELETED_P (XEXP (x, 0))
3616		|| GET_CODE (XEXP (x, 0)) == NOTE)))
3617	  || (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3618	      && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF
3619	      && (INSN_DELETED_P (XEXP (XEXP (XEXP (x, 0), 0), 0))
3620		  || GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == NOTE)))
3621	x = const0_rtx;
3622
3623      /* First switch to correct section.  */
3624#ifdef SELECT_RTX_SECTION
3625      SELECT_RTX_SECTION (pool->mode, x);
3626#else
3627      readonly_data_section ();
3628#endif
3629
3630#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3631      ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
3632				     pool->align, pool->labelno, done);
3633#endif
3634
3635      if (pool->align > 1)
3636	ASM_OUTPUT_ALIGN (asm_out_file, exact_log2 (pool->align));
3637
3638      /* Output the label.  */
3639      ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
3640
3641      /* Output the value of the constant itself.  */
3642      switch (GET_MODE_CLASS (pool->mode))
3643	{
3644	case MODE_FLOAT:
3645	  if (GET_CODE (x) != CONST_DOUBLE)
3646	    abort ();
3647
3648	  bcopy ((char *) &CONST_DOUBLE_LOW (x), (char *) &u, sizeof u);
3649	  assemble_real (u.d, pool->mode);
3650	  break;
3651
3652	case MODE_INT:
3653	case MODE_PARTIAL_INT:
3654	  assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);
3655	  break;
3656
3657	default:
3658	  abort ();
3659	}
3660
3661#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3662    done: ;
3663#endif
3664
3665    }
3666
3667#ifdef ASM_OUTPUT_POOL_EPILOGUE
3668  ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool_offset);
3669#endif
3670
3671  /* Done with this pool.  */
3672  first_pool = last_pool = 0;
3673}
3674
3675/* Look through the instructions for this function, and mark all the
3676   entries in the constant pool which are actually being used.  */
3677
3678static void
3679mark_constant_pool ()
3680{
3681  register rtx insn;
3682  struct pool_constant *pool;
3683
3684  if (first_pool == 0)
3685    return;
3686
3687  for (pool = first_pool; pool; pool = pool->next)
3688    pool->mark = 0;
3689
3690  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3691    if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3692      mark_constants (PATTERN (insn));
3693
3694  for (insn = current_function_epilogue_delay_list;
3695       insn;
3696       insn = XEXP (insn, 1))
3697    if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3698      mark_constants (PATTERN (insn));
3699}
3700
3701static void
3702mark_constants (x)
3703     register rtx x;
3704{
3705  register int i;
3706  register char *format_ptr;
3707
3708  if (x == 0)
3709    return;
3710
3711  if (GET_CODE (x) == SYMBOL_REF)
3712    {
3713      if (CONSTANT_POOL_ADDRESS_P (x))
3714	find_pool_constant (x)->mark = 1;
3715      return;
3716    }
3717  /* Never search inside a CONST_DOUBLE, because CONST_DOUBLE_MEM may be
3718     a MEM, but does not constitute a use of that MEM.  This is particularly
3719     important inside a nested function, because CONST_DOUBLE_MEM may be
3720     a reference to a MEM in the parent's constant pool.  See the comment
3721     in force_const_mem.  */
3722  else if (GET_CODE (x) == CONST_DOUBLE)
3723    return;
3724
3725  /* Insns may appear inside a SEQUENCE.  Only check the patterns of
3726     insns, not any notes that may be attached.  We don't want to mark
3727     a constant just because it happens to appear in a REG_EQUIV note.  */
3728  if (GET_RTX_CLASS (GET_CODE (x)) == 'i')
3729    {
3730      mark_constants (PATTERN (x));
3731      return;
3732    }
3733
3734  format_ptr = GET_RTX_FORMAT (GET_CODE (x));
3735
3736  for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
3737    {
3738      switch (*format_ptr++)
3739	{
3740	case 'e':
3741	  mark_constants (XEXP (x, i));
3742	  break;
3743
3744	case 'E':
3745	  if (XVEC (x, i) != 0)
3746	    {
3747	      register int j;
3748
3749	      for (j = 0; j < XVECLEN (x, i); j++)
3750		mark_constants (XVECEXP (x, i, j));
3751	    }
3752	  break;
3753
3754	case 'S':
3755	case 's':
3756	case '0':
3757	case 'i':
3758	case 'w':
3759	case 'n':
3760	case 'u':
3761	  break;
3762
3763	default:
3764	  abort ();
3765	}
3766    }
3767}
3768
3769/* Find all the constants whose addresses are referenced inside of EXP,
3770   and make sure assembler code with a label has been output for each one.
3771   Indicate whether an ADDR_EXPR has been encountered.  */
3772
3773static int
3774output_addressed_constants (exp)
3775     tree exp;
3776{
3777  int reloc = 0;
3778
3779  switch (TREE_CODE (exp))
3780    {
3781    case ADDR_EXPR:
3782      {
3783	register tree constant = TREE_OPERAND (exp, 0);
3784
3785	while (TREE_CODE (constant) == COMPONENT_REF)
3786	  {
3787	    constant = TREE_OPERAND (constant, 0);
3788	  }
3789
3790	if (TREE_CODE_CLASS (TREE_CODE (constant)) == 'c'
3791	    || TREE_CODE (constant) == CONSTRUCTOR)
3792	  /* No need to do anything here
3793	     for addresses of variables or functions.  */
3794	  output_constant_def (constant);
3795      }
3796      reloc = 1;
3797      break;
3798
3799    case PLUS_EXPR:
3800    case MINUS_EXPR:
3801      reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
3802      reloc |= output_addressed_constants (TREE_OPERAND (exp, 1));
3803      break;
3804
3805    case NOP_EXPR:
3806    case CONVERT_EXPR:
3807    case NON_LVALUE_EXPR:
3808      reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
3809      break;
3810
3811    case CONSTRUCTOR:
3812      {
3813	register tree link;
3814	for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
3815	  if (TREE_VALUE (link) != 0)
3816	    reloc |= output_addressed_constants (TREE_VALUE (link));
3817      }
3818      break;
3819
3820    default:
3821      break;
3822    }
3823  return reloc;
3824}
3825
3826/* Output assembler code for constant EXP to FILE, with no label.
3827   This includes the pseudo-op such as ".int" or ".byte", and a newline.
3828   Assumes output_addressed_constants has been done on EXP already.
3829
3830   Generate exactly SIZE bytes of assembler data, padding at the end
3831   with zeros if necessary.  SIZE must always be specified.
3832
3833   SIZE is important for structure constructors,
3834   since trailing members may have been omitted from the constructor.
3835   It is also important for initialization of arrays from string constants
3836   since the full length of the string constant might not be wanted.
3837   It is also needed for initialization of unions, where the initializer's
3838   type is just one member, and that may not be as long as the union.
3839
3840   There a case in which we would fail to output exactly SIZE bytes:
3841   for a structure constructor that wants to produce more than SIZE bytes.
3842   But such constructors will never be generated for any possible input.  */
3843
3844void
3845output_constant (exp, size)
3846     register tree exp;
3847     register int size;
3848{
3849  register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
3850
3851  if (size == 0)
3852    return;
3853
3854  /* Eliminate the NON_LVALUE_EXPR_EXPR that makes a cast not be an lvalue.
3855     That way we get the constant (we hope) inside it.  Also, strip off any
3856     NOP_EXPR that converts between two record, union, array, or set types.  */
3857  while ((TREE_CODE (exp) == NOP_EXPR
3858	  && (TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))
3859	      || AGGREGATE_TYPE_P (TREE_TYPE (exp))))
3860	 || TREE_CODE (exp) == NON_LVALUE_EXPR)
3861    exp = TREE_OPERAND (exp, 0);
3862
3863  /* Allow a constructor with no elements for any data type.
3864     This means to fill the space with zeros.  */
3865  if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
3866    {
3867      assemble_zeros (size);
3868      return;
3869    }
3870
3871  switch (code)
3872    {
3873    case CHAR_TYPE:
3874    case BOOLEAN_TYPE:
3875    case INTEGER_TYPE:
3876    case ENUMERAL_TYPE:
3877    case POINTER_TYPE:
3878    case REFERENCE_TYPE:
3879      /* ??? What about       (int)((float)(int)&foo + 4)    */
3880      while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3881	     || TREE_CODE (exp) == NON_LVALUE_EXPR)
3882	exp = TREE_OPERAND (exp, 0);
3883
3884      if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
3885					   EXPAND_INITIALIZER),
3886			      size, 0))
3887	error ("initializer for integer value is too complicated");
3888      size = 0;
3889      break;
3890
3891    case REAL_TYPE:
3892      if (TREE_CODE (exp) != REAL_CST)
3893	error ("initializer for floating value is not a floating constant");
3894
3895      assemble_real (TREE_REAL_CST (exp),
3896		     mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0));
3897      size = 0;
3898      break;
3899
3900    case COMPLEX_TYPE:
3901      output_constant (TREE_REALPART (exp), size / 2);
3902      output_constant (TREE_IMAGPART (exp), size / 2);
3903      size -= (size / 2) * 2;
3904      break;
3905
3906    case ARRAY_TYPE:
3907      if (TREE_CODE (exp) == CONSTRUCTOR)
3908	{
3909	  output_constructor (exp, size);
3910	  return;
3911	}
3912      else if (TREE_CODE (exp) == STRING_CST)
3913	{
3914	  int excess = 0;
3915
3916	  if (size > TREE_STRING_LENGTH (exp))
3917	    {
3918	      excess = size - TREE_STRING_LENGTH (exp);
3919	      size = TREE_STRING_LENGTH (exp);
3920	    }
3921
3922	  assemble_string (TREE_STRING_POINTER (exp), size);
3923	  size = excess;
3924	}
3925      else
3926	abort ();
3927      break;
3928
3929    case RECORD_TYPE:
3930    case UNION_TYPE:
3931      if (TREE_CODE (exp) == CONSTRUCTOR)
3932	output_constructor (exp, size);
3933      else
3934	abort ();
3935      return;
3936
3937    case SET_TYPE:
3938      if (TREE_CODE (exp) == INTEGER_CST)
3939	assemble_integer (expand_expr (exp, NULL_RTX,
3940				       VOIDmode, EXPAND_INITIALIZER),
3941			  size, 1);
3942      else if (TREE_CODE (exp) == CONSTRUCTOR)
3943	{
3944	  unsigned char *buffer = (unsigned char *) alloca (size);
3945	  if (get_set_constructor_bytes (exp, buffer, size))
3946	    abort ();
3947	  assemble_string ((char *) buffer, size);
3948	}
3949      else
3950	error ("unknown set constructor type");
3951      return;
3952
3953    default:
3954      break; /* ??? */
3955    }
3956
3957  if (size > 0)
3958    assemble_zeros (size);
3959}
3960
3961
3962/* Subroutine of output_constant, used for CONSTRUCTORs
3963   (aggregate constants).
3964   Generate at least SIZE bytes, padding if necessary.  */
3965
3966static void
3967output_constructor (exp, size)
3968     tree exp;
3969     int size;
3970{
3971  register tree link, field = 0;
3972  HOST_WIDE_INT min_index = 0;
3973  /* Number of bytes output or skipped so far.
3974     In other words, current position within the constructor.  */
3975  int total_bytes = 0;
3976  /* Non-zero means BYTE contains part of a byte, to be output.  */
3977  int byte_buffer_in_use = 0;
3978  register int byte;
3979
3980  if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
3981    abort ();
3982
3983  if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
3984    field = TYPE_FIELDS (TREE_TYPE (exp));
3985
3986  if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
3987      && TYPE_DOMAIN (TREE_TYPE (exp)) != 0)
3988    min_index
3989      = TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (exp))));
3990
3991  /* As LINK goes through the elements of the constant,
3992     FIELD goes through the structure fields, if the constant is a structure.
3993     if the constant is a union, then we override this,
3994     by getting the field from the TREE_LIST element.
3995     But the constant could also be an array.  Then FIELD is zero.  */
3996  for (link = CONSTRUCTOR_ELTS (exp);
3997       link;
3998       link = TREE_CHAIN (link),
3999       field = field ? TREE_CHAIN (field) : 0)
4000    {
4001      tree val = TREE_VALUE (link);
4002      tree index = 0;
4003
4004      /* the element in a union constructor specifies the proper field.  */
4005
4006      if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
4007	  || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE)
4008	{
4009	  /* if available, use the type given by link */
4010	  if (TREE_PURPOSE (link) != 0)
4011	    field = TREE_PURPOSE (link);
4012	}
4013
4014      if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
4015	index = TREE_PURPOSE (link);
4016
4017      /* Eliminate the marker that makes a cast not be an lvalue.  */
4018      if (val != 0)
4019	STRIP_NOPS (val);
4020
4021      if (index && TREE_CODE (index) == RANGE_EXPR)
4022	{
4023	  register int fieldsize
4024	    = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
4025	  HOST_WIDE_INT lo_index = TREE_INT_CST_LOW (TREE_OPERAND (index, 0));
4026	  HOST_WIDE_INT hi_index = TREE_INT_CST_LOW (TREE_OPERAND (index, 1));
4027	  HOST_WIDE_INT index;
4028	  for (index = lo_index; index <= hi_index; index++)
4029	    {
4030	      /* Output the element's initial value.  */
4031	      if (val == 0)
4032		assemble_zeros (fieldsize);
4033	      else
4034		output_constant (val, fieldsize);
4035
4036	      /* Count its size.  */
4037	      total_bytes += fieldsize;
4038	    }
4039	}
4040      else if (field == 0 || !DECL_BIT_FIELD (field))
4041	{
4042	  /* An element that is not a bit-field.  */
4043
4044	  register int fieldsize;
4045	  /* Since this structure is static,
4046	     we know the positions are constant.  */
4047	  int bitpos = (field ? (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field))
4048				 / BITS_PER_UNIT)
4049			: 0);
4050	  if (index != 0)
4051	    bitpos = (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (val)))
4052		      / BITS_PER_UNIT
4053		      * (TREE_INT_CST_LOW (index) - min_index));
4054
4055	  /* Output any buffered-up bit-fields preceding this element.  */
4056	  if (byte_buffer_in_use)
4057	    {
4058	      ASM_OUTPUT_BYTE (asm_out_file, byte);
4059	      total_bytes++;
4060	      byte_buffer_in_use = 0;
4061	    }
4062
4063	  /* Advance to offset of this element.
4064	     Note no alignment needed in an array, since that is guaranteed
4065	     if each element has the proper size.  */
4066	  if ((field != 0 || index != 0) && bitpos != total_bytes)
4067	    {
4068	      assemble_zeros (bitpos - total_bytes);
4069	      total_bytes = bitpos;
4070	    }
4071
4072	  /* Determine size this element should occupy.  */
4073	  if (field)
4074	    {
4075	      if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST)
4076		abort ();
4077	      if (TREE_INT_CST_LOW (DECL_SIZE (field)) > 100000)
4078		{
4079		  /* This avoids overflow trouble.  */
4080		  tree size_tree = size_binop (CEIL_DIV_EXPR,
4081					       DECL_SIZE (field),
4082					       size_int (BITS_PER_UNIT));
4083		  fieldsize = TREE_INT_CST_LOW (size_tree);
4084		}
4085	      else
4086		{
4087		  fieldsize = TREE_INT_CST_LOW (DECL_SIZE (field));
4088		  fieldsize = (fieldsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
4089		}
4090	    }
4091	  else
4092	    fieldsize = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
4093
4094	  /* Output the element's initial value.  */
4095	  if (val == 0)
4096	    assemble_zeros (fieldsize);
4097	  else
4098	    output_constant (val, fieldsize);
4099
4100	  /* Count its size.  */
4101	  total_bytes += fieldsize;
4102	}
4103      else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4104	error ("invalid initial value for member `%s'",
4105	       IDENTIFIER_POINTER (DECL_NAME (field)));
4106      else
4107	{
4108	  /* Element that is a bit-field.  */
4109
4110	  int next_offset = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
4111	  int end_offset
4112	    = (next_offset + TREE_INT_CST_LOW (DECL_SIZE (field)));
4113
4114	  if (val == 0)
4115	    val = integer_zero_node;
4116
4117	  /* If this field does not start in this (or, next) byte,
4118	     skip some bytes.  */
4119	  if (next_offset / BITS_PER_UNIT != total_bytes)
4120	    {
4121	      /* Output remnant of any bit field in previous bytes.  */
4122	      if (byte_buffer_in_use)
4123		{
4124		  ASM_OUTPUT_BYTE (asm_out_file, byte);
4125		  total_bytes++;
4126		  byte_buffer_in_use = 0;
4127		}
4128
4129	      /* If still not at proper byte, advance to there.  */
4130	      if (next_offset / BITS_PER_UNIT != total_bytes)
4131		{
4132		  assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4133		  total_bytes = next_offset / BITS_PER_UNIT;
4134		}
4135	    }
4136
4137	  if (! byte_buffer_in_use)
4138	    byte = 0;
4139
4140	  /* We must split the element into pieces that fall within
4141	     separate bytes, and combine each byte with previous or
4142	     following bit-fields.  */
4143
4144	  /* next_offset is the offset n fbits from the beginning of
4145	     the structure to the next bit of this element to be processed.
4146	     end_offset is the offset of the first bit past the end of
4147	     this element.  */
4148	  while (next_offset < end_offset)
4149	    {
4150	      int this_time;
4151	      int shift;
4152	      HOST_WIDE_INT value;
4153	      int next_byte = next_offset / BITS_PER_UNIT;
4154	      int next_bit = next_offset % BITS_PER_UNIT;
4155
4156	      /* Advance from byte to byte
4157		 within this element when necessary.  */
4158	      while (next_byte != total_bytes)
4159		{
4160		  ASM_OUTPUT_BYTE (asm_out_file, byte);
4161		  total_bytes++;
4162		  byte = 0;
4163		}
4164
4165	      /* Number of bits we can process at once
4166		 (all part of the same byte).  */
4167	      this_time = MIN (end_offset - next_offset,
4168			       BITS_PER_UNIT - next_bit);
4169	      if (BYTES_BIG_ENDIAN)
4170		{
4171		  /* On big-endian machine, take the most significant bits
4172		     first (of the bits that are significant)
4173		     and put them into bytes from the most significant end.  */
4174		  shift = end_offset - next_offset - this_time;
4175		  /* Don't try to take a bunch of bits that cross
4176		     the word boundary in the INTEGER_CST.  */
4177		  if (shift < HOST_BITS_PER_WIDE_INT
4178		      && shift + this_time > HOST_BITS_PER_WIDE_INT)
4179		    {
4180		      this_time -= (HOST_BITS_PER_WIDE_INT - shift);
4181		      shift = HOST_BITS_PER_WIDE_INT;
4182		    }
4183
4184		  /* Now get the bits from the appropriate constant word.  */
4185		  if (shift < HOST_BITS_PER_WIDE_INT)
4186		    {
4187		      value = TREE_INT_CST_LOW (val);
4188		    }
4189		  else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4190		    {
4191		      value = TREE_INT_CST_HIGH (val);
4192		      shift -= HOST_BITS_PER_WIDE_INT;
4193		    }
4194		  else
4195		    abort ();
4196		  byte |= (((value >> shift)
4197			    & (((HOST_WIDE_INT) 1 << this_time) - 1))
4198			   << (BITS_PER_UNIT - this_time - next_bit));
4199		}
4200	      else
4201		{
4202		  /* On little-endian machines,
4203		     take first the least significant bits of the value
4204		     and pack them starting at the least significant
4205		     bits of the bytes.  */
4206		  shift = (next_offset
4207			   - TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)));
4208		  /* Don't try to take a bunch of bits that cross
4209		     the word boundary in the INTEGER_CST.  */
4210		  if (shift < HOST_BITS_PER_WIDE_INT
4211		      && shift + this_time > HOST_BITS_PER_WIDE_INT)
4212		    {
4213		      this_time -= (HOST_BITS_PER_WIDE_INT - shift);
4214		      shift = HOST_BITS_PER_WIDE_INT;
4215		    }
4216
4217		  /* Now get the bits from the appropriate constant word.  */
4218		  if (shift < HOST_BITS_PER_WIDE_INT)
4219		    value = TREE_INT_CST_LOW (val);
4220		  else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4221		    {
4222		      value = TREE_INT_CST_HIGH (val);
4223		      shift -= HOST_BITS_PER_WIDE_INT;
4224		    }
4225		  else
4226		    abort ();
4227		  byte |= (((value >> shift)
4228			    & (((HOST_WIDE_INT) 1 << this_time) - 1))
4229			   << next_bit);
4230		}
4231	      next_offset += this_time;
4232	      byte_buffer_in_use = 1;
4233	    }
4234	}
4235    }
4236  if (byte_buffer_in_use)
4237    {
4238      ASM_OUTPUT_BYTE (asm_out_file, byte);
4239      total_bytes++;
4240    }
4241  if (total_bytes < size)
4242    assemble_zeros (size - total_bytes);
4243}
4244
4245/* Output asm to handle ``#pragma weak'' */
4246
4247void
4248handle_pragma_weak (what, name, value)
4249     enum pragma_state what;
4250     char *name, *value;
4251{
4252#ifdef HANDLE_PRAGMA_WEAK
4253  if (what == ps_name || what == ps_value)
4254    {
4255      struct weak_syms *weak =
4256	(struct weak_syms *)permalloc (sizeof (struct weak_syms));
4257      weak->next = weak_decls;
4258      weak->name = permalloc (strlen (name) + 1);
4259      strcpy (weak->name, name);
4260
4261      if (what != ps_value)
4262	weak->value = NULL_PTR;
4263
4264      else
4265	{
4266	  weak->value = permalloc (strlen (value) + 1);
4267	  strcpy (weak->value, value);
4268	}
4269
4270      weak_decls = weak;
4271    }
4272  else if (! (what == ps_done || what == ps_start))
4273    warning ("malformed `#pragma weak'");
4274#endif /* HANDLE_PRAGMA_WEAK */
4275}
4276
4277/* Declare DECL to be a weak symbol.  */
4278
4279void
4280declare_weak (decl)
4281     tree decl;
4282{
4283  if (! TREE_PUBLIC (decl))
4284    error_with_decl (decl, "weak declaration of `%s' must be public");
4285  else if (TREE_ASM_WRITTEN (decl))
4286    error_with_decl (decl, "weak declaration of `%s' must precede definition");
4287  else if (SUPPORTS_WEAK)
4288    DECL_WEAK (decl) = 1;
4289
4290#ifdef HANDLE_PRAGMA_WEAK
4291  /* Make sure this function name gets on the weak declaration list.  */
4292  handle_pragma_weak (ps_name,
4293		      IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
4294		      NULL);
4295#endif
4296}
4297
4298/* Emit any pending weak declarations.  */
4299
4300void
4301weak_finish ()
4302{
4303#ifdef HANDLE_PRAGMA_WEAK
4304  if (HANDLE_PRAGMA_WEAK)
4305    {
4306      struct weak_syms *t;
4307      for (t = weak_decls; t; t = t->next)
4308	{
4309	  ASM_WEAKEN_LABEL (asm_out_file, t->name);
4310	  if (t->value)
4311	    ASM_OUTPUT_DEF (asm_out_file, t->name, t->value);
4312	}
4313    }
4314#endif
4315}
4316
4317void
4318assemble_alias (decl, target)
4319     tree decl, target;
4320{
4321  char *name;
4322
4323  make_decl_rtl (decl, (char *) 0, 1);
4324  name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4325
4326#ifdef ASM_OUTPUT_DEF
4327  /* Make name accessible from other files, if appropriate.  */
4328
4329  if (TREE_PUBLIC (decl))
4330    {
4331#ifdef ASM_WEAKEN_LABEL
4332      if (DECL_WEAK (decl))
4333	ASM_WEAKEN_LABEL (asm_out_file, name);
4334      else
4335#endif
4336	ASM_GLOBALIZE_LABEL (asm_out_file, name);
4337    }
4338
4339  ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
4340  TREE_ASM_WRITTEN (decl) = 1;
4341#else
4342#ifdef ASM_OUTPUT_WEAK_ALIAS
4343  if (! DECL_WEAK (decl))
4344    warning ("only weak aliases are supported in this configuration");
4345
4346  ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4347  TREE_ASM_WRITTEN (decl) = 1;
4348#else
4349  warning ("alias definitions not supported in this configuration; ignored");
4350#endif
4351#endif
4352}
4353
4354/* This determines whether or not we support link-once semantics.  */
4355#ifndef SUPPORTS_ONE_ONLY
4356#ifdef MAKE_DECL_ONE_ONLY
4357#define SUPPORTS_ONE_ONLY 1
4358#else
4359#define SUPPORTS_ONE_ONLY 0
4360#endif
4361#endif
4362
4363/* Returns 1 if the target configuration supports defining public symbols
4364   so that one of them will be chosen at link time instead of generating a
4365   multiply-defined symbol error, whether through the use of weak symbols or
4366   a target-specific mechanism for having duplicates discarded.  */
4367
4368int
4369supports_one_only ()
4370{
4371  if (SUPPORTS_ONE_ONLY)
4372    return 1;
4373  return SUPPORTS_WEAK;
4374}
4375
4376/* Set up DECL as a public symbol that can be defined in multiple
4377   translation units without generating a linker error.  */
4378
4379void
4380make_decl_one_only (decl)
4381     tree decl;
4382{
4383  if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
4384    abort ();
4385
4386  TREE_PUBLIC (decl) = 1;
4387
4388  if (TREE_CODE (decl) == VAR_DECL
4389      && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4390    DECL_COMMON (decl) = 1;
4391  else if (SUPPORTS_ONE_ONLY)
4392    {
4393#ifdef MAKE_DECL_ONE_ONLY
4394      MAKE_DECL_ONE_ONLY (decl);
4395#endif
4396      DECL_ONE_ONLY (decl) = 1;
4397    }
4398  else if (SUPPORTS_WEAK)
4399    DECL_WEAK (decl) = 1;
4400  else
4401    abort ();
4402}
4403