OSDN Git Service

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