OSDN Git Service

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