OSDN Git Service

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