OSDN Git Service

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