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