OSDN Git Service

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