OSDN Git Service

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