OSDN Git Service

(assembler_trampoline_template): Always put template in text section.
[pf3gnuchains/gcc-fork.git] / gcc / varasm.c
1 /* Output variables, constants and external declarations, for GNU compiler.
2    Copyright (C) 1987, 1988, 1989, 1992 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, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20
21 /* This file handles generation of all the assembler code
22    *except* the instructions of a function.
23    This includes declarations of variables and their initial values.
24
25    We also output the assembler code for constants stored in memory
26    and are responsible for combining constants with the same value.  */
27
28 #include <stdio.h>
29 #include <setjmp.h>
30 /* #include <stab.h> */
31 #include "config.h"
32 #include "rtl.h"
33 #include "tree.h"
34 #include "flags.h"
35 #include "function.h"
36 #include "expr.h"
37 #include "hard-reg-set.h"
38 #include "regs.h"
39 #include "defaults.h"
40 #include "real.h"
41
42 #include "obstack.h"
43
44 #ifdef XCOFF_DEBUGGING_INFO
45 #include "xcoffout.h"
46 #endif
47
48 #ifndef ASM_STABS_OP
49 #define ASM_STABS_OP ".stabs"
50 #endif
51
52 /* This macro gets just the user-specified name
53    out of the string in a SYMBOL_REF.  On most machines,
54    we discard the * if any and that's all.  */
55 #ifndef STRIP_NAME_ENCODING
56 #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
57   (VAR) = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*'))
58 #endif
59
60 /* File in which assembler code is being written.  */
61
62 extern FILE *asm_out_file;
63
64 /* The (assembler) name of the first globally-visible object output.  */
65 char *first_global_object_name;
66
67 extern struct obstack *current_obstack;
68 extern struct obstack *saveable_obstack;
69 extern struct obstack permanent_obstack;
70 #define obstack_chunk_alloc xmalloc
71
72 /* Number for making the label on the next
73    constant that is stored in memory.  */
74
75 int const_labelno;
76
77 /* Number for making the label on the next
78    static variable internal to a function.  */
79
80 int var_labelno;
81
82 /* Nonzero if at least one function definition has been seen.  */
83 static int function_defined;
84
85 extern FILE *asm_out_file;
86
87 static char *compare_constant_1 ();
88 static void record_constant_1 ();
89 void output_constant_pool ();
90 void assemble_name ();
91 int output_addressed_constants ();
92 void output_constant ();
93 void output_constructor ();
94 void text_section ();
95 void readonly_data_section ();
96 void data_section ();
97 \f
98 #ifdef EXTRA_SECTIONS
99 static enum in_section {no_section, in_text, in_data, EXTRA_SECTIONS} in_section
100   = no_section;
101 #else
102 static enum in_section {no_section, in_text, in_data} in_section
103   = no_section;
104 #endif
105
106 /* Define functions like text_section for any extra sections.  */
107 #ifdef EXTRA_SECTION_FUNCTIONS
108 EXTRA_SECTION_FUNCTIONS
109 #endif
110
111 /* Tell assembler to switch to text section.  */
112
113 void
114 text_section ()
115 {
116   if (in_section != in_text)
117     {
118       fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
119       in_section = in_text;
120     }
121 }
122
123 /* Tell assembler to switch to data section.  */
124
125 void
126 data_section ()
127 {
128   if (in_section != in_data)
129     {
130       if (flag_shared_data)
131         {
132 #ifdef SHARED_SECTION_ASM_OP
133           fprintf (asm_out_file, "%s\n", SHARED_SECTION_ASM_OP);
134 #else
135           fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
136 #endif
137         }
138       else
139         fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
140
141       in_section = in_data;
142     }
143 }
144
145 /* Tell assembler to switch to read-only data section.  This is normally
146    the text section.  */
147
148 void
149 readonly_data_section ()
150 {
151 #ifdef READONLY_DATA_SECTION
152   READONLY_DATA_SECTION ();  /* Note this can call data_section.  */
153 #else
154   text_section ();
155 #endif
156 }
157
158 /* Determine if we're in the text section. */
159
160 int
161 in_text_section ()
162 {
163   return in_section == in_text;
164 }
165 \f
166 /* Create the rtl to represent a function, for a function definition.
167    DECL is a FUNCTION_DECL node which describes which function.
168    The rtl is stored into DECL.  */
169
170 void
171 make_function_rtl (decl)
172      tree decl;
173 {
174   char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
175
176   /* Rename a nested function to avoid conflicts.  */
177   if (decl_function_context (decl) != 0
178       && DECL_INITIAL (decl) != 0
179       && DECL_RTL (decl) == 0)
180     {
181       char *label;
182
183       name = IDENTIFIER_POINTER (DECL_NAME (decl));
184       ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
185       name = obstack_copy0 (saveable_obstack, label, strlen (label));
186       var_labelno++;
187     }
188
189   if (DECL_RTL (decl) == 0)
190     {
191       DECL_RTL (decl)
192         = gen_rtx (MEM, DECL_MODE (decl),
193                    gen_rtx (SYMBOL_REF, Pmode, name));
194
195       /* Optionally set flags or add text to the name to record information
196          such as that it is a function name.  If the name is changed, the macro
197          ASM_OUTPUT_LABELREF will have to know how to strip this information.
198          And if it finds a * at the beginning after doing so, it must handle
199          that too.  */
200 #ifdef ENCODE_SECTION_INFO
201       ENCODE_SECTION_INFO (decl);
202 #endif
203     }
204
205   /* Record at least one function has been defined.  */
206   function_defined = 1;
207 }
208
209 /* Given NAME, a putative register name, discard any customary prefixes.  */
210
211 static char *
212 strip_reg_name (name)
213      char *name;
214 {
215 #ifdef REGISTER_PREFIX
216   if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
217     name += strlen (REGISTER_PREFIX);
218 #endif
219   if (name[0] == '%' || name[0] == '#')
220     name++;
221   return name;
222 }
223 \f
224 /* Decode an `asm' spec for a declaration as a register name.
225    Return the register number, or -1 if nothing specified,
226    or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
227    or -3 if ASMSPEC is `cc' and is not recognized,
228    or -4 if ASMSPEC is `memory' and is not recognized.
229    Accept an exact spelling or a decimal number.
230    Prefixes such as % are optional.  */
231
232 int
233 decode_reg_name (asmspec)
234      char *asmspec;
235 {
236   if (asmspec != 0)
237     {
238       int i;
239
240       /* Get rid of confusing prefixes.  */
241       asmspec = strip_reg_name (asmspec);
242         
243       /* Allow a decimal number as a "register name".  */
244       for (i = strlen (asmspec) - 1; i >= 0; i--)
245         if (! (asmspec[i] >= '0' && asmspec[i] <= '9'))
246           break;
247       if (asmspec[0] != 0 && i < 0)
248         {
249           i = atoi (asmspec);
250           if (i < FIRST_PSEUDO_REGISTER && i >= 0)
251             return i;
252           else
253             return -2;
254         }
255
256       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
257         if (reg_names[i][0]
258             && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
259           return i;
260
261 #ifdef ADDITIONAL_REGISTER_NAMES
262       {
263         static struct { char *name; int number; } table[]
264           = ADDITIONAL_REGISTER_NAMES;
265
266         for (i = 0; i < sizeof (table) / sizeof (table[0]); i++)
267           if (! strcmp (asmspec, table[i].name))
268             return table[i].number;
269       }
270 #endif /* ADDITIONAL_REGISTER_NAMES */
271
272       if (!strcmp (asmspec, "memory"))
273         return -4;
274
275       if (!strcmp (asmspec, "cc"))
276         return -3;
277
278       return -2;
279     }
280
281   return -1;
282 }
283 \f
284 /* Create the DECL_RTL for a declaration for a static or external variable
285    or static or external function.
286    ASMSPEC, if not 0, is the string which the user specified
287    as the assembler symbol name.
288    TOP_LEVEL is nonzero if this is a file-scope variable.
289
290    This is never called for PARM_DECL nodes.  */
291
292 void
293 make_decl_rtl (decl, asmspec, top_level)
294      tree decl;
295      char *asmspec;
296      int top_level;
297 {
298   register char *name;
299   int reg_number = decode_reg_name (asmspec);
300
301   if (DECL_ASSEMBLER_NAME (decl) != NULL_TREE)
302     name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
303
304   if (reg_number == -2)
305     {
306       /* ASMSPEC is given, and not the name of a register.  */
307       name = (char *) obstack_alloc (saveable_obstack,
308                                      strlen (asmspec) + 2);
309       name[0] = '*';
310       strcpy (&name[1], asmspec);
311     }
312
313   /* For a duplicate declaration, we can be called twice on the
314      same DECL node.  Don't alter the RTL already made
315      unless the old mode is wrong (which can happen when
316      the previous rtl was made when the type was incomplete).  */
317   if (DECL_RTL (decl) == 0
318       || GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
319     {
320       DECL_RTL (decl) = 0;
321
322       /* First detect errors in declaring global registers.  */
323       if (DECL_REGISTER (decl) && reg_number == -1)
324         error_with_decl (decl,
325                          "register name not specified for `%s'");
326       else if (DECL_REGISTER (decl) && reg_number < 0)
327         error_with_decl (decl,
328                          "invalid register name for `%s'");
329       else if ((reg_number >= 0 || reg_number == -3) && ! DECL_REGISTER (decl))
330         error_with_decl (decl,
331                          "register name given for non-register variable `%s'");
332       else if (DECL_REGISTER (decl) && TREE_CODE (decl) == FUNCTION_DECL)
333         error ("function declared `register'");
334       else if (DECL_REGISTER (decl) && TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
335         error_with_decl (decl, "data type of `%s' isn't suitable for a register");
336       /* Now handle properly declared static register variables.  */
337       else if (DECL_REGISTER (decl))
338         {
339           int nregs;
340 #if 0 /* yylex should print the warning for this */
341           if (pedantic)
342             pedwarn ("ANSI C forbids global register variables");
343 #endif
344           if (DECL_INITIAL (decl) != 0 && top_level)
345             {
346               DECL_INITIAL (decl) = 0;
347               error ("global register variable has initial value");
348             }
349           if (fixed_regs[reg_number] == 0
350               && function_defined && top_level)
351             error ("global register variable follows a function definition");
352           if (TREE_THIS_VOLATILE (decl))
353             warning ("volatile register variables don't work as you might wish");
354           DECL_RTL (decl) = gen_rtx (REG, DECL_MODE (decl), reg_number);
355           REG_USERVAR_P (DECL_RTL (decl)) = 1;
356
357           if (top_level)
358             {
359               /* Make this register fixed, so not usable for anything else.  */
360               nregs = HARD_REGNO_NREGS (reg_number, DECL_MODE (decl));
361               while (nregs > 0)
362                 global_regs[reg_number + --nregs] = 1;
363               init_reg_sets_1 ();
364             }
365         }
366
367       /* Now handle ordinary static variables and functions (in memory).
368          Also handle vars declared register invalidly.  */
369       if (DECL_RTL (decl) == 0)
370         {
371           /* Can't use just the variable's own name for a variable
372              whose scope is less than the whole file.
373              Concatenate a distinguishing number.  */
374           if (!top_level && !DECL_EXTERNAL (decl) && asmspec == 0)
375             {
376               char *label;
377
378               ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
379               name = obstack_copy0 (saveable_obstack, label, strlen (label));
380               var_labelno++;
381             }
382
383           DECL_RTL (decl) = gen_rtx (MEM, DECL_MODE (decl),
384                                      gen_rtx (SYMBOL_REF, Pmode, name));
385           if (TREE_THIS_VOLATILE (decl))
386             MEM_VOLATILE_P (DECL_RTL (decl)) = 1;
387           if (TREE_READONLY (decl))
388             RTX_UNCHANGING_P (DECL_RTL (decl)) = 1;
389           MEM_IN_STRUCT_P (DECL_RTL (decl))
390             = (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
391                || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
392                || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE);
393
394           /* Optionally set flags or add text to the name to record information
395              such as that it is a function name.
396              If the name is changed, the macro ASM_OUTPUT_LABELREF
397              will have to know how to strip this information.
398              And if it finds a * at the beginning after doing so,
399              it must handle that too.  */
400 #ifdef ENCODE_SECTION_INFO
401           ENCODE_SECTION_INFO (decl);
402 #endif
403         }
404     }
405 }
406
407 /* Make the rtl for variable VAR be volatile.
408    Use this only for static variables.  */
409
410 make_var_volatile (var)
411      tree var;
412 {
413   if (GET_CODE (DECL_RTL (var)) != MEM)
414     abort ();
415
416   MEM_VOLATILE_P (DECL_RTL (var)) = 1;
417 }
418 \f
419 /* Output a string of literal assembler code
420    for an `asm' keyword used between functions.  */
421
422 void
423 assemble_asm (string)
424      tree string;
425 {
426   app_enable ();
427
428   if (TREE_CODE (string) == ADDR_EXPR)
429     string = TREE_OPERAND (string, 0);
430
431   fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
432 }
433
434 #if 0 /* This should no longer be needed, because
435          flag_gnu_linker should be 0 on these systems,
436          which should prevent any output
437          if ASM_OUTPUT_CONSTRUCTOR and ASM_OUTPUT_DESTRUCTOR are absent.  */
438 #if !(defined(DBX_DEBUGGING_INFO) && !defined(FASCIST_ASSEMBLER))
439 #ifndef ASM_OUTPUT_CONSTRUCTOR
440 #define ASM_OUTPUT_CONSTRUCTOR(file, name)
441 #endif
442 #ifndef ASM_OUTPUT_DESTRUCTOR
443 #define ASM_OUTPUT_DESTRUCTOR(file, name)
444 #endif
445 #endif
446 #endif /* 0 */
447
448 /* Record an element in the table of global destructors.
449    How this is done depends on what sort of assembler and linker
450    are in use.
451
452    NAME should be the name of a global function to be called
453    at exit time.  This name is output using assemble_name.  */
454
455 void
456 assemble_destructor (name)
457      char *name;
458 {
459 #ifdef ASM_OUTPUT_DESTRUCTOR
460   ASM_OUTPUT_DESTRUCTOR (asm_out_file, name);
461 #else
462   if (flag_gnu_linker)
463     {
464       /* Now tell GNU LD that this is part of the static destructor set.  */
465       /* This code works for any machine provided you use GNU as/ld.  */
466       fprintf (asm_out_file, "%s \"___DTOR_LIST__\",22,0,0,", ASM_STABS_OP);
467       assemble_name (asm_out_file, name);
468       fputc ('\n', asm_out_file);
469     }
470 #endif
471 }
472
473 /* Likewise for global constructors.  */
474
475 void
476 assemble_constructor (name)
477      char *name;
478 {
479 #ifdef ASM_OUTPUT_CONSTRUCTOR
480   ASM_OUTPUT_CONSTRUCTOR (asm_out_file, name);
481 #else
482   if (flag_gnu_linker)
483     {
484       /* Now tell GNU LD that this is part of the static constructor set.  */
485       /* This code works for any machine provided you use GNU as/ld.  */
486       fprintf (asm_out_file, "%s \"___CTOR_LIST__\",22,0,0,", ASM_STABS_OP);
487       assemble_name (asm_out_file, name);
488       fputc ('\n', asm_out_file);
489     }
490 #endif
491 }
492
493 /* Likewise for entries we want to record for garbage collection.
494    Garbage collection is still under development.  */
495
496 void
497 assemble_gc_entry (name)
498      char *name;
499 {
500 #ifdef ASM_OUTPUT_GC_ENTRY
501   ASM_OUTPUT_GC_ENTRY (asm_out_file, name);
502 #else
503   if (flag_gnu_linker)
504     {
505       /* Now tell GNU LD that this is part of the static constructor set.  */
506       fprintf (asm_out_file, "%s \"___PTR_LIST__\",22,0,0,", ASM_STABS_OP);
507       assemble_name (asm_out_file, name);
508       fputc ('\n', asm_out_file);
509     }
510 #endif
511 }
512 \f
513 /* Output assembler code for the constant pool of a function and associated
514    with defining the name of the function.  DECL describes the function.
515    NAME is the function's name.  For the constant pool, we use the current
516    constant pool data.  */
517
518 void
519 assemble_start_function (decl, fnname)
520      tree decl;
521      char *fnname;
522 {
523   int align;
524
525   /* The following code does not need preprocessing in the assembler.  */
526
527   app_disable ();
528
529   output_constant_pool (fnname, decl);
530
531   text_section ();
532
533
534   /* Tell assembler to move to target machine's alignment for functions.  */
535   align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
536   if (align > 0)
537     ASM_OUTPUT_ALIGN (asm_out_file, align);
538
539 #ifdef ASM_OUTPUT_FUNCTION_PREFIX
540   ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
541 #endif
542
543 #ifdef SDB_DEBUGGING_INFO
544   /* Output SDB definition of the function.  */
545   if (write_symbols == SDB_DEBUG)
546     sdbout_mark_begin_function ();
547 #endif
548
549 #ifdef DBX_DEBUGGING_INFO
550   /* Output DBX definition of the function.  */
551   if (write_symbols == DBX_DEBUG)
552     dbxout_begin_function (decl);
553 #endif
554
555   /* Make function name accessible from other files, if appropriate.  */
556
557   if (TREE_PUBLIC (decl))
558     {
559       if (!first_global_object_name)
560         STRIP_NAME_ENCODING (first_global_object_name, fnname);
561       ASM_GLOBALIZE_LABEL (asm_out_file, fnname);
562     }
563
564   /* Do any machine/system dependent processing of the function name */
565 #ifdef ASM_DECLARE_FUNCTION_NAME
566   ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
567 #else
568   /* Standard thing is just output label for the function.  */
569   ASM_OUTPUT_LABEL (asm_out_file, fnname);
570 #endif /* ASM_DECLARE_FUNCTION_NAME */
571 }
572
573 /* Output assembler code associated with defining the size of the
574    function.  DECL describes the function.  NAME is the function's name.  */
575
576 void
577 assemble_end_function (decl, fnname)
578      tree decl;
579      char *fnname;
580 {
581 #ifdef ASM_DECLARE_FUNCTION_SIZE
582   ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
583 #endif
584 }
585 \f
586 /* Assemble code to leave SIZE bytes of zeros.  */
587
588 void
589 assemble_zeros (size)
590      int size;
591 {
592 #ifdef ASM_NO_SKIP_IN_TEXT
593   /* The `space' pseudo in the text section outputs nop insns rather than 0s,
594      so we must output 0s explicitly in the text section.  */
595   if (ASM_NO_SKIP_IN_TEXT && in_text_section ())
596     {
597       int i;
598
599       for (i = 0; i < size - 20; i += 20)
600         {
601 #ifdef ASM_BYTE_OP
602           fprintf (asm_out_file,
603                    "%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);
604 #else
605           fprintf (asm_out_file,
606                    "\tbyte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n");
607 #endif
608         }
609       if (i < size)
610         {
611 #ifdef ASM_BYTE_OP
612           fprintf (asm_out_file, "%s 0", ASM_BYTE_OP);
613 #else
614           fprintf (asm_out_file, "\tbyte 0");
615 #endif
616           i++;
617           for (; i < size; i++)
618             fprintf (asm_out_file, ",0");
619           fprintf (asm_out_file, "\n");
620         }
621     }
622   else
623 #endif
624     ASM_OUTPUT_SKIP (asm_out_file, size);
625 }
626
627 /* Assemble a string constant with the specified C string as contents.  */
628
629 void
630 assemble_string (p, size)
631      unsigned char *p;
632      int size;
633 {
634   register int i;
635   int pos = 0;
636   int maximum = 2000;
637
638   /* If the string is very long, split it up.  */
639
640   while (pos < size)
641     {
642       int thissize = size - pos;
643       if (thissize > maximum)
644         thissize = maximum;
645
646       ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
647
648       pos += thissize;
649       p += thissize;
650     }
651 }
652 \f
653 /* Assemble everything that is needed for a variable or function declaration.
654    Not used for automatic variables, and not used for function definitions.
655    Should not be called for variables of incomplete structure type.
656
657    TOP_LEVEL is nonzero if this variable has file scope.
658    AT_END is nonzero if this is the special handling, at end of compilation,
659    to define things that have had only tentative definitions.  */
660
661 void
662 assemble_variable (decl, top_level, at_end)
663      tree decl;
664      int top_level;
665      int at_end;
666 {
667   register char *name;
668   int align;
669   tree size_tree;
670   int reloc = 0;
671
672   if (GET_CODE (DECL_RTL (decl)) == REG)
673     {
674       /* Do output symbol info for global register variables, but do nothing
675          else for them.  */
676
677       if (TREE_ASM_WRITTEN (decl))
678         return;
679       TREE_ASM_WRITTEN (decl) = 1;
680
681 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
682       /* File-scope global variables are output here.  */
683       if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
684           && top_level)
685         dbxout_symbol (decl, 0);
686 #endif
687 #ifdef SDB_DEBUGGING_INFO
688       if (write_symbols == SDB_DEBUG && top_level
689           /* Leave initialized global vars for end of compilation;
690              see comment in compile_file.  */
691           && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
692         sdbout_symbol (decl, 0);
693 #endif
694
695       /* Don't output any DWARF debugging information for variables here.
696          In the case of local variables, the information for them is output
697          when we do our recursive traversal of the tree representation for
698          the entire containing function.  In the case of file-scope variables,
699          we output information for all of them at the very end of compilation
700          while we are doing our final traversal of the chain of file-scope
701          declarations.  */
702
703       return;
704     }
705
706   /* Normally no need to say anything for external references,
707      since assembler considers all undefined symbols external.  */
708
709   if (DECL_EXTERNAL (decl))
710     return;
711
712   /* Output no assembler code for a function declaration.
713      Only definitions of functions output anything.  */
714
715   if (TREE_CODE (decl) == FUNCTION_DECL)
716     return;
717
718   /* If type was incomplete when the variable was declared,
719      see if it is complete now.  */
720
721   if (DECL_SIZE (decl) == 0)
722     layout_decl (decl, 0);
723
724   /* Still incomplete => don't allocate it; treat the tentative defn
725      (which is what it must have been) as an `extern' reference.  */
726
727   if (DECL_SIZE (decl) == 0)
728     {
729       error_with_file_and_line (DECL_SOURCE_FILE (decl),
730                                 DECL_SOURCE_LINE (decl),
731                                 "storage size of `%s' isn't known",
732                                 IDENTIFIER_POINTER (DECL_NAME (decl)));
733       return;
734     }
735
736   /* The first declaration of a variable that comes through this function
737      decides whether it is global (in C, has external linkage)
738      or local (in C, has internal linkage).  So do nothing more
739      if this function has already run.  */
740
741   if (TREE_ASM_WRITTEN (decl))
742     return;
743
744   TREE_ASM_WRITTEN (decl) = 1;
745
746 #ifdef DBX_DEBUGGING_INFO
747   /* File-scope global variables are output here.  */
748   if (write_symbols == DBX_DEBUG && top_level)
749     dbxout_symbol (decl, 0);
750 #endif
751 #ifdef SDB_DEBUGGING_INFO
752   if (write_symbols == SDB_DEBUG && top_level
753       /* Leave initialized global vars for end of compilation;
754          see comment in compile_file.  */
755       && (TREE_PUBLIC (decl) == 0 || DECL_INITIAL (decl) == 0))
756     sdbout_symbol (decl, 0);
757 #endif
758
759   /* Don't output any DWARF debugging information for variables here.
760      In the case of local variables, the information for them is output
761      when we do our recursive traversal of the tree representation for
762      the entire containing function.  In the case of file-scope variables,
763      we output information for all of them at the very end of compilation
764      while we are doing our final traversal of the chain of file-scope
765      declarations.  */
766
767   /* If storage size is erroneously variable, just continue.
768      Error message was already made.  */
769
770   if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
771     goto finish;
772
773   app_disable ();
774
775   /* This is better than explicit arithmetic, since it avoids overflow.  */
776   size_tree = size_binop (CEIL_DIV_EXPR,
777                           DECL_SIZE (decl), size_int (BITS_PER_UNIT));
778
779   if (TREE_INT_CST_HIGH (size_tree) != 0)
780     {
781       error_with_decl (decl, "size of variable `%s' is too large");
782       goto finish;
783     }
784
785   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
786
787   /* Handle uninitialized definitions.  */
788
789   /* ANSI specifies that a tentative definition which is not merged with
790      a non-tentative definition behaves exactly like a definition with an
791      initializer equal to zero.  (Section 3.7.2)
792      -fno-common gives strict ANSI behavior.  Usually you don't want it.  */
793   if (! flag_no_common
794       && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
795     {
796       int size = TREE_INT_CST_LOW (size_tree);
797       int rounded = size;
798
799       if (TREE_INT_CST_HIGH (size_tree) != 0)
800         error_with_decl (decl, "size of variable `%s' is too large");
801       /* Don't allocate zero bytes of common,
802          since that means "undefined external" in the linker.  */
803       if (size == 0) rounded = 1;
804       /* Round size up to multiple of BIGGEST_ALIGNMENT bits
805          so that each uninitialized object starts on such a boundary.  */
806       rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
807       rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
808                  * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
809 #if 0
810       if (flag_shared_data)
811         data_section ();
812 #endif
813       if (TREE_PUBLIC (decl))
814         {
815 #ifdef ASM_OUTPUT_SHARED_COMMON
816           if (flag_shared_data)
817             ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
818           else
819 #endif
820 #ifdef ASM_OUTPUT_ALIGNED_COMMON
821             ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size,
822                                        DECL_ALIGN (decl));
823 #else
824             ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded);
825 #endif
826         }
827       else
828         {
829 #ifdef ASM_OUTPUT_SHARED_LOCAL
830           if (flag_shared_data)
831             ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
832           else
833 #endif
834 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
835             ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size,
836                                       DECL_ALIGN (decl));
837 #else
838             ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
839 #endif
840         }
841       goto finish;
842     }
843
844   /* Handle initialized definitions.  */
845
846   /* First make the assembler name(s) global if appropriate.  */
847   if (TREE_PUBLIC (decl) && DECL_NAME (decl))
848     {
849       if (!first_global_object_name)
850         STRIP_NAME_ENCODING(first_global_object_name, name);
851       ASM_GLOBALIZE_LABEL (asm_out_file, name);
852     }
853 #if 0
854   for (d = equivalents; d; d = TREE_CHAIN (d))
855     {
856       tree e = TREE_VALUE (d);
857       if (TREE_PUBLIC (e) && DECL_NAME (e))
858         ASM_GLOBALIZE_LABEL (asm_out_file,
859                              XSTR (XEXP (DECL_RTL (e), 0), 0));
860     }
861 #endif
862
863   /* Output any data that we will need to use the address of.  */
864   if (DECL_INITIAL (decl))
865     reloc = output_addressed_constants (DECL_INITIAL (decl));
866
867   /* Switch to the proper section for this data.  */
868 #ifdef SELECT_SECTION
869   SELECT_SECTION (decl, reloc);
870 #else
871   if (TREE_READONLY (decl)
872       && ! TREE_THIS_VOLATILE (decl)
873       && ! (flag_pic && reloc))
874     readonly_data_section ();
875   else
876     data_section ();
877 #endif
878
879   /* Compute and output the alignment of this data.  */
880
881   align = DECL_ALIGN (decl);
882   /* Some object file formats have a maximum alignment which they support.
883      In particular, a.out format supports a maximum alignment of 4.  */
884 #ifndef MAX_OFILE_ALIGNMENT
885 #define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
886 #endif
887   if (align > MAX_OFILE_ALIGNMENT)
888     {
889       warning_with_decl (decl,
890           "alignment of `%s' is greater than maximum object file alignment");
891       align = MAX_OFILE_ALIGNMENT;
892     }
893 #ifdef DATA_ALIGNMENT
894   /* On some machines, it is good to increase alignment sometimes.  */
895   align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
896 #endif
897 #ifdef CONSTANT_ALIGNMENT
898   if (DECL_INITIAL (decl))
899     align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
900 #endif
901
902   /* Reset the alignment in case we have made it tighter, so we can benefit
903      from it in get_pointer_alignment.  */
904   DECL_ALIGN (decl) = align;
905
906   if (align > BITS_PER_UNIT)
907     ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
908
909   /* Do any machine/system dependent processing of the object.  */
910 #ifdef ASM_DECLARE_OBJECT_NAME
911   ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
912 #else
913   /* Standard thing is just output label for the object.  */
914   ASM_OUTPUT_LABEL (asm_out_file, name);
915 #endif /* ASM_DECLARE_OBJECT_NAME */
916
917 #if 0
918   for (d = equivalents; d; d = TREE_CHAIN (d))
919     {
920       tree e = TREE_VALUE (d);
921       ASM_OUTPUT_LABEL (asm_out_file, XSTR (XEXP (DECL_RTL (e), 0), 0));
922     }
923 #endif
924
925   if (DECL_INITIAL (decl))
926     /* Output the actual data.  */
927     output_constant (DECL_INITIAL (decl),
928                      int_size_in_bytes (TREE_TYPE (decl)));
929   else
930     /* Leave space for it.  */
931     assemble_zeros (int_size_in_bytes (TREE_TYPE (decl)));
932
933  finish:
934 #ifdef XCOFF_DEBUGGING_INFO
935   /* Unfortunately, the IBM assembler cannot handle stabx before the actual
936      declaration.  When something like ".stabx  "aa:S-2",aa,133,0" is emitted 
937      and `aa' hasn't been output yet, the assembler generates a stab entry with
938      a value of zero, in addition to creating an unnecessary external entry
939      for `aa'.  Hence, we must postpone dbxout_symbol to here at the end.  */
940
941   /* File-scope global variables are output here.  */
942   if (write_symbols == XCOFF_DEBUG && top_level)
943     dbxout_symbol (decl, 0);
944 #else
945   /* There must be a statement after a label.  */
946   ;
947 #endif
948 }
949
950 /* Output something to declare an external symbol to the assembler.
951    (Most assemblers don't need this, so we normally output nothing.)
952    Do nothing if DECL is not external.  */
953
954 void
955 assemble_external (decl)
956      tree decl;
957 {
958 #ifdef ASM_OUTPUT_EXTERNAL
959   if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd'
960       && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
961     {
962       rtx rtl = DECL_RTL (decl);
963
964       if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
965           && ! SYMBOL_REF_USED (XEXP (rtl, 0)))
966         {
967           /* Some systems do require some output.  */
968           SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
969           ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
970         }
971     }
972 #endif
973 }
974
975 /* Similar, for calling a library function FUN.  */
976
977 void
978 assemble_external_libcall (fun)
979      rtx fun;
980 {
981 #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
982   /* Declare library function name external when first used, if nec.  */
983   if (! SYMBOL_REF_USED (fun))
984     {
985       SYMBOL_REF_USED (fun) = 1;
986       ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
987     }
988 #endif
989 }
990
991 /* Declare the label NAME global.  */
992
993 void
994 assemble_global (name)
995      char *name;
996 {
997   ASM_GLOBALIZE_LABEL (asm_out_file, name);
998 }
999
1000 /* Assemble a label named NAME.  */
1001
1002 void
1003 assemble_label (name)
1004      char *name;
1005 {
1006   ASM_OUTPUT_LABEL (asm_out_file, name);
1007 }
1008
1009 /* Output to FILE a reference to the assembler name of a C-level name NAME.
1010    If NAME starts with a *, the rest of NAME is output verbatim.
1011    Otherwise NAME is transformed in an implementation-defined way
1012    (usually by the addition of an underscore).
1013    Many macros in the tm file are defined to call this function.  */
1014
1015 void
1016 assemble_name (file, name)
1017      FILE *file;
1018      char *name;
1019 {
1020   if (name[0] == '*')
1021     fputs (&name[1], file);
1022   else
1023     ASM_OUTPUT_LABELREF (file, name);
1024 }
1025
1026 /* Allocate SIZE bytes writable static space with a gensym name
1027    and return an RTX to refer to its address.  */
1028
1029 rtx
1030 assemble_static_space (size)
1031      int size;
1032 {
1033   char name[12];
1034   char *namestring;
1035   rtx x;
1036   /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1037      so that each uninitialized object starts on such a boundary.  */
1038   int rounded = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1039                  / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1040                  * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1041
1042 #if 0
1043   if (flag_shared_data)
1044     data_section ();
1045 #endif
1046
1047   ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1048   ++const_labelno;
1049
1050   namestring = (char *) obstack_alloc (saveable_obstack,
1051                                        strlen (name) + 2);
1052   strcpy (namestring, name);
1053
1054   x = gen_rtx (SYMBOL_REF, Pmode, namestring);
1055 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
1056   ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
1057 #else
1058   ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1059 #endif
1060   return x;
1061 }
1062
1063 /* Assemble the static constant template for function entry trampolines.
1064    This is done at most once per compilation.
1065    Returns an RTX for the address of the template.  */
1066
1067 rtx
1068 assemble_trampoline_template ()
1069 {
1070   char label[256];
1071   char *name;
1072   int align;
1073
1074   /* Some assemblers don't like instructions in data segment, so always
1075      put trampoline template in text segment.  */
1076
1077   text_section ();
1078
1079   /* Write the assembler code to define one.  */
1080   align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1081   if (align > 0)
1082     ASM_OUTPUT_ALIGN (asm_out_file, align);
1083
1084   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LTRAMP", 0);
1085   TRAMPOLINE_TEMPLATE (asm_out_file);
1086
1087   /* Record the rtl to refer to it.  */
1088   ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1089   name
1090     = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
1091   return gen_rtx (SYMBOL_REF, Pmode, name);
1092 }
1093 \f
1094 /* Assemble the integer constant X into an object of SIZE bytes.
1095    X must be either a CONST_INT or CONST_DOUBLE.
1096
1097    Return 1 if we were able to output the constant, otherwise 0.  If FORCE is
1098    non-zero, abort if we can't output the constant.  */
1099
1100 int
1101 assemble_integer (x, size, force)
1102      rtx x;
1103      int size;
1104      int force;
1105 {
1106   /* First try to use the standard 1, 2, 4, 8, and 16 byte
1107      ASM_OUTPUT... macros. */
1108
1109   switch (size)
1110     {
1111 #ifdef ASM_OUTPUT_CHAR
1112     case 1:
1113       ASM_OUTPUT_CHAR (asm_out_file, x);
1114       return 1;
1115 #endif
1116
1117 #ifdef ASM_OUTPUT_SHORT
1118     case 2:
1119       ASM_OUTPUT_SHORT (asm_out_file, x);
1120       return 1;
1121 #endif
1122
1123 #ifdef ASM_OUTPUT_INT
1124     case 4:
1125       ASM_OUTPUT_INT (asm_out_file, x);
1126       return 1;
1127 #endif
1128
1129 #ifdef ASM_OUTPUT_DOUBLE_INT
1130     case 8:
1131       ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
1132       return 1;
1133 #endif
1134
1135 #ifdef ASM_OUTPUT_QUADRUPLE_INT
1136     case 16:
1137       ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
1138       return 1;
1139 #endif
1140     }
1141
1142   /* If we couldn't do it that way, there are two other possibilities: First,
1143      if the machine can output an explicit byte and this is a 1 byte constant,
1144      we can use ASM_OUTPUT_BYTE.  */
1145
1146 #ifdef ASM_OUTPUT_BYTE
1147   if (size == 1 && GET_CODE (x) == CONST_INT)
1148     {
1149       ASM_OUTPUT_BYTE (asm_out_file, INTVAL (x));
1150       return 1;
1151     }
1152 #endif
1153
1154   /* Finally, if SIZE is larger than a single word, try to output the constant
1155      one word at a time.  */
1156
1157   if (size > UNITS_PER_WORD)
1158     {
1159       int i;
1160       enum machine_mode mode
1161         = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1162       rtx word;
1163
1164       for (i = 0; i < size / UNITS_PER_WORD; i++)
1165         {
1166           word = operand_subword (x, i, 0, mode);
1167
1168           if (word == 0)
1169             break;
1170
1171           if (! assemble_integer (word, UNITS_PER_WORD, 0))
1172             break;
1173         }
1174
1175       if (i == size / UNITS_PER_WORD)
1176         return 1;
1177       /* If we output at least one word and then could not finish,
1178          there is no valid way to continue.  */
1179       if (i > 0)
1180         abort ();
1181     }
1182
1183   if (force)
1184     abort ();
1185
1186   return 0;
1187 }
1188 \f
1189 /* Assemble the floating-point constant D into an object of size MODE.  */
1190
1191 void
1192 assemble_real (d, mode)
1193      REAL_VALUE_TYPE d;
1194      enum machine_mode mode;
1195 {
1196   jmp_buf output_constant_handler;
1197
1198   if (setjmp (output_constant_handler))
1199     {
1200       error ("floating point trap outputting a constant");
1201 #ifdef REAL_IS_NOT_DOUBLE
1202       bzero (&d, sizeof d);
1203       d = dconst0;
1204 #else
1205       d = 0;
1206 #endif
1207     }
1208
1209   set_float_handler (output_constant_handler);
1210
1211   switch (mode)
1212     {
1213 #ifdef ASM_OUTPUT_FLOAT
1214     case SFmode:
1215       ASM_OUTPUT_FLOAT (asm_out_file, d);
1216       break;
1217 #endif
1218
1219 #ifdef ASM_OUTPUT_DOUBLE
1220     case DFmode:
1221       ASM_OUTPUT_DOUBLE (asm_out_file, d);
1222       break;
1223 #endif
1224
1225 #ifdef ASM_OUTPUT_LONG_DOUBLE
1226     case TFmode:
1227       ASM_OUTPUT_LONG_DOUBLE (asm_out_file, d);
1228       break;
1229 #endif
1230
1231     default:
1232       abort ();
1233     }
1234
1235   set_float_handler (NULL_PTR);
1236 }
1237 \f
1238 /* Here we combine duplicate floating constants to make
1239    CONST_DOUBLE rtx's, and force those out to memory when necessary.  */
1240
1241 /* Chain of all CONST_DOUBLE rtx's constructed for the current function.
1242    They are chained through the CONST_DOUBLE_CHAIN.
1243    A CONST_DOUBLE rtx has CONST_DOUBLE_MEM != cc0_rtx iff it is on this chain.
1244    In that case, CONST_DOUBLE_MEM is either a MEM,
1245    or const0_rtx if no MEM has been made for this CONST_DOUBLE yet.
1246
1247    (CONST_DOUBLE_MEM is used only for top-level functions.
1248    See force_const_mem for explanation.)  */
1249
1250 static rtx const_double_chain;
1251
1252 /* Return a CONST_DOUBLE for a value specified as a pair of ints.
1253    For an integer, I0 is the low-order word and I1 is the high-order word.
1254    For a real number, I0 is the word with the low address
1255    and I1 is the word with the high address.  */
1256
1257 rtx
1258 immed_double_const (i0, i1, mode)
1259      HOST_WIDE_INT i0, i1;
1260      enum machine_mode mode;
1261 {
1262   register rtx r;
1263   int in_current_obstack;
1264
1265   if (GET_MODE_CLASS (mode) == MODE_INT)
1266     {
1267       /* We clear out all bits that don't belong in MODE, unless they and our
1268          sign bit are all one.  So we get either a reasonable negative value
1269          or a reasonable unsigned value for this mode.  */
1270       int width = GET_MODE_BITSIZE (mode);
1271       if (width < HOST_BITS_PER_WIDE_INT
1272           && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
1273               != ((HOST_WIDE_INT) (-1) << (width - 1))))
1274         i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
1275       else if (width == HOST_BITS_PER_WIDE_INT
1276                && ! (i1 == ~0 && i0 < 0))
1277         i1 = 0;
1278       else if (width > 2 * HOST_BITS_PER_WIDE_INT)
1279         /* We cannot represent this value as a constant.  */
1280         abort ();
1281
1282       /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a CONST_INT.
1283
1284          ??? Strictly speaking, this is wrong if we create a CONST_INT
1285          for a large unsigned constant with the size of MODE being
1286          HOST_BITS_PER_WIDE_INT and later try to interpret that constant in a
1287          wider mode.  In that case we will mis-interpret it as a negative
1288          number.
1289
1290          Unfortunately, the only alternative is to make a CONST_DOUBLE
1291          for any constant in any mode if it is an unsigned constant larger
1292          than the maximum signed integer in an int on the host.  However,
1293          doing this will break everyone that always expects to see a CONST_INT
1294          for SImode and smaller.
1295
1296          We have always been making CONST_INTs in this case, so nothing new
1297          is being broken.  */
1298
1299       if (width <= HOST_BITS_PER_WIDE_INT)
1300         i1 = (i0 < 0) ? ~0 : 0;
1301
1302       /* If this integer fits in one word, return a CONST_INT.  */
1303       if ((i1 == 0 && i0 >= 0)
1304           || (i1 == ~0 && i0 < 0))
1305         return GEN_INT (i0);
1306
1307       /* We use VOIDmode for integers.  */
1308       mode = VOIDmode;
1309     }
1310
1311   /* Search the chain for an existing CONST_DOUBLE with the right value.
1312      If one is found, return it.  */
1313
1314   for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
1315     if (CONST_DOUBLE_LOW (r) == i0 && CONST_DOUBLE_HIGH (r) == i1
1316         && GET_MODE (r) == mode)
1317       return r;
1318
1319   /* No; make a new one and add it to the chain.
1320
1321      We may be called by an optimizer which may be discarding any memory
1322      allocated during its processing (such as combine and loop).  However,
1323      we will be leaving this constant on the chain, so we cannot tolerate
1324      freed memory.  So switch to saveable_obstack for this allocation
1325      and then switch back if we were in current_obstack.  */
1326
1327   in_current_obstack = rtl_in_saveable_obstack ();
1328   r = gen_rtx (CONST_DOUBLE, mode, 0, i0, i1);
1329   if (in_current_obstack)
1330     rtl_in_current_obstack ();
1331
1332   /* Don't touch const_double_chain in nested function;
1333      see force_const_mem.  */
1334   if (outer_function_chain == 0)
1335     {
1336       CONST_DOUBLE_CHAIN (r) = const_double_chain;
1337       const_double_chain = r;
1338     }
1339
1340   /* Store const0_rtx in mem-slot since this CONST_DOUBLE is on the chain.
1341      Actual use of mem-slot is only through force_const_mem.  */
1342
1343   CONST_DOUBLE_MEM (r) = const0_rtx;
1344
1345   return r;
1346 }
1347
1348 /* Return a CONST_DOUBLE for a specified `double' value
1349    and machine mode.  */
1350
1351 rtx
1352 immed_real_const_1 (d, mode)
1353      REAL_VALUE_TYPE d;
1354      enum machine_mode mode;
1355 {
1356   union real_extract u;
1357   register rtx r;
1358   int in_current_obstack;
1359
1360   /* Get the desired `double' value as a sequence of ints
1361      since that is how they are stored in a CONST_DOUBLE.  */
1362
1363   u.d = d;
1364
1365   /* Detect special cases.  */
1366
1367   /* Avoid REAL_VALUES_EQUAL here in order to distinguish minus zero.  */
1368   if (!bcmp (&dconst0, &d, sizeof d))
1369     return CONST0_RTX (mode);
1370   else if (REAL_VALUES_EQUAL (dconst1, d))
1371     return CONST1_RTX (mode);
1372
1373   if (sizeof u == 2 * sizeof (HOST_WIDE_INT))
1374     return immed_double_const (u.i[0], u.i[1], mode);
1375
1376   /* The rest of this function handles the case where
1377      a float value requires more than 2 ints of space.
1378      It will be deleted as dead code on machines that don't need it.  */
1379
1380   /* Search the chain for an existing CONST_DOUBLE with the right value.
1381      If one is found, return it.  */
1382
1383   for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
1384     if (! bcmp (&CONST_DOUBLE_LOW (r), &u, sizeof u)
1385         && GET_MODE (r) == mode)
1386       return r;
1387
1388   /* No; make a new one and add it to the chain.
1389
1390      We may be called by an optimizer which may be discarding any memory
1391      allocated during its processing (such as combine and loop).  However,
1392      we will be leaving this constant on the chain, so we cannot tolerate
1393      freed memory.  So switch to saveable_obstack for this allocation
1394      and then switch back if we were in current_obstack.  */
1395
1396   in_current_obstack = rtl_in_saveable_obstack ();
1397   r = rtx_alloc (CONST_DOUBLE);
1398   PUT_MODE (r, mode);
1399   bcopy (&u, &CONST_DOUBLE_LOW (r), sizeof u);
1400   if (in_current_obstack)
1401     rtl_in_current_obstack ();
1402
1403   /* Don't touch const_double_chain in nested function;
1404      see force_const_mem.  */
1405   if (outer_function_chain == 0)
1406     {
1407       CONST_DOUBLE_CHAIN (r) = const_double_chain;
1408       const_double_chain = r;
1409     }
1410
1411   /* Store const0_rtx in CONST_DOUBLE_MEM since this CONST_DOUBLE is on the
1412      chain, but has not been allocated memory.  Actual use of CONST_DOUBLE_MEM
1413      is only through force_const_mem.  */
1414
1415   CONST_DOUBLE_MEM (r) = const0_rtx;
1416
1417   return r;
1418 }
1419
1420 /* Return a CONST_DOUBLE rtx for a value specified by EXP,
1421    which must be a REAL_CST tree node.  */
1422
1423 rtx
1424 immed_real_const (exp)
1425      tree exp;
1426 {
1427   return immed_real_const_1 (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)));
1428 }
1429
1430 /* At the end of a function, forget the memory-constants
1431    previously made for CONST_DOUBLEs.  Mark them as not on real_constant_chain.
1432    Also clear out real_constant_chain and clear out all the chain-pointers.  */
1433
1434 void
1435 clear_const_double_mem ()
1436 {
1437   register rtx r, next;
1438
1439   /* Don't touch CONST_DOUBLE_MEM for nested functions.
1440      See force_const_mem for explanation.  */
1441   if (outer_function_chain != 0)
1442     return;
1443
1444   for (r = const_double_chain; r; r = next)
1445     {
1446       next = CONST_DOUBLE_CHAIN (r);
1447       CONST_DOUBLE_CHAIN (r) = 0;
1448       CONST_DOUBLE_MEM (r) = cc0_rtx;
1449     }
1450   const_double_chain = 0;
1451 }
1452 \f
1453 /* Given an expression EXP with a constant value,
1454    reduce it to the sum of an assembler symbol and an integer.
1455    Store them both in the structure *VALUE.
1456    Abort if EXP does not reduce.  */
1457
1458 struct addr_const
1459 {
1460   rtx base;
1461   HOST_WIDE_INT offset;
1462 };
1463
1464 static void
1465 decode_addr_const (exp, value)
1466      tree exp;
1467      struct addr_const *value;
1468 {
1469   register tree target = TREE_OPERAND (exp, 0);
1470   register int offset = 0;
1471   register rtx x;
1472
1473   while (1)
1474     {
1475       if (TREE_CODE (target) == COMPONENT_REF
1476           && (TREE_CODE (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1)))
1477               == INTEGER_CST))
1478         {
1479           offset += TREE_INT_CST_LOW (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1))) / BITS_PER_UNIT;
1480           target = TREE_OPERAND (target, 0);
1481         }
1482       else if (TREE_CODE (target) == ARRAY_REF)
1483         {
1484           if (TREE_CODE (TREE_OPERAND (target, 1)) != INTEGER_CST
1485               || TREE_CODE (TYPE_SIZE (TREE_TYPE (target))) != INTEGER_CST)
1486             abort ();
1487           offset += ((TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (target)))
1488                       * TREE_INT_CST_LOW (TREE_OPERAND (target, 1)))
1489                      / BITS_PER_UNIT);
1490           target = TREE_OPERAND (target, 0);
1491         }
1492       else
1493         break;
1494     }
1495
1496   switch (TREE_CODE (target))
1497     {
1498     case VAR_DECL:
1499     case FUNCTION_DECL:
1500       x = DECL_RTL (target);
1501       break;
1502
1503     case LABEL_DECL:
1504       x = gen_rtx (MEM, FUNCTION_MODE,
1505                    gen_rtx (LABEL_REF, VOIDmode,
1506                             label_rtx (TREE_OPERAND (exp, 0))));
1507       break;
1508
1509     case REAL_CST:
1510     case STRING_CST:
1511     case COMPLEX_CST:
1512     case CONSTRUCTOR:
1513       x = TREE_CST_RTL (target);
1514       break;
1515
1516     default:
1517       abort ();
1518     }
1519
1520   if (GET_CODE (x) != MEM)
1521     abort ();
1522   x = XEXP (x, 0);
1523
1524   value->base = x;
1525   value->offset = offset;
1526 }
1527 \f
1528 /* Uniquize all constants that appear in memory.
1529    Each constant in memory thus far output is recorded
1530    in `const_hash_table' with a `struct constant_descriptor'
1531    that contains a polish representation of the value of
1532    the constant.
1533
1534    We cannot store the trees in the hash table
1535    because the trees may be temporary.  */
1536
1537 struct constant_descriptor
1538 {
1539   struct constant_descriptor *next;
1540   char *label;
1541   char contents[1];
1542 };
1543
1544 #define HASHBITS 30
1545 #define MAX_HASH_TABLE 1009
1546 static struct constant_descriptor *const_hash_table[MAX_HASH_TABLE];
1547
1548 /* Compute a hash code for a constant expression.  */
1549
1550 int
1551 const_hash (exp)
1552      tree exp;
1553 {
1554   register char *p;
1555   register int len, hi, i;
1556   register enum tree_code code = TREE_CODE (exp);
1557
1558   if (code == INTEGER_CST)
1559     {
1560       p = (char *) &TREE_INT_CST_LOW (exp);
1561       len = 2 * sizeof TREE_INT_CST_LOW (exp);
1562     }
1563   else if (code == REAL_CST)
1564     {
1565       p = (char *) &TREE_REAL_CST (exp);
1566       len = sizeof TREE_REAL_CST (exp);
1567     }
1568   else if (code == STRING_CST)
1569     p = TREE_STRING_POINTER (exp), len = TREE_STRING_LENGTH (exp);
1570   else if (code == COMPLEX_CST)
1571     return const_hash (TREE_REALPART (exp)) * 5
1572       + const_hash (TREE_IMAGPART (exp));
1573   else if (code == CONSTRUCTOR)
1574     {
1575       register tree link;
1576
1577       /* For record type, include the type in the hashing.
1578          We do not do so for array types
1579          because (1) the sizes of the elements are sufficient
1580          and (2) distinct array types can have the same constructor.
1581          Instead, we include the array size because the constructor could
1582          be shorter.  */
1583       if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1584         hi = ((HOST_WIDE_INT) TREE_TYPE (exp) & ((1 << HASHBITS) - 1))
1585           % MAX_HASH_TABLE;
1586       else
1587         hi = ((5 + int_size_in_bytes (TREE_TYPE (exp)))
1588                & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
1589
1590       for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
1591         if (TREE_VALUE (link))
1592           hi = (hi * 603 + const_hash (TREE_VALUE (link))) % MAX_HASH_TABLE;
1593
1594       return hi;
1595     }
1596   else if (code == ADDR_EXPR)
1597     {
1598       struct addr_const value;
1599       decode_addr_const (exp, &value);
1600       if (GET_CODE (value.base) == SYMBOL_REF)
1601         {
1602           /* Don't hash the address of the SYMBOL_REF;
1603              only use the offset and the symbol name.  */
1604           hi = value.offset;
1605           p = XSTR (value.base, 0);
1606           for (i = 0; p[i] != 0; i++)
1607             hi = ((hi * 613) + (unsigned)(p[i]));
1608         }
1609       else if (GET_CODE (value.base) == LABEL_REF)
1610         hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
1611
1612       hi &= (1 << HASHBITS) - 1;
1613       hi %= MAX_HASH_TABLE;
1614       return hi;
1615     }
1616   else if (code == PLUS_EXPR || code == MINUS_EXPR)
1617     return const_hash (TREE_OPERAND (exp, 0)) * 9
1618       +  const_hash (TREE_OPERAND (exp, 1));
1619   else if (code == NOP_EXPR || code == CONVERT_EXPR)
1620     return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
1621
1622   /* Compute hashing function */
1623   hi = len;
1624   for (i = 0; i < len; i++)
1625     hi = ((hi * 613) + (unsigned)(p[i]));
1626
1627   hi &= (1 << HASHBITS) - 1;
1628   hi %= MAX_HASH_TABLE;
1629   return hi;
1630 }
1631 \f
1632 /* Compare a constant expression EXP with a constant-descriptor DESC.
1633    Return 1 if DESC describes a constant with the same value as EXP.  */
1634
1635 static int
1636 compare_constant (exp, desc)
1637      tree exp;
1638      struct constant_descriptor *desc;
1639 {
1640   return 0 != compare_constant_1 (exp, desc->contents);
1641 }
1642
1643 /* Compare constant expression EXP with a substring P of a constant descriptor.
1644    If they match, return a pointer to the end of the substring matched.
1645    If they do not match, return 0.
1646
1647    Since descriptors are written in polish prefix notation,
1648    this function can be used recursively to test one operand of EXP
1649    against a subdescriptor, and if it succeeds it returns the
1650    address of the subdescriptor for the next operand.  */
1651
1652 static char *
1653 compare_constant_1 (exp, p)
1654      tree exp;
1655      char *p;
1656 {
1657   register char *strp;
1658   register int len;
1659   register enum tree_code code = TREE_CODE (exp);
1660
1661   if (code != (enum tree_code) *p++)
1662     return 0;
1663
1664   if (code == INTEGER_CST)
1665     {
1666       /* Integer constants are the same only if the same width of type.  */
1667       if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
1668         return 0;
1669       strp = (char *) &TREE_INT_CST_LOW (exp);
1670       len = 2 * sizeof TREE_INT_CST_LOW (exp);
1671     }
1672   else if (code == REAL_CST)
1673     {
1674       /* Real constants are the same only if the same width of type.  */
1675       if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
1676         return 0;
1677       strp = (char *) &TREE_REAL_CST (exp);
1678       len = sizeof TREE_REAL_CST (exp);
1679     }
1680   else if (code == STRING_CST)
1681     {
1682       if (flag_writable_strings)
1683         return 0;
1684       strp = TREE_STRING_POINTER (exp);
1685       len = TREE_STRING_LENGTH (exp);
1686       if (bcmp (&TREE_STRING_LENGTH (exp), p,
1687                 sizeof TREE_STRING_LENGTH (exp)))
1688         return 0;
1689       p += sizeof TREE_STRING_LENGTH (exp);
1690     }
1691   else if (code == COMPLEX_CST)
1692     {
1693       p = compare_constant_1 (TREE_REALPART (exp), p);
1694       if (p == 0) return 0;
1695       p = compare_constant_1 (TREE_IMAGPART (exp), p);
1696       return p;
1697     }
1698   else if (code == CONSTRUCTOR)
1699     {
1700       register tree link;
1701       int length = list_length (CONSTRUCTOR_ELTS (exp));
1702       tree type;
1703
1704       if (bcmp (&length, p, sizeof length))
1705         return 0;
1706       p += sizeof length;
1707
1708       /* For record constructors, insist that the types match.
1709          For arrays, just verify both constructors are for arrays.  */
1710       if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1711         type = TREE_TYPE (exp);
1712       else
1713         type = 0;
1714       if (bcmp (&type, p, sizeof type))
1715         return 0;
1716       p += sizeof type;
1717
1718       /* For arrays, insist that the size in bytes match.  */
1719       if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1720         {
1721           int size = int_size_in_bytes (TREE_TYPE (exp));
1722           if (bcmp (&size, p, sizeof size))
1723             return 0;
1724           p += sizeof size;
1725         }
1726
1727       for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
1728         {
1729           if (TREE_VALUE (link))
1730             {
1731               if ((p = compare_constant_1 (TREE_VALUE (link), p)) == 0)
1732                 return 0;
1733             }
1734           else
1735             {
1736               tree zero = 0;
1737
1738               if (bcmp (&zero, p, sizeof zero))
1739                 return 0;
1740               p += sizeof zero;
1741             }
1742         }
1743
1744       return p;
1745     }
1746   else if (code == ADDR_EXPR)
1747     {
1748       struct addr_const value;
1749       decode_addr_const (exp, &value);
1750       strp = (char *) &value.offset;
1751       len = sizeof value.offset;
1752       /* Compare the offset.  */
1753       while (--len >= 0)
1754         if (*p++ != *strp++)
1755           return 0;
1756       /* Compare symbol name.  */
1757       strp = XSTR (value.base, 0);
1758       len = strlen (strp) + 1;
1759     }
1760   else if (code == PLUS_EXPR || code == MINUS_EXPR)
1761     {
1762       p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
1763       if (p == 0) return 0;
1764       p = compare_constant_1 (TREE_OPERAND (exp, 1), p);
1765       return p;
1766     }
1767   else if (code == NOP_EXPR || code == CONVERT_EXPR)
1768     {
1769       p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
1770       return p;
1771     }
1772
1773   /* Compare constant contents.  */
1774   while (--len >= 0)
1775     if (*p++ != *strp++)
1776       return 0;
1777
1778   return p;
1779 }
1780 \f
1781 /* Construct a constant descriptor for the expression EXP.
1782    It is up to the caller to enter the descriptor in the hash table.  */
1783
1784 static struct constant_descriptor *
1785 record_constant (exp)
1786      tree exp;
1787 {
1788   struct constant_descriptor *ptr = 0;
1789   int buf;
1790
1791   obstack_grow (&permanent_obstack, &ptr, sizeof ptr);
1792   obstack_grow (&permanent_obstack, &buf, sizeof buf);
1793   record_constant_1 (exp);
1794   return (struct constant_descriptor *) obstack_finish (&permanent_obstack);
1795 }
1796
1797 /* Add a description of constant expression EXP
1798    to the object growing in `permanent_obstack'.
1799    No need to return its address; the caller will get that
1800    from the obstack when the object is complete.  */
1801
1802 static void
1803 record_constant_1 (exp)
1804      tree exp;
1805 {
1806   register char *strp;
1807   register int len;
1808   register enum tree_code code = TREE_CODE (exp);
1809
1810   obstack_1grow (&permanent_obstack, (unsigned int) code);
1811
1812   if (code == INTEGER_CST)
1813     {
1814       obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
1815       strp = (char *) &TREE_INT_CST_LOW (exp);
1816       len = 2 * sizeof TREE_INT_CST_LOW (exp);
1817     }
1818   else if (code == REAL_CST)
1819     {
1820       obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
1821       strp = (char *) &TREE_REAL_CST (exp);
1822       len = sizeof TREE_REAL_CST (exp);
1823     }
1824   else if (code == STRING_CST)
1825     {
1826       if (flag_writable_strings)
1827         return;
1828       strp = TREE_STRING_POINTER (exp);
1829       len = TREE_STRING_LENGTH (exp);
1830       obstack_grow (&permanent_obstack, (char *) &TREE_STRING_LENGTH (exp),
1831                     sizeof TREE_STRING_LENGTH (exp));
1832     }
1833   else if (code == COMPLEX_CST)
1834     {
1835       record_constant_1 (TREE_REALPART (exp));
1836       record_constant_1 (TREE_IMAGPART (exp));
1837       return;
1838     }
1839   else if (code == CONSTRUCTOR)
1840     {
1841       register tree link;
1842       int length = list_length (CONSTRUCTOR_ELTS (exp));
1843       tree type;
1844
1845       obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
1846
1847       /* For record constructors, insist that the types match.
1848          For arrays, just verify both constructors are for arrays.  */
1849       if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1850         type = TREE_TYPE (exp);
1851       else
1852         type = 0;
1853       obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
1854
1855       /* For arrays, insist that the size in bytes match.  */
1856       if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1857         {
1858           int size = int_size_in_bytes (TREE_TYPE (exp));
1859           obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
1860         }
1861
1862       for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
1863         {
1864           if (TREE_VALUE (link))
1865             record_constant_1 (TREE_VALUE (link));
1866           else
1867             {
1868               tree zero = 0;
1869
1870               obstack_grow (&permanent_obstack, (char *) &zero, sizeof zero);
1871             }
1872         }
1873
1874       return;
1875     }
1876   else if (code == ADDR_EXPR)
1877     {
1878       struct addr_const value;
1879       decode_addr_const (exp, &value);
1880       /* Record the offset.  */
1881       obstack_grow (&permanent_obstack,
1882                     (char *) &value.offset, sizeof value.offset);
1883       /* Record the symbol name.  */
1884       obstack_grow (&permanent_obstack, XSTR (value.base, 0),
1885                     strlen (XSTR (value.base, 0)) + 1);
1886       return;
1887     }
1888   else if (code == PLUS_EXPR || code == MINUS_EXPR)
1889     {
1890       record_constant_1 (TREE_OPERAND (exp, 0));
1891       record_constant_1 (TREE_OPERAND (exp, 1));
1892       return;
1893     }
1894   else if (code == NOP_EXPR || code == CONVERT_EXPR)
1895     {
1896       record_constant_1 (TREE_OPERAND (exp, 0));
1897       return;
1898     }
1899
1900   /* Record constant contents.  */
1901   obstack_grow (&permanent_obstack, strp, len);
1902 }
1903 \f
1904 /* Return an rtx representing a reference to constant data in memory
1905    for the constant expression EXP.
1906    If assembler code for such a constant has already been output,
1907    return an rtx to refer to it.
1908    Otherwise, output such a constant in memory and generate
1909    an rtx for it.  The TREE_CST_RTL of EXP is set up to point to that rtx.
1910    The const_hash_table records which constants already have label strings.  */
1911
1912 rtx
1913 output_constant_def (exp)
1914      tree exp;
1915 {
1916   register int hash, align;
1917   register struct constant_descriptor *desc;
1918   char label[256];
1919   char *found = 0;
1920   int reloc;
1921   register rtx def;
1922
1923   if (TREE_CODE (exp) == INTEGER_CST)
1924     abort ();                   /* No TREE_CST_RTL slot in these.  */
1925
1926   if (TREE_CST_RTL (exp))
1927     return TREE_CST_RTL (exp);
1928
1929   /* Make sure any other constants whose addresses appear in EXP
1930      are assigned label numbers.  */
1931
1932   reloc = output_addressed_constants (exp);
1933
1934   /* Compute hash code of EXP.  Search the descriptors for that hash code
1935      to see if any of them describes EXP.  If yes, the descriptor records
1936      the label number already assigned.  */
1937
1938   hash = const_hash (exp) % MAX_HASH_TABLE;
1939
1940   for (desc = const_hash_table[hash]; desc; desc = desc->next)
1941     if (compare_constant (exp, desc))
1942       {
1943         found = desc->label;
1944         break;
1945       }
1946
1947   if (found == 0)
1948     {
1949       /* No constant equal to EXP is known to have been output.
1950          Make a constant descriptor to enter EXP in the hash table.
1951          Assign the label number and record it in the descriptor for
1952          future calls to this function to find.  */
1953
1954       /* Create a string containing the label name, in LABEL.  */
1955       ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
1956
1957       desc = record_constant (exp);
1958       desc->next = const_hash_table[hash];
1959       desc->label
1960         = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
1961       const_hash_table[hash] = desc;
1962     }
1963
1964   /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
1965
1966   push_obstacks_nochange ();
1967   if (TREE_PERMANENT (exp))
1968     end_temporary_allocation ();
1969
1970   def = gen_rtx (SYMBOL_REF, Pmode, desc->label);
1971
1972   TREE_CST_RTL (exp)
1973     = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), def);
1974   RTX_UNCHANGING_P (TREE_CST_RTL (exp)) = 1;
1975   if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
1976       || TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1977     MEM_IN_STRUCT_P (TREE_CST_RTL (exp)) = 1;
1978
1979   pop_obstacks ();
1980
1981   /* Optionally set flags or add text to the name to record information
1982      such as that it is a function name.  If the name is changed, the macro
1983      ASM_OUTPUT_LABELREF will have to know how to strip this information.
1984      And if it finds a * at the beginning after doing so, it must handle
1985      that too.  */
1986 #ifdef ENCODE_SECTION_INFO
1987   ENCODE_SECTION_INFO (exp);
1988 #endif
1989
1990   if (found == 0)
1991     {
1992       /* Now output assembler code to define that label
1993          and follow it with the data of EXP.  */
1994
1995       /* First switch to text section, except for writable strings.  */
1996 #ifdef SELECT_SECTION
1997       SELECT_SECTION (exp, reloc);
1998 #else
1999       if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
2000           || (flag_pic && reloc))
2001         data_section ();
2002       else
2003         readonly_data_section ();
2004 #endif
2005
2006       /* Align the location counter as required by EXP's data type.  */
2007       align = TYPE_ALIGN (TREE_TYPE (exp));
2008 #ifdef CONSTANT_ALIGNMENT
2009       align = CONSTANT_ALIGNMENT (exp, align);
2010 #endif
2011
2012       if (align > BITS_PER_UNIT)
2013         ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2014
2015       /* Output the label itself.  */
2016       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", const_labelno);
2017
2018       /* Output the value of EXP.  */
2019       output_constant (exp,
2020                        (TREE_CODE (exp) == STRING_CST
2021                         ? TREE_STRING_LENGTH (exp)
2022                         : int_size_in_bytes (TREE_TYPE (exp))));
2023
2024       ++const_labelno;
2025     }
2026
2027   return TREE_CST_RTL (exp);
2028 }
2029 \f
2030 /* Similar hash facility for making memory-constants
2031    from constant rtl-expressions.  It is used on RISC machines
2032    where immediate integer arguments and constant addresses are restricted
2033    so that such constants must be stored in memory.
2034
2035    This pool of constants is reinitialized for each function
2036    so each function gets its own constants-pool that comes right before it.
2037
2038    All structures allocated here are discarded when functions are saved for
2039    inlining, so they do not need to be allocated permanently.  */
2040
2041 #define MAX_RTX_HASH_TABLE 61
2042 static struct constant_descriptor **const_rtx_hash_table;
2043
2044 /* Structure to represent sufficient information about a constant so that
2045    it can be output when the constant pool is output, so that function
2046    integration can be done, and to simplify handling on machines that reference
2047    constant pool as base+displacement.  */
2048
2049 struct pool_constant
2050 {
2051   struct constant_descriptor *desc;
2052   struct pool_constant *next;
2053   enum machine_mode mode;
2054   rtx constant;
2055   int labelno;
2056   int align;
2057   int offset;
2058 };
2059
2060 /* Pointers to first and last constant in pool.  */
2061
2062 static struct pool_constant *first_pool, *last_pool;
2063
2064 /* Current offset in constant pool (does not include any machine-specific
2065    header.  */
2066
2067 static int pool_offset;
2068
2069 /* Structure used to maintain hash table mapping symbols used to their
2070    corresponding constants.  */
2071
2072 struct pool_sym
2073 {
2074   char *label;
2075   struct pool_constant *pool;
2076   struct pool_sym *next;
2077 };
2078
2079 static struct pool_sym **const_rtx_sym_hash_table;
2080
2081 /* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
2082    The argument is XSTR (... , 0)  */
2083
2084 #define SYMHASH(LABEL)  \
2085   ((((HOST_WIDE_INT) (LABEL)) & ((1 << HASHBITS) - 1))  % MAX_RTX_HASH_TABLE)
2086 \f
2087 /* Initialize constant pool hashing for next function.  */
2088
2089 void
2090 init_const_rtx_hash_table ()
2091 {
2092   const_rtx_hash_table
2093     = ((struct constant_descriptor **)
2094        oballoc (MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *)));
2095   const_rtx_sym_hash_table
2096     = ((struct pool_sym **)
2097        oballoc (MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *)));
2098   bzero (const_rtx_hash_table,
2099          MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *));
2100   bzero (const_rtx_sym_hash_table,
2101          MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *));
2102
2103   first_pool = last_pool = 0;
2104   pool_offset = 0;
2105 }
2106
2107 /* Save and restore it for a nested function.  */
2108
2109 void
2110 save_varasm_status (p)
2111      struct function *p;
2112 {
2113   p->const_rtx_hash_table = const_rtx_hash_table;
2114   p->const_rtx_sym_hash_table = const_rtx_sym_hash_table;
2115   p->first_pool = first_pool;
2116   p->last_pool = last_pool;
2117   p->pool_offset = pool_offset;
2118 }
2119
2120 void
2121 restore_varasm_status (p)
2122      struct function *p;
2123 {
2124   const_rtx_hash_table = p->const_rtx_hash_table;
2125   const_rtx_sym_hash_table = p->const_rtx_sym_hash_table;
2126   first_pool = p->first_pool;
2127   last_pool = p->last_pool;
2128   pool_offset = p->pool_offset;
2129 }
2130 \f
2131 enum kind { RTX_DOUBLE, RTX_INT };
2132
2133 struct rtx_const
2134 {
2135 #ifdef ONLY_INT_FIELDS
2136   unsigned int kind : 16;
2137   unsigned int mode : 16;
2138 #else
2139   enum kind kind : 16;
2140   enum machine_mode mode : 16;
2141 #endif
2142   union {
2143     union real_extract du;
2144     struct addr_const addr;
2145   } un;
2146 };
2147
2148 /* Express an rtx for a constant integer (perhaps symbolic)
2149    as the sum of a symbol or label plus an explicit integer.
2150    They are stored into VALUE.  */
2151
2152 static void
2153 decode_rtx_const (mode, x, value)
2154      enum machine_mode mode;
2155      rtx x;
2156      struct rtx_const *value;
2157 {
2158   /* Clear the whole structure, including any gaps.  */
2159
2160   {
2161     int *p = (int *) value;
2162     int *end = (int *) (value + 1);
2163     while (p < end)
2164       *p++ = 0;
2165   }
2166
2167   value->kind = RTX_INT;        /* Most usual kind. */
2168   value->mode = mode;
2169
2170   switch (GET_CODE (x))
2171     {
2172     case CONST_DOUBLE:
2173       value->kind = RTX_DOUBLE;
2174       value->mode = GET_MODE (x);
2175       bcopy (&CONST_DOUBLE_LOW (x), &value->un.du, sizeof value->un.du);
2176       break;
2177
2178     case CONST_INT:
2179       value->un.addr.offset = INTVAL (x);
2180       break;
2181
2182     case SYMBOL_REF:
2183     case LABEL_REF:
2184     case PC:
2185       value->un.addr.base = x;
2186       break;
2187
2188     case CONST:
2189       x = XEXP (x, 0);
2190       if (GET_CODE (x) == PLUS)
2191         {
2192           value->un.addr.base = XEXP (x, 0);
2193           if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2194             abort ();
2195           value->un.addr.offset = INTVAL (XEXP (x, 1));
2196         }
2197       else if (GET_CODE (x) == MINUS)
2198         {
2199           value->un.addr.base = XEXP (x, 0);
2200           if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2201             abort ();
2202           value->un.addr.offset = - INTVAL (XEXP (x, 1));
2203         }
2204       else
2205         abort ();
2206       break;
2207
2208     default:
2209       abort ();
2210     }
2211
2212   if (value->kind == RTX_INT && value->un.addr.base != 0)
2213     switch (GET_CODE (value->un.addr.base))
2214       {
2215       case SYMBOL_REF:
2216       case LABEL_REF:
2217         /* Use the string's address, not the SYMBOL_REF's address,
2218            for the sake of addresses of library routines.
2219            For a LABEL_REF, compare labels.  */
2220         value->un.addr.base = XEXP (value->un.addr.base, 0);
2221       }
2222 }
2223
2224 /* Given a MINUS expression, simplify it if both sides
2225    include the same symbol.  */
2226
2227 rtx
2228 simplify_subtraction (x)
2229      rtx x;
2230 {
2231   struct rtx_const val0, val1;
2232
2233   decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
2234   decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
2235
2236   if (val0.un.addr.base == val1.un.addr.base)
2237     return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
2238   return x;
2239 }
2240
2241 /* Compute a hash code for a constant RTL expression.  */
2242
2243 int
2244 const_hash_rtx (mode, x)
2245      enum machine_mode mode;
2246      rtx x;
2247 {
2248   register int hi, i;
2249
2250   struct rtx_const value;
2251   decode_rtx_const (mode, x, &value);
2252
2253   /* Compute hashing function */
2254   hi = 0;
2255   for (i = 0; i < sizeof value / sizeof (int); i++)
2256     hi += ((int *) &value)[i];
2257
2258   hi &= (1 << HASHBITS) - 1;
2259   hi %= MAX_RTX_HASH_TABLE;
2260   return hi;
2261 }
2262
2263 /* Compare a constant rtl object X with a constant-descriptor DESC.
2264    Return 1 if DESC describes a constant with the same value as X.  */
2265
2266 static int
2267 compare_constant_rtx (mode, x, desc)
2268      enum machine_mode mode;
2269      rtx x;
2270      struct constant_descriptor *desc;
2271 {
2272   register int *p = (int *) desc->contents;
2273   register int *strp;
2274   register int len;
2275   struct rtx_const value;
2276
2277   decode_rtx_const (mode, x, &value);
2278   strp = (int *) &value;
2279   len = sizeof value / sizeof (int);
2280
2281   /* Compare constant contents.  */
2282   while (--len >= 0)
2283     if (*p++ != *strp++)
2284       return 0;
2285
2286   return 1;
2287 }
2288
2289 /* Construct a constant descriptor for the rtl-expression X.
2290    It is up to the caller to enter the descriptor in the hash table.  */
2291
2292 static struct constant_descriptor *
2293 record_constant_rtx (mode, x)
2294      enum machine_mode mode;
2295      rtx x;
2296 {
2297   struct constant_descriptor *ptr;
2298   char *label;
2299   struct rtx_const value;
2300
2301   decode_rtx_const (mode, x, &value);
2302
2303   obstack_grow (current_obstack, &ptr, sizeof ptr);
2304   obstack_grow (current_obstack, &label, sizeof label);
2305
2306   /* Record constant contents.  */
2307   obstack_grow (current_obstack, &value, sizeof value);
2308
2309   return (struct constant_descriptor *) obstack_finish (current_obstack);
2310 }
2311 \f
2312 /* Given a constant rtx X, make (or find) a memory constant for its value
2313    and return a MEM rtx to refer to it in memory.  */
2314
2315 rtx
2316 force_const_mem (mode, x)
2317      enum machine_mode mode;
2318      rtx x;
2319 {
2320   register int hash;
2321   register struct constant_descriptor *desc;
2322   char label[256];
2323   char *found = 0;
2324   rtx def;
2325
2326   /* If we want this CONST_DOUBLE in the same mode as it is in memory
2327      (this will always be true for floating CONST_DOUBLEs that have been
2328      placed in memory, but not for VOIDmode (integer) CONST_DOUBLEs),
2329      use the previous copy.  Otherwise, make a new one.  Note that in
2330      the unlikely event that this same CONST_DOUBLE is used in two different
2331      modes in an alternating fashion, we will allocate a lot of different
2332      memory locations, but this should be extremely rare.  */
2333
2334   /* Don't use CONST_DOUBLE_MEM in a nested function.
2335      Nested functions have their own constant pools,
2336      so they can't share the same values in CONST_DOUBLE_MEM
2337      with the containing function.  */
2338   if (outer_function_chain == 0)
2339     if (GET_CODE (x) == CONST_DOUBLE
2340         && GET_CODE (CONST_DOUBLE_MEM (x)) == MEM
2341         && GET_MODE (CONST_DOUBLE_MEM (x)) == mode)
2342       return CONST_DOUBLE_MEM (x);
2343
2344   /* Compute hash code of X.  Search the descriptors for that hash code
2345      to see if any of them describes X.  If yes, the descriptor records
2346      the label number already assigned.  */
2347
2348   hash = const_hash_rtx (mode, x);
2349
2350   for (desc = const_rtx_hash_table[hash]; desc; desc = desc->next)
2351     if (compare_constant_rtx (mode, x, desc))
2352       {
2353         found = desc->label;
2354         break;
2355       }
2356
2357   if (found == 0)
2358     {
2359       register struct pool_constant *pool;
2360       register struct pool_sym *sym;
2361       int align;
2362
2363       /* No constant equal to X is known to have been output.
2364          Make a constant descriptor to enter X in the hash table.
2365          Assign the label number and record it in the descriptor for
2366          future calls to this function to find.  */
2367
2368       desc = record_constant_rtx (mode, x);
2369       desc->next = const_rtx_hash_table[hash];
2370       const_rtx_hash_table[hash] = desc;
2371
2372       /* Align the location counter as required by EXP's data type.  */
2373       align = (mode == VOIDmode) ? UNITS_PER_WORD : GET_MODE_SIZE (mode);
2374       if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2375         align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
2376
2377       pool_offset += align - 1;
2378       pool_offset &= ~ (align - 1);
2379
2380       /* Allocate a pool constant descriptor, fill it in, and chain it in.  */
2381
2382       pool = (struct pool_constant *) oballoc (sizeof (struct pool_constant));
2383       pool->desc = desc;
2384       pool->constant = x;
2385       pool->mode = mode;
2386       pool->labelno = const_labelno;
2387       pool->align = align;
2388       pool->offset = pool_offset;
2389       pool->next = 0;
2390
2391       if (last_pool == 0)
2392         first_pool = pool;
2393       else
2394         last_pool->next = pool;
2395
2396       last_pool = pool;
2397       pool_offset += GET_MODE_SIZE (mode);
2398
2399       /* Create a string containing the label name, in LABEL.  */
2400       ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2401
2402       ++const_labelno;
2403
2404       desc->label = found
2405         = (char *) obstack_copy0 (saveable_obstack, label, strlen (label));
2406
2407       /* Add label to symbol hash table.  */
2408       hash = SYMHASH (found);
2409       sym = (struct pool_sym *) oballoc (sizeof (struct pool_sym));
2410       sym->label = found;
2411       sym->pool = pool;
2412       sym->next = const_rtx_sym_hash_table[hash];
2413       const_rtx_sym_hash_table[hash] = sym;
2414     }
2415
2416   /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
2417
2418   def = gen_rtx (MEM, mode, gen_rtx (SYMBOL_REF, Pmode, found));
2419
2420   RTX_UNCHANGING_P (def) = 1;
2421   /* Mark the symbol_ref as belonging to this constants pool.  */
2422   CONSTANT_POOL_ADDRESS_P (XEXP (def, 0)) = 1;
2423   current_function_uses_const_pool = 1;
2424
2425   if (outer_function_chain == 0)
2426     if (GET_CODE (x) == CONST_DOUBLE)
2427       {
2428         if (CONST_DOUBLE_MEM (x) == cc0_rtx)
2429           {
2430             CONST_DOUBLE_CHAIN (x) = const_double_chain;
2431             const_double_chain = x;
2432           }
2433         CONST_DOUBLE_MEM (x) = def;
2434       }
2435
2436   return def;
2437 }
2438 \f
2439 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
2440    the corresponding pool_constant structure.  */
2441
2442 static struct pool_constant *
2443 find_pool_constant (addr)
2444      rtx addr;
2445 {
2446   struct pool_sym *sym;
2447   char *label = XSTR (addr, 0);
2448
2449   for (sym = const_rtx_sym_hash_table[SYMHASH (label)]; sym; sym = sym->next)
2450     if (sym->label == label)
2451       return sym->pool;
2452
2453   abort ();
2454 }
2455
2456 /* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
2457
2458 rtx
2459 get_pool_constant (addr)
2460      rtx addr;
2461 {
2462   return (find_pool_constant (addr))->constant;
2463 }
2464
2465 /* Similar, return the mode.  */
2466
2467 enum machine_mode
2468 get_pool_mode (addr)
2469      rtx addr;
2470 {
2471   return (find_pool_constant (addr))->mode;
2472 }
2473
2474 /* Similar, return the offset in the constant pool.  */
2475
2476 int
2477 get_pool_offset (addr)
2478      rtx addr;
2479 {
2480   return (find_pool_constant (addr))->offset;
2481 }
2482
2483 /* Return the size of the constant pool.  */
2484
2485 int
2486 get_pool_size ()
2487 {
2488   return pool_offset;
2489 }
2490 \f
2491 /* Write all the constants in the constant pool.  */
2492
2493 void
2494 output_constant_pool (fnname, fndecl)
2495      char *fnname;
2496      tree fndecl;
2497 {
2498   struct pool_constant *pool;
2499   rtx x;
2500   union real_extract u;
2501
2502 #ifdef ASM_OUTPUT_POOL_PROLOGUE
2503   ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
2504 #endif
2505
2506   for (pool = first_pool; pool; pool = pool->next)
2507     {
2508       x = pool->constant;
2509
2510       /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
2511          whose CODE_LABEL has been deleted.  This can occur if a jump table
2512          is eliminated by optimization.  If so, write a constant of zero
2513          instead.  Note that this can also happen by turning the
2514          CODE_LABEL into a NOTE.  */
2515       if (((GET_CODE (x) == LABEL_REF
2516             && (INSN_DELETED_P (XEXP (x, 0))
2517                 || GET_CODE (XEXP (x, 0)) == NOTE)))
2518           || (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
2519               && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF
2520               && (INSN_DELETED_P (XEXP (XEXP (XEXP (x, 0), 0), 0))
2521                   || GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == NOTE)))
2522         x = const0_rtx;
2523
2524       /* First switch to correct section.  */
2525 #ifdef SELECT_RTX_SECTION
2526       SELECT_RTX_SECTION (pool->mode, x);
2527 #else
2528       readonly_data_section ();
2529 #endif
2530
2531 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
2532       ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
2533                                      pool->align, pool->labelno, done);
2534 #endif
2535
2536       if (pool->align > 1)
2537         ASM_OUTPUT_ALIGN (asm_out_file, exact_log2 (pool->align));
2538
2539       /* Output the label.  */
2540       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
2541
2542       /* Output the value of the constant itself.  */
2543       switch (GET_MODE_CLASS (pool->mode))
2544         {
2545         case MODE_FLOAT:
2546           if (GET_CODE (x) != CONST_DOUBLE)
2547             abort ();
2548
2549           bcopy (&CONST_DOUBLE_LOW (x), &u, sizeof u);
2550           assemble_real (u.d, pool->mode);
2551           break;
2552
2553         case MODE_INT:
2554           assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);
2555           break;
2556
2557         default:
2558           abort ();
2559         }
2560
2561     done: ;
2562     }
2563
2564   /* Done with this pool.  */
2565   first_pool = last_pool = 0;
2566 }
2567 \f
2568 /* Find all the constants whose addresses are referenced inside of EXP,
2569    and make sure assembler code with a label has been output for each one.
2570    Indicate whether an ADDR_EXPR has been encountered.  */
2571
2572 int
2573 output_addressed_constants (exp)
2574      tree exp;
2575 {
2576   int reloc = 0;
2577
2578   switch (TREE_CODE (exp))
2579     {
2580     case ADDR_EXPR:
2581       {
2582         register tree constant = TREE_OPERAND (exp, 0);
2583
2584         while (TREE_CODE (constant) == COMPONENT_REF)
2585           {
2586             constant = TREE_OPERAND (constant, 0);
2587           }
2588
2589         if (TREE_CODE_CLASS (TREE_CODE (constant)) == 'c'
2590             || TREE_CODE (constant) == CONSTRUCTOR)
2591           /* No need to do anything here
2592              for addresses of variables or functions.  */
2593           output_constant_def (constant);
2594       }
2595       reloc = 1;
2596       break;
2597
2598     case PLUS_EXPR:
2599     case MINUS_EXPR:
2600       reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
2601       reloc |= output_addressed_constants (TREE_OPERAND (exp, 1));
2602       break;
2603
2604     case NOP_EXPR:
2605     case CONVERT_EXPR:
2606     case NON_LVALUE_EXPR:
2607       reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
2608       break;
2609
2610     case CONSTRUCTOR:
2611       {
2612         register tree link;
2613         for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2614           if (TREE_VALUE (link) != 0)
2615             reloc |= output_addressed_constants (TREE_VALUE (link));
2616       }
2617       break;
2618
2619     case ERROR_MARK:
2620       break;
2621     }
2622   return reloc;
2623 }
2624 \f
2625 /* Output assembler code for constant EXP to FILE, with no label.
2626    This includes the pseudo-op such as ".int" or ".byte", and a newline.
2627    Assumes output_addressed_constants has been done on EXP already.
2628
2629    Generate exactly SIZE bytes of assembler data, padding at the end
2630    with zeros if necessary.  SIZE must always be specified.
2631
2632    SIZE is important for structure constructors,
2633    since trailing members may have been omitted from the constructor.
2634    It is also important for initialization of arrays from string constants
2635    since the full length of the string constant might not be wanted.
2636    It is also needed for initialization of unions, where the initializer's
2637    type is just one member, and that may not be as long as the union.
2638
2639    There a case in which we would fail to output exactly SIZE bytes:
2640    for a structure constructor that wants to produce more than SIZE bytes.
2641    But such constructors will never be generated for any possible input.  */
2642
2643 void
2644 output_constant (exp, size)
2645      register tree exp;
2646      register int size;
2647 {
2648   register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
2649   rtx x;
2650
2651   if (size == 0)
2652     return;
2653
2654   /* Allow a constructor with no elements for any data type.
2655      This means to fill the space with zeros.  */
2656   if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
2657     {
2658       assemble_zeros (size);
2659       return;
2660     }
2661
2662   /* Eliminate the NOP_EXPR that makes a cast not be an lvalue.
2663      That way we get the constant (we hope) inside it.  */
2664   if (TREE_CODE (exp) == NOP_EXPR
2665       && TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0)))
2666     exp = TREE_OPERAND (exp, 0);
2667
2668   switch (code)
2669     {
2670     case INTEGER_TYPE:
2671     case ENUMERAL_TYPE:
2672     case POINTER_TYPE:
2673     case REFERENCE_TYPE:
2674       /* ??? What about       (int)((float)(int)&foo + 4)    */
2675       while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
2676              || TREE_CODE (exp) == NON_LVALUE_EXPR)
2677         exp = TREE_OPERAND (exp, 0);
2678
2679       if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
2680                                            EXPAND_INITIALIZER),
2681                               size, 0))
2682         error ("initializer for integer value is too complicated");
2683       size = 0;
2684       break;
2685
2686     case REAL_TYPE:
2687       if (TREE_CODE (exp) != REAL_CST)
2688         error ("initializer for floating value is not a floating constant");
2689
2690       assemble_real (TREE_REAL_CST (exp),
2691                      mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0));
2692       size = 0;
2693       break;
2694
2695     case COMPLEX_TYPE:
2696       output_constant (TREE_REALPART (exp), size / 2);
2697       output_constant (TREE_IMAGPART (exp), size / 2);
2698       size -= (size / 2) * 2;
2699       break;
2700
2701     case ARRAY_TYPE:
2702       if (TREE_CODE (exp) == CONSTRUCTOR)
2703         {
2704           output_constructor (exp, size);
2705           return;
2706         }
2707       else if (TREE_CODE (exp) == STRING_CST)
2708         {
2709           int excess = 0;
2710
2711           if (size > TREE_STRING_LENGTH (exp))
2712             {
2713               excess = size - TREE_STRING_LENGTH (exp);
2714               size = TREE_STRING_LENGTH (exp);
2715             }
2716
2717           assemble_string (TREE_STRING_POINTER (exp), size);
2718           size = excess;
2719         }
2720       else
2721         abort ();
2722       break;
2723
2724     case RECORD_TYPE:
2725     case UNION_TYPE:
2726       if (TREE_CODE (exp) == CONSTRUCTOR)
2727         output_constructor (exp, size);
2728       else
2729         abort ();
2730       return;
2731     }
2732
2733   if (size > 0)
2734     assemble_zeros (size);
2735 }
2736 \f
2737 /* Subroutine of output_constant, used for CONSTRUCTORs
2738    (aggregate constants).
2739    Generate at least SIZE bytes, padding if necessary.  */
2740
2741 void
2742 output_constructor (exp, size)
2743      tree exp;
2744      int size;
2745 {
2746   register tree link, field = 0;
2747   /* Number of bytes output or skipped so far.
2748      In other words, current position within the constructor.  */
2749   int total_bytes = 0;
2750   /* Non-zero means BYTE contains part of a byte, to be output.  */
2751   int byte_buffer_in_use = 0;
2752   register int byte;
2753
2754   if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
2755     abort ();
2756
2757   if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2758     field = TYPE_FIELDS (TREE_TYPE (exp));
2759
2760   /* As LINK goes through the elements of the constant,
2761      FIELD goes through the structure fields, if the constant is a structure.
2762      if the constant is a union, then we override this,
2763      by getting the field from the TREE_LIST element.
2764      But the constant could also be an array.  Then FIELD is zero.  */
2765   for (link = CONSTRUCTOR_ELTS (exp);
2766        link;
2767        link = TREE_CHAIN (link),
2768        field = field ? TREE_CHAIN (field) : 0)
2769     {
2770       tree val = TREE_VALUE (link);
2771       /* the element in a union constructor specifies the proper field.  */
2772       if (TREE_PURPOSE (link) != 0)
2773         field = TREE_PURPOSE (link);
2774
2775       /* Eliminate the marker that makes a cast not be an lvalue.  */
2776       if (val != 0)
2777         STRIP_NOPS (val);
2778
2779       if (field == 0 || !DECL_BIT_FIELD (field))
2780         {
2781           register int fieldsize;
2782           /* Since this structure is static,
2783              we know the positions are constant.  */
2784           int bitpos = (field ? (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field))
2785                                  / BITS_PER_UNIT)
2786                         : 0);
2787
2788           /* An element that is not a bit-field.
2789              Output any buffered-up bit-fields preceding it.  */
2790           if (byte_buffer_in_use)
2791             {
2792               ASM_OUTPUT_BYTE (asm_out_file, byte);
2793               total_bytes++;
2794               byte_buffer_in_use = 0;
2795             }
2796
2797           /* Advance to offset of this element.
2798              Note no alignment needed in an array, since that is guaranteed
2799              if each element has the proper size.  */
2800           if (field != 0 && bitpos != total_bytes)
2801             {
2802               assemble_zeros (bitpos - total_bytes);
2803               total_bytes = bitpos;
2804             }
2805
2806           /* Determine size this element should occupy.  */
2807           if (field)
2808             {
2809               if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST)
2810                 abort ();
2811               if (TREE_INT_CST_LOW (DECL_SIZE (field)) > 100000)
2812                 {
2813                   /* This avoids overflow trouble.  */
2814                   tree size_tree = size_binop (CEIL_DIV_EXPR,
2815                                                DECL_SIZE (field),
2816                                                size_int (BITS_PER_UNIT));
2817                   fieldsize = TREE_INT_CST_LOW (size_tree);
2818                 }
2819               else
2820                 {
2821                   fieldsize = TREE_INT_CST_LOW (DECL_SIZE (field));
2822                   fieldsize = (fieldsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
2823                 }
2824             }
2825           else
2826             fieldsize = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
2827
2828           /* Output the element's initial value.  */
2829           if (val == 0)
2830             assemble_zeros (fieldsize);
2831           else
2832             output_constant (val, fieldsize);
2833
2834           /* Count its size.  */
2835           total_bytes += fieldsize;
2836         }
2837       else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
2838         error ("invalid initial value for member `%s'",
2839                IDENTIFIER_POINTER (DECL_NAME (field)));
2840       else
2841         {
2842           /* Element that is a bit-field.  */
2843
2844           int next_offset = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
2845           int end_offset
2846             = (next_offset + TREE_INT_CST_LOW (DECL_SIZE (field)));
2847
2848           if (val == 0)
2849             val = integer_zero_node;
2850
2851           /* If this field does not start in this (or, next) byte,
2852              skip some bytes.  */
2853           if (next_offset / BITS_PER_UNIT != total_bytes)
2854             {
2855               /* Output remnant of any bit field in previous bytes.  */
2856               if (byte_buffer_in_use)
2857                 {
2858                   ASM_OUTPUT_BYTE (asm_out_file, byte);
2859                   total_bytes++;
2860                   byte_buffer_in_use = 0;
2861                 }
2862
2863               /* If still not at proper byte, advance to there.  */
2864               if (next_offset / BITS_PER_UNIT != total_bytes)
2865                 {
2866                   assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
2867                   total_bytes = next_offset / BITS_PER_UNIT;
2868                 }
2869             }
2870
2871           if (! byte_buffer_in_use)
2872             byte = 0;
2873
2874           /* We must split the element into pieces that fall within
2875              separate bytes, and combine each byte with previous or
2876              following bit-fields.  */
2877
2878           /* next_offset is the offset n fbits from the beginning of
2879              the structure to the next bit of this element to be processed.
2880              end_offset is the offset of the first bit past the end of
2881              this element.  */
2882           while (next_offset < end_offset)
2883             {
2884               int this_time;
2885               int shift, value;
2886               int next_byte = next_offset / BITS_PER_UNIT;
2887               int next_bit = next_offset % BITS_PER_UNIT;
2888
2889               /* Advance from byte to byte
2890                  within this element when necessary.  */
2891               while (next_byte != total_bytes)
2892                 {
2893                   ASM_OUTPUT_BYTE (asm_out_file, byte);
2894                   total_bytes++;
2895                   byte = 0;
2896                 }
2897
2898               /* Number of bits we can process at once
2899                  (all part of the same byte).  */
2900               this_time = MIN (end_offset - next_offset,
2901                                BITS_PER_UNIT - next_bit);
2902 #if BYTES_BIG_ENDIAN
2903               /* On big-endian machine, take the most significant bits
2904                  first (of the bits that are significant)
2905                  and put them into bytes from the most significant end.  */
2906               shift = end_offset - next_offset - this_time;
2907               /* Don't try to take a bunch of bits that cross
2908                  the word boundary in the INTEGER_CST.  */
2909               if (shift < HOST_BITS_PER_WIDE_INT
2910                   && shift + this_time > HOST_BITS_PER_WIDE_INT)
2911                 {
2912                   this_time -= (HOST_BITS_PER_WIDE_INT - shift);
2913                   shift = HOST_BITS_PER_WIDE_INT;
2914                 }
2915
2916               /* Now get the bits from the appropriate constant word.  */
2917               if (shift < HOST_BITS_PER_WIDE_INT)
2918                 {
2919                   value = TREE_INT_CST_LOW (val);
2920                 }
2921               else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
2922                 {
2923                   value = TREE_INT_CST_HIGH (val);
2924                   shift -= HOST_BITS_PER_WIDE_INT;
2925                 }
2926               else
2927                 abort ();
2928               byte |= (((value >> shift)
2929                         & (((HOST_WIDE_INT) 1 << this_time) - 1))
2930                        << (BITS_PER_UNIT - this_time - next_bit));
2931 #else
2932               /* On little-endian machines,
2933                  take first the least significant bits of the value
2934                  and pack them starting at the least significant
2935                  bits of the bytes.  */
2936               shift = (next_offset
2937                        - TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)));
2938               /* Don't try to take a bunch of bits that cross
2939                  the word boundary in the INTEGER_CST.  */
2940               if (shift < HOST_BITS_PER_WIDE_INT
2941                   && shift + this_time > HOST_BITS_PER_WIDE_INT)
2942                 {
2943                   this_time -= (HOST_BITS_PER_WIDE_INT - shift);
2944                   shift = HOST_BITS_PER_WIDE_INT;
2945                 }
2946
2947               /* Now get the bits from the appropriate constant word.  */
2948               if (shift < HOST_BITS_PER_INT)
2949                 value = TREE_INT_CST_LOW (val);
2950               else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
2951                 {
2952                   value = TREE_INT_CST_HIGH (val);
2953                   shift -= HOST_BITS_PER_WIDE_INT;
2954                 }
2955               else
2956                 abort ();
2957               byte |= ((value >> shift)
2958                        & (((HOST_WIDE_INT) 1 << this_time) - 1)) << next_bit;
2959 #endif
2960               next_offset += this_time;
2961               byte_buffer_in_use = 1;
2962             }
2963         }
2964     }
2965   if (byte_buffer_in_use)
2966     {
2967       ASM_OUTPUT_BYTE (asm_out_file, byte);
2968       total_bytes++;
2969     }
2970   if (total_bytes < size)
2971     assemble_zeros (size - total_bytes);
2972 }