OSDN Git Service

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