varasm.c (force_const_mem): Keep pool alignment in bits.
[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 is. */
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 = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
3517 #ifdef CONSTANT_ALIGNMENT
3518 align = CONSTANT_ALIGNMENT (make_tree (type_for_mode (mode, 0), x),
3519 align);
3520 #endif
3521
3522 pool_offset += (align / BITS_PER_UNIT) - 1;
3523 pool_offset &= ~ ((align / BITS_PER_UNIT) - 1);
3524
3525 if (GET_CODE (x) == LABEL_REF)
3526 LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3527
3528 /* Allocate a pool constant descriptor, fill it in, and chain it in. */
3529
3530 pool = (struct pool_constant *) ggc_alloc (sizeof (struct pool_constant));
3531 pool->desc = desc;
3532 pool->constant = x;
3533 pool->mode = mode;
3534 pool->labelno = const_labelno;
3535 pool->align = align;
3536 pool->offset = pool_offset;
3537 pool->mark = 1;
3538 pool->next = 0;
3539
3540 if (last_pool == 0)
3541 first_pool = pool;
3542 else
3543 last_pool->next = pool;
3544
3545 last_pool = pool;
3546 pool_offset += GET_MODE_SIZE (mode);
3547
3548 /* Create a string containing the label name, in LABEL. */
3549 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3550
3551 ++const_labelno;
3552
3553 desc->label = found = ggc_strdup (label);
3554
3555 /* Add label to symbol hash table. */
3556 hash = SYMHASH (found);
3557 pool->label = found;
3558 pool->next_sym = const_rtx_sym_hash_table[hash];
3559 const_rtx_sym_hash_table[hash] = pool;
3560 }
3561
3562 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
3563
3564 def = gen_rtx_MEM (mode, gen_rtx_SYMBOL_REF (Pmode, found));
3565 set_mem_attributes (def, type_for_mode (mode, 0), 1);
3566 RTX_UNCHANGING_P (def) = 1;
3567
3568 /* Mark the symbol_ref as belonging to this constants pool. */
3569 CONSTANT_POOL_ADDRESS_P (XEXP (def, 0)) = 1;
3570 current_function_uses_const_pool = 1;
3571
3572 if (GET_CODE (x) == CONST_DOUBLE)
3573 {
3574 if (CONST_DOUBLE_MEM (x) == cc0_rtx)
3575 {
3576 CONST_DOUBLE_CHAIN (x) = const_double_chain;
3577 const_double_chain = x;
3578 }
3579 CONST_DOUBLE_MEM (x) = def;
3580 }
3581
3582 return def;
3583 }
3584 \f
3585 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3586 the corresponding pool_constant structure. */
3587
3588 static struct pool_constant *
3589 find_pool_constant (f, addr)
3590 struct function *f;
3591 rtx addr;
3592 {
3593 struct pool_constant *pool;
3594 const char *label = XSTR (addr, 0);
3595
3596 for (pool = f->varasm->x_const_rtx_sym_hash_table[SYMHASH (label)]; pool;
3597 pool = pool->next_sym)
3598 if (pool->label == label)
3599 return pool;
3600
3601 abort ();
3602 }
3603
3604 /* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3605
3606 rtx
3607 get_pool_constant (addr)
3608 rtx addr;
3609 {
3610 return (find_pool_constant (cfun, addr))->constant;
3611 }
3612
3613 /* Likewise, but for the constant pool of a specific function. */
3614
3615 rtx
3616 get_pool_constant_for_function (f, addr)
3617 struct function *f;
3618 rtx addr;
3619 {
3620 return (find_pool_constant (f, addr))->constant;
3621 }
3622
3623 /* Similar, return the mode. */
3624
3625 enum machine_mode
3626 get_pool_mode (addr)
3627 rtx addr;
3628 {
3629 return (find_pool_constant (cfun, addr))->mode;
3630 }
3631
3632 enum machine_mode
3633 get_pool_mode_for_function (f, addr)
3634 struct function *f;
3635 rtx addr;
3636 {
3637 return (find_pool_constant (f, addr))->mode;
3638 }
3639
3640 /* Similar, return the offset in the constant pool. */
3641
3642 int
3643 get_pool_offset (addr)
3644 rtx addr;
3645 {
3646 return (find_pool_constant (cfun, addr))->offset;
3647 }
3648
3649 /* Return the size of the constant pool. */
3650
3651 int
3652 get_pool_size ()
3653 {
3654 return pool_offset;
3655 }
3656 \f
3657 /* Write all the constants in the constant pool. */
3658
3659 void
3660 output_constant_pool (fnname, fndecl)
3661 const char *fnname ATTRIBUTE_UNUSED;
3662 tree fndecl ATTRIBUTE_UNUSED;
3663 {
3664 struct pool_constant *pool;
3665 rtx x;
3666 union real_extract u;
3667
3668 /* It is possible for gcc to call force_const_mem and then to later
3669 discard the instructions which refer to the constant. In such a
3670 case we do not need to output the constant. */
3671 mark_constant_pool ();
3672
3673 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3674 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
3675 #endif
3676
3677 for (pool = first_pool; pool; pool = pool->next)
3678 {
3679 rtx tmp;
3680
3681 x = pool->constant;
3682
3683 if (! pool->mark)
3684 continue;
3685
3686 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3687 whose CODE_LABEL has been deleted. This can occur if a jump table
3688 is eliminated by optimization. If so, write a constant of zero
3689 instead. Note that this can also happen by turning the
3690 CODE_LABEL into a NOTE. */
3691 /* ??? This seems completely and utterly wrong. Certainly it's
3692 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3693 functioning even with INSN_DELETED_P and friends. */
3694
3695 tmp = x;
3696 switch (GET_CODE (x))
3697 {
3698 case CONST:
3699 if (GET_CODE (XEXP (x, 0)) != PLUS
3700 || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3701 break;
3702 tmp = XEXP (XEXP (x, 0), 0);
3703 /* FALLTHRU */
3704
3705 case LABEL_REF:
3706 tmp = XEXP (x, 0);
3707 if (INSN_DELETED_P (tmp)
3708 || (GET_CODE (tmp) == NOTE
3709 && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_DELETED))
3710 {
3711 abort ();
3712 x = const0_rtx;
3713 }
3714 break;
3715
3716 default:
3717 break;
3718 }
3719
3720 /* First switch to correct section. */
3721 #ifdef SELECT_RTX_SECTION
3722 SELECT_RTX_SECTION (pool->mode, x);
3723 #else
3724 readonly_data_section ();
3725 #endif
3726
3727 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3728 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
3729 pool->align, pool->labelno, done);
3730 #endif
3731
3732 assemble_align (pool->align);
3733
3734 /* Output the label. */
3735 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
3736
3737 /* Output the value of the constant itself. */
3738 switch (GET_MODE_CLASS (pool->mode))
3739 {
3740 case MODE_FLOAT:
3741 if (GET_CODE (x) != CONST_DOUBLE)
3742 abort ();
3743
3744 memcpy ((char *) &u, (char *) &CONST_DOUBLE_LOW (x), sizeof u);
3745 assemble_real (u.d, pool->mode);
3746 break;
3747
3748 case MODE_INT:
3749 case MODE_PARTIAL_INT:
3750 assemble_integer (x, GET_MODE_SIZE (pool->mode), 1);
3751 break;
3752
3753 default:
3754 abort ();
3755 }
3756
3757 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3758 done: ;
3759 #endif
3760
3761 }
3762
3763 #ifdef ASM_OUTPUT_POOL_EPILOGUE
3764 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool_offset);
3765 #endif
3766
3767 /* Done with this pool. */
3768 first_pool = last_pool = 0;
3769 }
3770
3771 /* Look through the instructions for this function, and mark all the
3772 entries in the constant pool which are actually being used.
3773 Emit used deferred strings. */
3774
3775 static void
3776 mark_constant_pool ()
3777 {
3778 register rtx insn;
3779 struct pool_constant *pool;
3780
3781 if (first_pool == 0 && htab_elements (const_str_htab) == 0)
3782 return;
3783
3784 for (pool = first_pool; pool; pool = pool->next)
3785 pool->mark = 0;
3786
3787 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3788 if (INSN_P (insn))
3789 mark_constants (PATTERN (insn));
3790
3791 for (insn = current_function_epilogue_delay_list;
3792 insn;
3793 insn = XEXP (insn, 1))
3794 if (INSN_P (insn))
3795 mark_constants (PATTERN (insn));
3796 }
3797
3798 /* Look through appropriate parts of X, marking all entries in the
3799 constant pool which are actually being used. Entries that are only
3800 referenced by other constants are also marked as used. Emit
3801 deferred strings that are used. */
3802
3803 static void
3804 mark_constants (x)
3805 rtx x;
3806 {
3807 register int i;
3808 register const char *format_ptr;
3809
3810 if (x == 0)
3811 return;
3812
3813 if (GET_CODE (x) == SYMBOL_REF)
3814 {
3815 mark_constant (&x, NULL);
3816 return;
3817 }
3818 /* Never search inside a CONST_DOUBLE, because CONST_DOUBLE_MEM may be
3819 a MEM, but does not constitute a use of that MEM. */
3820 else if (GET_CODE (x) == CONST_DOUBLE)
3821 return;
3822
3823 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3824 insns, not any notes that may be attached. We don't want to mark
3825 a constant just because it happens to appear in a REG_EQUIV note. */
3826 if (INSN_P (x))
3827 {
3828 mark_constants (PATTERN (x));
3829 return;
3830 }
3831
3832 format_ptr = GET_RTX_FORMAT (GET_CODE (x));
3833
3834 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
3835 {
3836 switch (*format_ptr++)
3837 {
3838 case 'e':
3839 mark_constants (XEXP (x, i));
3840 break;
3841
3842 case 'E':
3843 if (XVEC (x, i) != 0)
3844 {
3845 register int j;
3846
3847 for (j = 0; j < XVECLEN (x, i); j++)
3848 mark_constants (XVECEXP (x, i, j));
3849 }
3850 break;
3851
3852 case 'S':
3853 case 's':
3854 case '0':
3855 case 'i':
3856 case 'w':
3857 case 'n':
3858 case 'u':
3859 break;
3860
3861 default:
3862 abort ();
3863 }
3864 }
3865 }
3866
3867 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3868 to as used. Emit referenced deferred strings. This function can
3869 be used with for_each_rtx () to mark all SYMBOL_REFs in an rtx. */
3870
3871 static int
3872 mark_constant (current_rtx, data)
3873 rtx *current_rtx;
3874 void *data ATTRIBUTE_UNUSED;
3875 {
3876 rtx x = *current_rtx;
3877
3878 if (x == NULL_RTX)
3879 return 0;
3880 else if (GET_CODE(x) == CONST_DOUBLE)
3881 /* Never search inside a CONST_DOUBLE because CONST_DOUBLE_MEM may
3882 be a MEM but does not constitute a use of that MEM. */
3883 return -1;
3884 else if (GET_CODE (x) == SYMBOL_REF)
3885 {
3886 if (CONSTANT_POOL_ADDRESS_P (x))
3887 {
3888 struct pool_constant *pool = find_pool_constant (cfun, x);
3889 if (pool->mark == 0) {
3890 pool->mark = 1;
3891 for_each_rtx (&(pool->constant), &mark_constant, NULL);
3892 }
3893 else
3894 return -1;
3895 }
3896 else if (STRING_POOL_ADDRESS_P (x))
3897 {
3898 struct deferred_string **defstr;
3899
3900 defstr = (struct deferred_string **)
3901 htab_find_slot_with_hash (const_str_htab, XSTR (x, 0),
3902 STRHASH (XSTR (x, 0)), NO_INSERT);
3903 if (defstr)
3904 {
3905 struct deferred_string *p = *defstr;
3906
3907 STRING_POOL_ADDRESS_P (x) = 0;
3908 output_constant_def_contents (p->exp, 0, p->labelno);
3909 htab_clear_slot (const_str_htab, (void **) defstr);
3910 }
3911 }
3912 }
3913 return 0;
3914 }
3915 \f
3916 /* Find all the constants whose addresses are referenced inside of EXP,
3917 and make sure assembler code with a label has been output for each one.
3918 Indicate whether an ADDR_EXPR has been encountered. */
3919
3920 static int
3921 output_addressed_constants (exp)
3922 tree exp;
3923 {
3924 int reloc = 0;
3925
3926 /* Give the front-end a chance to convert VALUE to something that
3927 looks more like a constant to the back-end. */
3928 if (lang_expand_constant)
3929 exp = (*lang_expand_constant) (exp);
3930
3931 switch (TREE_CODE (exp))
3932 {
3933 case ADDR_EXPR:
3934 {
3935 register tree constant = TREE_OPERAND (exp, 0);
3936
3937 while (TREE_CODE (constant) == COMPONENT_REF)
3938 {
3939 constant = TREE_OPERAND (constant, 0);
3940 }
3941
3942 if (TREE_CODE_CLASS (TREE_CODE (constant)) == 'c'
3943 || TREE_CODE (constant) == CONSTRUCTOR)
3944 /* No need to do anything here
3945 for addresses of variables or functions. */
3946 output_constant_def (constant, 0);
3947 }
3948 reloc = 1;
3949 break;
3950
3951 case PLUS_EXPR:
3952 case MINUS_EXPR:
3953 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
3954 reloc |= output_addressed_constants (TREE_OPERAND (exp, 1));
3955 break;
3956
3957 case NOP_EXPR:
3958 case CONVERT_EXPR:
3959 case NON_LVALUE_EXPR:
3960 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
3961 break;
3962
3963 case CONSTRUCTOR:
3964 {
3965 register tree link;
3966 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
3967 if (TREE_VALUE (link) != 0)
3968 reloc |= output_addressed_constants (TREE_VALUE (link));
3969 }
3970 break;
3971
3972 default:
3973 break;
3974 }
3975 return reloc;
3976 }
3977 \f
3978 /* Return nonzero if VALUE is a valid constant-valued expression
3979 for use in initializing a static variable; one that can be an
3980 element of a "constant" initializer.
3981
3982 Return null_pointer_node if the value is absolute;
3983 if it is relocatable, return the variable that determines the relocation.
3984 We assume that VALUE has been folded as much as possible;
3985 therefore, we do not need to check for such things as
3986 arithmetic-combinations of integers. */
3987
3988 tree
3989 initializer_constant_valid_p (value, endtype)
3990 tree value;
3991 tree endtype;
3992 {
3993 /* Give the front-end a chance to convert VALUE to something that
3994 looks more like a constant to the back-end. */
3995 if (lang_expand_constant)
3996 value = (*lang_expand_constant) (value);
3997
3998 switch (TREE_CODE (value))
3999 {
4000 case CONSTRUCTOR:
4001 if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
4002 || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
4003 && TREE_CONSTANT (value)
4004 && CONSTRUCTOR_ELTS (value))
4005 return
4006 initializer_constant_valid_p (TREE_VALUE (CONSTRUCTOR_ELTS (value)),
4007 endtype);
4008
4009 return TREE_STATIC (value) ? null_pointer_node : 0;
4010
4011 case INTEGER_CST:
4012 case REAL_CST:
4013 case STRING_CST:
4014 case COMPLEX_CST:
4015 return null_pointer_node;
4016
4017 case ADDR_EXPR:
4018 return staticp (TREE_OPERAND (value, 0)) ? TREE_OPERAND (value, 0) : 0;
4019
4020 case NON_LVALUE_EXPR:
4021 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4022
4023 case CONVERT_EXPR:
4024 case NOP_EXPR:
4025 /* Allow conversions between pointer types. */
4026 if (POINTER_TYPE_P (TREE_TYPE (value))
4027 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4028 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4029
4030 /* Allow conversions between real types. */
4031 if (FLOAT_TYPE_P (TREE_TYPE (value))
4032 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4033 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4034
4035 /* Allow length-preserving conversions between integer types. */
4036 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
4037 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
4038 && (TYPE_PRECISION (TREE_TYPE (value))
4039 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
4040 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4041
4042 /* Allow conversions between other integer types only if
4043 explicit value. */
4044 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
4045 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4046 {
4047 tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4048 endtype);
4049 if (inner == null_pointer_node)
4050 return null_pointer_node;
4051 break;
4052 }
4053
4054 /* Allow (int) &foo provided int is as wide as a pointer. */
4055 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
4056 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
4057 && (TYPE_PRECISION (TREE_TYPE (value))
4058 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
4059 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
4060 endtype);
4061
4062 /* Likewise conversions from int to pointers, but also allow
4063 conversions from 0. */
4064 if (POINTER_TYPE_P (TREE_TYPE (value))
4065 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4066 {
4067 if (integer_zerop (TREE_OPERAND (value, 0)))
4068 return null_pointer_node;
4069 else if (TYPE_PRECISION (TREE_TYPE (value))
4070 <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
4071 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
4072 endtype);
4073 }
4074
4075 /* Allow conversions to union types if the value inside is okay. */
4076 if (TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
4077 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
4078 endtype);
4079 break;
4080
4081 case PLUS_EXPR:
4082 if (! INTEGRAL_TYPE_P (endtype)
4083 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
4084 {
4085 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4086 endtype);
4087 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4088 endtype);
4089 /* If either term is absolute, use the other terms relocation. */
4090 if (valid0 == null_pointer_node)
4091 return valid1;
4092 if (valid1 == null_pointer_node)
4093 return valid0;
4094 }
4095 break;
4096
4097 case MINUS_EXPR:
4098 if (! INTEGRAL_TYPE_P (endtype)
4099 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
4100 {
4101 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4102 endtype);
4103 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4104 endtype);
4105 /* Win if second argument is absolute. */
4106 if (valid1 == null_pointer_node)
4107 return valid0;
4108 /* Win if both arguments have the same relocation.
4109 Then the value is absolute. */
4110 if (valid0 == valid1 && valid0 != 0)
4111 return null_pointer_node;
4112
4113 /* Since GCC guarantees that string constants are unique in the
4114 generated code, a subtraction between two copies of the same
4115 constant string is absolute. */
4116 if (valid0 && TREE_CODE (valid0) == STRING_CST &&
4117 valid1 && TREE_CODE (valid1) == STRING_CST &&
4118 TREE_STRING_POINTER (valid0) == TREE_STRING_POINTER (valid1))
4119 return null_pointer_node;
4120 }
4121
4122 /* Support differences between labels. */
4123 if (INTEGRAL_TYPE_P (endtype))
4124 {
4125 tree op0, op1;
4126 op0 = TREE_OPERAND (value, 0);
4127 op1 = TREE_OPERAND (value, 1);
4128 STRIP_NOPS (op0);
4129 STRIP_NOPS (op1);
4130
4131 if (TREE_CODE (op0) == ADDR_EXPR
4132 && TREE_CODE (TREE_OPERAND (op0, 0)) == LABEL_DECL
4133 && TREE_CODE (op1) == ADDR_EXPR
4134 && TREE_CODE (TREE_OPERAND (op1, 0)) == LABEL_DECL)
4135 return null_pointer_node;
4136 }
4137 break;
4138
4139 default:
4140 break;
4141 }
4142
4143 return 0;
4144 }
4145 \f
4146 /* Output assembler code for constant EXP to FILE, with no label.
4147 This includes the pseudo-op such as ".int" or ".byte", and a newline.
4148 Assumes output_addressed_constants has been done on EXP already.
4149
4150 Generate exactly SIZE bytes of assembler data, padding at the end
4151 with zeros if necessary. SIZE must always be specified.
4152
4153 SIZE is important for structure constructors,
4154 since trailing members may have been omitted from the constructor.
4155 It is also important for initialization of arrays from string constants
4156 since the full length of the string constant might not be wanted.
4157 It is also needed for initialization of unions, where the initializer's
4158 type is just one member, and that may not be as long as the union.
4159
4160 There a case in which we would fail to output exactly SIZE bytes:
4161 for a structure constructor that wants to produce more than SIZE bytes.
4162 But such constructors will never be generated for any possible input. */
4163
4164 void
4165 output_constant (exp, size)
4166 register tree exp;
4167 register int size;
4168 {
4169 register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
4170
4171 /* Some front-ends use constants other than the standard
4172 language-indepdent varieties, but which may still be output
4173 directly. Give the front-end a chance to convert EXP to a
4174 language-independent representation. */
4175 if (lang_expand_constant)
4176 {
4177 exp = (*lang_expand_constant) (exp);
4178 code = TREE_CODE (TREE_TYPE (exp));
4179 }
4180
4181 if (size == 0 || flag_syntax_only)
4182 return;
4183
4184 /* Eliminate the NON_LVALUE_EXPR_EXPR that makes a cast not be an lvalue.
4185 That way we get the constant (we hope) inside it. Also, strip off any
4186 NOP_EXPR that converts between two record, union, array, or set types
4187 or a CONVERT_EXPR that converts to a union TYPE. */
4188 while ((TREE_CODE (exp) == NOP_EXPR
4189 && (TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))
4190 || AGGREGATE_TYPE_P (TREE_TYPE (exp))))
4191 || (TREE_CODE (exp) == CONVERT_EXPR
4192 && code == UNION_TYPE)
4193 || TREE_CODE (exp) == NON_LVALUE_EXPR)
4194 {
4195 exp = TREE_OPERAND (exp, 0);
4196 code = TREE_CODE (TREE_TYPE (exp));
4197 }
4198
4199 /* Allow a constructor with no elements for any data type.
4200 This means to fill the space with zeros. */
4201 if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
4202 {
4203 assemble_zeros (size);
4204 return;
4205 }
4206
4207 switch (code)
4208 {
4209 case CHAR_TYPE:
4210 case BOOLEAN_TYPE:
4211 case INTEGER_TYPE:
4212 case ENUMERAL_TYPE:
4213 case POINTER_TYPE:
4214 case REFERENCE_TYPE:
4215 /* ??? What about (int)((float)(int)&foo + 4) */
4216 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
4217 || TREE_CODE (exp) == NON_LVALUE_EXPR)
4218 exp = TREE_OPERAND (exp, 0);
4219
4220 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
4221 EXPAND_INITIALIZER),
4222 size, 0))
4223 error ("initializer for integer value is too complicated");
4224 size = 0;
4225 break;
4226
4227 case REAL_TYPE:
4228 if (TREE_CODE (exp) != REAL_CST)
4229 error ("initializer for floating value is not a floating constant");
4230
4231 assemble_real (TREE_REAL_CST (exp),
4232 mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0));
4233 size = 0;
4234 break;
4235
4236 case COMPLEX_TYPE:
4237 output_constant (TREE_REALPART (exp), size / 2);
4238 output_constant (TREE_IMAGPART (exp), size / 2);
4239 size -= (size / 2) * 2;
4240 break;
4241
4242 case ARRAY_TYPE:
4243 if (TREE_CODE (exp) == CONSTRUCTOR)
4244 {
4245 output_constructor (exp, size);
4246 return;
4247 }
4248 else if (TREE_CODE (exp) == STRING_CST)
4249 {
4250 int excess = 0;
4251
4252 if (size > TREE_STRING_LENGTH (exp))
4253 {
4254 excess = size - TREE_STRING_LENGTH (exp);
4255 size = TREE_STRING_LENGTH (exp);
4256 }
4257
4258 assemble_string (TREE_STRING_POINTER (exp), size);
4259 size = excess;
4260 }
4261 else
4262 abort ();
4263 break;
4264
4265 case RECORD_TYPE:
4266 case UNION_TYPE:
4267 if (TREE_CODE (exp) == CONSTRUCTOR)
4268 output_constructor (exp, size);
4269 else
4270 abort ();
4271 return;
4272
4273 case SET_TYPE:
4274 if (TREE_CODE (exp) == INTEGER_CST)
4275 assemble_integer (expand_expr (exp, NULL_RTX,
4276 VOIDmode, EXPAND_INITIALIZER),
4277 size, 1);
4278 else if (TREE_CODE (exp) == CONSTRUCTOR)
4279 {
4280 unsigned char *buffer = (unsigned char *) alloca (size);
4281 if (get_set_constructor_bytes (exp, buffer, size))
4282 abort ();
4283 assemble_string ((char *) buffer, size);
4284 }
4285 else
4286 error ("unknown set constructor type");
4287 return;
4288
4289 default:
4290 break; /* ??? */
4291 }
4292
4293 if (size > 0)
4294 assemble_zeros (size);
4295 }
4296
4297 \f
4298 /* Subroutine of output_constructor, used for computing the size of
4299 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
4300 type with an unspecified upper bound. */
4301
4302 static unsigned HOST_WIDE_INT
4303 array_size_for_constructor (val)
4304 tree val;
4305 {
4306 tree max_index, i;
4307
4308 max_index = NULL_TREE;
4309 for (i = CONSTRUCTOR_ELTS (val); i ; i = TREE_CHAIN (i))
4310 {
4311 tree index = TREE_PURPOSE (i);
4312
4313 if (TREE_CODE (index) == RANGE_EXPR)
4314 index = TREE_OPERAND (index, 1);
4315 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4316 max_index = index;
4317 }
4318
4319 if (max_index == NULL_TREE)
4320 return 0;
4321
4322 /* Compute the total number of array elements. */
4323 i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
4324 convert (sizetype,
4325 TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
4326 i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
4327
4328 /* Multiply by the array element unit size to find number of bytes. */
4329 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
4330
4331 return tree_low_cst (i, 1);
4332 }
4333
4334 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
4335 Generate at least SIZE bytes, padding if necessary. */
4336
4337 static void
4338 output_constructor (exp, size)
4339 tree exp;
4340 int size;
4341 {
4342 tree type = TREE_TYPE (exp);
4343 register tree link, field = 0;
4344 tree min_index = 0;
4345 /* Number of bytes output or skipped so far.
4346 In other words, current position within the constructor. */
4347 HOST_WIDE_INT total_bytes = 0;
4348 /* Non-zero means BYTE contains part of a byte, to be output. */
4349 int byte_buffer_in_use = 0;
4350 register int byte = 0;
4351
4352 if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
4353 abort ();
4354
4355 if (TREE_CODE (type) == RECORD_TYPE)
4356 field = TYPE_FIELDS (type);
4357
4358 if (TREE_CODE (type) == ARRAY_TYPE
4359 && TYPE_DOMAIN (type) != 0)
4360 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
4361
4362 /* As LINK goes through the elements of the constant,
4363 FIELD goes through the structure fields, if the constant is a structure.
4364 if the constant is a union, then we override this,
4365 by getting the field from the TREE_LIST element.
4366 But the constant could also be an array. Then FIELD is zero.
4367
4368 There is always a maximum of one element in the chain LINK for unions
4369 (even if the initializer in a source program incorrectly contains
4370 more one). */
4371 for (link = CONSTRUCTOR_ELTS (exp);
4372 link;
4373 link = TREE_CHAIN (link),
4374 field = field ? TREE_CHAIN (field) : 0)
4375 {
4376 tree val = TREE_VALUE (link);
4377 tree index = 0;
4378
4379 /* The element in a union constructor specifies the proper field
4380 or index. */
4381 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
4382 || TREE_CODE (type) == QUAL_UNION_TYPE)
4383 && TREE_PURPOSE (link) != 0)
4384 field = TREE_PURPOSE (link);
4385
4386 else if (TREE_CODE (type) == ARRAY_TYPE)
4387 index = TREE_PURPOSE (link);
4388
4389 /* Eliminate the marker that makes a cast not be an lvalue. */
4390 if (val != 0)
4391 STRIP_NOPS (val);
4392
4393 if (index && TREE_CODE (index) == RANGE_EXPR)
4394 {
4395 unsigned HOST_WIDE_INT fieldsize
4396 = int_size_in_bytes (TREE_TYPE (type));
4397 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
4398 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
4399 HOST_WIDE_INT index;
4400
4401 for (index = lo_index; index <= hi_index; index++)
4402 {
4403 /* Output the element's initial value. */
4404 if (val == 0)
4405 assemble_zeros (fieldsize);
4406 else
4407 output_constant (val, fieldsize);
4408
4409 /* Count its size. */
4410 total_bytes += fieldsize;
4411 }
4412 }
4413 else if (field == 0 || !DECL_BIT_FIELD (field))
4414 {
4415 /* An element that is not a bit-field. */
4416
4417 unsigned HOST_WIDE_INT fieldsize;
4418 /* Since this structure is static,
4419 we know the positions are constant. */
4420 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
4421
4422 if (index != 0)
4423 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4424 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
4425
4426 /* Output any buffered-up bit-fields preceding this element. */
4427 if (byte_buffer_in_use)
4428 {
4429 ASM_OUTPUT_BYTE (asm_out_file, byte);
4430 total_bytes++;
4431 byte_buffer_in_use = 0;
4432 }
4433
4434 /* Advance to offset of this element.
4435 Note no alignment needed in an array, since that is guaranteed
4436 if each element has the proper size. */
4437 if ((field != 0 || index != 0) && pos != total_bytes)
4438 {
4439 assemble_zeros (pos - total_bytes);
4440 total_bytes = pos;
4441 }
4442
4443 else if (field != 0 && DECL_PACKED (field))
4444 /* Some assemblers automaticallly align a datum according to its
4445 size if no align directive is specified. The datum, however,
4446 may be declared with 'packed' attribute, so we have to disable
4447 such a feature. */
4448 ASM_OUTPUT_ALIGN (asm_out_file, 0);
4449
4450 /* Determine size this element should occupy. */
4451 if (field)
4452 {
4453 fieldsize = 0;
4454
4455 /* If this is an array with an unspecified upper bound,
4456 the initializer determines the size. */
4457 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4458 but we cannot do this until the deprecated support for
4459 initializing zero-length array members is removed. */
4460 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4461 && TYPE_DOMAIN (TREE_TYPE (field))
4462 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4463 {
4464 fieldsize = array_size_for_constructor (val);
4465 /* Given a non-empty initialization, this field had
4466 better be last. */
4467 if (fieldsize != 0 && TREE_CHAIN (field) != NULL_TREE)
4468 abort ();
4469 }
4470 else if (DECL_SIZE_UNIT (field))
4471 {
4472 /* ??? This can't be right. If the decl size overflows
4473 a host integer we will silently emit no data. */
4474 if (host_integerp (DECL_SIZE_UNIT (field), 1))
4475 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4476 }
4477 }
4478 else
4479 fieldsize = int_size_in_bytes (TREE_TYPE (type));
4480
4481 /* Output the element's initial value. */
4482 if (val == 0)
4483 assemble_zeros (fieldsize);
4484 else
4485 output_constant (val, fieldsize);
4486
4487 /* Count its size. */
4488 total_bytes += fieldsize;
4489 }
4490 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4491 error ("invalid initial value for member `%s'",
4492 IDENTIFIER_POINTER (DECL_NAME (field)));
4493 else
4494 {
4495 /* Element that is a bit-field. */
4496
4497 HOST_WIDE_INT next_offset = int_bit_position (field);
4498 HOST_WIDE_INT end_offset
4499 = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
4500
4501 if (val == 0)
4502 val = integer_zero_node;
4503
4504 /* If this field does not start in this (or, next) byte,
4505 skip some bytes. */
4506 if (next_offset / BITS_PER_UNIT != total_bytes)
4507 {
4508 /* Output remnant of any bit field in previous bytes. */
4509 if (byte_buffer_in_use)
4510 {
4511 ASM_OUTPUT_BYTE (asm_out_file, byte);
4512 total_bytes++;
4513 byte_buffer_in_use = 0;
4514 }
4515
4516 /* If still not at proper byte, advance to there. */
4517 if (next_offset / BITS_PER_UNIT != total_bytes)
4518 {
4519 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4520 total_bytes = next_offset / BITS_PER_UNIT;
4521 }
4522 }
4523
4524 if (! byte_buffer_in_use)
4525 byte = 0;
4526
4527 /* We must split the element into pieces that fall within
4528 separate bytes, and combine each byte with previous or
4529 following bit-fields. */
4530
4531 /* next_offset is the offset n fbits from the beginning of
4532 the structure to the next bit of this element to be processed.
4533 end_offset is the offset of the first bit past the end of
4534 this element. */
4535 while (next_offset < end_offset)
4536 {
4537 int this_time;
4538 int shift;
4539 HOST_WIDE_INT value;
4540 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4541 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4542
4543 /* Advance from byte to byte
4544 within this element when necessary. */
4545 while (next_byte != total_bytes)
4546 {
4547 ASM_OUTPUT_BYTE (asm_out_file, byte);
4548 total_bytes++;
4549 byte = 0;
4550 }
4551
4552 /* Number of bits we can process at once
4553 (all part of the same byte). */
4554 this_time = MIN (end_offset - next_offset,
4555 BITS_PER_UNIT - next_bit);
4556 if (BYTES_BIG_ENDIAN)
4557 {
4558 /* On big-endian machine, take the most significant bits
4559 first (of the bits that are significant)
4560 and put them into bytes from the most significant end. */
4561 shift = end_offset - next_offset - this_time;
4562
4563 /* Don't try to take a bunch of bits that cross
4564 the word boundary in the INTEGER_CST. We can
4565 only select bits from the LOW or HIGH part
4566 not from both. */
4567 if (shift < HOST_BITS_PER_WIDE_INT
4568 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4569 {
4570 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4571 shift = HOST_BITS_PER_WIDE_INT;
4572 }
4573
4574 /* Now get the bits from the appropriate constant word. */
4575 if (shift < HOST_BITS_PER_WIDE_INT)
4576 value = TREE_INT_CST_LOW (val);
4577 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4578 {
4579 value = TREE_INT_CST_HIGH (val);
4580 shift -= HOST_BITS_PER_WIDE_INT;
4581 }
4582 else
4583 abort ();
4584
4585 /* Get the result. This works only when:
4586 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4587 byte |= (((value >> shift)
4588 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4589 << (BITS_PER_UNIT - this_time - next_bit));
4590 }
4591 else
4592 {
4593 /* On little-endian machines,
4594 take first the least significant bits of the value
4595 and pack them starting at the least significant
4596 bits of the bytes. */
4597 shift = next_offset - int_bit_position (field);
4598
4599 /* Don't try to take a bunch of bits that cross
4600 the word boundary in the INTEGER_CST. We can
4601 only select bits from the LOW or HIGH part
4602 not from both. */
4603 if (shift < HOST_BITS_PER_WIDE_INT
4604 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4605 this_time = (HOST_BITS_PER_WIDE_INT - shift);
4606
4607 /* Now get the bits from the appropriate constant word. */
4608 if (shift < HOST_BITS_PER_WIDE_INT)
4609 value = TREE_INT_CST_LOW (val);
4610 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4611 {
4612 value = TREE_INT_CST_HIGH (val);
4613 shift -= HOST_BITS_PER_WIDE_INT;
4614 }
4615 else
4616 abort ();
4617
4618 /* Get the result. This works only when:
4619 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4620 byte |= (((value >> shift)
4621 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4622 << next_bit);
4623 }
4624
4625 next_offset += this_time;
4626 byte_buffer_in_use = 1;
4627 }
4628 }
4629 }
4630
4631 if (byte_buffer_in_use)
4632 {
4633 ASM_OUTPUT_BYTE (asm_out_file, byte);
4634 total_bytes++;
4635 }
4636
4637 if (total_bytes < size)
4638 assemble_zeros (size - total_bytes);
4639 }
4640
4641 #ifdef HANDLE_PRAGMA_WEAK
4642 /* Add function NAME to the weak symbols list. VALUE is a weak alias
4643 associatd with NAME. */
4644
4645 int
4646 add_weak (name, value)
4647 const char *name;
4648 const char *value;
4649 {
4650 struct weak_syms *weak;
4651
4652 weak = (struct weak_syms *) permalloc (sizeof (struct weak_syms));
4653
4654 if (weak == NULL)
4655 return 0;
4656
4657 weak->next = weak_decls;
4658 weak->name = name;
4659 weak->value = value;
4660 weak_decls = weak;
4661
4662 return 1;
4663 }
4664 #endif /* HANDLE_PRAGMA_WEAK */
4665
4666 /* Declare DECL to be a weak symbol. */
4667
4668 void
4669 declare_weak (decl)
4670 tree decl;
4671 {
4672 if (! TREE_PUBLIC (decl))
4673 error_with_decl (decl, "weak declaration of `%s' must be public");
4674 else if (TREE_ASM_WRITTEN (decl))
4675 error_with_decl (decl, "weak declaration of `%s' must precede definition");
4676 else if (SUPPORTS_WEAK)
4677 DECL_WEAK (decl) = 1;
4678 #ifdef HANDLE_PRAGMA_WEAK
4679 add_weak (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), NULL);
4680 #endif
4681 }
4682
4683 /* Emit any pending weak declarations. */
4684
4685 #ifdef HANDLE_PRAGMA_WEAK
4686 struct weak_syms * weak_decls;
4687 #endif
4688
4689 void
4690 weak_finish ()
4691 {
4692 #ifdef HANDLE_PRAGMA_WEAK
4693 if (HANDLE_PRAGMA_WEAK)
4694 {
4695 struct weak_syms *t;
4696 for (t = weak_decls; t; t = t->next)
4697 {
4698 if (t->name)
4699 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, t->name, t->value);
4700 }
4701 }
4702 #endif
4703 }
4704
4705 /* Remove NAME from the pending list of weak symbols. This prevents
4706 the compiler from emitting multiple .weak directives which confuses
4707 some assemblers. */
4708 #ifdef ASM_WEAKEN_LABEL
4709 static void
4710 remove_from_pending_weak_list (name)
4711 const char *name ATTRIBUTE_UNUSED;
4712 {
4713 #ifdef HANDLE_PRAGMA_WEAK
4714 if (HANDLE_PRAGMA_WEAK)
4715 {
4716 struct weak_syms *t;
4717 for (t = weak_decls; t; t = t->next)
4718 {
4719 if (t->name && strcmp (name, t->name) == 0)
4720 t->name = NULL;
4721 }
4722 }
4723 #endif
4724 }
4725 #endif
4726
4727 void
4728 assemble_alias (decl, target)
4729 tree decl, target ATTRIBUTE_UNUSED;
4730 {
4731 const char *name;
4732
4733 /* We must force creation of DECL_RTL for debug info generation, even though
4734 we don't use it here. */
4735 make_decl_rtl (decl, NULL);
4736
4737 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4738
4739 #ifdef ASM_OUTPUT_DEF
4740 /* Make name accessible from other files, if appropriate. */
4741
4742 if (TREE_PUBLIC (decl))
4743 {
4744 #ifdef ASM_WEAKEN_LABEL
4745 if (DECL_WEAK (decl))
4746 {
4747 ASM_WEAKEN_LABEL (asm_out_file, name);
4748 /* Remove this function from the pending weak list so that
4749 we do not emit multiple .weak directives for it. */
4750 remove_from_pending_weak_list
4751 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
4752 }
4753 else
4754 #endif
4755 ASM_GLOBALIZE_LABEL (asm_out_file, name);
4756 }
4757
4758 #ifdef ASM_OUTPUT_DEF_FROM_DECLS
4759 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4760 #else
4761 ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
4762 #endif
4763 TREE_ASM_WRITTEN (decl) = 1;
4764 #else
4765 #ifdef ASM_OUTPUT_WEAK_ALIAS
4766 if (! DECL_WEAK (decl))
4767 warning ("only weak aliases are supported in this configuration");
4768
4769 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4770 TREE_ASM_WRITTEN (decl) = 1;
4771 #else
4772 warning ("alias definitions not supported in this configuration; ignored");
4773 #endif
4774 #endif
4775 }
4776
4777 /* Returns 1 if the target configuration supports defining public symbols
4778 so that one of them will be chosen at link time instead of generating a
4779 multiply-defined symbol error, whether through the use of weak symbols or
4780 a target-specific mechanism for having duplicates discarded. */
4781
4782 int
4783 supports_one_only ()
4784 {
4785 if (SUPPORTS_ONE_ONLY)
4786 return 1;
4787 return SUPPORTS_WEAK;
4788 }
4789
4790 /* Set up DECL as a public symbol that can be defined in multiple
4791 translation units without generating a linker error. */
4792
4793 void
4794 make_decl_one_only (decl)
4795 tree decl;
4796 {
4797 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
4798 abort ();
4799
4800 TREE_PUBLIC (decl) = 1;
4801
4802 if (TREE_CODE (decl) == VAR_DECL
4803 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4804 DECL_COMMON (decl) = 1;
4805 else if (SUPPORTS_ONE_ONLY)
4806 {
4807 #ifdef MAKE_DECL_ONE_ONLY
4808 MAKE_DECL_ONE_ONLY (decl);
4809 #endif
4810 DECL_ONE_ONLY (decl) = 1;
4811 }
4812 else if (SUPPORTS_WEAK)
4813 DECL_WEAK (decl) = 1;
4814 else
4815 abort ();
4816 }
4817
4818 void
4819 init_varasm_once ()
4820 {
4821 const_str_htab = htab_create (128, const_str_htab_hash, const_str_htab_eq,
4822 const_str_htab_del);
4823 ggc_add_root (const_hash_table, MAX_HASH_TABLE, sizeof const_hash_table[0],
4824 mark_const_hash_entry);
4825 ggc_add_root (&const_str_htab, 1, sizeof const_str_htab,
4826 mark_const_str_htab);
4827 }
4828
4829 /* Select a set of attributes for section NAME based on the properties
4830 of DECL and whether or not RELOC indicates that DECL's initializer
4831 might contain runtime relocations.
4832
4833 We make the section read-only and executable for a function decl,
4834 read-only for a const data decl, and writable for a non-const data decl.
4835
4836 If the section has already been defined, to not allow it to have
4837 different attributes, as (1) this is ambiguous since we're not seeing
4838 all the declarations up front and (2) some assemblers (e.g. SVR4)
4839 do not recoginize section redefinitions. */
4840
4841 unsigned int
4842 default_section_type_flags (decl, name, reloc)
4843 tree decl;
4844 const char *name;
4845 int reloc;
4846 {
4847 static htab_t htab;
4848 unsigned int flags;
4849 unsigned int **slot;
4850
4851 /* The names we put in the hashtable will always be the unique
4852 versions gived to us by the stringtable, so we can just use
4853 their addresses as the keys. */
4854 if (!htab)
4855 htab = htab_create (31, htab_hash_pointer, htab_eq_pointer, NULL);
4856
4857 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4858 flags = SECTION_CODE;
4859 else if (decl && DECL_READONLY_SECTION (decl, reloc))
4860 flags = 0;
4861 else
4862 flags = SECTION_WRITE;
4863
4864 if (decl && DECL_ONE_ONLY (decl))
4865 flags |= SECTION_LINKONCE;
4866
4867 if (strcmp (name, ".bss") == 0
4868 || strncmp (name, ".bss.", 5) == 0
4869 || strncmp (name, ".gnu.linkonce.b.", 16) == 0
4870 || strcmp (name, ".sbss") == 0
4871 || strncmp (name, ".sbss.", 6) == 0
4872 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
4873 flags |= SECTION_BSS;
4874
4875 /* See if we already have an entry for this section. */
4876 slot = (unsigned int **) htab_find_slot (htab, name, INSERT);
4877 if (!*slot)
4878 {
4879 *slot = (unsigned int *) xmalloc (sizeof (unsigned int));
4880 **slot = flags;
4881 }
4882 else
4883 {
4884 if (decl && **slot != flags)
4885 error_with_decl (decl, "%s causes a section type conflict");
4886 }
4887
4888 return flags;
4889 }
4890
4891 /* Output assembly to switch to section NAME with attribute FLAGS.
4892 Four variants for common object file formats. */
4893
4894 void
4895 default_no_named_section (name, flags, align)
4896 const char *name ATTRIBUTE_UNUSED;
4897 unsigned int flags ATTRIBUTE_UNUSED;
4898 unsigned int align ATTRIBUTE_UNUSED;
4899 {
4900 /* Some object formats don't support named sections at all. The
4901 front-end should already have flagged this as an error. */
4902 abort ();
4903 }
4904
4905 void
4906 default_elf_asm_named_section (name, flags, align)
4907 const char *name;
4908 unsigned int flags;
4909 unsigned int align ATTRIBUTE_UNUSED;
4910 {
4911 char flagchars[8], *f = flagchars;
4912 const char *type;
4913
4914 if (!(flags & SECTION_DEBUG))
4915 *f++ = 'a';
4916 if (flags & SECTION_WRITE)
4917 *f++ = 'w';
4918 if (flags & SECTION_CODE)
4919 *f++ = 'x';
4920 if (flags & SECTION_SMALL)
4921 *f++ = 's';
4922 *f = '\0';
4923
4924 if (flags & SECTION_BSS)
4925 type = "nobits";
4926 else
4927 type = "progbits";
4928
4929 fprintf (asm_out_file, "\t.section\t%s,\"%s\",@%s\n",
4930 name, flagchars, type);
4931 }
4932
4933 void
4934 default_coff_asm_named_section (name, flags, align)
4935 const char *name;
4936 unsigned int flags;
4937 unsigned int align ATTRIBUTE_UNUSED;
4938 {
4939 char flagchars[8], *f = flagchars;
4940
4941 if (flags & SECTION_WRITE)
4942 *f++ = 'w';
4943 if (flags & SECTION_CODE)
4944 *f++ = 'x';
4945 *f = '\0';
4946
4947 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
4948 }
4949
4950 void
4951 default_pe_asm_named_section (name, flags, align)
4952 const char *name;
4953 unsigned int flags;
4954 unsigned int align ATTRIBUTE_UNUSED;
4955 {
4956 default_coff_asm_named_section (name, flags, align);
4957
4958 if (flags & SECTION_LINKONCE)
4959 {
4960 /* Functions may have been compiled at various levels of
4961 optimization so we can't use `same_size' here.
4962 Instead, have the linker pick one. */
4963 fprintf (asm_out_file, "\t.linkonce %s\n",
4964 (flags & SECTION_CODE ? "discard" : "same_size"));
4965 }
4966 }