OSDN Git Service

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