OSDN Git Service

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