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