OSDN Git Service

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