OSDN Git Service

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