OSDN Git Service

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