OSDN Git Service

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