OSDN Git Service

(output_constant): Handle CHAR_TYPE and BOOLEAN_TYPE like INTEGER_TYPE.
[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   /* By default, put trampoline templates in read-only data section.  */
1075
1076 #ifdef TRAMPOLINE_SECTION
1077   TRAMPOLINE_SECTION ();
1078 #else
1079   readonly_data_section ();
1080 #endif
1081
1082   /* Write the assembler code to define one.  */
1083   align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1084   if (align > 0)
1085     ASM_OUTPUT_ALIGN (asm_out_file, align);
1086
1087   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LTRAMP", 0);
1088   TRAMPOLINE_TEMPLATE (asm_out_file);
1089
1090   /* Record the rtl to refer to it.  */
1091   ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1092   name
1093     = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
1094   return gen_rtx (SYMBOL_REF, Pmode, name);
1095 }
1096 \f
1097 /* Assemble the integer constant X into an object of SIZE bytes.
1098    X must be either a CONST_INT or CONST_DOUBLE.
1099
1100    Return 1 if we were able to output the constant, otherwise 0.  If FORCE is
1101    non-zero, abort if we can't output the constant.  */
1102
1103 int
1104 assemble_integer (x, size, force)
1105      rtx x;
1106      int size;
1107      int force;
1108 {
1109   /* First try to use the standard 1, 2, 4, 8, and 16 byte
1110      ASM_OUTPUT... macros. */
1111
1112   switch (size)
1113     {
1114 #ifdef ASM_OUTPUT_CHAR
1115     case 1:
1116       ASM_OUTPUT_CHAR (asm_out_file, x);
1117       return 1;
1118 #endif
1119
1120 #ifdef ASM_OUTPUT_SHORT
1121     case 2:
1122       ASM_OUTPUT_SHORT (asm_out_file, x);
1123       return 1;
1124 #endif
1125
1126 #ifdef ASM_OUTPUT_INT
1127     case 4:
1128       ASM_OUTPUT_INT (asm_out_file, x);
1129       return 1;
1130 #endif
1131
1132 #ifdef ASM_OUTPUT_DOUBLE_INT
1133     case 8:
1134       ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
1135       return 1;
1136 #endif
1137
1138 #ifdef ASM_OUTPUT_QUADRUPLE_INT
1139     case 16:
1140       ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
1141       return 1;
1142 #endif
1143     }
1144
1145   /* If we couldn't do it that way, there are two other possibilities: First,
1146      if the machine can output an explicit byte and this is a 1 byte constant,
1147      we can use ASM_OUTPUT_BYTE.  */
1148
1149 #ifdef ASM_OUTPUT_BYTE
1150   if (size == 1 && GET_CODE (x) == CONST_INT)
1151     {
1152       ASM_OUTPUT_BYTE (asm_out_file, INTVAL (x));
1153       return 1;
1154     }
1155 #endif
1156
1157   /* Finally, if SIZE is larger than a single word, try to output the constant
1158      one word at a time.  */
1159
1160   if (size > UNITS_PER_WORD)
1161     {
1162       int i;
1163       enum machine_mode mode
1164         = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1165       rtx word;
1166
1167       for (i = 0; i < size / UNITS_PER_WORD; i++)
1168         {
1169           word = operand_subword (x, i, 0, mode);
1170
1171           if (word == 0)
1172             break;
1173
1174           if (! assemble_integer (word, UNITS_PER_WORD, 0))
1175             break;
1176         }
1177
1178       if (i == size / UNITS_PER_WORD)
1179         return 1;
1180       /* If we output at least one word and then could not finish,
1181          there is no valid way to continue.  */
1182       if (i > 0)
1183         abort ();
1184     }
1185
1186   if (force)
1187     abort ();
1188
1189   return 0;
1190 }
1191 \f
1192 /* Assemble the floating-point constant D into an object of size MODE.  */
1193
1194 void
1195 assemble_real (d, mode)
1196      REAL_VALUE_TYPE d;
1197      enum machine_mode mode;
1198 {
1199   jmp_buf output_constant_handler;
1200
1201   if (setjmp (output_constant_handler))
1202     {
1203       error ("floating point trap outputting a constant");
1204 #ifdef REAL_IS_NOT_DOUBLE
1205       bzero (&d, sizeof d);
1206       d = dconst0;
1207 #else
1208       d = 0;
1209 #endif
1210     }
1211
1212   set_float_handler (output_constant_handler);
1213
1214   switch (mode)
1215     {
1216 #ifdef ASM_OUTPUT_BYTE_FLOAT
1217     case QFmode:
1218       ASM_OUTPUT_BYTE_FLOAT (asm_out_file, d);
1219       break;
1220 #endif
1221 #ifdef ASM_OUTPUT_SHORT_FLOAT
1222     case HFmode:
1223       ASM_OUTPUT_SHORT_FLOAT (asm_out_file, d);
1224       break;
1225 #endif
1226 #ifdef ASM_OUTPUT_FLOAT
1227     case SFmode:
1228       ASM_OUTPUT_FLOAT (asm_out_file, d);
1229       break;
1230 #endif
1231
1232 #ifdef ASM_OUTPUT_DOUBLE
1233     case DFmode:
1234       ASM_OUTPUT_DOUBLE (asm_out_file, d);
1235       break;
1236 #endif
1237
1238 #ifdef ASM_OUTPUT_LONG_DOUBLE
1239     case TFmode:
1240       ASM_OUTPUT_LONG_DOUBLE (asm_out_file, d);
1241       break;
1242 #endif
1243
1244     default:
1245       abort ();
1246     }
1247
1248   set_float_handler (NULL_PTR);
1249 }
1250 \f
1251 /* Here we combine duplicate floating constants to make
1252    CONST_DOUBLE rtx's, and force those out to memory when necessary.  */
1253
1254 /* Chain of all CONST_DOUBLE rtx's constructed for the current function.
1255    They are chained through the CONST_DOUBLE_CHAIN.
1256    A CONST_DOUBLE rtx has CONST_DOUBLE_MEM != cc0_rtx iff it is on this chain.
1257    In that case, CONST_DOUBLE_MEM is either a MEM,
1258    or const0_rtx if no MEM has been made for this CONST_DOUBLE yet.
1259
1260    (CONST_DOUBLE_MEM is used only for top-level functions.
1261    See force_const_mem for explanation.)  */
1262
1263 static rtx const_double_chain;
1264
1265 /* Return a CONST_DOUBLE for a value specified as a pair of ints.
1266    For an integer, I0 is the low-order word and I1 is the high-order word.
1267    For a real number, I0 is the word with the low address
1268    and I1 is the word with the high address.  */
1269
1270 rtx
1271 immed_double_const (i0, i1, mode)
1272      HOST_WIDE_INT i0, i1;
1273      enum machine_mode mode;
1274 {
1275   register rtx r;
1276   int in_current_obstack;
1277
1278   if (GET_MODE_CLASS (mode) == MODE_INT)
1279     {
1280       /* We clear out all bits that don't belong in MODE, unless they and our
1281          sign bit are all one.  So we get either a reasonable negative value
1282          or a reasonable unsigned value for this mode.  */
1283       int width = GET_MODE_BITSIZE (mode);
1284       if (width < HOST_BITS_PER_WIDE_INT
1285           && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
1286               != ((HOST_WIDE_INT) (-1) << (width - 1))))
1287         i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
1288       else if (width == HOST_BITS_PER_WIDE_INT
1289                && ! (i1 == ~0 && i0 < 0))
1290         i1 = 0;
1291       else if (width > 2 * HOST_BITS_PER_WIDE_INT)
1292         /* We cannot represent this value as a constant.  */
1293         abort ();
1294
1295       /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a CONST_INT.
1296
1297          ??? Strictly speaking, this is wrong if we create a CONST_INT
1298          for a large unsigned constant with the size of MODE being
1299          HOST_BITS_PER_WIDE_INT and later try to interpret that constant in a
1300          wider mode.  In that case we will mis-interpret it as a negative
1301          number.
1302
1303          Unfortunately, the only alternative is to make a CONST_DOUBLE
1304          for any constant in any mode if it is an unsigned constant larger
1305          than the maximum signed integer in an int on the host.  However,
1306          doing this will break everyone that always expects to see a CONST_INT
1307          for SImode and smaller.
1308
1309          We have always been making CONST_INTs in this case, so nothing new
1310          is being broken.  */
1311
1312       if (width <= HOST_BITS_PER_WIDE_INT)
1313         i1 = (i0 < 0) ? ~0 : 0;
1314
1315       /* If this integer fits in one word, return a CONST_INT.  */
1316       if ((i1 == 0 && i0 >= 0)
1317           || (i1 == ~0 && i0 < 0))
1318         return GEN_INT (i0);
1319
1320       /* We use VOIDmode for integers.  */
1321       mode = VOIDmode;
1322     }
1323
1324   /* Search the chain for an existing CONST_DOUBLE with the right value.
1325      If one is found, return it.  */
1326
1327   for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
1328     if (CONST_DOUBLE_LOW (r) == i0 && CONST_DOUBLE_HIGH (r) == i1
1329         && GET_MODE (r) == mode)
1330       return r;
1331
1332   /* No; make a new one and add it to the chain.
1333
1334      We may be called by an optimizer which may be discarding any memory
1335      allocated during its processing (such as combine and loop).  However,
1336      we will be leaving this constant on the chain, so we cannot tolerate
1337      freed memory.  So switch to saveable_obstack for this allocation
1338      and then switch back if we were in current_obstack.  */
1339
1340   in_current_obstack = rtl_in_saveable_obstack ();
1341   r = gen_rtx (CONST_DOUBLE, mode, 0, i0, i1);
1342   if (in_current_obstack)
1343     rtl_in_current_obstack ();
1344
1345   /* Don't touch const_double_chain in nested function;
1346      see force_const_mem.  */
1347   if (outer_function_chain == 0)
1348     {
1349       CONST_DOUBLE_CHAIN (r) = const_double_chain;
1350       const_double_chain = r;
1351     }
1352
1353   /* Store const0_rtx in mem-slot since this CONST_DOUBLE is on the chain.
1354      Actual use of mem-slot is only through force_const_mem.  */
1355
1356   CONST_DOUBLE_MEM (r) = const0_rtx;
1357
1358   return r;
1359 }
1360
1361 /* Return a CONST_DOUBLE for a specified `double' value
1362    and machine mode.  */
1363
1364 rtx
1365 immed_real_const_1 (d, mode)
1366      REAL_VALUE_TYPE d;
1367      enum machine_mode mode;
1368 {
1369   union real_extract u;
1370   register rtx r;
1371   int in_current_obstack;
1372
1373   /* Get the desired `double' value as a sequence of ints
1374      since that is how they are stored in a CONST_DOUBLE.  */
1375
1376   u.d = d;
1377
1378   /* Detect special cases.  */
1379
1380   /* Avoid REAL_VALUES_EQUAL here in order to distinguish minus zero.  */
1381   if (!bcmp (&dconst0, &d, sizeof d))
1382     return CONST0_RTX (mode);
1383   else if (REAL_VALUES_EQUAL (dconst1, d))
1384     return CONST1_RTX (mode);
1385
1386   if (sizeof u == 2 * sizeof (HOST_WIDE_INT))
1387     return immed_double_const (u.i[0], u.i[1], mode);
1388
1389   /* The rest of this function handles the case where
1390      a float value requires more than 2 ints of space.
1391      It will be deleted as dead code on machines that don't need it.  */
1392
1393   /* Search the chain for an existing CONST_DOUBLE with the right value.
1394      If one is found, return it.  */
1395
1396   for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
1397     if (! bcmp (&CONST_DOUBLE_LOW (r), &u, sizeof u)
1398         && GET_MODE (r) == mode)
1399       return r;
1400
1401   /* No; make a new one and add it to the chain.
1402
1403      We may be called by an optimizer which may be discarding any memory
1404      allocated during its processing (such as combine and loop).  However,
1405      we will be leaving this constant on the chain, so we cannot tolerate
1406      freed memory.  So switch to saveable_obstack for this allocation
1407      and then switch back if we were in current_obstack.  */
1408
1409   in_current_obstack = rtl_in_saveable_obstack ();
1410   r = rtx_alloc (CONST_DOUBLE);
1411   PUT_MODE (r, mode);
1412   bcopy (&u, &CONST_DOUBLE_LOW (r), sizeof u);
1413   if (in_current_obstack)
1414     rtl_in_current_obstack ();
1415
1416   /* Don't touch const_double_chain in nested function;
1417      see force_const_mem.  */
1418   if (outer_function_chain == 0)
1419     {
1420       CONST_DOUBLE_CHAIN (r) = const_double_chain;
1421       const_double_chain = r;
1422     }
1423
1424   /* Store const0_rtx in CONST_DOUBLE_MEM since this CONST_DOUBLE is on the
1425      chain, but has not been allocated memory.  Actual use of CONST_DOUBLE_MEM
1426      is only through force_const_mem.  */
1427
1428   CONST_DOUBLE_MEM (r) = const0_rtx;
1429
1430   return r;
1431 }
1432
1433 /* Return a CONST_DOUBLE rtx for a value specified by EXP,
1434    which must be a REAL_CST tree node.  */
1435
1436 rtx
1437 immed_real_const (exp)
1438      tree exp;
1439 {
1440   return immed_real_const_1 (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)));
1441 }
1442
1443 /* At the end of a function, forget the memory-constants
1444    previously made for CONST_DOUBLEs.  Mark them as not on real_constant_chain.
1445    Also clear out real_constant_chain and clear out all the chain-pointers.  */
1446
1447 void
1448 clear_const_double_mem ()
1449 {
1450   register rtx r, next;
1451
1452   /* Don't touch CONST_DOUBLE_MEM for nested functions.
1453      See force_const_mem for explanation.  */
1454   if (outer_function_chain != 0)
1455     return;
1456
1457   for (r = const_double_chain; r; r = next)
1458     {
1459       next = CONST_DOUBLE_CHAIN (r);
1460       CONST_DOUBLE_CHAIN (r) = 0;
1461       CONST_DOUBLE_MEM (r) = cc0_rtx;
1462     }
1463   const_double_chain = 0;
1464 }
1465 \f
1466 /* Given an expression EXP with a constant value,
1467    reduce it to the sum of an assembler symbol and an integer.
1468    Store them both in the structure *VALUE.
1469    Abort if EXP does not reduce.  */
1470
1471 struct addr_const
1472 {
1473   rtx base;
1474   HOST_WIDE_INT offset;
1475 };
1476
1477 static void
1478 decode_addr_const (exp, value)
1479      tree exp;
1480      struct addr_const *value;
1481 {
1482   register tree target = TREE_OPERAND (exp, 0);
1483   register int offset = 0;
1484   register rtx x;
1485
1486   while (1)
1487     {
1488       if (TREE_CODE (target) == COMPONENT_REF
1489           && (TREE_CODE (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1)))
1490               == INTEGER_CST))
1491         {
1492           offset += TREE_INT_CST_LOW (DECL_FIELD_BITPOS (TREE_OPERAND (target, 1))) / BITS_PER_UNIT;
1493           target = TREE_OPERAND (target, 0);
1494         }
1495       else if (TREE_CODE (target) == ARRAY_REF)
1496         {
1497           if (TREE_CODE (TREE_OPERAND (target, 1)) != INTEGER_CST
1498               || TREE_CODE (TYPE_SIZE (TREE_TYPE (target))) != INTEGER_CST)
1499             abort ();
1500           offset += ((TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (target)))
1501                       * TREE_INT_CST_LOW (TREE_OPERAND (target, 1)))
1502                      / BITS_PER_UNIT);
1503           target = TREE_OPERAND (target, 0);
1504         }
1505       else
1506         break;
1507     }
1508
1509   switch (TREE_CODE (target))
1510     {
1511     case VAR_DECL:
1512     case FUNCTION_DECL:
1513       x = DECL_RTL (target);
1514       break;
1515
1516     case LABEL_DECL:
1517       x = gen_rtx (MEM, FUNCTION_MODE,
1518                    gen_rtx (LABEL_REF, VOIDmode,
1519                             label_rtx (TREE_OPERAND (exp, 0))));
1520       break;
1521
1522     case REAL_CST:
1523     case STRING_CST:
1524     case COMPLEX_CST:
1525     case CONSTRUCTOR:
1526       x = TREE_CST_RTL (target);
1527       break;
1528
1529     default:
1530       abort ();
1531     }
1532
1533   if (GET_CODE (x) != MEM)
1534     abort ();
1535   x = XEXP (x, 0);
1536
1537   value->base = x;
1538   value->offset = offset;
1539 }
1540 \f
1541 /* Uniquize all constants that appear in memory.
1542    Each constant in memory thus far output is recorded
1543    in `const_hash_table' with a `struct constant_descriptor'
1544    that contains a polish representation of the value of
1545    the constant.
1546
1547    We cannot store the trees in the hash table
1548    because the trees may be temporary.  */
1549
1550 struct constant_descriptor
1551 {
1552   struct constant_descriptor *next;
1553   char *label;
1554   char contents[1];
1555 };
1556
1557 #define HASHBITS 30
1558 #define MAX_HASH_TABLE 1009
1559 static struct constant_descriptor *const_hash_table[MAX_HASH_TABLE];
1560
1561 /* Compute a hash code for a constant expression.  */
1562
1563 int
1564 const_hash (exp)
1565      tree exp;
1566 {
1567   register char *p;
1568   register int len, hi, i;
1569   register enum tree_code code = TREE_CODE (exp);
1570
1571   if (code == INTEGER_CST)
1572     {
1573       p = (char *) &TREE_INT_CST_LOW (exp);
1574       len = 2 * sizeof TREE_INT_CST_LOW (exp);
1575     }
1576   else if (code == REAL_CST)
1577     {
1578       p = (char *) &TREE_REAL_CST (exp);
1579       len = sizeof TREE_REAL_CST (exp);
1580     }
1581   else if (code == STRING_CST)
1582     p = TREE_STRING_POINTER (exp), len = TREE_STRING_LENGTH (exp);
1583   else if (code == COMPLEX_CST)
1584     return const_hash (TREE_REALPART (exp)) * 5
1585       + const_hash (TREE_IMAGPART (exp));
1586   else if (code == CONSTRUCTOR)
1587     {
1588       register tree link;
1589
1590       /* For record type, include the type in the hashing.
1591          We do not do so for array types
1592          because (1) the sizes of the elements are sufficient
1593          and (2) distinct array types can have the same constructor.
1594          Instead, we include the array size because the constructor could
1595          be shorter.  */
1596       if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1597         hi = ((HOST_WIDE_INT) TREE_TYPE (exp) & ((1 << HASHBITS) - 1))
1598           % MAX_HASH_TABLE;
1599       else
1600         hi = ((5 + int_size_in_bytes (TREE_TYPE (exp)))
1601                & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
1602
1603       for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
1604         if (TREE_VALUE (link))
1605           hi = (hi * 603 + const_hash (TREE_VALUE (link))) % MAX_HASH_TABLE;
1606
1607       return hi;
1608     }
1609   else if (code == ADDR_EXPR)
1610     {
1611       struct addr_const value;
1612       decode_addr_const (exp, &value);
1613       if (GET_CODE (value.base) == SYMBOL_REF)
1614         {
1615           /* Don't hash the address of the SYMBOL_REF;
1616              only use the offset and the symbol name.  */
1617           hi = value.offset;
1618           p = XSTR (value.base, 0);
1619           for (i = 0; p[i] != 0; i++)
1620             hi = ((hi * 613) + (unsigned)(p[i]));
1621         }
1622       else if (GET_CODE (value.base) == LABEL_REF)
1623         hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
1624
1625       hi &= (1 << HASHBITS) - 1;
1626       hi %= MAX_HASH_TABLE;
1627       return hi;
1628     }
1629   else if (code == PLUS_EXPR || code == MINUS_EXPR)
1630     return const_hash (TREE_OPERAND (exp, 0)) * 9
1631       +  const_hash (TREE_OPERAND (exp, 1));
1632   else if (code == NOP_EXPR || code == CONVERT_EXPR)
1633     return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
1634
1635   /* Compute hashing function */
1636   hi = len;
1637   for (i = 0; i < len; i++)
1638     hi = ((hi * 613) + (unsigned)(p[i]));
1639
1640   hi &= (1 << HASHBITS) - 1;
1641   hi %= MAX_HASH_TABLE;
1642   return hi;
1643 }
1644 \f
1645 /* Compare a constant expression EXP with a constant-descriptor DESC.
1646    Return 1 if DESC describes a constant with the same value as EXP.  */
1647
1648 static int
1649 compare_constant (exp, desc)
1650      tree exp;
1651      struct constant_descriptor *desc;
1652 {
1653   return 0 != compare_constant_1 (exp, desc->contents);
1654 }
1655
1656 /* Compare constant expression EXP with a substring P of a constant descriptor.
1657    If they match, return a pointer to the end of the substring matched.
1658    If they do not match, return 0.
1659
1660    Since descriptors are written in polish prefix notation,
1661    this function can be used recursively to test one operand of EXP
1662    against a subdescriptor, and if it succeeds it returns the
1663    address of the subdescriptor for the next operand.  */
1664
1665 static char *
1666 compare_constant_1 (exp, p)
1667      tree exp;
1668      char *p;
1669 {
1670   register char *strp;
1671   register int len;
1672   register enum tree_code code = TREE_CODE (exp);
1673
1674   if (code != (enum tree_code) *p++)
1675     return 0;
1676
1677   if (code == INTEGER_CST)
1678     {
1679       /* Integer constants are the same only if the same width of type.  */
1680       if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
1681         return 0;
1682       strp = (char *) &TREE_INT_CST_LOW (exp);
1683       len = 2 * sizeof TREE_INT_CST_LOW (exp);
1684     }
1685   else if (code == REAL_CST)
1686     {
1687       /* Real constants are the same only if the same width of type.  */
1688       if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
1689         return 0;
1690       strp = (char *) &TREE_REAL_CST (exp);
1691       len = sizeof TREE_REAL_CST (exp);
1692     }
1693   else if (code == STRING_CST)
1694     {
1695       if (flag_writable_strings)
1696         return 0;
1697       strp = TREE_STRING_POINTER (exp);
1698       len = TREE_STRING_LENGTH (exp);
1699       if (bcmp (&TREE_STRING_LENGTH (exp), p,
1700                 sizeof TREE_STRING_LENGTH (exp)))
1701         return 0;
1702       p += sizeof TREE_STRING_LENGTH (exp);
1703     }
1704   else if (code == COMPLEX_CST)
1705     {
1706       p = compare_constant_1 (TREE_REALPART (exp), p);
1707       if (p == 0) return 0;
1708       p = compare_constant_1 (TREE_IMAGPART (exp), p);
1709       return p;
1710     }
1711   else if (code == CONSTRUCTOR)
1712     {
1713       register tree link;
1714       int length = list_length (CONSTRUCTOR_ELTS (exp));
1715       tree type;
1716
1717       if (bcmp (&length, p, sizeof length))
1718         return 0;
1719       p += sizeof length;
1720
1721       /* For record constructors, insist that the types match.
1722          For arrays, just verify both constructors are for arrays.  */
1723       if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1724         type = TREE_TYPE (exp);
1725       else
1726         type = 0;
1727       if (bcmp (&type, p, sizeof type))
1728         return 0;
1729       p += sizeof type;
1730
1731       /* For arrays, insist that the size in bytes match.  */
1732       if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1733         {
1734           int size = int_size_in_bytes (TREE_TYPE (exp));
1735           if (bcmp (&size, p, sizeof size))
1736             return 0;
1737           p += sizeof size;
1738         }
1739
1740       for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
1741         {
1742           if (TREE_VALUE (link))
1743             {
1744               if ((p = compare_constant_1 (TREE_VALUE (link), p)) == 0)
1745                 return 0;
1746             }
1747           else
1748             {
1749               tree zero = 0;
1750
1751               if (bcmp (&zero, p, sizeof zero))
1752                 return 0;
1753               p += sizeof zero;
1754             }
1755         }
1756
1757       return p;
1758     }
1759   else if (code == ADDR_EXPR)
1760     {
1761       struct addr_const value;
1762       decode_addr_const (exp, &value);
1763       strp = (char *) &value.offset;
1764       len = sizeof value.offset;
1765       /* Compare the offset.  */
1766       while (--len >= 0)
1767         if (*p++ != *strp++)
1768           return 0;
1769       /* Compare symbol name.  */
1770       strp = XSTR (value.base, 0);
1771       len = strlen (strp) + 1;
1772     }
1773   else if (code == PLUS_EXPR || code == MINUS_EXPR)
1774     {
1775       p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
1776       if (p == 0) return 0;
1777       p = compare_constant_1 (TREE_OPERAND (exp, 1), p);
1778       return p;
1779     }
1780   else if (code == NOP_EXPR || code == CONVERT_EXPR)
1781     {
1782       p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
1783       return p;
1784     }
1785
1786   /* Compare constant contents.  */
1787   while (--len >= 0)
1788     if (*p++ != *strp++)
1789       return 0;
1790
1791   return p;
1792 }
1793 \f
1794 /* Construct a constant descriptor for the expression EXP.
1795    It is up to the caller to enter the descriptor in the hash table.  */
1796
1797 static struct constant_descriptor *
1798 record_constant (exp)
1799      tree exp;
1800 {
1801   struct constant_descriptor *ptr = 0;
1802   int buf;
1803
1804   obstack_grow (&permanent_obstack, &ptr, sizeof ptr);
1805   obstack_grow (&permanent_obstack, &buf, sizeof buf);
1806   record_constant_1 (exp);
1807   return (struct constant_descriptor *) obstack_finish (&permanent_obstack);
1808 }
1809
1810 /* Add a description of constant expression EXP
1811    to the object growing in `permanent_obstack'.
1812    No need to return its address; the caller will get that
1813    from the obstack when the object is complete.  */
1814
1815 static void
1816 record_constant_1 (exp)
1817      tree exp;
1818 {
1819   register char *strp;
1820   register int len;
1821   register enum tree_code code = TREE_CODE (exp);
1822
1823   obstack_1grow (&permanent_obstack, (unsigned int) code);
1824
1825   if (code == INTEGER_CST)
1826     {
1827       obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
1828       strp = (char *) &TREE_INT_CST_LOW (exp);
1829       len = 2 * sizeof TREE_INT_CST_LOW (exp);
1830     }
1831   else if (code == REAL_CST)
1832     {
1833       obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
1834       strp = (char *) &TREE_REAL_CST (exp);
1835       len = sizeof TREE_REAL_CST (exp);
1836     }
1837   else if (code == STRING_CST)
1838     {
1839       if (flag_writable_strings)
1840         return;
1841       strp = TREE_STRING_POINTER (exp);
1842       len = TREE_STRING_LENGTH (exp);
1843       obstack_grow (&permanent_obstack, (char *) &TREE_STRING_LENGTH (exp),
1844                     sizeof TREE_STRING_LENGTH (exp));
1845     }
1846   else if (code == COMPLEX_CST)
1847     {
1848       record_constant_1 (TREE_REALPART (exp));
1849       record_constant_1 (TREE_IMAGPART (exp));
1850       return;
1851     }
1852   else if (code == CONSTRUCTOR)
1853     {
1854       register tree link;
1855       int length = list_length (CONSTRUCTOR_ELTS (exp));
1856       tree type;
1857
1858       obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
1859
1860       /* For record constructors, insist that the types match.
1861          For arrays, just verify both constructors are for arrays.  */
1862       if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
1863         type = TREE_TYPE (exp);
1864       else
1865         type = 0;
1866       obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
1867
1868       /* For arrays, insist that the size in bytes match.  */
1869       if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1870         {
1871           int size = int_size_in_bytes (TREE_TYPE (exp));
1872           obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
1873         }
1874
1875       for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
1876         {
1877           if (TREE_VALUE (link))
1878             record_constant_1 (TREE_VALUE (link));
1879           else
1880             {
1881               tree zero = 0;
1882
1883               obstack_grow (&permanent_obstack, (char *) &zero, sizeof zero);
1884             }
1885         }
1886
1887       return;
1888     }
1889   else if (code == ADDR_EXPR)
1890     {
1891       struct addr_const value;
1892       decode_addr_const (exp, &value);
1893       /* Record the offset.  */
1894       obstack_grow (&permanent_obstack,
1895                     (char *) &value.offset, sizeof value.offset);
1896       /* Record the symbol name.  */
1897       obstack_grow (&permanent_obstack, XSTR (value.base, 0),
1898                     strlen (XSTR (value.base, 0)) + 1);
1899       return;
1900     }
1901   else if (code == PLUS_EXPR || code == MINUS_EXPR)
1902     {
1903       record_constant_1 (TREE_OPERAND (exp, 0));
1904       record_constant_1 (TREE_OPERAND (exp, 1));
1905       return;
1906     }
1907   else if (code == NOP_EXPR || code == CONVERT_EXPR)
1908     {
1909       record_constant_1 (TREE_OPERAND (exp, 0));
1910       return;
1911     }
1912
1913   /* Record constant contents.  */
1914   obstack_grow (&permanent_obstack, strp, len);
1915 }
1916 \f
1917 /* Return an rtx representing a reference to constant data in memory
1918    for the constant expression EXP.
1919    If assembler code for such a constant has already been output,
1920    return an rtx to refer to it.
1921    Otherwise, output such a constant in memory and generate
1922    an rtx for it.  The TREE_CST_RTL of EXP is set up to point to that rtx.
1923    The const_hash_table records which constants already have label strings.  */
1924
1925 rtx
1926 output_constant_def (exp)
1927      tree exp;
1928 {
1929   register int hash, align;
1930   register struct constant_descriptor *desc;
1931   char label[256];
1932   char *found = 0;
1933   int reloc;
1934   register rtx def;
1935
1936   if (TREE_CODE (exp) == INTEGER_CST)
1937     abort ();                   /* No TREE_CST_RTL slot in these.  */
1938
1939   if (TREE_CST_RTL (exp))
1940     return TREE_CST_RTL (exp);
1941
1942   /* Make sure any other constants whose addresses appear in EXP
1943      are assigned label numbers.  */
1944
1945   reloc = output_addressed_constants (exp);
1946
1947   /* Compute hash code of EXP.  Search the descriptors for that hash code
1948      to see if any of them describes EXP.  If yes, the descriptor records
1949      the label number already assigned.  */
1950
1951   hash = const_hash (exp) % MAX_HASH_TABLE;
1952
1953   for (desc = const_hash_table[hash]; desc; desc = desc->next)
1954     if (compare_constant (exp, desc))
1955       {
1956         found = desc->label;
1957         break;
1958       }
1959
1960   if (found == 0)
1961     {
1962       /* No constant equal to EXP is known to have been output.
1963          Make a constant descriptor to enter EXP in the hash table.
1964          Assign the label number and record it in the descriptor for
1965          future calls to this function to find.  */
1966
1967       /* Create a string containing the label name, in LABEL.  */
1968       ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
1969
1970       desc = record_constant (exp);
1971       desc->next = const_hash_table[hash];
1972       desc->label
1973         = (char *) obstack_copy0 (&permanent_obstack, label, strlen (label));
1974       const_hash_table[hash] = desc;
1975     }
1976
1977   /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
1978
1979   push_obstacks_nochange ();
1980   if (TREE_PERMANENT (exp))
1981     end_temporary_allocation ();
1982
1983   def = gen_rtx (SYMBOL_REF, Pmode, desc->label);
1984
1985   TREE_CST_RTL (exp)
1986     = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), def);
1987   RTX_UNCHANGING_P (TREE_CST_RTL (exp)) = 1;
1988   if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
1989       || TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
1990     MEM_IN_STRUCT_P (TREE_CST_RTL (exp)) = 1;
1991
1992   pop_obstacks ();
1993
1994   /* Optionally set flags or add text to the name to record information
1995      such as that it is a function name.  If the name is changed, the macro
1996      ASM_OUTPUT_LABELREF will have to know how to strip this information.
1997      And if it finds a * at the beginning after doing so, it must handle
1998      that too.  */
1999 #ifdef ENCODE_SECTION_INFO
2000   ENCODE_SECTION_INFO (exp);
2001 #endif
2002
2003   if (found == 0)
2004     {
2005       /* Now output assembler code to define that label
2006          and follow it with the data of EXP.  */
2007
2008       /* First switch to text section, except for writable strings.  */
2009 #ifdef SELECT_SECTION
2010       SELECT_SECTION (exp, reloc);
2011 #else
2012       if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
2013           || (flag_pic && reloc))
2014         data_section ();
2015       else
2016         readonly_data_section ();
2017 #endif
2018
2019       /* Align the location counter as required by EXP's data type.  */
2020       align = TYPE_ALIGN (TREE_TYPE (exp));
2021 #ifdef CONSTANT_ALIGNMENT
2022       align = CONSTANT_ALIGNMENT (exp, align);
2023 #endif
2024
2025       if (align > BITS_PER_UNIT)
2026         ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2027
2028       /* Output the label itself.  */
2029       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", const_labelno);
2030
2031       /* Output the value of EXP.  */
2032       output_constant (exp,
2033                        (TREE_CODE (exp) == STRING_CST
2034                         ? TREE_STRING_LENGTH (exp)
2035                         : int_size_in_bytes (TREE_TYPE (exp))));
2036
2037       ++const_labelno;
2038     }
2039
2040   return TREE_CST_RTL (exp);
2041 }
2042 \f
2043 /* Similar hash facility for making memory-constants
2044    from constant rtl-expressions.  It is used on RISC machines
2045    where immediate integer arguments and constant addresses are restricted
2046    so that such constants must be stored in memory.
2047
2048    This pool of constants is reinitialized for each function
2049    so each function gets its own constants-pool that comes right before it.
2050
2051    All structures allocated here are discarded when functions are saved for
2052    inlining, so they do not need to be allocated permanently.  */
2053
2054 #define MAX_RTX_HASH_TABLE 61
2055 static struct constant_descriptor **const_rtx_hash_table;
2056
2057 /* Structure to represent sufficient information about a constant so that
2058    it can be output when the constant pool is output, so that function
2059    integration can be done, and to simplify handling on machines that reference
2060    constant pool as base+displacement.  */
2061
2062 struct pool_constant
2063 {
2064   struct constant_descriptor *desc;
2065   struct pool_constant *next;
2066   enum machine_mode mode;
2067   rtx constant;
2068   int labelno;
2069   int align;
2070   int offset;
2071 };
2072
2073 /* Pointers to first and last constant in pool.  */
2074
2075 static struct pool_constant *first_pool, *last_pool;
2076
2077 /* Current offset in constant pool (does not include any machine-specific
2078    header.  */
2079
2080 static int pool_offset;
2081
2082 /* Structure used to maintain hash table mapping symbols used to their
2083    corresponding constants.  */
2084
2085 struct pool_sym
2086 {
2087   char *label;
2088   struct pool_constant *pool;
2089   struct pool_sym *next;
2090 };
2091
2092 static struct pool_sym **const_rtx_sym_hash_table;
2093
2094 /* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
2095    The argument is XSTR (... , 0)  */
2096
2097 #define SYMHASH(LABEL)  \
2098   ((((HOST_WIDE_INT) (LABEL)) & ((1 << HASHBITS) - 1))  % MAX_RTX_HASH_TABLE)
2099 \f
2100 /* Initialize constant pool hashing for next function.  */
2101
2102 void
2103 init_const_rtx_hash_table ()
2104 {
2105   const_rtx_hash_table
2106     = ((struct constant_descriptor **)
2107        oballoc (MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *)));
2108   const_rtx_sym_hash_table
2109     = ((struct pool_sym **)
2110        oballoc (MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *)));
2111   bzero (const_rtx_hash_table,
2112          MAX_RTX_HASH_TABLE * sizeof (struct constant_descriptor *));
2113   bzero (const_rtx_sym_hash_table,
2114          MAX_RTX_HASH_TABLE * sizeof (struct pool_sym *));
2115
2116   first_pool = last_pool = 0;
2117   pool_offset = 0;
2118 }
2119
2120 /* Save and restore it for a nested function.  */
2121
2122 void
2123 save_varasm_status (p)
2124      struct function *p;
2125 {
2126   p->const_rtx_hash_table = const_rtx_hash_table;
2127   p->const_rtx_sym_hash_table = const_rtx_sym_hash_table;
2128   p->first_pool = first_pool;
2129   p->last_pool = last_pool;
2130   p->pool_offset = pool_offset;
2131 }
2132
2133 void
2134 restore_varasm_status (p)
2135      struct function *p;
2136 {
2137   const_rtx_hash_table = p->const_rtx_hash_table;
2138   const_rtx_sym_hash_table = p->const_rtx_sym_hash_table;
2139   first_pool = p->first_pool;
2140   last_pool = p->last_pool;
2141   pool_offset = p->pool_offset;
2142 }
2143 \f
2144 enum kind { RTX_DOUBLE, RTX_INT };
2145
2146 struct rtx_const
2147 {
2148 #ifdef ONLY_INT_FIELDS
2149   unsigned int kind : 16;
2150   unsigned int mode : 16;
2151 #else
2152   enum kind kind : 16;
2153   enum machine_mode mode : 16;
2154 #endif
2155   union {
2156     union real_extract du;
2157     struct addr_const addr;
2158   } un;
2159 };
2160
2161 /* Express an rtx for a constant integer (perhaps symbolic)
2162    as the sum of a symbol or label plus an explicit integer.
2163    They are stored into VALUE.  */
2164
2165 static void
2166 decode_rtx_const (mode, x, value)
2167      enum machine_mode mode;
2168      rtx x;
2169      struct rtx_const *value;
2170 {
2171   /* Clear the whole structure, including any gaps.  */
2172
2173   {
2174     int *p = (int *) value;
2175     int *end = (int *) (value + 1);
2176     while (p < end)
2177       *p++ = 0;
2178   }
2179
2180   value->kind = RTX_INT;        /* Most usual kind. */
2181   value->mode = mode;
2182
2183   switch (GET_CODE (x))
2184     {
2185     case CONST_DOUBLE:
2186       value->kind = RTX_DOUBLE;
2187       value->mode = GET_MODE (x);
2188       bcopy (&CONST_DOUBLE_LOW (x), &value->un.du, sizeof value->un.du);
2189       break;
2190
2191     case CONST_INT:
2192       value->un.addr.offset = INTVAL (x);
2193       break;
2194
2195     case SYMBOL_REF:
2196     case LABEL_REF:
2197     case PC:
2198       value->un.addr.base = x;
2199       break;
2200
2201     case CONST:
2202       x = XEXP (x, 0);
2203       if (GET_CODE (x) == PLUS)
2204         {
2205           value->un.addr.base = XEXP (x, 0);
2206           if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2207             abort ();
2208           value->un.addr.offset = INTVAL (XEXP (x, 1));
2209         }
2210       else if (GET_CODE (x) == MINUS)
2211         {
2212           value->un.addr.base = XEXP (x, 0);
2213           if (GET_CODE (XEXP (x, 1)) != CONST_INT)
2214             abort ();
2215           value->un.addr.offset = - INTVAL (XEXP (x, 1));
2216         }
2217       else
2218         abort ();
2219       break;
2220
2221     default:
2222       abort ();
2223     }
2224
2225   if (value->kind == RTX_INT && value->un.addr.base != 0)
2226     switch (GET_CODE (value->un.addr.base))
2227       {
2228       case SYMBOL_REF:
2229       case LABEL_REF:
2230         /* Use the string's address, not the SYMBOL_REF's address,
2231            for the sake of addresses of library routines.
2232            For a LABEL_REF, compare labels.  */
2233         value->un.addr.base = XEXP (value->un.addr.base, 0);
2234       }
2235 }
2236
2237 /* Given a MINUS expression, simplify it if both sides
2238    include the same symbol.  */
2239
2240 rtx
2241 simplify_subtraction (x)
2242      rtx x;
2243 {
2244   struct rtx_const val0, val1;
2245
2246   decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
2247   decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
2248
2249   if (val0.un.addr.base == val1.un.addr.base)
2250     return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
2251   return x;
2252 }
2253
2254 /* Compute a hash code for a constant RTL expression.  */
2255
2256 int
2257 const_hash_rtx (mode, x)
2258      enum machine_mode mode;
2259      rtx x;
2260 {
2261   register int hi, i;
2262
2263   struct rtx_const value;
2264   decode_rtx_const (mode, x, &value);
2265
2266   /* Compute hashing function */
2267   hi = 0;
2268   for (i = 0; i < sizeof value / sizeof (int); i++)
2269     hi += ((int *) &value)[i];
2270
2271   hi &= (1 << HASHBITS) - 1;
2272   hi %= MAX_RTX_HASH_TABLE;
2273   return hi;
2274 }
2275
2276 /* Compare a constant rtl object X with a constant-descriptor DESC.
2277    Return 1 if DESC describes a constant with the same value as X.  */
2278
2279 static int
2280 compare_constant_rtx (mode, x, desc)
2281      enum machine_mode mode;
2282      rtx x;
2283      struct constant_descriptor *desc;
2284 {
2285   register int *p = (int *) desc->contents;
2286   register int *strp;
2287   register int len;
2288   struct rtx_const value;
2289
2290   decode_rtx_const (mode, x, &value);
2291   strp = (int *) &value;
2292   len = sizeof value / sizeof (int);
2293
2294   /* Compare constant contents.  */
2295   while (--len >= 0)
2296     if (*p++ != *strp++)
2297       return 0;
2298
2299   return 1;
2300 }
2301
2302 /* Construct a constant descriptor for the rtl-expression X.
2303    It is up to the caller to enter the descriptor in the hash table.  */
2304
2305 static struct constant_descriptor *
2306 record_constant_rtx (mode, x)
2307      enum machine_mode mode;
2308      rtx x;
2309 {
2310   struct constant_descriptor *ptr;
2311   char *label;
2312   struct rtx_const value;
2313
2314   decode_rtx_const (mode, x, &value);
2315
2316   obstack_grow (current_obstack, &ptr, sizeof ptr);
2317   obstack_grow (current_obstack, &label, sizeof label);
2318
2319   /* Record constant contents.  */
2320   obstack_grow (current_obstack, &value, sizeof value);
2321
2322   return (struct constant_descriptor *) obstack_finish (current_obstack);
2323 }
2324 \f
2325 /* Given a constant rtx X, make (or find) a memory constant for its value
2326    and return a MEM rtx to refer to it in memory.  */
2327
2328 rtx
2329 force_const_mem (mode, x)
2330      enum machine_mode mode;
2331      rtx x;
2332 {
2333   register int hash;
2334   register struct constant_descriptor *desc;
2335   char label[256];
2336   char *found = 0;
2337   rtx def;
2338
2339   /* If we want this CONST_DOUBLE in the same mode as it is in memory
2340      (this will always be true for floating CONST_DOUBLEs that have been
2341      placed in memory, but not for VOIDmode (integer) CONST_DOUBLEs),
2342      use the previous copy.  Otherwise, make a new one.  Note that in
2343      the unlikely event that this same CONST_DOUBLE is used in two different
2344      modes in an alternating fashion, we will allocate a lot of different
2345      memory locations, but this should be extremely rare.  */
2346
2347   /* Don't use CONST_DOUBLE_MEM in a nested function.
2348      Nested functions have their own constant pools,
2349      so they can't share the same values in CONST_DOUBLE_MEM
2350      with the containing function.  */
2351   if (outer_function_chain == 0)
2352     if (GET_CODE (x) == CONST_DOUBLE
2353         && GET_CODE (CONST_DOUBLE_MEM (x)) == MEM
2354         && GET_MODE (CONST_DOUBLE_MEM (x)) == mode)
2355       return CONST_DOUBLE_MEM (x);
2356
2357   /* Compute hash code of X.  Search the descriptors for that hash code
2358      to see if any of them describes X.  If yes, the descriptor records
2359      the label number already assigned.  */
2360
2361   hash = const_hash_rtx (mode, x);
2362
2363   for (desc = const_rtx_hash_table[hash]; desc; desc = desc->next)
2364     if (compare_constant_rtx (mode, x, desc))
2365       {
2366         found = desc->label;
2367         break;
2368       }
2369
2370   if (found == 0)
2371     {
2372       register struct pool_constant *pool;
2373       register struct pool_sym *sym;
2374       int align;
2375
2376       /* No constant equal to X is known to have been output.
2377          Make a constant descriptor to enter X in the hash table.
2378          Assign the label number and record it in the descriptor for
2379          future calls to this function to find.  */
2380
2381       desc = record_constant_rtx (mode, x);
2382       desc->next = const_rtx_hash_table[hash];
2383       const_rtx_hash_table[hash] = desc;
2384
2385       /* Align the location counter as required by EXP's data type.  */
2386       align = (mode == VOIDmode) ? UNITS_PER_WORD : GET_MODE_SIZE (mode);
2387       if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2388         align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
2389
2390       pool_offset += align - 1;
2391       pool_offset &= ~ (align - 1);
2392
2393       /* Allocate a pool constant descriptor, fill it in, and chain it in.  */
2394
2395       pool = (struct pool_constant *) oballoc (sizeof (struct pool_constant));
2396       pool->desc = desc;
2397       pool->constant = x;
2398       pool->mode = mode;
2399       pool->labelno = const_labelno;
2400       pool->align = align;
2401       pool->offset = pool_offset;
2402       pool->next = 0;
2403
2404       if (last_pool == 0)
2405         first_pool = pool;
2406       else
2407         last_pool->next = pool;
2408
2409       last_pool = pool;
2410       pool_offset += GET_MODE_SIZE (mode);
2411
2412       /* Create a string containing the label name, in LABEL.  */
2413       ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2414
2415       ++const_labelno;
2416
2417       desc->label = found
2418         = (char *) obstack_copy0 (saveable_obstack, label, strlen (label));
2419
2420       /* Add label to symbol hash table.  */
2421       hash = SYMHASH (found);
2422       sym = (struct pool_sym *) oballoc (sizeof (struct pool_sym));
2423       sym->label = found;
2424       sym->pool = pool;
2425       sym->next = const_rtx_sym_hash_table[hash];
2426       const_rtx_sym_hash_table[hash] = sym;
2427     }
2428
2429   /* We have a symbol name; construct the SYMBOL_REF and the MEM.  */
2430
2431   def = gen_rtx (MEM, mode, gen_rtx (SYMBOL_REF, Pmode, found));
2432
2433   RTX_UNCHANGING_P (def) = 1;
2434   /* Mark the symbol_ref as belonging to this constants pool.  */
2435   CONSTANT_POOL_ADDRESS_P (XEXP (def, 0)) = 1;
2436   current_function_uses_const_pool = 1;
2437
2438   if (outer_function_chain == 0)
2439     if (GET_CODE (x) == CONST_DOUBLE)
2440       {
2441         if (CONST_DOUBLE_MEM (x) == cc0_rtx)
2442           {
2443             CONST_DOUBLE_CHAIN (x) = const_double_chain;
2444             const_double_chain = x;
2445           }
2446         CONST_DOUBLE_MEM (x) = def;
2447       }
2448
2449   return def;
2450 }
2451 \f
2452 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
2453    the corresponding pool_constant structure.  */
2454
2455 static struct pool_constant *
2456 find_pool_constant (addr)
2457      rtx addr;
2458 {
2459   struct pool_sym *sym;
2460   char *label = XSTR (addr, 0);
2461
2462   for (sym = const_rtx_sym_hash_table[SYMHASH (label)]; sym; sym = sym->next)
2463     if (sym->label == label)
2464       return sym->pool;
2465
2466   abort ();
2467 }
2468
2469 /* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
2470
2471 rtx
2472 get_pool_constant (addr)
2473      rtx addr;
2474 {
2475   return (find_pool_constant (addr))->constant;
2476 }
2477
2478 /* Similar, return the mode.  */
2479
2480 enum machine_mode
2481 get_pool_mode (addr)
2482      rtx addr;
2483 {
2484   return (find_pool_constant (addr))->mode;
2485 }
2486
2487 /* Similar, return the offset in the constant pool.  */
2488
2489 int
2490 get_pool_offset (addr)
2491      rtx addr;
2492 {
2493   return (find_pool_constant (addr))->offset;
2494 }
2495
2496 /* Return the size of the constant pool.  */
2497
2498 int
2499 get_pool_size ()
2500 {
2501   return pool_offset;
2502 }
2503 \f
2504 /* Write all the constants in the constant pool.  */
2505
2506 void
2507 output_constant_pool (fnname, fndecl)
2508      char *fnname;
2509      tree fndecl;
2510 {
2511   struct pool_constant *pool;
2512   rtx x;
2513   union real_extract u;
2514
2515 #ifdef ASM_OUTPUT_POOL_PROLOGUE
2516   ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
2517 #endif
2518
2519   for (pool = first_pool; pool; pool = pool->next)
2520     {
2521       x = pool->constant;
2522
2523       /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
2524          whose CODE_LABEL has been deleted.  This can occur if a jump table
2525          is eliminated by optimization.  If so, write a constant of zero
2526          instead.  Note that this can also happen by turning the
2527          CODE_LABEL into a NOTE.  */
2528       if (((GET_CODE (x) == LABEL_REF
2529             && (INSN_DELETED_P (XEXP (x, 0))
2530                 || GET_CODE (XEXP (x, 0)) == NOTE)))
2531           || (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
2532               && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF
2533               && (INSN_DELETED_P (XEXP (XEXP (XEXP (x, 0), 0), 0))
2534                   || GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == NOTE)))
2535         x = const0_rtx;
2536
2537       /* First switch to correct section.  */
2538 #ifdef SELECT_RTX_SECTION
2539       SELECT_RTX_SECTION (pool->mode, x);
2540 #else
2541       readonly_data_section ();
2542 #endif
2543
2544 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
2545       ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
2546                                      pool->align, pool->labelno, done);
2547 #endif
2548
2549       if (pool->align > 1)
2550         ASM_OUTPUT_ALIGN (asm_out_file, exact_log2 (pool->align));
2551
2552       /* Output the label.  */
2553       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
2554
2555       /* Output the value of the constant itself.  */
2556       switch (GET_MODE_CLASS (pool->mode))
2557         {
2558         case MODE_FLOAT:
2559           if (GET_CODE (x) != CONST_DOUBLE)
2560             abort ();
2561
2562           bcopy (&CONST_DOUBLE_LOW (x), &u, sizeof u);
2563           assemble_real (u.d, pool->mode);
2564           break;
2565
2566         case MODE_INT:
2567           assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);
2568           break;
2569
2570         default:
2571           abort ();
2572         }
2573
2574     done: ;
2575     }
2576
2577   /* Done with this pool.  */
2578   first_pool = last_pool = 0;
2579 }
2580 \f
2581 /* Find all the constants whose addresses are referenced inside of EXP,
2582    and make sure assembler code with a label has been output for each one.
2583    Indicate whether an ADDR_EXPR has been encountered.  */
2584
2585 int
2586 output_addressed_constants (exp)
2587      tree exp;
2588 {
2589   int reloc = 0;
2590
2591   switch (TREE_CODE (exp))
2592     {
2593     case ADDR_EXPR:
2594       {
2595         register tree constant = TREE_OPERAND (exp, 0);
2596
2597         while (TREE_CODE (constant) == COMPONENT_REF)
2598           {
2599             constant = TREE_OPERAND (constant, 0);
2600           }
2601
2602         if (TREE_CODE_CLASS (TREE_CODE (constant)) == 'c'
2603             || TREE_CODE (constant) == CONSTRUCTOR)
2604           /* No need to do anything here
2605              for addresses of variables or functions.  */
2606           output_constant_def (constant);
2607       }
2608       reloc = 1;
2609       break;
2610
2611     case PLUS_EXPR:
2612     case MINUS_EXPR:
2613       reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
2614       reloc |= output_addressed_constants (TREE_OPERAND (exp, 1));
2615       break;
2616
2617     case NOP_EXPR:
2618     case CONVERT_EXPR:
2619     case NON_LVALUE_EXPR:
2620       reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
2621       break;
2622
2623     case CONSTRUCTOR:
2624       {
2625         register tree link;
2626         for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2627           if (TREE_VALUE (link) != 0)
2628             reloc |= output_addressed_constants (TREE_VALUE (link));
2629       }
2630       break;
2631
2632     case ERROR_MARK:
2633       break;
2634     }
2635   return reloc;
2636 }
2637 \f
2638 /* Output assembler code for constant EXP to FILE, with no label.
2639    This includes the pseudo-op such as ".int" or ".byte", and a newline.
2640    Assumes output_addressed_constants has been done on EXP already.
2641
2642    Generate exactly SIZE bytes of assembler data, padding at the end
2643    with zeros if necessary.  SIZE must always be specified.
2644
2645    SIZE is important for structure constructors,
2646    since trailing members may have been omitted from the constructor.
2647    It is also important for initialization of arrays from string constants
2648    since the full length of the string constant might not be wanted.
2649    It is also needed for initialization of unions, where the initializer's
2650    type is just one member, and that may not be as long as the union.
2651
2652    There a case in which we would fail to output exactly SIZE bytes:
2653    for a structure constructor that wants to produce more than SIZE bytes.
2654    But such constructors will never be generated for any possible input.  */
2655
2656 void
2657 output_constant (exp, size)
2658      register tree exp;
2659      register int size;
2660 {
2661   register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
2662   rtx x;
2663
2664   if (size == 0)
2665     return;
2666
2667   /* Allow a constructor with no elements for any data type.
2668      This means to fill the space with zeros.  */
2669   if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
2670     {
2671       assemble_zeros (size);
2672       return;
2673     }
2674
2675   /* Eliminate the NOP_EXPR that makes a cast not be an lvalue.
2676      That way we get the constant (we hope) inside it.  */
2677   if (TREE_CODE (exp) == NOP_EXPR
2678       && TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0)))
2679     exp = TREE_OPERAND (exp, 0);
2680
2681   switch (code)
2682     {
2683     case CHAR_TYPE:
2684     case BOOLEAN_TYPE:
2685     case INTEGER_TYPE:
2686     case ENUMERAL_TYPE:
2687     case POINTER_TYPE:
2688     case REFERENCE_TYPE:
2689       /* ??? What about       (int)((float)(int)&foo + 4)    */
2690       while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
2691              || TREE_CODE (exp) == NON_LVALUE_EXPR)
2692         exp = TREE_OPERAND (exp, 0);
2693
2694       if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
2695                                            EXPAND_INITIALIZER),
2696                               size, 0))
2697         error ("initializer for integer value is too complicated");
2698       size = 0;
2699       break;
2700
2701     case REAL_TYPE:
2702       if (TREE_CODE (exp) != REAL_CST)
2703         error ("initializer for floating value is not a floating constant");
2704
2705       assemble_real (TREE_REAL_CST (exp),
2706                      mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0));
2707       size = 0;
2708       break;
2709
2710     case COMPLEX_TYPE:
2711       output_constant (TREE_REALPART (exp), size / 2);
2712       output_constant (TREE_IMAGPART (exp), size / 2);
2713       size -= (size / 2) * 2;
2714       break;
2715
2716     case ARRAY_TYPE:
2717       if (TREE_CODE (exp) == CONSTRUCTOR)
2718         {
2719           output_constructor (exp, size);
2720           return;
2721         }
2722       else if (TREE_CODE (exp) == STRING_CST)
2723         {
2724           int excess = 0;
2725
2726           if (size > TREE_STRING_LENGTH (exp))
2727             {
2728               excess = size - TREE_STRING_LENGTH (exp);
2729               size = TREE_STRING_LENGTH (exp);
2730             }
2731
2732           assemble_string (TREE_STRING_POINTER (exp), size);
2733           size = excess;
2734         }
2735       else
2736         abort ();
2737       break;
2738
2739     case RECORD_TYPE:
2740     case UNION_TYPE:
2741       if (TREE_CODE (exp) == CONSTRUCTOR)
2742         output_constructor (exp, size);
2743       else
2744         abort ();
2745       return;
2746     }
2747
2748   if (size > 0)
2749     assemble_zeros (size);
2750 }
2751 \f
2752 /* Subroutine of output_constant, used for CONSTRUCTORs
2753    (aggregate constants).
2754    Generate at least SIZE bytes, padding if necessary.  */
2755
2756 void
2757 output_constructor (exp, size)
2758      tree exp;
2759      int size;
2760 {
2761   register tree link, field = 0;
2762   /* Number of bytes output or skipped so far.
2763      In other words, current position within the constructor.  */
2764   int total_bytes = 0;
2765   /* Non-zero means BYTE contains part of a byte, to be output.  */
2766   int byte_buffer_in_use = 0;
2767   register int byte;
2768
2769   if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
2770     abort ();
2771
2772   if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2773     field = TYPE_FIELDS (TREE_TYPE (exp));
2774
2775   /* As LINK goes through the elements of the constant,
2776      FIELD goes through the structure fields, if the constant is a structure.
2777      if the constant is a union, then we override this,
2778      by getting the field from the TREE_LIST element.
2779      But the constant could also be an array.  Then FIELD is zero.  */
2780   for (link = CONSTRUCTOR_ELTS (exp);
2781        link;
2782        link = TREE_CHAIN (link),
2783        field = field ? TREE_CHAIN (field) : 0)
2784     {
2785       tree val = TREE_VALUE (link);
2786       /* the element in a union constructor specifies the proper field.  */
2787       if (TREE_PURPOSE (link) != 0)
2788         field = TREE_PURPOSE (link);
2789
2790       /* Eliminate the marker that makes a cast not be an lvalue.  */
2791       if (val != 0)
2792         STRIP_NOPS (val);
2793
2794       if (field == 0 || !DECL_BIT_FIELD (field))
2795         {
2796           register int fieldsize;
2797           /* Since this structure is static,
2798              we know the positions are constant.  */
2799           int bitpos = (field ? (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field))
2800                                  / BITS_PER_UNIT)
2801                         : 0);
2802
2803           /* An element that is not a bit-field.
2804              Output any buffered-up bit-fields preceding it.  */
2805           if (byte_buffer_in_use)
2806             {
2807               ASM_OUTPUT_BYTE (asm_out_file, byte);
2808               total_bytes++;
2809               byte_buffer_in_use = 0;
2810             }
2811
2812           /* Advance to offset of this element.
2813              Note no alignment needed in an array, since that is guaranteed
2814              if each element has the proper size.  */
2815           if (field != 0 && bitpos != total_bytes)
2816             {
2817               assemble_zeros (bitpos - total_bytes);
2818               total_bytes = bitpos;
2819             }
2820
2821           /* Determine size this element should occupy.  */
2822           if (field)
2823             {
2824               if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST)
2825                 abort ();
2826               if (TREE_INT_CST_LOW (DECL_SIZE (field)) > 100000)
2827                 {
2828                   /* This avoids overflow trouble.  */
2829                   tree size_tree = size_binop (CEIL_DIV_EXPR,
2830                                                DECL_SIZE (field),
2831                                                size_int (BITS_PER_UNIT));
2832                   fieldsize = TREE_INT_CST_LOW (size_tree);
2833                 }
2834               else
2835                 {
2836                   fieldsize = TREE_INT_CST_LOW (DECL_SIZE (field));
2837                   fieldsize = (fieldsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
2838                 }
2839             }
2840           else
2841             fieldsize = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));
2842
2843           /* Output the element's initial value.  */
2844           if (val == 0)
2845             assemble_zeros (fieldsize);
2846           else
2847             output_constant (val, fieldsize);
2848
2849           /* Count its size.  */
2850           total_bytes += fieldsize;
2851         }
2852       else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
2853         error ("invalid initial value for member `%s'",
2854                IDENTIFIER_POINTER (DECL_NAME (field)));
2855       else
2856         {
2857           /* Element that is a bit-field.  */
2858
2859           int next_offset = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
2860           int end_offset
2861             = (next_offset + TREE_INT_CST_LOW (DECL_SIZE (field)));
2862
2863           if (val == 0)
2864             val = integer_zero_node;
2865
2866           /* If this field does not start in this (or, next) byte,
2867              skip some bytes.  */
2868           if (next_offset / BITS_PER_UNIT != total_bytes)
2869             {
2870               /* Output remnant of any bit field in previous bytes.  */
2871               if (byte_buffer_in_use)
2872                 {
2873                   ASM_OUTPUT_BYTE (asm_out_file, byte);
2874                   total_bytes++;
2875                   byte_buffer_in_use = 0;
2876                 }
2877
2878               /* If still not at proper byte, advance to there.  */
2879               if (next_offset / BITS_PER_UNIT != total_bytes)
2880                 {
2881                   assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
2882                   total_bytes = next_offset / BITS_PER_UNIT;
2883                 }
2884             }
2885
2886           if (! byte_buffer_in_use)
2887             byte = 0;
2888
2889           /* We must split the element into pieces that fall within
2890              separate bytes, and combine each byte with previous or
2891              following bit-fields.  */
2892
2893           /* next_offset is the offset n fbits from the beginning of
2894              the structure to the next bit of this element to be processed.
2895              end_offset is the offset of the first bit past the end of
2896              this element.  */
2897           while (next_offset < end_offset)
2898             {
2899               int this_time;
2900               int shift, value;
2901               int next_byte = next_offset / BITS_PER_UNIT;
2902               int next_bit = next_offset % BITS_PER_UNIT;
2903
2904               /* Advance from byte to byte
2905                  within this element when necessary.  */
2906               while (next_byte != total_bytes)
2907                 {
2908                   ASM_OUTPUT_BYTE (asm_out_file, byte);
2909                   total_bytes++;
2910                   byte = 0;
2911                 }
2912
2913               /* Number of bits we can process at once
2914                  (all part of the same byte).  */
2915               this_time = MIN (end_offset - next_offset,
2916                                BITS_PER_UNIT - next_bit);
2917 #if BYTES_BIG_ENDIAN
2918               /* On big-endian machine, take the most significant bits
2919                  first (of the bits that are significant)
2920                  and put them into bytes from the most significant end.  */
2921               shift = end_offset - next_offset - this_time;
2922               /* Don't try to take a bunch of bits that cross
2923                  the word boundary in the INTEGER_CST.  */
2924               if (shift < HOST_BITS_PER_WIDE_INT
2925                   && shift + this_time > HOST_BITS_PER_WIDE_INT)
2926                 {
2927                   this_time -= (HOST_BITS_PER_WIDE_INT - shift);
2928                   shift = HOST_BITS_PER_WIDE_INT;
2929                 }
2930
2931               /* Now get the bits from the appropriate constant word.  */
2932               if (shift < HOST_BITS_PER_WIDE_INT)
2933                 {
2934                   value = TREE_INT_CST_LOW (val);
2935                 }
2936               else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
2937                 {
2938                   value = TREE_INT_CST_HIGH (val);
2939                   shift -= HOST_BITS_PER_WIDE_INT;
2940                 }
2941               else
2942                 abort ();
2943               byte |= (((value >> shift)
2944                         & (((HOST_WIDE_INT) 1 << this_time) - 1))
2945                        << (BITS_PER_UNIT - this_time - next_bit));
2946 #else
2947               /* On little-endian machines,
2948                  take first the least significant bits of the value
2949                  and pack them starting at the least significant
2950                  bits of the bytes.  */
2951               shift = (next_offset
2952                        - TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)));
2953               /* Don't try to take a bunch of bits that cross
2954                  the word boundary in the INTEGER_CST.  */
2955               if (shift < HOST_BITS_PER_WIDE_INT
2956                   && shift + this_time > HOST_BITS_PER_WIDE_INT)
2957                 {
2958                   this_time -= (HOST_BITS_PER_WIDE_INT - shift);
2959                   shift = HOST_BITS_PER_WIDE_INT;
2960                 }
2961
2962               /* Now get the bits from the appropriate constant word.  */
2963               if (shift < HOST_BITS_PER_INT)
2964                 value = TREE_INT_CST_LOW (val);
2965               else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
2966                 {
2967                   value = TREE_INT_CST_HIGH (val);
2968                   shift -= HOST_BITS_PER_WIDE_INT;
2969                 }
2970               else
2971                 abort ();
2972               byte |= ((value >> shift)
2973                        & (((HOST_WIDE_INT) 1 << this_time) - 1)) << next_bit;
2974 #endif
2975               next_offset += this_time;
2976               byte_buffer_in_use = 1;
2977             }
2978         }
2979     }
2980   if (byte_buffer_in_use)
2981     {
2982       ASM_OUTPUT_BYTE (asm_out_file, byte);
2983       total_bytes++;
2984     }
2985   if (total_bytes < size)
2986     assemble_zeros (size - total_bytes);
2987 }