OSDN Git Service

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