OSDN Git Service

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