OSDN Git Service

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