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 Free Software Foundation, Inc.
5 This file is part of GCC.
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
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
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
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.
27 We also output the assembler code for constants stored in memory
28 and are responsible for combining constants with the same value. */
32 #include "coretypes.h"
39 #include "hard-reg-set.h"
48 #include "langhooks.h"
53 #ifdef XCOFF_DEBUGGING_INFO
54 #include "xcoffout.h" /* Needed for external data
55 declarations for e.g. AIX 4.x. */
58 #ifndef TRAMPOLINE_ALIGNMENT
59 #define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY
63 #define ASM_STABS_OP "\t.stabs\t"
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
;
71 struct constant_descriptor_rtx
;
75 #define MAX_RTX_HASH_TABLE 61
77 struct varasm_status
GTY(())
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.
84 This pool of constants is reinitialized for each function
85 so each function gets its own constants-pool that comes right before
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
;
92 /* Pointers to first and last constant in pool. */
93 struct pool_constant
*x_first_pool
;
94 struct pool_constant
*x_last_pool
;
96 /* Current offset in constant pool (does not include any machine-specific
98 HOST_WIDE_INT x_pool_offset
;
101 #define const_rtx_hash_table (cfun->varasm->x_const_rtx_hash_table)
102 #define const_rtx_sym_hash_table (cfun->varasm->x_const_rtx_sym_hash_table)
103 #define first_pool (cfun->varasm->x_first_pool)
104 #define last_pool (cfun->varasm->x_last_pool)
105 #define pool_offset (cfun->varasm->x_pool_offset)
107 /* Number for making the label on the next
108 constant that is stored in memory. */
110 static GTY(()) int const_labelno
;
112 /* Number for making the label on the next
113 static variable internal to a function. */
115 static GTY(()) int var_labelno
;
117 /* Carry information from ASM_DECLARE_OBJECT_NAME
118 to ASM_FINISH_DECLARE_OBJECT. */
120 int size_directive_output
;
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,
127 tree last_assemble_variable_decl
;
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. */
136 static HOST_WIDE_INT const_alias_set
;
138 static const char *strip_reg_name
PARAMS ((const char *));
139 static int contains_pointers_p
PARAMS ((tree
));
140 static void decode_addr_const
PARAMS ((tree
, struct addr_const
*));
141 static unsigned int const_hash
PARAMS ((tree
));
142 static unsigned int const_hash_1
PARAMS ((tree
));
143 static int compare_constant
PARAMS ((tree
, tree
));
144 static tree copy_constant
PARAMS ((tree
));
145 static void maybe_output_constant_def_contents
PARAMS ((tree
, rtx
, int));
146 static void output_constant_def_contents
PARAMS ((tree
, const char *));
147 static void decode_rtx_const
PARAMS ((enum machine_mode
, rtx
,
148 struct rtx_const
*));
149 static unsigned int const_hash_rtx
PARAMS ((enum machine_mode
, rtx
));
150 static int compare_constant_rtx
151 PARAMS ((enum machine_mode
, rtx
, struct constant_descriptor_rtx
*));
152 static struct constant_descriptor_rtx
* record_constant_rtx
153 PARAMS ((enum machine_mode
, rtx
));
154 static struct pool_constant
*find_pool_constant
PARAMS ((struct function
*, rtx
));
155 static void mark_constant_pool
PARAMS ((void));
156 static void mark_constants
PARAMS ((rtx
));
157 static int mark_constant
PARAMS ((rtx
*current_rtx
, void *data
));
158 static int output_addressed_constants
PARAMS ((tree
));
159 static unsigned HOST_WIDE_INT array_size_for_constructor
PARAMS ((tree
));
160 static unsigned min_align
PARAMS ((unsigned, unsigned));
161 static void output_constructor
PARAMS ((tree
, HOST_WIDE_INT
,
163 static void globalize_decl
PARAMS ((tree
));
164 static void maybe_assemble_visibility
PARAMS ((tree
));
165 static int in_named_entry_eq
PARAMS ((const PTR
, const PTR
));
166 static hashval_t in_named_entry_hash
PARAMS ((const PTR
));
167 #ifdef ASM_OUTPUT_BSS
168 static void asm_output_bss
PARAMS ((FILE *, tree
, const char *, int, int));
170 #ifdef BSS_SECTION_ASM_OP
171 #ifdef ASM_OUTPUT_ALIGNED_BSS
172 static void asm_output_aligned_bss
173 PARAMS ((FILE *, tree
, const char *, int, int)) ATTRIBUTE_UNUSED
;
175 #endif /* BSS_SECTION_ASM_OP */
176 static bool asm_emit_uninitialised
PARAMS ((tree
, const char*, int, int));
177 static void resolve_unique_section
PARAMS ((tree
, int, int));
178 static void mark_weak
PARAMS ((tree
));
180 enum in_section
{ no_section
, in_text
, in_data
, in_named
181 #ifdef BSS_SECTION_ASM_OP
184 #ifdef CTORS_SECTION_ASM_OP
187 #ifdef DTORS_SECTION_ASM_OP
190 #ifdef READONLY_DATA_SECTION_ASM_OP
193 #ifdef EXTRA_SECTIONS
197 static GTY(()) enum in_section in_section
= no_section
;
199 /* Return a nonzero value if DECL has a section attribute. */
200 #ifndef IN_NAMED_SECTION
201 #define IN_NAMED_SECTION(DECL) \
202 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
203 && DECL_SECTION_NAME (DECL) != NULL_TREE)
206 /* Text of section name when in_section == in_named. */
207 static GTY(()) const char *in_named_name
;
209 /* Hash table of flags that have been used for a particular named section. */
211 struct in_named_entry
GTY(())
218 static GTY((param_is (struct in_named_entry
))) htab_t in_named_htab
;
220 /* Define functions like text_section for any extra sections. */
221 #ifdef EXTRA_SECTION_FUNCTIONS
222 EXTRA_SECTION_FUNCTIONS
225 /* Tell assembler to switch to text section. */
230 if (in_section
!= in_text
)
232 in_section
= in_text
;
236 fprintf (asm_out_file
, "%s\n", TEXT_SECTION_ASM_OP
);
241 /* Tell assembler to switch to data section. */
246 if (in_section
!= in_data
)
248 in_section
= in_data
;
249 if (flag_shared_data
)
251 #ifdef SHARED_SECTION_ASM_OP
252 fprintf (asm_out_file
, "%s\n", SHARED_SECTION_ASM_OP
);
254 fprintf (asm_out_file
, "%s\n", DATA_SECTION_ASM_OP
);
258 fprintf (asm_out_file
, "%s\n", DATA_SECTION_ASM_OP
);
262 /* Tell assembler to switch to read-only data section. This is normally
266 readonly_data_section ()
268 #ifdef READONLY_DATA_SECTION
269 READONLY_DATA_SECTION (); /* Note this can call data_section. */
271 #ifdef READONLY_DATA_SECTION_ASM_OP
272 if (in_section
!= in_readonly_data
)
274 in_section
= in_readonly_data
;
275 fputs (READONLY_DATA_SECTION_ASM_OP
, asm_out_file
);
276 fputc ('\n', asm_out_file
);
284 /* Determine if we're in the text section. */
289 return in_section
== in_text
;
292 /* Determine if we're in the data section. */
297 return in_section
== in_data
;
300 /* Helper routines for maintaining in_named_htab. */
303 in_named_entry_eq (p1
, p2
)
307 const struct in_named_entry
*old
= p1
;
308 const char *new = p2
;
310 return strcmp (old
->name
, new) == 0;
314 in_named_entry_hash (p
)
317 const struct in_named_entry
*old
= p
;
318 return htab_hash_string (old
->name
);
321 /* If SECTION has been seen before as a named section, return the flags
322 that were used. Otherwise, return 0. Note, that 0 is a perfectly valid
323 set of flags for a section to have, so 0 does not mean that the section
324 has not been seen. */
327 get_named_section_flags (section
)
330 struct in_named_entry
**slot
;
332 slot
= (struct in_named_entry
**)
333 htab_find_slot_with_hash (in_named_htab
, section
,
334 htab_hash_string (section
), NO_INSERT
);
336 return slot
? (*slot
)->flags
: 0;
339 /* Returns true if the section has been declared before. Sets internal
340 flag on this section in in_named_hash so subsequent calls on this
341 section will return false. */
344 named_section_first_declaration (name
)
347 struct in_named_entry
**slot
;
349 slot
= (struct in_named_entry
**)
350 htab_find_slot_with_hash (in_named_htab
, name
,
351 htab_hash_string (name
), NO_INSERT
);
352 if (! (*slot
)->declared
)
354 (*slot
)->declared
= true;
364 /* Record FLAGS for SECTION. If SECTION was previously recorded with a
365 different set of flags, return false. */
368 set_named_section_flags (section
, flags
)
372 struct in_named_entry
**slot
, *entry
;
374 slot
= (struct in_named_entry
**)
375 htab_find_slot_with_hash (in_named_htab
, section
,
376 htab_hash_string (section
), INSERT
);
381 entry
= (struct in_named_entry
*) ggc_alloc (sizeof (*entry
));
383 entry
->name
= ggc_strdup (section
);
384 entry
->flags
= flags
;
385 entry
->declared
= false;
387 else if (entry
->flags
!= flags
)
393 /* Tell assembler to change to section NAME with attributes FLAGS. */
396 named_section_flags (name
, flags
)
400 if (in_section
!= in_named
|| strcmp (name
, in_named_name
) != 0)
402 if (! set_named_section_flags (name
, flags
))
405 (*targetm
.asm_out
.named_section
) (name
, flags
);
407 if (flags
& SECTION_FORGET
)
408 in_section
= no_section
;
411 in_named_name
= ggc_strdup (name
);
412 in_section
= in_named
;
417 /* Tell assembler to change to section NAME for DECL.
418 If DECL is NULL, just switch to section NAME.
419 If NAME is NULL, get the name from DECL.
420 If RELOC is 1, the initializer for DECL contains relocs. */
423 named_section (decl
, name
, reloc
)
430 if (decl
!= NULL_TREE
&& !DECL_P (decl
))
433 name
= TREE_STRING_POINTER (DECL_SECTION_NAME (decl
));
435 flags
= (* targetm
.section_type_flags
) (decl
, name
, reloc
);
437 /* Sanity check user variables for flag changes. Non-user
438 section flag changes will abort in named_section_flags.
439 However, don't complain if SECTION_OVERRIDE is set.
440 We trust that the setter knows that it is safe to ignore
441 the default flags for this decl. */
442 if (decl
&& ! set_named_section_flags (name
, flags
))
444 flags
= get_named_section_flags (name
);
445 if ((flags
& SECTION_OVERRIDE
) == 0)
446 error_with_decl (decl
, "%s causes a section type conflict");
449 named_section_flags (name
, flags
);
452 /* If required, set DECL_SECTION_NAME to a unique name. */
455 resolve_unique_section (decl
, reloc
, flag_function_or_data_sections
)
457 int reloc ATTRIBUTE_UNUSED
;
458 int flag_function_or_data_sections
;
460 if (DECL_SECTION_NAME (decl
) == NULL_TREE
461 && targetm
.have_named_sections
462 && (flag_function_or_data_sections
463 || DECL_ONE_ONLY (decl
)))
464 (*targetm
.asm_out
.unique_section
) (decl
, reloc
);
467 #ifdef BSS_SECTION_ASM_OP
469 /* Tell the assembler to switch to the bss section. */
474 if (in_section
!= in_bss
)
476 #ifdef SHARED_BSS_SECTION_ASM_OP
477 if (flag_shared_data
)
478 fprintf (asm_out_file
, "%s\n", SHARED_BSS_SECTION_ASM_OP
);
481 fprintf (asm_out_file
, "%s\n", BSS_SECTION_ASM_OP
);
487 #ifdef ASM_OUTPUT_BSS
489 /* Utility function for ASM_OUTPUT_BSS for targets to use if
490 they don't support alignments in .bss.
491 ??? It is believed that this function will work in most cases so such
492 support is localized here. */
495 asm_output_bss (file
, decl
, name
, size
, rounded
)
497 tree decl ATTRIBUTE_UNUSED
;
499 int size ATTRIBUTE_UNUSED
, rounded
;
501 (*targetm
.asm_out
.globalize_label
) (file
, name
);
503 #ifdef ASM_DECLARE_OBJECT_NAME
504 last_assemble_variable_decl
= decl
;
505 ASM_DECLARE_OBJECT_NAME (file
, name
, decl
);
507 /* Standard thing is just output label for the object. */
508 ASM_OUTPUT_LABEL (file
, name
);
509 #endif /* ASM_DECLARE_OBJECT_NAME */
510 ASM_OUTPUT_SKIP (file
, rounded
? rounded
: 1);
515 #ifdef ASM_OUTPUT_ALIGNED_BSS
517 /* Utility function for targets to use in implementing
518 ASM_OUTPUT_ALIGNED_BSS.
519 ??? It is believed that this function will work in most cases so such
520 support is localized here. */
523 asm_output_aligned_bss (file
, decl
, name
, size
, align
)
525 tree decl ATTRIBUTE_UNUSED
;
530 ASM_OUTPUT_ALIGN (file
, floor_log2 (align
/ BITS_PER_UNIT
));
531 #ifdef ASM_DECLARE_OBJECT_NAME
532 last_assemble_variable_decl
= decl
;
533 ASM_DECLARE_OBJECT_NAME (file
, name
, decl
);
535 /* Standard thing is just output label for the object. */
536 ASM_OUTPUT_LABEL (file
, name
);
537 #endif /* ASM_DECLARE_OBJECT_NAME */
538 ASM_OUTPUT_SKIP (file
, size
? size
: 1);
543 #endif /* BSS_SECTION_ASM_OP */
545 /* Switch to the section for function DECL.
547 If DECL is NULL_TREE, switch to the text section.
548 ??? It's not clear that we will ever be passed NULL_TREE, but it's
549 safer to handle it. */
552 function_section (decl
)
555 if (decl
!= NULL_TREE
556 && DECL_SECTION_NAME (decl
) != NULL_TREE
)
557 named_section (decl
, (char *) 0, 0);
562 /* Switch to section for variable DECL. RELOC is the same as the
563 argument to SELECT_SECTION. */
566 variable_section (decl
, reloc
)
570 if (IN_NAMED_SECTION (decl
))
571 named_section (decl
, NULL
, reloc
);
573 (*targetm
.asm_out
.select_section
) (decl
, reloc
, DECL_ALIGN (decl
));
576 /* Tell assembler to switch to the section for string merging. */
579 mergeable_string_section (decl
, align
, flags
)
580 tree decl ATTRIBUTE_UNUSED
;
581 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED
;
582 unsigned int flags ATTRIBUTE_UNUSED
;
584 #ifdef HAVE_GAS_SHF_MERGE
585 if (flag_merge_constants
586 && TREE_CODE (decl
) == STRING_CST
587 && TREE_CODE (TREE_TYPE (decl
)) == ARRAY_TYPE
589 && TREE_STRING_LENGTH (decl
) >= int_size_in_bytes (TREE_TYPE (decl
)))
591 enum machine_mode mode
;
592 unsigned int modesize
;
597 mode
= TYPE_MODE (TREE_TYPE (TREE_TYPE (decl
)));
598 modesize
= GET_MODE_BITSIZE (mode
);
599 if (modesize
>= 8 && modesize
<= 256
600 && (modesize
& (modesize
- 1)) == 0)
602 if (align
< modesize
)
605 str
= TREE_STRING_POINTER (decl
);
606 len
= TREE_STRING_LENGTH (decl
);
607 unit
= GET_MODE_SIZE (mode
);
609 /* Check for embedded NUL characters. */
610 for (i
= 0; i
< len
; i
+= unit
)
612 for (j
= 0; j
< unit
; j
++)
613 if (str
[i
+ j
] != '\0')
620 sprintf (name
, ".rodata.str%d.%d", modesize
/ 8,
622 flags
|= (modesize
/ 8) | SECTION_MERGE
| SECTION_STRINGS
;
623 if (!i
&& modesize
< align
)
625 /* A "" string with requested alignment greater than
626 character size might cause a problem:
627 if some other string required even bigger
628 alignment than "", then linker might think the
629 "" is just part of padding after some other string
630 and not put it into the hash table initially.
631 But this means "" could have smaller alignment
633 #ifdef ASM_OUTPUT_SECTION_START
634 named_section_flags (name
, flags
);
635 ASM_OUTPUT_SECTION_START (asm_out_file
);
637 readonly_data_section ();
642 named_section_flags (name
, flags
);
648 readonly_data_section ();
651 /* Tell assembler to switch to the section for constant merging. */
654 mergeable_constant_section (mode
, align
, flags
)
655 enum machine_mode mode ATTRIBUTE_UNUSED
;
656 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED
;
657 unsigned int flags ATTRIBUTE_UNUSED
;
659 #ifdef HAVE_GAS_SHF_MERGE
660 unsigned int modesize
= GET_MODE_BITSIZE (mode
);
662 if (flag_merge_constants
668 && (align
& (align
- 1)) == 0)
672 sprintf (name
, ".rodata.cst%d", (int) (align
/ 8));
673 flags
|= (align
/ 8) | SECTION_MERGE
;
674 named_section_flags (name
, flags
);
678 readonly_data_section ();
681 /* Given NAME, a putative register name, discard any customary prefixes. */
684 strip_reg_name (name
)
687 #ifdef REGISTER_PREFIX
688 if (!strncmp (name
, REGISTER_PREFIX
, strlen (REGISTER_PREFIX
)))
689 name
+= strlen (REGISTER_PREFIX
);
691 if (name
[0] == '%' || name
[0] == '#')
696 /* Decode an `asm' spec for a declaration as a register name.
697 Return the register number, or -1 if nothing specified,
698 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
699 or -3 if ASMSPEC is `cc' and is not recognized,
700 or -4 if ASMSPEC is `memory' and is not recognized.
701 Accept an exact spelling or a decimal number.
702 Prefixes such as % are optional. */
705 decode_reg_name (asmspec
)
712 /* Get rid of confusing prefixes. */
713 asmspec
= strip_reg_name (asmspec
);
715 /* Allow a decimal number as a "register name". */
716 for (i
= strlen (asmspec
) - 1; i
>= 0; i
--)
717 if (! ISDIGIT (asmspec
[i
]))
719 if (asmspec
[0] != 0 && i
< 0)
722 if (i
< FIRST_PSEUDO_REGISTER
&& i
>= 0)
728 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
730 && ! strcmp (asmspec
, strip_reg_name (reg_names
[i
])))
733 #ifdef ADDITIONAL_REGISTER_NAMES
735 static const struct { const char *const name
; const int number
; } table
[]
736 = ADDITIONAL_REGISTER_NAMES
;
738 for (i
= 0; i
< (int) ARRAY_SIZE (table
); i
++)
739 if (! strcmp (asmspec
, table
[i
].name
))
740 return table
[i
].number
;
742 #endif /* ADDITIONAL_REGISTER_NAMES */
744 if (!strcmp (asmspec
, "memory"))
747 if (!strcmp (asmspec
, "cc"))
756 /* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should
757 have static storage duration. In other words, it should not be an
758 automatic variable, including PARM_DECLs.
760 There is, however, one exception: this function handles variables
761 explicitly placed in a particular register by the user.
763 ASMSPEC, if not 0, is the string which the user specified as the
764 assembler symbol name.
766 This is never called for PARM_DECL nodes. */
769 make_decl_rtl (decl
, asmspec
)
773 int top_level
= (DECL_CONTEXT (decl
) == NULL_TREE
);
774 const char *name
= 0;
775 const char *new_name
= 0;
779 /* Check that we are not being given an automatic variable. */
780 /* A weak alias has TREE_PUBLIC set but not the other bits. */
781 if (TREE_CODE (decl
) == PARM_DECL
782 || TREE_CODE (decl
) == RESULT_DECL
783 || (TREE_CODE (decl
) == VAR_DECL
784 && !TREE_STATIC (decl
)
785 && !TREE_PUBLIC (decl
)
786 && !DECL_EXTERNAL (decl
)
787 && !DECL_REGISTER (decl
)))
789 /* And that we were not given a type or a label. */
790 else if (TREE_CODE (decl
) == TYPE_DECL
791 || TREE_CODE (decl
) == LABEL_DECL
)
794 /* For a duplicate declaration, we can be called twice on the
795 same DECL node. Don't discard the RTL already made. */
796 if (DECL_RTL_SET_P (decl
))
798 /* If the old RTL had the wrong mode, fix the mode. */
799 if (GET_MODE (DECL_RTL (decl
)) != DECL_MODE (decl
))
800 SET_DECL_RTL (decl
, adjust_address_nv (DECL_RTL (decl
),
801 DECL_MODE (decl
), 0));
803 /* ??? Another way to do this would be to maintain a hashed
804 table of such critters. Instead of adding stuff to a DECL
805 to give certain attributes to it, we could use an external
806 hash map from DECL to set of attributes. */
808 /* Let the target reassign the RTL if it wants.
809 This is necessary, for example, when one machine specific
810 decl attribute overrides another. */
811 (* targetm
.encode_section_info
) (decl
, DECL_RTL (decl
), false);
815 new_name
= name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
));
817 reg_number
= decode_reg_name (asmspec
);
818 if (reg_number
== -2)
820 /* ASMSPEC is given, and not the name of a register. Mark the
821 name with a star so assemble_name won't munge it. */
822 char *starred
= alloca (strlen (asmspec
) + 2);
824 strcpy (starred
+ 1, asmspec
);
828 if (TREE_CODE (decl
) != FUNCTION_DECL
&& DECL_REGISTER (decl
))
830 /* First detect errors in declaring global registers. */
831 if (reg_number
== -1)
832 error_with_decl (decl
, "register name not specified for `%s'");
833 else if (reg_number
< 0)
834 error_with_decl (decl
, "invalid register name for `%s'");
835 else if (TYPE_MODE (TREE_TYPE (decl
)) == BLKmode
)
836 error_with_decl (decl
,
837 "data type of `%s' isn't suitable for a register");
838 else if (! HARD_REGNO_MODE_OK (reg_number
, TYPE_MODE (TREE_TYPE (decl
))))
839 error_with_decl (decl
,
840 "register specified for `%s' isn't suitable for data type");
841 /* Now handle properly declared static register variables. */
846 if (DECL_INITIAL (decl
) != 0 && TREE_STATIC (decl
))
848 DECL_INITIAL (decl
) = 0;
849 error ("global register variable has initial value");
851 if (TREE_THIS_VOLATILE (decl
))
852 warning ("volatile register variables don't work as you might wish");
854 /* If the user specified one of the eliminables registers here,
855 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
856 confused with that register and be eliminated. This usage is
857 somewhat suspect... */
859 SET_DECL_RTL (decl
, gen_rtx_raw_REG (DECL_MODE (decl
), reg_number
));
860 ORIGINAL_REGNO (DECL_RTL (decl
)) = reg_number
;
861 REG_USERVAR_P (DECL_RTL (decl
)) = 1;
863 if (TREE_STATIC (decl
))
865 /* Make this register global, so not usable for anything
867 #ifdef ASM_DECLARE_REGISTER_GLOBAL
868 ASM_DECLARE_REGISTER_GLOBAL (asm_out_file
, decl
, reg_number
, name
);
870 nregs
= HARD_REGNO_NREGS (reg_number
, DECL_MODE (decl
));
872 globalize_reg (reg_number
+ --nregs
);
875 /* As a register variable, it has no section. */
880 /* Now handle ordinary static variables and functions (in memory).
881 Also handle vars declared register invalidly. */
883 if (reg_number
>= 0 || reg_number
== -3)
884 error_with_decl (decl
,
885 "register name given for non-register variable `%s'");
887 /* Specifying a section attribute on a variable forces it into a
888 non-.bss section, and thus it cannot be common. */
889 if (TREE_CODE (decl
) == VAR_DECL
890 && DECL_SECTION_NAME (decl
) != NULL_TREE
891 && DECL_INITIAL (decl
) == NULL_TREE
892 && DECL_COMMON (decl
))
893 DECL_COMMON (decl
) = 0;
895 /* Variables can't be both common and weak. */
896 if (TREE_CODE (decl
) == VAR_DECL
&& DECL_WEAK (decl
))
897 DECL_COMMON (decl
) = 0;
899 /* Can't use just the variable's own name for a variable
900 whose scope is less than the whole file, unless it's a member
901 of a local class (which will already be unambiguous).
902 Concatenate a distinguishing number. */
903 if (!top_level
&& !TREE_PUBLIC (decl
)
904 && ! (DECL_CONTEXT (decl
) && TYPE_P (DECL_CONTEXT (decl
)))
906 && name
== IDENTIFIER_POINTER (DECL_NAME (decl
)))
910 ASM_FORMAT_PRIVATE_NAME (label
, name
, var_labelno
);
915 if (name
!= new_name
)
917 SET_DECL_ASSEMBLER_NAME (decl
, get_identifier (new_name
));
918 name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
));
921 x
= gen_rtx_SYMBOL_REF (Pmode
, name
);
922 SYMBOL_REF_WEAK (x
) = DECL_WEAK (decl
);
923 SYMBOL_REF_DECL (x
) = decl
;
925 x
= gen_rtx_MEM (DECL_MODE (decl
), x
);
926 if (TREE_CODE (decl
) != FUNCTION_DECL
)
927 set_mem_attributes (x
, decl
, 1);
928 SET_DECL_RTL (decl
, x
);
930 /* Optionally set flags or add text to the name to record information
931 such as that it is a function name.
932 If the name is changed, the macro ASM_OUTPUT_LABELREF
933 will have to know how to strip this information. */
934 (* targetm
.encode_section_info
) (decl
, DECL_RTL (decl
), true);
937 /* Make the rtl for variable VAR be volatile.
938 Use this only for static variables. */
941 make_var_volatile (var
)
944 if (GET_CODE (DECL_RTL (var
)) != MEM
)
947 MEM_VOLATILE_P (DECL_RTL (var
)) = 1;
950 /* Output a string of literal assembler code
951 for an `asm' keyword used between functions. */
954 assemble_asm (string
)
959 if (TREE_CODE (string
) == ADDR_EXPR
)
960 string
= TREE_OPERAND (string
, 0);
962 fprintf (asm_out_file
, "\t%s\n", TREE_STRING_POINTER (string
));
965 /* Record an element in the table of global destructors. SYMBOL is
966 a SYMBOL_REF of the function to be called; PRIORITY is a number
967 between 0 and MAX_INIT_PRIORITY. */
970 default_stabs_asm_out_destructor (symbol
, priority
)
972 int priority ATTRIBUTE_UNUSED
;
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
977 fprintf (asm_out_file
, "%s\"___DTOR_LIST__\",22,0,0,", ASM_STABS_OP
);
978 assemble_name (asm_out_file
, XSTR (symbol
, 0));
979 fputc ('\n', asm_out_file
);
983 default_named_section_asm_out_destructor (symbol
, priority
)
987 const char *section
= ".dtors";
990 /* ??? This only works reliably with the GNU linker. */
991 if (priority
!= DEFAULT_INIT_PRIORITY
)
993 sprintf (buf
, ".dtors.%.5u",
994 /* Invert the numbering so the linker puts us in the proper
995 order; constructors are run from right to left, and the
996 linker sorts in increasing order. */
997 MAX_INIT_PRIORITY
- priority
);
1001 named_section_flags (section
, SECTION_WRITE
);
1002 assemble_align (POINTER_SIZE
);
1003 assemble_integer (symbol
, POINTER_SIZE
/ BITS_PER_UNIT
, POINTER_SIZE
, 1);
1006 #ifdef DTORS_SECTION_ASM_OP
1010 if (in_section
!= in_dtors
)
1012 in_section
= in_dtors
;
1013 fputs (DTORS_SECTION_ASM_OP
, asm_out_file
);
1014 fputc ('\n', asm_out_file
);
1019 default_dtor_section_asm_out_destructor (symbol
, priority
)
1021 int priority ATTRIBUTE_UNUSED
;
1024 assemble_align (POINTER_SIZE
);
1025 assemble_integer (symbol
, POINTER_SIZE
/ BITS_PER_UNIT
, POINTER_SIZE
, 1);
1029 /* Likewise for global constructors. */
1032 default_stabs_asm_out_constructor (symbol
, priority
)
1034 int priority ATTRIBUTE_UNUSED
;
1036 /* Tell GNU LD that this is part of the static destructor set.
1037 This will work for any system that uses stabs, most usefully
1039 fprintf (asm_out_file
, "%s\"___CTOR_LIST__\",22,0,0,", ASM_STABS_OP
);
1040 assemble_name (asm_out_file
, XSTR (symbol
, 0));
1041 fputc ('\n', asm_out_file
);
1045 default_named_section_asm_out_constructor (symbol
, priority
)
1049 const char *section
= ".ctors";
1052 /* ??? This only works reliably with the GNU linker. */
1053 if (priority
!= DEFAULT_INIT_PRIORITY
)
1055 sprintf (buf
, ".ctors.%.5u",
1056 /* Invert the numbering so the linker puts us in the proper
1057 order; constructors are run from right to left, and the
1058 linker sorts in increasing order. */
1059 MAX_INIT_PRIORITY
- priority
);
1063 named_section_flags (section
, SECTION_WRITE
);
1064 assemble_align (POINTER_SIZE
);
1065 assemble_integer (symbol
, POINTER_SIZE
/ BITS_PER_UNIT
, POINTER_SIZE
, 1);
1068 #ifdef CTORS_SECTION_ASM_OP
1072 if (in_section
!= in_ctors
)
1074 in_section
= in_ctors
;
1075 fputs (CTORS_SECTION_ASM_OP
, asm_out_file
);
1076 fputc ('\n', asm_out_file
);
1081 default_ctor_section_asm_out_constructor (symbol
, priority
)
1083 int priority ATTRIBUTE_UNUSED
;
1086 assemble_align (POINTER_SIZE
);
1087 assemble_integer (symbol
, POINTER_SIZE
/ BITS_PER_UNIT
, POINTER_SIZE
, 1);
1091 /* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
1092 a nonzero value if the constant pool should be output before the
1093 start of the function, or a zero value if the pool should output
1094 after the end of the function. The default is to put it before the
1097 #ifndef CONSTANT_POOL_BEFORE_FUNCTION
1098 #define CONSTANT_POOL_BEFORE_FUNCTION 1
1101 /* Output assembler code for the constant pool of a function and associated
1102 with defining the name of the function. DECL describes the function.
1103 NAME is the function's name. For the constant pool, we use the current
1104 constant pool data. */
1107 assemble_start_function (decl
, fnname
)
1113 /* The following code does not need preprocessing in the assembler. */
1117 if (CONSTANT_POOL_BEFORE_FUNCTION
)
1118 output_constant_pool (fnname
, decl
);
1120 resolve_unique_section (decl
, 0, flag_function_sections
);
1121 function_section (decl
);
1123 /* Tell assembler to move to target machine's alignment for functions. */
1124 align
= floor_log2 (FUNCTION_BOUNDARY
/ BITS_PER_UNIT
);
1125 if (align
< force_align_functions_log
)
1126 align
= force_align_functions_log
;
1129 ASM_OUTPUT_ALIGN (asm_out_file
, align
);
1132 /* Handle a user-specified function alignment.
1133 Note that we still need to align to FUNCTION_BOUNDARY, as above,
1134 because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */
1135 if (align_functions_log
> align
1136 && cfun
->function_frequency
!= FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
)
1138 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1139 ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file
,
1140 align_functions_log
, align_functions
- 1);
1142 ASM_OUTPUT_ALIGN (asm_out_file
, align_functions_log
);
1146 #ifdef ASM_OUTPUT_FUNCTION_PREFIX
1147 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file
, fnname
);
1150 (*debug_hooks
->begin_function
) (decl
);
1152 /* Make function name accessible from other files, if appropriate. */
1154 if (TREE_PUBLIC (decl
))
1156 if (! first_global_object_name
)
1161 p
= (* targetm
.strip_name_encoding
) (fnname
);
1164 if (! DECL_WEAK (decl
) && ! DECL_ONE_ONLY (decl
))
1165 first_global_object_name
= name
;
1167 weak_global_object_name
= name
;
1170 globalize_decl (decl
);
1172 maybe_assemble_visibility (decl
);
1175 /* Do any machine/system dependent processing of the function name */
1176 #ifdef ASM_DECLARE_FUNCTION_NAME
1177 ASM_DECLARE_FUNCTION_NAME (asm_out_file
, fnname
, current_function_decl
);
1179 /* Standard thing is just output label for the function. */
1180 ASM_OUTPUT_LABEL (asm_out_file
, fnname
);
1181 #endif /* ASM_DECLARE_FUNCTION_NAME */
1184 /* Output assembler code associated with defining the size of the
1185 function. DECL describes the function. NAME is the function's name. */
1188 assemble_end_function (decl
, fnname
)
1192 #ifdef ASM_DECLARE_FUNCTION_SIZE
1193 ASM_DECLARE_FUNCTION_SIZE (asm_out_file
, fnname
, decl
);
1195 if (! CONSTANT_POOL_BEFORE_FUNCTION
)
1197 output_constant_pool (fnname
, decl
);
1198 function_section (decl
); /* need to switch back */
1202 /* Assemble code to leave SIZE bytes of zeros. */
1205 assemble_zeros (size
)
1208 /* Do no output if -fsyntax-only. */
1209 if (flag_syntax_only
)
1212 #ifdef ASM_NO_SKIP_IN_TEXT
1213 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1214 so we must output 0s explicitly in the text section. */
1215 if (ASM_NO_SKIP_IN_TEXT
&& in_text_section ())
1218 for (i
= 0; i
< size
; i
++)
1219 assemble_integer (const0_rtx
, 1, BITS_PER_UNIT
, 1);
1224 ASM_OUTPUT_SKIP (asm_out_file
, size
);
1227 /* Assemble an alignment pseudo op for an ALIGN-bit boundary. */
1230 assemble_align (align
)
1233 if (align
> BITS_PER_UNIT
)
1235 ASM_OUTPUT_ALIGN (asm_out_file
, floor_log2 (align
/ BITS_PER_UNIT
));
1239 /* Assemble a string constant with the specified C string as contents. */
1242 assemble_string (p
, size
)
1249 /* If the string is very long, split it up. */
1253 int thissize
= size
- pos
;
1254 if (thissize
> maximum
)
1257 ASM_OUTPUT_ASCII (asm_out_file
, p
, thissize
);
1265 #if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1266 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1267 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1269 #if defined ASM_OUTPUT_ALIGNED_LOCAL
1270 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1271 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl))
1273 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1274 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded)
1278 #if defined ASM_OUTPUT_ALIGNED_BSS
1279 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1280 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1282 #if defined ASM_OUTPUT_BSS
1283 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1284 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded)
1290 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1291 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1292 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1294 #if defined ASM_OUTPUT_ALIGNED_COMMON
1295 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1296 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl))
1298 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1299 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded)
1304 asm_emit_uninitialised (decl
, name
, size
, rounded
)
1307 int size ATTRIBUTE_UNUSED
;
1308 int rounded ATTRIBUTE_UNUSED
;
1316 destination
= asm_dest_local
;
1318 /* ??? We should handle .bss via select_section mechanisms rather than
1319 via special target hooks. That would eliminate this special case. */
1320 if (TREE_PUBLIC (decl
))
1322 if (!DECL_COMMON (decl
))
1324 destination
= asm_dest_bss
;
1329 destination
= asm_dest_common
;
1332 if (destination
== asm_dest_bss
)
1333 globalize_decl (decl
);
1334 resolve_unique_section (decl
, 0, flag_data_sections
);
1336 if (flag_shared_data
)
1338 switch (destination
)
1340 #ifdef ASM_OUTPUT_SHARED_BSS
1342 ASM_OUTPUT_SHARED_BSS (asm_out_file
, decl
, name
, size
, rounded
);
1345 #ifdef ASM_OUTPUT_SHARED_COMMON
1346 case asm_dest_common
:
1347 ASM_OUTPUT_SHARED_COMMON (asm_out_file
, name
, size
, rounded
);
1350 #ifdef ASM_OUTPUT_SHARED_LOCAL
1351 case asm_dest_local
:
1352 ASM_OUTPUT_SHARED_LOCAL (asm_out_file
, name
, size
, rounded
);
1360 switch (destination
)
1364 ASM_EMIT_BSS (decl
, name
, size
, rounded
);
1367 case asm_dest_common
:
1368 ASM_EMIT_COMMON (decl
, name
, size
, rounded
);
1370 case asm_dest_local
:
1371 ASM_EMIT_LOCAL (decl
, name
, size
, rounded
);
1380 /* Assemble everything that is needed for a variable or function declaration.
1381 Not used for automatic variables, and not used for function definitions.
1382 Should not be called for variables of incomplete structure type.
1384 TOP_LEVEL is nonzero if this variable has file scope.
1385 AT_END is nonzero if this is the special handling, at end of compilation,
1386 to define things that have had only tentative definitions.
1387 DONT_OUTPUT_DATA if nonzero means don't actually output the
1388 initial value (that will be done by the caller). */
1391 assemble_variable (decl
, top_level
, at_end
, dont_output_data
)
1393 int top_level ATTRIBUTE_UNUSED
;
1394 int at_end ATTRIBUTE_UNUSED
;
1395 int dont_output_data
;
1402 last_assemble_variable_decl
= 0;
1404 /* Normally no need to say anything here for external references,
1405 since assemble_external is called by the language-specific code
1406 when a declaration is first seen. */
1408 if (DECL_EXTERNAL (decl
))
1411 /* Output no assembler code for a function declaration.
1412 Only definitions of functions output anything. */
1414 if (TREE_CODE (decl
) == FUNCTION_DECL
)
1417 /* Do nothing for global register variables. */
1418 if (DECL_RTL_SET_P (decl
) && GET_CODE (DECL_RTL (decl
)) == REG
)
1420 TREE_ASM_WRITTEN (decl
) = 1;
1424 /* If type was incomplete when the variable was declared,
1425 see if it is complete now. */
1427 if (DECL_SIZE (decl
) == 0)
1428 layout_decl (decl
, 0);
1430 /* Still incomplete => don't allocate it; treat the tentative defn
1431 (which is what it must have been) as an `extern' reference. */
1433 if (!dont_output_data
&& DECL_SIZE (decl
) == 0)
1435 error_with_file_and_line (DECL_SOURCE_FILE (decl
),
1436 DECL_SOURCE_LINE (decl
),
1437 "storage size of `%s' isn't known",
1438 IDENTIFIER_POINTER (DECL_NAME (decl
)));
1439 TREE_ASM_WRITTEN (decl
) = 1;
1443 /* The first declaration of a variable that comes through this function
1444 decides whether it is global (in C, has external linkage)
1445 or local (in C, has internal linkage). So do nothing more
1446 if this function has already run. */
1448 if (TREE_ASM_WRITTEN (decl
))
1451 /* Make sure targetm.encode_section_info is invoked before we set
1453 decl_rtl
= DECL_RTL (decl
);
1455 TREE_ASM_WRITTEN (decl
) = 1;
1457 /* Do no output if -fsyntax-only. */
1458 if (flag_syntax_only
)
1463 if (! dont_output_data
1464 && ! host_integerp (DECL_SIZE_UNIT (decl
), 1))
1466 error_with_decl (decl
, "size of variable `%s' is too large");
1470 name
= XSTR (XEXP (decl_rtl
, 0), 0);
1471 if (TREE_PUBLIC (decl
) && DECL_NAME (decl
)
1472 && ! first_global_object_name
1473 && ! (DECL_COMMON (decl
) && (DECL_INITIAL (decl
) == 0
1474 || DECL_INITIAL (decl
) == error_mark_node
))
1475 && ! DECL_WEAK (decl
)
1476 && ! DECL_ONE_ONLY (decl
))
1481 p
= (* targetm
.strip_name_encoding
) (name
);
1482 xname
= xstrdup (p
);
1483 first_global_object_name
= xname
;
1486 /* Compute the alignment of this data. */
1488 align
= DECL_ALIGN (decl
);
1490 /* In the case for initialing an array whose length isn't specified,
1491 where we have not yet been able to do the layout,
1492 figure out the proper alignment now. */
1493 if (dont_output_data
&& DECL_SIZE (decl
) == 0
1494 && TREE_CODE (TREE_TYPE (decl
)) == ARRAY_TYPE
)
1495 align
= MAX (align
, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl
))));
1497 /* Some object file formats have a maximum alignment which they support.
1498 In particular, a.out format supports a maximum alignment of 4. */
1499 #ifndef MAX_OFILE_ALIGNMENT
1500 #define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
1502 if (align
> MAX_OFILE_ALIGNMENT
)
1504 warning_with_decl (decl
,
1505 "alignment of `%s' is greater than maximum object file alignment. Using %d",
1506 MAX_OFILE_ALIGNMENT
/BITS_PER_UNIT
);
1507 align
= MAX_OFILE_ALIGNMENT
;
1510 /* On some machines, it is good to increase alignment sometimes. */
1511 if (! DECL_USER_ALIGN (decl
))
1513 #ifdef DATA_ALIGNMENT
1514 align
= DATA_ALIGNMENT (TREE_TYPE (decl
), align
);
1516 #ifdef CONSTANT_ALIGNMENT
1517 if (DECL_INITIAL (decl
) != 0 && DECL_INITIAL (decl
) != error_mark_node
)
1518 align
= CONSTANT_ALIGNMENT (DECL_INITIAL (decl
), align
);
1522 /* Reset the alignment in case we have made it tighter, so we can benefit
1523 from it in get_pointer_alignment. */
1524 DECL_ALIGN (decl
) = align
;
1525 set_mem_align (decl_rtl
, align
);
1527 if (TREE_PUBLIC (decl
))
1528 maybe_assemble_visibility (decl
);
1530 /* Output any data that we will need to use the address of. */
1531 if (DECL_INITIAL (decl
) == error_mark_node
)
1532 reloc
= contains_pointers_p (TREE_TYPE (decl
)) ? 3 : 0;
1533 else if (DECL_INITIAL (decl
))
1534 reloc
= output_addressed_constants (DECL_INITIAL (decl
));
1535 resolve_unique_section (decl
, reloc
, flag_data_sections
);
1537 /* Handle uninitialized definitions. */
1539 /* If the decl has been given an explicit section name, then it
1540 isn't common, and shouldn't be handled as such. */
1541 if (DECL_SECTION_NAME (decl
) || dont_output_data
)
1543 /* We don't implement common thread-local data at present. */
1544 else if (DECL_THREAD_LOCAL (decl
))
1546 if (DECL_COMMON (decl
))
1547 sorry ("thread-local COMMON data not implemented");
1549 else if (DECL_INITIAL (decl
) == 0
1550 || DECL_INITIAL (decl
) == error_mark_node
1551 || (flag_zero_initialized_in_bss
1552 /* Leave constant zeroes in .rodata so they can be shared. */
1553 && !TREE_READONLY (decl
)
1554 && initializer_zerop (DECL_INITIAL (decl
))))
1556 unsigned HOST_WIDE_INT size
= tree_low_cst (DECL_SIZE_UNIT (decl
), 1);
1557 unsigned HOST_WIDE_INT rounded
= size
;
1559 /* Don't allocate zero bytes of common,
1560 since that means "undefined external" in the linker. */
1564 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1565 so that each uninitialized object starts on such a boundary. */
1566 rounded
+= (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
) - 1;
1567 rounded
= (rounded
/ (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
)
1568 * (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
));
1570 #if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_DECL_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
1571 if ((unsigned HOST_WIDE_INT
) DECL_ALIGN (decl
) / BITS_PER_UNIT
> rounded
)
1573 (decl
, "requested alignment for %s is greater than implemented alignment of %d",rounded
);
1576 /* If the target cannot output uninitialized but not common global data
1577 in .bss, then we have to use .data, so fall through. */
1578 if (asm_emit_uninitialised (decl
, name
, size
, rounded
))
1582 /* Handle initialized definitions.
1583 Also handle uninitialized global definitions if -fno-common and the
1584 target doesn't support ASM_OUTPUT_BSS. */
1586 /* First make the assembler name(s) global if appropriate. */
1587 if (TREE_PUBLIC (decl
) && DECL_NAME (decl
))
1588 globalize_decl (decl
);
1590 /* Switch to the appropriate section. */
1591 variable_section (decl
, reloc
);
1593 /* dbxout.c needs to know this. */
1594 if (in_text_section ())
1595 DECL_IN_TEXT_SECTION (decl
) = 1;
1597 /* Output the alignment of this data. */
1598 if (align
> BITS_PER_UNIT
)
1600 ASM_OUTPUT_ALIGN (asm_out_file
,
1601 floor_log2 (DECL_ALIGN (decl
) / BITS_PER_UNIT
));
1604 /* Do any machine/system dependent processing of the object. */
1605 #ifdef ASM_DECLARE_OBJECT_NAME
1606 last_assemble_variable_decl
= decl
;
1607 ASM_DECLARE_OBJECT_NAME (asm_out_file
, name
, decl
);
1609 /* Standard thing is just output label for the object. */
1610 ASM_OUTPUT_LABEL (asm_out_file
, name
);
1611 #endif /* ASM_DECLARE_OBJECT_NAME */
1613 if (!dont_output_data
)
1615 if (DECL_INITIAL (decl
) && DECL_INITIAL (decl
) != error_mark_node
)
1616 /* Output the actual data. */
1617 output_constant (DECL_INITIAL (decl
),
1618 tree_low_cst (DECL_SIZE_UNIT (decl
), 1),
1621 /* Leave space for it. */
1622 assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl
), 1));
1626 /* Return 1 if type TYPE contains any pointers. */
1629 contains_pointers_p (type
)
1632 switch (TREE_CODE (type
))
1635 case REFERENCE_TYPE
:
1636 /* I'm not sure whether OFFSET_TYPE needs this treatment,
1637 so I'll play safe and return 1. */
1643 case QUAL_UNION_TYPE
:
1646 /* For a type that has fields, see if the fields have pointers. */
1647 for (fields
= TYPE_FIELDS (type
); fields
; fields
= TREE_CHAIN (fields
))
1648 if (TREE_CODE (fields
) == FIELD_DECL
1649 && contains_pointers_p (TREE_TYPE (fields
)))
1655 /* An array type contains pointers if its element type does. */
1656 return contains_pointers_p (TREE_TYPE (type
));
1663 /* Output something to declare an external symbol to the assembler.
1664 (Most assemblers don't need this, so we normally output nothing.)
1665 Do nothing if DECL is not external. */
1668 assemble_external (decl
)
1669 tree decl ATTRIBUTE_UNUSED
;
1671 /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
1672 main body of this code is only rarely exercised. To provide some
1673 testing, on all platforms, we make sure that the ASM_OUT_FILE is
1674 open. If it's not, we should not be calling this function. */
1678 #ifdef ASM_OUTPUT_EXTERNAL
1679 if (DECL_P (decl
) && DECL_EXTERNAL (decl
) && TREE_PUBLIC (decl
))
1681 rtx rtl
= DECL_RTL (decl
);
1683 if (GET_CODE (rtl
) == MEM
&& GET_CODE (XEXP (rtl
, 0)) == SYMBOL_REF
1684 && ! SYMBOL_REF_USED (XEXP (rtl
, 0)))
1686 /* Some systems do require some output. */
1687 SYMBOL_REF_USED (XEXP (rtl
, 0)) = 1;
1688 ASM_OUTPUT_EXTERNAL (asm_out_file
, decl
, XSTR (XEXP (rtl
, 0), 0));
1694 /* Similar, for calling a library function FUN. */
1697 assemble_external_libcall (fun
)
1698 rtx fun ATTRIBUTE_UNUSED
;
1700 #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
1701 /* Declare library function name external when first used, if nec. */
1702 if (! SYMBOL_REF_USED (fun
))
1704 SYMBOL_REF_USED (fun
) = 1;
1705 ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file
, fun
);
1710 /* Assemble a label named NAME. */
1713 assemble_label (name
)
1716 ASM_OUTPUT_LABEL (asm_out_file
, name
);
1719 /* Output to FILE a reference to the assembler name of a C-level name NAME.
1720 If NAME starts with a *, the rest of NAME is output verbatim.
1721 Otherwise NAME is transformed in an implementation-defined way
1722 (usually by the addition of an underscore).
1723 Many macros in the tm file are defined to call this function. */
1726 assemble_name (file
, name
)
1730 const char *real_name
;
1733 real_name
= (* targetm
.strip_name_encoding
) (name
);
1735 id
= maybe_get_identifier (real_name
);
1737 TREE_SYMBOL_REFERENCED (id
) = 1;
1740 fputs (&name
[1], file
);
1742 ASM_OUTPUT_LABELREF (file
, name
);
1745 /* Allocate SIZE bytes writable static space with a gensym name
1746 and return an RTX to refer to its address. */
1749 assemble_static_space (size
)
1753 const char *namestring
;
1757 if (flag_shared_data
)
1761 ASM_GENERATE_INTERNAL_LABEL (name
, "LF", const_labelno
);
1763 namestring
= ggc_strdup (name
);
1765 x
= gen_rtx_SYMBOL_REF (Pmode
, namestring
);
1766 SYMBOL_REF_FLAGS (x
) = SYMBOL_FLAG_LOCAL
;
1768 #ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
1769 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file
, NULL_TREE
, name
, size
,
1772 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
1773 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file
, name
, size
, BIGGEST_ALIGNMENT
);
1776 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1777 so that each uninitialized object starts on such a boundary. */
1778 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */
1779 int rounded ATTRIBUTE_UNUSED
1780 = ((size
+ (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
) - 1)
1781 / (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
)
1782 * (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
));
1783 ASM_OUTPUT_LOCAL (asm_out_file
, name
, size
, rounded
);
1790 /* Assemble the static constant template for function entry trampolines.
1791 This is done at most once per compilation.
1792 Returns an RTX for the address of the template. */
1794 #ifdef TRAMPOLINE_TEMPLATE
1796 assemble_trampoline_template ()
1803 /* By default, put trampoline templates in read-only data section. */
1805 #ifdef TRAMPOLINE_SECTION
1806 TRAMPOLINE_SECTION ();
1808 readonly_data_section ();
1811 /* Write the assembler code to define one. */
1812 align
= floor_log2 (TRAMPOLINE_ALIGNMENT
/ BITS_PER_UNIT
);
1815 ASM_OUTPUT_ALIGN (asm_out_file
, align
);
1818 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "LTRAMP", 0);
1819 TRAMPOLINE_TEMPLATE (asm_out_file
);
1821 /* Record the rtl to refer to it. */
1822 ASM_GENERATE_INTERNAL_LABEL (label
, "LTRAMP", 0);
1823 name
= ggc_strdup (label
);
1824 symbol
= gen_rtx_SYMBOL_REF (Pmode
, name
);
1825 SYMBOL_REF_FLAGS (symbol
) = SYMBOL_FLAG_LOCAL
;
1831 /* A and B are either alignments or offsets. Return the minimum alignment
1832 that may be assumed after adding the two together. */
1834 static inline unsigned
1838 return (a
| b
) & -(a
| b
);
1841 /* Return the assembler directive for creating a given kind of integer
1842 object. SIZE is the number of bytes in the object and ALIGNED_P
1843 indicates whether it is known to be aligned. Return NULL if the
1844 assembly dialect has no such directive.
1846 The returned string should be printed at the start of a new line and
1847 be followed immediately by the object's initial value. */
1850 integer_asm_op (size
, aligned_p
)
1854 struct asm_int_op
*ops
;
1857 ops
= &targetm
.asm_out
.aligned_op
;
1859 ops
= &targetm
.asm_out
.unaligned_op
;
1864 return targetm
.asm_out
.byte_op
;
1878 /* Use directive OP to assemble an integer object X. Print OP at the
1879 start of the line, followed immediately by the value of X. */
1882 assemble_integer_with_op (op
, x
)
1886 fputs (op
, asm_out_file
);
1887 output_addr_const (asm_out_file
, x
);
1888 fputc ('\n', asm_out_file
);
1891 /* The default implementation of the asm_out.integer target hook. */
1894 default_assemble_integer (x
, size
, aligned_p
)
1895 rtx x ATTRIBUTE_UNUSED
;
1896 unsigned int size ATTRIBUTE_UNUSED
;
1897 int aligned_p ATTRIBUTE_UNUSED
;
1899 const char *op
= integer_asm_op (size
, aligned_p
);
1900 return op
&& (assemble_integer_with_op (op
, x
), true);
1903 /* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
1904 the alignment of the integer in bits. Return 1 if we were able to output
1905 the constant, otherwise 0. If FORCE is nonzero, abort if we can't output
1909 assemble_integer (x
, size
, align
, force
)
1917 aligned_p
= (align
>= MIN (size
* BITS_PER_UNIT
, BIGGEST_ALIGNMENT
));
1919 /* See if the target hook can handle this kind of object. */
1920 if ((*targetm
.asm_out
.integer
) (x
, size
, aligned_p
))
1923 /* If the object is a multi-byte one, try splitting it up. Split
1924 it into words it if is multi-word, otherwise split it into bytes. */
1927 enum machine_mode omode
, imode
;
1928 unsigned int subalign
;
1929 unsigned int subsize
, i
;
1931 subsize
= size
> UNITS_PER_WORD
? UNITS_PER_WORD
: 1;
1932 subalign
= MIN (align
, subsize
* BITS_PER_UNIT
);
1933 omode
= mode_for_size (subsize
* BITS_PER_UNIT
, MODE_INT
, 0);
1934 imode
= mode_for_size (size
* BITS_PER_UNIT
, MODE_INT
, 0);
1936 for (i
= 0; i
< size
; i
+= subsize
)
1938 rtx partial
= simplify_subreg (omode
, x
, imode
, i
);
1939 if (!partial
|| !assemble_integer (partial
, subsize
, subalign
, 0))
1945 /* If we've printed some of it, but not all of it, there's no going
1958 assemble_real (d
, mode
, align
)
1960 enum machine_mode mode
;
1965 unsigned int nalign
= min_align (align
, 32);
1967 switch (BITS_PER_UNIT
)
1973 REAL_VALUE_TO_TARGET_SINGLE (d
, l
);
1974 assemble_integer (GEN_INT (l
), 4, align
, 1);
1977 REAL_VALUE_TO_TARGET_DOUBLE (d
, data
);
1978 assemble_integer (GEN_INT (data
[0]), 4, align
, 1);
1979 assemble_integer (GEN_INT (data
[1]), 4, nalign
, 1);
1982 REAL_VALUE_TO_TARGET_LONG_DOUBLE (d
, data
);
1983 assemble_integer (GEN_INT (data
[0]), 4, align
, 1);
1984 assemble_integer (GEN_INT (data
[1]), 4, nalign
, 1);
1985 assemble_integer (GEN_INT (data
[2]), 4, nalign
, 1);
1988 REAL_VALUE_TO_TARGET_LONG_DOUBLE (d
, data
);
1989 assemble_integer (GEN_INT (data
[0]), 4, align
, 1);
1990 assemble_integer (GEN_INT (data
[1]), 4, nalign
, 1);
1991 assemble_integer (GEN_INT (data
[2]), 4, nalign
, 1);
1992 assemble_integer (GEN_INT (data
[3]), 4, nalign
, 1);
2003 REAL_VALUE_TO_TARGET_SINGLE (d
, l
);
2004 assemble_integer (GEN_INT (l
), 2, align
, 1);
2007 REAL_VALUE_TO_TARGET_DOUBLE (d
, data
);
2008 assemble_integer (GEN_INT (data
[0]), 2, align
, 1);
2009 assemble_integer (GEN_INT (data
[1]), 1, nalign
, 1);
2020 REAL_VALUE_TO_TARGET_SINGLE (d
, l
);
2021 assemble_integer (GEN_INT (l
), 1, align
, 1);
2024 REAL_VALUE_TO_TARGET_DOUBLE (d
, data
);
2025 assemble_integer (GEN_INT (data
[0]), 1, align
, 1);
2026 assemble_integer (GEN_INT (data
[1]), 1, nalign
, 1);
2038 /* Given an expression EXP with a constant value,
2039 reduce it to the sum of an assembler symbol and an integer.
2040 Store them both in the structure *VALUE.
2041 Abort if EXP does not reduce. */
2043 struct addr_const
GTY(())
2046 HOST_WIDE_INT offset
;
2050 decode_addr_const (exp
, value
)
2052 struct addr_const
*value
;
2054 tree target
= TREE_OPERAND (exp
, 0);
2060 if (TREE_CODE (target
) == COMPONENT_REF
2061 && host_integerp (byte_position (TREE_OPERAND (target
, 1)), 0))
2064 offset
+= int_byte_position (TREE_OPERAND (target
, 1));
2065 target
= TREE_OPERAND (target
, 0);
2067 else if (TREE_CODE (target
) == ARRAY_REF
2068 || TREE_CODE (target
) == ARRAY_RANGE_REF
)
2070 offset
+= (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target
)), 1)
2071 * tree_low_cst (TREE_OPERAND (target
, 1), 0));
2072 target
= TREE_OPERAND (target
, 0);
2078 switch (TREE_CODE (target
))
2082 x
= DECL_RTL (target
);
2086 x
= gen_rtx_MEM (FUNCTION_MODE
,
2087 gen_rtx_LABEL_REF (VOIDmode
,
2088 label_rtx (TREE_OPERAND (exp
, 0))));
2096 /* This constant should have been output already, but we can't simply
2097 use TREE_CST_RTL since INTEGER_CST doesn't have one. */
2098 x
= output_constant_def (target
, 1);
2105 if (GET_CODE (x
) != MEM
)
2110 value
->offset
= offset
;
2113 /* We do RTX_UNSPEC + XINT (blah), so nothing can go after RTX_UNSPEC. */
2114 enum kind
{ RTX_UNKNOWN
, RTX_DOUBLE
, RTX_VECTOR
, RTX_INT
, RTX_UNSPEC
};
2115 struct rtx_const
GTY(())
2117 ENUM_BITFIELD(kind
) kind
: 16;
2118 ENUM_BITFIELD(machine_mode
) mode
: 16;
2119 union rtx_const_un
{
2120 REAL_VALUE_TYPE
GTY ((tag ("4"))) du
;
2121 struct rtx_const_u_addr
{
2124 HOST_WIDE_INT offset
;
2125 } GTY ((tag ("1"))) addr
;
2126 struct rtx_const_u_di
{
2129 } GTY ((tag ("0"))) di
;
2131 /* The max vector size we have is 16 wide; two variants for
2132 integral and floating point vectors. */
2133 struct rtx_const_int_vec
{
2136 } GTY ((tag ("2"))) int_vec
[16];
2138 REAL_VALUE_TYPE
GTY ((tag ("3"))) fp_vec
[8];
2140 } GTY ((desc ("%1.kind >= RTX_INT"), descbits ("1"))) un
;
2143 /* Uniquize all constants that appear in memory.
2144 Each constant in memory thus far output is recorded
2145 in `const_hash_table'. */
2147 struct constant_descriptor_tree
GTY(())
2149 /* More constant_descriptors with the same hash code. */
2150 struct constant_descriptor_tree
*next
;
2152 /* The label of the constant. */
2155 /* A MEM for the constant. */
2158 /* The value of the constant. */
2162 #define MAX_HASH_TABLE 1009
2163 static GTY(()) struct constant_descriptor_tree
*
2164 const_hash_table
[MAX_HASH_TABLE
];
2166 static struct constant_descriptor_tree
* build_constant_desc
PARAMS ((tree
));
2167 static unsigned int n_deferred_strings
= 0;
2169 /* Compute a hash code for a constant expression. */
2175 return const_hash_1 (exp
) % MAX_HASH_TABLE
;
2185 enum tree_code code
= TREE_CODE (exp
);
2187 /* Either set P and LEN to the address and len of something to hash and
2188 exit the switch or return a value. */
2193 p
= (char *) &TREE_INT_CST (exp
);
2194 len
= sizeof TREE_INT_CST (exp
);
2198 return real_hash (TREE_REAL_CST_PTR (exp
));
2201 p
= TREE_STRING_POINTER (exp
);
2202 len
= TREE_STRING_LENGTH (exp
);
2206 return (const_hash_1 (TREE_REALPART (exp
)) * 5
2207 + const_hash_1 (TREE_IMAGPART (exp
)));
2210 if (TREE_CODE (TREE_TYPE (exp
)) == SET_TYPE
)
2214 len
= int_size_in_bytes (TREE_TYPE (exp
));
2215 tmp
= (char *) alloca (len
);
2216 get_set_constructor_bytes (exp
, (unsigned char *) tmp
, len
);
2224 hi
= 5 + int_size_in_bytes (TREE_TYPE (exp
));
2226 for (link
= CONSTRUCTOR_ELTS (exp
); link
; link
= TREE_CHAIN (link
))
2227 if (TREE_VALUE (link
))
2228 hi
= hi
* 603 + const_hash_1 (TREE_VALUE (link
));
2236 struct addr_const value
;
2238 decode_addr_const (exp
, &value
);
2239 if (GET_CODE (value
.base
) == SYMBOL_REF
)
2241 /* Don't hash the address of the SYMBOL_REF;
2242 only use the offset and the symbol name. */
2244 p
= XSTR (value
.base
, 0);
2245 for (i
= 0; p
[i
] != 0; i
++)
2246 hi
= ((hi
* 613) + (unsigned) (p
[i
]));
2248 else if (GET_CODE (value
.base
) == LABEL_REF
)
2249 hi
= value
.offset
+ CODE_LABEL_NUMBER (XEXP (value
.base
, 0)) * 13;
2257 return (const_hash_1 (TREE_OPERAND (exp
, 0)) * 9
2258 + const_hash_1 (TREE_OPERAND (exp
, 1)));
2262 case NON_LVALUE_EXPR
:
2263 return const_hash_1 (TREE_OPERAND (exp
, 0)) * 7 + 2;
2266 /* A language specific constant. Just hash the code. */
2270 /* Compute hashing function */
2272 for (i
= 0; i
< len
; i
++)
2273 hi
= ((hi
* 613) + (unsigned) (p
[i
]));
2278 /* Compare t1 and t2, and return 1 only if they are known to result in
2279 the same bit pattern on output. */
2282 compare_constant (t1
, t2
)
2286 enum tree_code typecode
;
2288 if (t1
== NULL_TREE
)
2289 return t2
== NULL_TREE
;
2290 if (t2
== NULL_TREE
)
2293 if (TREE_CODE (t1
) != TREE_CODE (t2
))
2296 switch (TREE_CODE (t1
))
2299 /* Integer constants are the same only if the same width of type. */
2300 if (TYPE_PRECISION (TREE_TYPE (t1
)) != TYPE_PRECISION (TREE_TYPE (t2
)))
2302 return tree_int_cst_equal (t1
, t2
);
2305 /* Real constants are the same only if the same width of type. */
2306 if (TYPE_PRECISION (TREE_TYPE (t1
)) != TYPE_PRECISION (TREE_TYPE (t2
)))
2309 return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1
), TREE_REAL_CST (t2
));
2312 if (flag_writable_strings
)
2315 if (TYPE_MODE (TREE_TYPE (t1
)) != TYPE_MODE (TREE_TYPE (t2
)))
2318 return (TREE_STRING_LENGTH (t1
) == TREE_STRING_LENGTH (t2
)
2319 && ! memcmp (TREE_STRING_POINTER (t1
), TREE_STRING_POINTER (t2
),
2320 TREE_STRING_LENGTH (t1
)));
2323 return (compare_constant (TREE_REALPART (t1
), TREE_REALPART (t2
))
2324 && compare_constant (TREE_IMAGPART (t1
), TREE_IMAGPART (t2
)));
2327 typecode
= TREE_CODE (TREE_TYPE (t1
));
2328 if (typecode
!= TREE_CODE (TREE_TYPE (t2
)))
2331 if (typecode
== SET_TYPE
)
2333 int len
= int_size_in_bytes (TREE_TYPE (t2
));
2334 unsigned char *tmp1
, *tmp2
;
2336 if (int_size_in_bytes (TREE_TYPE (t1
)) != len
)
2339 tmp1
= (unsigned char *) alloca (len
);
2340 tmp2
= (unsigned char *) alloca (len
);
2342 if (get_set_constructor_bytes (t1
, tmp1
, len
) != NULL_TREE
)
2344 if (get_set_constructor_bytes (t2
, tmp2
, len
) != NULL_TREE
)
2347 return memcmp (tmp1
, tmp2
, len
) != 0;
2353 if (typecode
== ARRAY_TYPE
)
2355 HOST_WIDE_INT size_1
= int_size_in_bytes (TREE_TYPE (t1
));
2356 /* For arrays, check that the sizes all match. */
2357 if (TYPE_MODE (TREE_TYPE (t1
)) != TYPE_MODE (TREE_TYPE (t2
))
2359 || size_1
!= int_size_in_bytes (TREE_TYPE (t2
)))
2364 /* For record and union constructors, require exact type
2366 if (TREE_TYPE (t1
) != TREE_TYPE (t2
))
2370 for (l1
= CONSTRUCTOR_ELTS (t1
), l2
= CONSTRUCTOR_ELTS (t2
);
2372 l1
= TREE_CHAIN (l1
), l2
= TREE_CHAIN (l2
))
2374 /* Check that each value is the same... */
2375 if (! compare_constant (TREE_VALUE (l1
), TREE_VALUE (l2
)))
2377 /* ... and that they apply to the same fields! */
2378 if (typecode
== ARRAY_TYPE
)
2380 if (! compare_constant (TREE_PURPOSE (l1
),
2386 if (TREE_PURPOSE (l1
) != TREE_PURPOSE (l2
))
2391 return l1
== NULL_TREE
&& l2
== NULL_TREE
;
2397 struct addr_const value1
, value2
;
2399 decode_addr_const (t1
, &value1
);
2400 decode_addr_const (t2
, &value2
);
2401 return (value1
.offset
== value2
.offset
2402 && strcmp (XSTR (value1
.base
, 0), XSTR (value2
.base
, 0)) == 0);
2408 return (compare_constant (TREE_OPERAND (t1
, 0), TREE_OPERAND (t2
, 0))
2409 && compare_constant(TREE_OPERAND (t1
, 1), TREE_OPERAND (t2
, 1)));
2413 case NON_LVALUE_EXPR
:
2414 return compare_constant (TREE_OPERAND (t1
, 0), TREE_OPERAND (t2
, 0));
2419 nt1
= (*lang_hooks
.expand_constant
) (t1
);
2420 nt2
= (*lang_hooks
.expand_constant
) (t2
);
2421 if (nt1
!= t1
|| nt2
!= t2
)
2422 return compare_constant (nt1
, nt2
);
2428 /* Should not get here. */
2432 /* Make a copy of the whole tree structure for a constant. This
2433 handles the same types of nodes that compare_constant handles. */
2439 switch (TREE_CODE (exp
))
2442 /* For ADDR_EXPR, we do not want to copy the decl whose address
2443 is requested. We do want to copy constants though. */
2444 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp
, 0))) == 'c')
2445 return build1 (TREE_CODE (exp
), TREE_TYPE (exp
),
2446 copy_constant (TREE_OPERAND (exp
, 0)));
2448 return copy_node (exp
);
2453 return copy_node (exp
);
2456 return build_complex (TREE_TYPE (exp
),
2457 copy_constant (TREE_REALPART (exp
)),
2458 copy_constant (TREE_IMAGPART (exp
)));
2462 return build (TREE_CODE (exp
), TREE_TYPE (exp
),
2463 copy_constant (TREE_OPERAND (exp
, 0)),
2464 copy_constant (TREE_OPERAND (exp
, 1)));
2468 case NON_LVALUE_EXPR
:
2469 return build1 (TREE_CODE (exp
), TREE_TYPE (exp
),
2470 copy_constant (TREE_OPERAND (exp
, 0)));
2474 tree copy
= copy_node (exp
);
2475 tree list
= copy_list (CONSTRUCTOR_ELTS (exp
));
2478 CONSTRUCTOR_ELTS (copy
) = list
;
2479 for (tail
= list
; tail
; tail
= TREE_CHAIN (tail
))
2480 TREE_VALUE (tail
) = copy_constant (TREE_VALUE (tail
));
2481 if (TREE_CODE (TREE_TYPE (exp
)) == SET_TYPE
)
2482 for (tail
= list
; tail
; tail
= TREE_CHAIN (tail
))
2483 TREE_PURPOSE (tail
) = copy_constant (TREE_PURPOSE (tail
));
2491 t
= (*lang_hooks
.expand_constant
) (exp
);
2493 return copy_constant (t
);
2500 /* Subroutine of output_constant_def:
2501 No constant equal to EXP is known to have been output.
2502 Make a constant descriptor to enter EXP in the hash table.
2503 Assign the label number and construct RTL to refer to the
2504 constant's location in memory.
2505 Caller is responsible for updating the hash table. */
2507 static struct constant_descriptor_tree
*
2508 build_constant_desc (exp
)
2515 struct constant_descriptor_tree
*desc
;
2517 desc
= ggc_alloc (sizeof (*desc
));
2518 desc
->value
= copy_constant (exp
);
2520 /* Create a string containing the label name, in LABEL. */
2521 labelno
= const_labelno
++;
2522 ASM_GENERATE_INTERNAL_LABEL (label
, "LC", labelno
);
2524 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
2525 symbol
= gen_rtx_SYMBOL_REF (Pmode
, ggc_strdup (label
));
2526 SYMBOL_REF_FLAGS (symbol
) = SYMBOL_FLAG_LOCAL
;
2527 SYMBOL_REF_DECL (symbol
) = exp
;
2529 rtl
= gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp
)), symbol
);
2530 set_mem_attributes (rtl
, exp
, 1);
2531 set_mem_alias_set (rtl
, 0);
2532 set_mem_alias_set (rtl
, const_alias_set
);
2534 /* Set flags or add text to the name to record information, such as
2535 that it is a local symbol. If the name is changed, the macro
2536 ASM_OUTPUT_LABELREF will have to know how to strip this
2538 (*targetm
.encode_section_info
) (exp
, rtl
, true);
2541 desc
->label
= XSTR (XEXP (desc
->rtl
, 0), 0);
2546 /* Return an rtx representing a reference to constant data in memory
2547 for the constant expression EXP.
2549 If assembler code for such a constant has already been output,
2550 return an rtx to refer to it.
2551 Otherwise, output such a constant in memory
2552 and generate an rtx for it.
2554 If DEFER is nonzero, the output of string constants can be deferred
2555 and output only if referenced in the function after all optimizations.
2557 The TREE_CST_RTL of EXP is set up to point to that rtx.
2558 The const_hash_table records which constants already have label strings. */
2561 output_constant_def (exp
, defer
)
2566 struct constant_descriptor_tree
*desc
;
2568 /* We can't just use the saved RTL if this is a deferred string constant
2569 and we are not to defer anymore. */
2570 if (TREE_CODE (exp
) != INTEGER_CST
&& TREE_CST_RTL (exp
)
2571 && (defer
|| !STRING_POOL_ADDRESS_P (XEXP (TREE_CST_RTL (exp
), 0))))
2572 return TREE_CST_RTL (exp
);
2574 /* Compute hash code of EXP. Search the descriptors for that hash code
2575 to see if any of them describes EXP. If yes, the descriptor records
2576 the label number already assigned. */
2578 hash
= const_hash (exp
);
2579 for (desc
= const_hash_table
[hash
]; desc
; desc
= desc
->next
)
2580 if (compare_constant (exp
, desc
->value
))
2585 desc
= build_constant_desc (exp
);
2586 desc
->next
= const_hash_table
[hash
];
2587 const_hash_table
[hash
] = desc
;
2589 maybe_output_constant_def_contents (exp
, desc
->rtl
, defer
);
2591 else if (!defer
&& STRING_POOL_ADDRESS_P (XEXP (desc
->rtl
, 0)))
2593 /* This string is currently deferred but we need to output it
2594 now; mark it no longer deferred. */
2595 STRING_POOL_ADDRESS_P (XEXP (desc
->rtl
, 0)) = 0;
2596 n_deferred_strings
--;
2597 maybe_output_constant_def_contents (exp
, desc
->rtl
, 0);
2600 TREE_CST_RTL (exp
) = desc
->rtl
;
2604 /* Subroutine of output_constant_def:
2605 Decide whether or not to defer the output of EXP, which can be
2606 accesed through rtl RTL, and either do the output or record EXP in
2607 the table of deferred strings. */
2609 maybe_output_constant_def_contents (exp
, rtl
, defer
)
2614 if (flag_syntax_only
)
2617 /* Is this a string constant that can be deferred? */
2618 if (defer
&& TREE_CODE (exp
) == STRING_CST
&& !flag_writable_strings
)
2620 STRING_POOL_ADDRESS_P (XEXP (rtl
, 0)) = 1;
2621 n_deferred_strings
++;
2625 output_constant_def_contents (exp
, XSTR (XEXP (rtl
, 0), 0));
2628 /* Now output assembler code to define the label for EXP,
2629 and follow it with the data of EXP. */
2632 output_constant_def_contents (exp
, label
)
2636 /* Make sure any other constants whose addresses appear in EXP
2637 are assigned label numbers. */
2638 int reloc
= output_addressed_constants (exp
);
2640 /* Align the location counter as required by EXP's data type. */
2641 int align
= TYPE_ALIGN (TREE_TYPE (exp
));
2642 #ifdef CONSTANT_ALIGNMENT
2643 align
= CONSTANT_ALIGNMENT (exp
, align
);
2646 if (IN_NAMED_SECTION (exp
))
2647 named_section (exp
, NULL
, reloc
);
2649 (*targetm
.asm_out
.select_section
) (exp
, reloc
, align
);
2651 if (align
> BITS_PER_UNIT
)
2653 ASM_OUTPUT_ALIGN (asm_out_file
, floor_log2 (align
/ BITS_PER_UNIT
));
2656 /* Output the label itself. */
2657 ASM_OUTPUT_LABEL (asm_out_file
, label
);
2659 /* Output the value of EXP. */
2660 output_constant (exp
,
2661 (TREE_CODE (exp
) == STRING_CST
2662 ? MAX (TREE_STRING_LENGTH (exp
),
2663 int_size_in_bytes (TREE_TYPE (exp
)))
2664 : int_size_in_bytes (TREE_TYPE (exp
))),
2669 /* Used in the hash tables to avoid outputting the same constant
2670 twice. Unlike 'struct constant_descriptor_tree', RTX constants
2671 are output once per function, not once per file; there seems
2672 to be no reason for the difference. */
2674 struct constant_descriptor_rtx
GTY(())
2676 /* More constant_descriptors with the same hash code. */
2677 struct constant_descriptor_rtx
*next
;
2679 /* A MEM for the constant. */
2682 /* The value of the constant. */
2683 struct rtx_const value
;
2686 /* Structure to represent sufficient information about a constant so that
2687 it can be output when the constant pool is output, so that function
2688 integration can be done, and to simplify handling on machines that reference
2689 constant pool as base+displacement. */
2691 struct pool_constant
GTY(())
2693 struct constant_descriptor_rtx
*desc
;
2694 struct pool_constant
*next
;
2695 struct pool_constant
*next_sym
;
2697 enum machine_mode mode
;
2700 HOST_WIDE_INT offset
;
2704 /* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
2705 The argument is XSTR (... , 0) */
2707 #define SYMHASH(LABEL) (((unsigned long) (LABEL)) % MAX_RTX_HASH_TABLE)
2709 /* Initialize constant pool hashing for a new function. */
2712 init_varasm_status (f
)
2715 struct varasm_status
*p
;
2716 p
= (struct varasm_status
*) ggc_alloc (sizeof (struct varasm_status
));
2718 p
->x_const_rtx_hash_table
2719 = ((struct constant_descriptor_rtx
**)
2720 ggc_alloc_cleared (MAX_RTX_HASH_TABLE
2721 * sizeof (struct constant_descriptor_rtx
*)));
2722 p
->x_const_rtx_sym_hash_table
2723 = ((struct pool_constant
**)
2724 ggc_alloc_cleared (MAX_RTX_HASH_TABLE
2725 * sizeof (struct pool_constant
*)));
2727 p
->x_first_pool
= p
->x_last_pool
= 0;
2728 p
->x_pool_offset
= 0;
2732 /* Express an rtx for a constant integer (perhaps symbolic)
2733 as the sum of a symbol or label plus an explicit integer.
2734 They are stored into VALUE. */
2737 decode_rtx_const (mode
, x
, value
)
2738 enum machine_mode mode
;
2740 struct rtx_const
*value
;
2742 /* Clear the whole structure, including any gaps. */
2743 memset (value
, 0, sizeof (struct rtx_const
));
2745 value
->kind
= RTX_INT
; /* Most usual kind. */
2748 switch (GET_CODE (x
))
2751 value
->kind
= RTX_DOUBLE
;
2752 if (GET_MODE (x
) != VOIDmode
)
2754 const REAL_VALUE_TYPE
*r
= CONST_DOUBLE_REAL_VALUE (x
);
2756 value
->mode
= GET_MODE (x
);
2758 /* Copy the REAL_VALUE_TYPE by members so that we don't
2759 copy garbage from the original structure into our
2760 carefully cleaned hashing structure. */
2761 value
->un
.du
.class = r
->class;
2762 value
->un
.du
.sign
= r
->sign
;
2769 value
->un
.du
.exp
= r
->exp
;
2772 memcpy (value
->un
.du
.sig
, r
->sig
, sizeof (r
->sig
));
2780 value
->un
.di
.low
= CONST_DOUBLE_LOW (x
);
2781 value
->un
.di
.high
= CONST_DOUBLE_HIGH (x
);
2789 units
= CONST_VECTOR_NUNITS (x
);
2790 value
->kind
= RTX_VECTOR
;
2793 if (GET_MODE_CLASS (mode
) == MODE_VECTOR_INT
)
2795 for (i
= 0; i
< units
; ++i
)
2797 rtx elt
= CONST_VECTOR_ELT (x
, i
);
2798 if (GET_CODE (elt
) == CONST_INT
)
2800 value
->un
.int_vec
[i
].low
= INTVAL (elt
);
2801 value
->un
.int_vec
[i
].high
= 0;
2805 value
->un
.int_vec
[i
].low
= CONST_DOUBLE_LOW (elt
);
2806 value
->un
.int_vec
[i
].high
= CONST_DOUBLE_HIGH (elt
);
2810 else if (GET_MODE_CLASS (mode
) == MODE_VECTOR_FLOAT
)
2812 for (i
= 0; i
< units
; ++i
)
2814 const REAL_VALUE_TYPE
*r
2815 = CONST_DOUBLE_REAL_VALUE (CONST_VECTOR_ELT (x
, i
));
2816 REAL_VALUE_TYPE
*d
= &value
->un
.fp_vec
[i
];
2818 /* Copy the REAL_VALUE_TYPE by members so that we don't
2819 copy garbage from the original structure into our
2820 carefully cleaned hashing structure. */
2821 d
->class = r
->class;
2832 memcpy (d
->sig
, r
->sig
, sizeof (r
->sig
));
2845 value
->un
.addr
.offset
= INTVAL (x
);
2851 value
->un
.addr
.base
= x
;
2856 if (GET_CODE (x
) == PLUS
&& GET_CODE (XEXP (x
, 1)) == CONST_INT
)
2858 value
->un
.addr
.base
= XEXP (x
, 0);
2859 value
->un
.addr
.offset
= INTVAL (XEXP (x
, 1));
2861 else if (GET_CODE (x
) == MINUS
&& GET_CODE (XEXP (x
, 1)) == CONST_INT
)
2863 value
->un
.addr
.base
= XEXP (x
, 0);
2864 value
->un
.addr
.offset
= - INTVAL (XEXP (x
, 1));
2868 value
->un
.addr
.base
= x
;
2869 value
->un
.addr
.offset
= 0;
2874 value
->kind
= RTX_UNKNOWN
;
2878 if (value
->kind
== RTX_INT
&& value
->un
.addr
.base
!= 0
2879 && GET_CODE (value
->un
.addr
.base
) == UNSPEC
)
2881 /* For a simple UNSPEC, the base is set to the
2882 operand, the kind field is set to the index of
2883 the unspec expression.
2884 Together with the code below, in case that
2885 the operand is a SYMBOL_REF or LABEL_REF,
2886 the address of the string or the code_label
2887 is taken as base. */
2888 if (XVECLEN (value
->un
.addr
.base
, 0) == 1)
2890 value
->kind
= RTX_UNSPEC
+ XINT (value
->un
.addr
.base
, 1);
2891 value
->un
.addr
.base
= XVECEXP (value
->un
.addr
.base
, 0, 0);
2895 if (value
->kind
>= RTX_INT
&& value
->un
.addr
.base
!= 0)
2896 switch (GET_CODE (value
->un
.addr
.base
))
2899 /* Use the string's address, not the SYMBOL_REF's address,
2900 for the sake of addresses of library routines. */
2901 value
->un
.addr
.symbol
= XSTR (value
->un
.addr
.base
, 0);
2902 value
->un
.addr
.base
= NULL_RTX
;
2906 /* For a LABEL_REF, compare labels. */
2907 value
->un
.addr
.base
= XEXP (value
->un
.addr
.base
, 0);
2914 /* Given a MINUS expression, simplify it if both sides
2915 include the same symbol. */
2918 simplify_subtraction (x
)
2921 struct rtx_const val0
, val1
;
2923 decode_rtx_const (GET_MODE (x
), XEXP (x
, 0), &val0
);
2924 decode_rtx_const (GET_MODE (x
), XEXP (x
, 1), &val1
);
2926 if (val0
.kind
>= RTX_INT
2927 && val0
.kind
== val1
.kind
2928 && val0
.un
.addr
.base
== val1
.un
.addr
.base
2929 && val0
.un
.addr
.symbol
== val1
.un
.addr
.symbol
)
2930 return GEN_INT (val0
.un
.addr
.offset
- val1
.un
.addr
.offset
);
2935 /* Compute a hash code for a constant RTL expression. */
2938 const_hash_rtx (mode
, x
)
2939 enum machine_mode mode
;
2943 struct rtx_const value
;
2944 unsigned int data
[sizeof(struct rtx_const
) / sizeof (unsigned int)];
2950 decode_rtx_const (mode
, x
, &u
.value
);
2952 /* Compute hashing function */
2954 for (i
= 0; i
< ARRAY_SIZE (u
.data
); i
++)
2955 hi
= hi
* 613 + u
.data
[i
];
2957 return hi
% MAX_RTX_HASH_TABLE
;
2960 /* Compare a constant rtl object X with a constant-descriptor DESC.
2961 Return 1 if DESC describes a constant with the same value as X. */
2964 compare_constant_rtx (mode
, x
, desc
)
2965 enum machine_mode mode
;
2967 struct constant_descriptor_rtx
*desc
;
2969 struct rtx_const value
;
2971 decode_rtx_const (mode
, x
, &value
);
2973 /* Compare constant contents. */
2974 return memcmp (&value
, &desc
->value
, sizeof (struct rtx_const
)) == 0;
2977 /* Construct a constant descriptor for the rtl-expression X.
2978 It is up to the caller to enter the descriptor in the hash table. */
2980 static struct constant_descriptor_rtx
*
2981 record_constant_rtx (mode
, x
)
2982 enum machine_mode mode
;
2985 struct constant_descriptor_rtx
*ptr
;
2987 ptr
= (struct constant_descriptor_rtx
*) ggc_alloc (sizeof (*ptr
));
2988 decode_rtx_const (mode
, x
, &ptr
->value
);
2993 /* Given a constant rtx X, return a MEM for the location in memory at which
2994 this constant has been placed. Return 0 if it not has been placed yet. */
2997 mem_for_const_double (x
)
3000 enum machine_mode mode
= GET_MODE (x
);
3001 struct constant_descriptor_rtx
*desc
;
3003 for (desc
= const_rtx_hash_table
[const_hash_rtx (mode
, x
)]; desc
;
3005 if (compare_constant_rtx (mode
, x
, desc
))
3011 /* Given a constant rtx X, make (or find) a memory constant for its value
3012 and return a MEM rtx to refer to it in memory. */
3015 force_const_mem (mode
, x
)
3016 enum machine_mode mode
;
3020 struct constant_descriptor_rtx
*desc
;
3023 struct pool_constant
*pool
;
3026 /* If we're not allowed to drop X into the constant pool, don't. */
3027 if ((*targetm
.cannot_force_const_mem
) (x
))
3030 /* Compute hash code of X. Search the descriptors for that hash code
3031 to see if any of them describes X. If yes, we have an rtx to use. */
3032 hash
= const_hash_rtx (mode
, x
);
3033 for (desc
= const_rtx_hash_table
[hash
]; desc
; desc
= desc
->next
)
3034 if (compare_constant_rtx (mode
, x
, desc
))
3037 /* No constant equal to X is known to have been output.
3038 Make a constant descriptor to enter X in the hash table
3039 and make a MEM for it. */
3040 desc
= record_constant_rtx (mode
, x
);
3041 desc
->next
= const_rtx_hash_table
[hash
];
3042 const_rtx_hash_table
[hash
] = desc
;
3044 /* Align the location counter as required by EXP's data type. */
3045 align
= GET_MODE_ALIGNMENT (mode
== VOIDmode
? word_mode
: mode
);
3046 #ifdef CONSTANT_ALIGNMENT
3047 align
= CONSTANT_ALIGNMENT (make_tree ((*lang_hooks
.types
.type_for_mode
)
3048 (mode
, 0), x
), align
);
3051 pool_offset
+= (align
/ BITS_PER_UNIT
) - 1;
3052 pool_offset
&= ~ ((align
/ BITS_PER_UNIT
) - 1);
3054 if (GET_CODE (x
) == LABEL_REF
)
3055 LABEL_PRESERVE_P (XEXP (x
, 0)) = 1;
3057 /* Allocate a pool constant descriptor, fill it in, and chain it in. */
3058 pool
= (struct pool_constant
*) ggc_alloc (sizeof (struct pool_constant
));
3062 pool
->labelno
= const_labelno
;
3063 pool
->align
= align
;
3064 pool
->offset
= pool_offset
;
3071 last_pool
->next
= pool
;
3074 pool_offset
+= GET_MODE_SIZE (mode
);
3076 /* Create a string containing the label name, in LABEL. */
3077 ASM_GENERATE_INTERNAL_LABEL (label
, "LC", const_labelno
);
3081 /* Construct the SYMBOL_REF and the MEM. */
3083 symbol
= gen_rtx_SYMBOL_REF (Pmode
, ggc_strdup (label
));
3084 SYMBOL_REF_FLAGS (symbol
) = SYMBOL_FLAG_LOCAL
;
3086 pool
->desc
->rtl
= def
= gen_rtx_MEM (mode
, symbol
);
3087 set_mem_attributes (def
, (*lang_hooks
.types
.type_for_mode
) (mode
, 0), 1);
3088 RTX_UNCHANGING_P (def
) = 1;
3090 /* Add label to symbol hash table. */
3091 hash
= SYMHASH (XSTR (symbol
, 0));
3092 pool
->next_sym
= const_rtx_sym_hash_table
[hash
];
3093 const_rtx_sym_hash_table
[hash
] = pool
;
3095 /* Mark the symbol_ref as belonging to this constants pool. */
3096 CONSTANT_POOL_ADDRESS_P (symbol
) = 1;
3097 SYMBOL_REF_FLAGS (symbol
) = SYMBOL_FLAG_LOCAL
;
3098 current_function_uses_const_pool
= 1;
3103 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3104 the corresponding pool_constant structure. */
3106 static struct pool_constant
*
3107 find_pool_constant (f
, addr
)
3111 struct pool_constant
*pool
;
3112 const char *label
= XSTR (addr
, 0);
3114 for (pool
= f
->varasm
->x_const_rtx_sym_hash_table
[SYMHASH (label
)]; pool
;
3115 pool
= pool
->next_sym
)
3116 if (XSTR (XEXP (pool
->desc
->rtl
, 0), 0) == label
)
3122 /* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3125 get_pool_constant (addr
)
3128 return (find_pool_constant (cfun
, addr
))->constant
;
3131 /* Given a constant pool SYMBOL_REF, return the corresponding constant
3132 and whether it has been output or not. */
3135 get_pool_constant_mark (addr
, pmarked
)
3139 struct pool_constant
*pool
= find_pool_constant (cfun
, addr
);
3140 *pmarked
= (pool
->mark
!= 0);
3141 return pool
->constant
;
3144 /* Likewise, but for the constant pool of a specific function. */
3147 get_pool_constant_for_function (f
, addr
)
3151 return (find_pool_constant (f
, addr
))->constant
;
3154 /* Similar, return the mode. */
3157 get_pool_mode (addr
)
3160 return (find_pool_constant (cfun
, addr
))->mode
;
3164 get_pool_mode_for_function (f
, addr
)
3168 return (find_pool_constant (f
, addr
))->mode
;
3171 /* Similar, return the offset in the constant pool. */
3174 get_pool_offset (addr
)
3177 return (find_pool_constant (cfun
, addr
))->offset
;
3180 /* Return the size of the constant pool. */
3188 /* Write all the constants in the constant pool. */
3191 output_constant_pool (fnname
, fndecl
)
3192 const char *fnname ATTRIBUTE_UNUSED
;
3193 tree fndecl ATTRIBUTE_UNUSED
;
3195 struct pool_constant
*pool
;
3199 /* It is possible for gcc to call force_const_mem and then to later
3200 discard the instructions which refer to the constant. In such a
3201 case we do not need to output the constant. */
3202 mark_constant_pool ();
3204 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3205 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file
, fnname
, fndecl
, pool_offset
);
3208 for (pool
= first_pool
; pool
; pool
= pool
->next
)
3217 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3218 whose CODE_LABEL has been deleted. This can occur if a jump table
3219 is eliminated by optimization. If so, write a constant of zero
3220 instead. Note that this can also happen by turning the
3221 CODE_LABEL into a NOTE. */
3222 /* ??? This seems completely and utterly wrong. Certainly it's
3223 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3224 functioning even with INSN_DELETED_P and friends. */
3227 switch (GET_CODE (x
))
3230 if (GET_CODE (XEXP (x
, 0)) != PLUS
3231 || GET_CODE (XEXP (XEXP (x
, 0), 0)) != LABEL_REF
)
3233 tmp
= XEXP (XEXP (x
, 0), 0);
3238 if (INSN_DELETED_P (tmp
)
3239 || (GET_CODE (tmp
) == NOTE
3240 && NOTE_LINE_NUMBER (tmp
) == NOTE_INSN_DELETED
))
3251 /* First switch to correct section. */
3252 (*targetm
.asm_out
.select_rtx_section
) (pool
->mode
, x
, pool
->align
);
3254 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3255 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file
, x
, pool
->mode
,
3256 pool
->align
, pool
->labelno
, done
);
3259 assemble_align (pool
->align
);
3261 /* Output the label. */
3262 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "LC", pool
->labelno
);
3264 /* Output the value of the constant itself. */
3265 switch (GET_MODE_CLASS (pool
->mode
))
3268 if (GET_CODE (x
) != CONST_DOUBLE
)
3271 REAL_VALUE_FROM_CONST_DOUBLE (r
, x
);
3272 assemble_real (r
, pool
->mode
, pool
->align
);
3276 case MODE_PARTIAL_INT
:
3277 assemble_integer (x
, GET_MODE_SIZE (pool
->mode
), pool
->align
, 1);
3280 case MODE_VECTOR_FLOAT
:
3285 if (GET_CODE (x
) != CONST_VECTOR
)
3288 units
= CONST_VECTOR_NUNITS (x
);
3290 for (i
= 0; i
< units
; i
++)
3292 elt
= CONST_VECTOR_ELT (x
, i
);
3293 REAL_VALUE_FROM_CONST_DOUBLE (r
, elt
);
3294 assemble_real (r
, GET_MODE_INNER (pool
->mode
), pool
->align
);
3299 case MODE_VECTOR_INT
:
3304 if (GET_CODE (x
) != CONST_VECTOR
)
3307 units
= CONST_VECTOR_NUNITS (x
);
3309 for (i
= 0; i
< units
; i
++)
3311 elt
= CONST_VECTOR_ELT (x
, i
);
3312 assemble_integer (elt
, GET_MODE_UNIT_SIZE (pool
->mode
),
3322 /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3323 sections have proper size. */
3324 if (pool
->align
> GET_MODE_BITSIZE (pool
->mode
)
3325 && in_section
== in_named
3326 && get_named_section_flags (in_named_name
) & SECTION_MERGE
)
3327 assemble_align (pool
->align
);
3329 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3334 #ifdef ASM_OUTPUT_POOL_EPILOGUE
3335 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file
, fnname
, fndecl
, pool_offset
);
3338 /* Done with this pool. */
3339 first_pool
= last_pool
= 0;
3342 /* Look through the instructions for this function, and mark all the
3343 entries in the constant pool which are actually being used.
3344 Emit used deferred strings. */
3347 mark_constant_pool ()
3351 struct pool_constant
*pool
;
3353 if (first_pool
== 0 && n_deferred_strings
== 0)
3356 for (pool
= first_pool
; pool
; pool
= pool
->next
)
3359 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
3361 mark_constants (PATTERN (insn
));
3363 for (link
= current_function_epilogue_delay_list
;
3365 link
= XEXP (link
, 1))
3367 insn
= XEXP (link
, 0);
3370 mark_constants (PATTERN (insn
));
3374 /* Look through appropriate parts of X, marking all entries in the
3375 constant pool which are actually being used. Entries that are only
3376 referenced by other constants are also marked as used. Emit
3377 deferred strings that are used. */
3384 const char *format_ptr
;
3389 if (GET_CODE (x
) == SYMBOL_REF
)
3391 mark_constant (&x
, NULL
);
3395 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3396 insns, not any notes that may be attached. We don't want to mark
3397 a constant just because it happens to appear in a REG_EQUIV note. */
3400 mark_constants (PATTERN (x
));
3404 format_ptr
= GET_RTX_FORMAT (GET_CODE (x
));
3406 for (i
= 0; i
< GET_RTX_LENGTH (GET_CODE (x
)); i
++)
3408 switch (*format_ptr
++)
3411 mark_constants (XEXP (x
, i
));
3415 if (XVEC (x
, i
) != 0)
3419 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
3420 mark_constants (XVECEXP (x
, i
, j
));
3440 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3441 to as used. Emit referenced deferred strings. This function can
3442 be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */
3445 mark_constant (current_rtx
, data
)
3447 void *data ATTRIBUTE_UNUSED
;
3449 rtx x
= *current_rtx
;
3454 else if (GET_CODE (x
) == SYMBOL_REF
)
3456 if (CONSTANT_POOL_ADDRESS_P (x
))
3458 struct pool_constant
*pool
= find_pool_constant (cfun
, x
);
3459 if (pool
->mark
== 0)
3462 for_each_rtx (&(pool
->constant
), &mark_constant
, NULL
);
3467 else if (STRING_POOL_ADDRESS_P (x
))
3469 STRING_POOL_ADDRESS_P (x
) = 0;
3470 n_deferred_strings
--;
3471 output_constant_def_contents (SYMBOL_REF_DECL (x
), XSTR (x
, 0));
3477 /* Find all the constants whose addresses are referenced inside of EXP,
3478 and make sure assembler code with a label has been output for each one.
3479 Indicate whether an ADDR_EXPR has been encountered. */
3482 output_addressed_constants (exp
)
3485 int reloc
= 0, reloc2
;
3488 /* Give the front-end a chance to convert VALUE to something that
3489 looks more like a constant to the back-end. */
3490 exp
= (*lang_hooks
.expand_constant
) (exp
);
3492 switch (TREE_CODE (exp
))
3496 /* Go inside any operations that get_inner_reference can handle and see
3497 if what's inside is a constant: no need to do anything here for
3498 addresses of variables or functions. */
3499 for (tem
= TREE_OPERAND (exp
, 0); handled_component_p (tem
);
3500 tem
= TREE_OPERAND (tem
, 0))
3503 if (TREE_CODE_CLASS (TREE_CODE (tem
)) == 'c'
3504 || TREE_CODE (tem
) == CONSTRUCTOR
)
3505 output_constant_def (tem
, 0);
3507 if (TREE_PUBLIC (tem
))
3514 reloc
= output_addressed_constants (TREE_OPERAND (exp
, 0));
3515 reloc
|= output_addressed_constants (TREE_OPERAND (exp
, 1));
3519 reloc
= output_addressed_constants (TREE_OPERAND (exp
, 0));
3520 reloc2
= output_addressed_constants (TREE_OPERAND (exp
, 1));
3521 /* The difference of two local labels is computable at link time. */
3522 if (reloc
== 1 && reloc2
== 1)
3530 case NON_LVALUE_EXPR
:
3531 reloc
= output_addressed_constants (TREE_OPERAND (exp
, 0));
3535 for (tem
= CONSTRUCTOR_ELTS (exp
); tem
; tem
= TREE_CHAIN (tem
))
3536 if (TREE_VALUE (tem
) != 0)
3537 reloc
|= output_addressed_constants (TREE_VALUE (tem
));
3547 /* Return nonzero if VALUE is a valid constant-valued expression
3548 for use in initializing a static variable; one that can be an
3549 element of a "constant" initializer.
3551 Return null_pointer_node if the value is absolute;
3552 if it is relocatable, return the variable that determines the relocation.
3553 We assume that VALUE has been folded as much as possible;
3554 therefore, we do not need to check for such things as
3555 arithmetic-combinations of integers. */
3558 initializer_constant_valid_p (value
, endtype
)
3562 /* Give the front-end a chance to convert VALUE to something that
3563 looks more like a constant to the back-end. */
3564 value
= (*lang_hooks
.expand_constant
) (value
);
3566 switch (TREE_CODE (value
))
3569 if ((TREE_CODE (TREE_TYPE (value
)) == UNION_TYPE
3570 || TREE_CODE (TREE_TYPE (value
)) == RECORD_TYPE
)
3571 && TREE_CONSTANT (value
)
3572 && CONSTRUCTOR_ELTS (value
))
3574 initializer_constant_valid_p (TREE_VALUE (CONSTRUCTOR_ELTS (value
)),
3577 return TREE_STATIC (value
) ? null_pointer_node
: 0;
3584 return null_pointer_node
;
3588 return staticp (TREE_OPERAND (value
, 0)) ? TREE_OPERAND (value
, 0) : 0;
3590 case VIEW_CONVERT_EXPR
:
3591 case NON_LVALUE_EXPR
:
3592 return initializer_constant_valid_p (TREE_OPERAND (value
, 0), endtype
);
3596 /* Allow conversions between pointer types. */
3597 if (POINTER_TYPE_P (TREE_TYPE (value
))
3598 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value
, 0))))
3599 return initializer_constant_valid_p (TREE_OPERAND (value
, 0), endtype
);
3601 /* Allow conversions between real types. */
3602 if (FLOAT_TYPE_P (TREE_TYPE (value
))
3603 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value
, 0))))
3604 return initializer_constant_valid_p (TREE_OPERAND (value
, 0), endtype
);
3606 /* Allow length-preserving conversions between integer types. */
3607 if (INTEGRAL_TYPE_P (TREE_TYPE (value
))
3608 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value
, 0)))
3609 && (TYPE_PRECISION (TREE_TYPE (value
))
3610 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value
, 0)))))
3611 return initializer_constant_valid_p (TREE_OPERAND (value
, 0), endtype
);
3613 /* Allow conversions between other integer types only if
3615 if (INTEGRAL_TYPE_P (TREE_TYPE (value
))
3616 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value
, 0))))
3618 tree inner
= initializer_constant_valid_p (TREE_OPERAND (value
, 0),
3620 if (inner
== null_pointer_node
)
3621 return null_pointer_node
;
3625 /* Allow (int) &foo provided int is as wide as a pointer. */
3626 if (INTEGRAL_TYPE_P (TREE_TYPE (value
))
3627 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value
, 0)))
3628 && (TYPE_PRECISION (TREE_TYPE (value
))
3629 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value
, 0)))))
3630 return initializer_constant_valid_p (TREE_OPERAND (value
, 0),
3633 /* Likewise conversions from int to pointers, but also allow
3634 conversions from 0. */
3635 if (POINTER_TYPE_P (TREE_TYPE (value
))
3636 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value
, 0))))
3638 if (integer_zerop (TREE_OPERAND (value
, 0)))
3639 return null_pointer_node
;
3640 else if (TYPE_PRECISION (TREE_TYPE (value
))
3641 <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value
, 0))))
3642 return initializer_constant_valid_p (TREE_OPERAND (value
, 0),
3646 /* Allow conversions to union types if the value inside is okay. */
3647 if (TREE_CODE (TREE_TYPE (value
)) == UNION_TYPE
)
3648 return initializer_constant_valid_p (TREE_OPERAND (value
, 0),
3653 if (! INTEGRAL_TYPE_P (endtype
)
3654 || TYPE_PRECISION (endtype
) >= POINTER_SIZE
)
3656 tree valid0
= initializer_constant_valid_p (TREE_OPERAND (value
, 0),
3658 tree valid1
= initializer_constant_valid_p (TREE_OPERAND (value
, 1),
3660 /* If either term is absolute, use the other terms relocation. */
3661 if (valid0
== null_pointer_node
)
3663 if (valid1
== null_pointer_node
)
3669 if (! INTEGRAL_TYPE_P (endtype
)
3670 || TYPE_PRECISION (endtype
) >= POINTER_SIZE
)
3672 tree valid0
= initializer_constant_valid_p (TREE_OPERAND (value
, 0),
3674 tree valid1
= initializer_constant_valid_p (TREE_OPERAND (value
, 1),
3676 /* Win if second argument is absolute. */
3677 if (valid1
== null_pointer_node
)
3679 /* Win if both arguments have the same relocation.
3680 Then the value is absolute. */
3681 if (valid0
== valid1
&& valid0
!= 0)
3682 return null_pointer_node
;
3684 /* Since GCC guarantees that string constants are unique in the
3685 generated code, a subtraction between two copies of the same
3686 constant string is absolute. */
3687 if (valid0
&& TREE_CODE (valid0
) == STRING_CST
&&
3688 valid1
&& TREE_CODE (valid1
) == STRING_CST
&&
3689 TREE_STRING_POINTER (valid0
) == TREE_STRING_POINTER (valid1
))
3690 return null_pointer_node
;
3693 /* Support differences between labels. */
3694 if (INTEGRAL_TYPE_P (endtype
))
3697 op0
= TREE_OPERAND (value
, 0);
3698 op1
= TREE_OPERAND (value
, 1);
3700 /* Like STRIP_NOPS except allow the operand mode to widen.
3701 This works around a feature of fold that simplifies
3702 (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3703 that the narrower operation is cheaper. */
3705 while (TREE_CODE (op0
) == NOP_EXPR
3706 || TREE_CODE (op0
) == CONVERT_EXPR
3707 || TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3709 tree inner
= TREE_OPERAND (op0
, 0);
3710 if (inner
== error_mark_node
3711 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner
)))
3712 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0
)))
3713 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner
)))))
3718 while (TREE_CODE (op1
) == NOP_EXPR
3719 || TREE_CODE (op1
) == CONVERT_EXPR
3720 || TREE_CODE (op1
) == NON_LVALUE_EXPR
)
3722 tree inner
= TREE_OPERAND (op1
, 0);
3723 if (inner
== error_mark_node
3724 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner
)))
3725 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1
)))
3726 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner
)))))
3731 if (TREE_CODE (op0
) == ADDR_EXPR
3732 && TREE_CODE (TREE_OPERAND (op0
, 0)) == LABEL_DECL
3733 && TREE_CODE (op1
) == ADDR_EXPR
3734 && TREE_CODE (TREE_OPERAND (op1
, 0)) == LABEL_DECL
)
3735 return null_pointer_node
;
3746 /* Output assembler code for constant EXP to FILE, with no label.
3747 This includes the pseudo-op such as ".int" or ".byte", and a newline.
3748 Assumes output_addressed_constants has been done on EXP already.
3750 Generate exactly SIZE bytes of assembler data, padding at the end
3751 with zeros if necessary. SIZE must always be specified.
3753 SIZE is important for structure constructors,
3754 since trailing members may have been omitted from the constructor.
3755 It is also important for initialization of arrays from string constants
3756 since the full length of the string constant might not be wanted.
3757 It is also needed for initialization of unions, where the initializer's
3758 type is just one member, and that may not be as long as the union.
3760 There a case in which we would fail to output exactly SIZE bytes:
3761 for a structure constructor that wants to produce more than SIZE bytes.
3762 But such constructors will never be generated for any possible input.
3764 ALIGN is the alignment of the data in bits. */
3767 output_constant (exp
, size
, align
)
3772 enum tree_code code
;
3773 HOST_WIDE_INT thissize
;
3775 /* Some front-ends use constants other than the standard language-independent
3776 varieties, but which may still be output directly. Give the front-end a
3777 chance to convert EXP to a language-independent representation. */
3778 exp
= (*lang_hooks
.expand_constant
) (exp
);
3780 if (size
== 0 || flag_syntax_only
)
3783 /* Eliminate any conversions since we'll be outputting the underlying
3785 while (TREE_CODE (exp
) == NOP_EXPR
|| TREE_CODE (exp
) == CONVERT_EXPR
3786 || TREE_CODE (exp
) == NON_LVALUE_EXPR
3787 || TREE_CODE (exp
) == VIEW_CONVERT_EXPR
)
3788 exp
= TREE_OPERAND (exp
, 0);
3790 code
= TREE_CODE (TREE_TYPE (exp
));
3791 thissize
= int_size_in_bytes (TREE_TYPE (exp
));
3793 /* Allow a constructor with no elements for any data type.
3794 This means to fill the space with zeros. */
3795 if (TREE_CODE (exp
) == CONSTRUCTOR
&& CONSTRUCTOR_ELTS (exp
) == 0)
3797 assemble_zeros (size
);
3801 if (TREE_CODE (exp
) == FDESC_EXPR
)
3803 #ifdef ASM_OUTPUT_FDESC
3804 HOST_WIDE_INT part
= tree_low_cst (TREE_OPERAND (exp
, 1), 0);
3805 tree decl
= TREE_OPERAND (exp
, 0);
3806 ASM_OUTPUT_FDESC (asm_out_file
, decl
, part
);
3813 /* Now output the underlying data. If we've handling the padding, return.
3814 Otherwise, break and ensure THISSIZE is the size written. */
3822 case REFERENCE_TYPE
:
3823 if (! assemble_integer (expand_expr (exp
, NULL_RTX
, VOIDmode
,
3824 EXPAND_INITIALIZER
),
3826 error ("initializer for integer value is too complicated");
3830 if (TREE_CODE (exp
) != REAL_CST
)
3831 error ("initializer for floating value is not a floating constant");
3833 assemble_real (TREE_REAL_CST (exp
),
3834 mode_for_size (size
* BITS_PER_UNIT
, MODE_FLOAT
, 0),
3839 output_constant (TREE_REALPART (exp
), thissize
/ 2, align
);
3840 output_constant (TREE_IMAGPART (exp
), thissize
/ 2,
3841 min_align (align
, BITS_PER_UNIT
* (thissize
/ 2)));
3846 if (TREE_CODE (exp
) == CONSTRUCTOR
)
3848 output_constructor (exp
, size
, align
);
3851 else if (TREE_CODE (exp
) == STRING_CST
)
3853 thissize
= MIN (TREE_STRING_LENGTH (exp
), size
);
3854 assemble_string (TREE_STRING_POINTER (exp
), thissize
);
3856 else if (TREE_CODE (exp
) == VECTOR_CST
)
3860 unsigned int nalign
;
3861 enum machine_mode inner
;
3863 inner
= GET_MODE_INNER (TYPE_MODE (TREE_TYPE (exp
)));
3864 nalign
= MIN (align
, GET_MODE_ALIGNMENT (inner
));
3866 elt_size
= GET_MODE_UNIT_SIZE (TYPE_MODE (TREE_TYPE (exp
)));
3868 link
= TREE_VECTOR_CST_ELTS (exp
);
3869 output_constant (TREE_VALUE (link
), elt_size
, align
);
3870 while ((link
= TREE_CHAIN (link
)) != NULL
)
3871 output_constant (TREE_VALUE (link
), elt_size
, nalign
);
3879 if (TREE_CODE (exp
) == CONSTRUCTOR
)
3880 output_constructor (exp
, size
, align
);
3886 if (TREE_CODE (exp
) == INTEGER_CST
)
3887 assemble_integer (expand_expr (exp
, NULL_RTX
,
3888 VOIDmode
, EXPAND_INITIALIZER
),
3889 thissize
, align
, 1);
3890 else if (TREE_CODE (exp
) == CONSTRUCTOR
)
3892 unsigned char *buffer
= (unsigned char *) alloca (thissize
);
3893 if (get_set_constructor_bytes (exp
, buffer
, thissize
))
3895 assemble_string ((char *) buffer
, thissize
);
3898 error ("unknown set constructor type");
3910 assemble_zeros (size
);
3914 /* Subroutine of output_constructor, used for computing the size of
3915 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
3916 type with an unspecified upper bound. */
3918 static unsigned HOST_WIDE_INT
3919 array_size_for_constructor (val
)
3924 /* This code used to attempt to handle string constants that are not
3925 arrays of single-bytes, but nothing else does, so there's no point in
3927 if (TREE_CODE (val
) == STRING_CST
)
3928 return TREE_STRING_LENGTH (val
);
3930 max_index
= NULL_TREE
;
3931 for (i
= CONSTRUCTOR_ELTS (val
); i
; i
= TREE_CHAIN (i
))
3933 tree index
= TREE_PURPOSE (i
);
3935 if (TREE_CODE (index
) == RANGE_EXPR
)
3936 index
= TREE_OPERAND (index
, 1);
3937 if (max_index
== NULL_TREE
|| tree_int_cst_lt (max_index
, index
))
3941 if (max_index
== NULL_TREE
)
3944 /* Compute the total number of array elements. */
3945 i
= size_binop (MINUS_EXPR
, convert (sizetype
, max_index
),
3947 TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val
)))));
3948 i
= size_binop (PLUS_EXPR
, i
, convert (sizetype
, integer_one_node
));
3950 /* Multiply by the array element unit size to find number of bytes. */
3951 i
= size_binop (MULT_EXPR
, i
, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val
))));
3953 return tree_low_cst (i
, 1);
3956 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
3957 Generate at least SIZE bytes, padding if necessary. */
3960 output_constructor (exp
, size
, align
)
3965 tree type
= TREE_TYPE (exp
);
3966 tree link
, field
= 0;
3968 /* Number of bytes output or skipped so far.
3969 In other words, current position within the constructor. */
3970 HOST_WIDE_INT total_bytes
= 0;
3971 /* Nonzero means BYTE contains part of a byte, to be output. */
3972 int byte_buffer_in_use
= 0;
3975 if (HOST_BITS_PER_WIDE_INT
< BITS_PER_UNIT
)
3978 if (TREE_CODE (type
) == RECORD_TYPE
)
3979 field
= TYPE_FIELDS (type
);
3981 if (TREE_CODE (type
) == ARRAY_TYPE
3982 && TYPE_DOMAIN (type
) != 0)
3983 min_index
= TYPE_MIN_VALUE (TYPE_DOMAIN (type
));
3985 /* As LINK goes through the elements of the constant,
3986 FIELD goes through the structure fields, if the constant is a structure.
3987 if the constant is a union, then we override this,
3988 by getting the field from the TREE_LIST element.
3989 But the constant could also be an array. Then FIELD is zero.
3991 There is always a maximum of one element in the chain LINK for unions
3992 (even if the initializer in a source program incorrectly contains
3994 for (link
= CONSTRUCTOR_ELTS (exp
);
3996 link
= TREE_CHAIN (link
),
3997 field
= field
? TREE_CHAIN (field
) : 0)
3999 tree val
= TREE_VALUE (link
);
4002 /* The element in a union constructor specifies the proper field
4004 if ((TREE_CODE (type
) == RECORD_TYPE
|| TREE_CODE (type
) == UNION_TYPE
4005 || TREE_CODE (type
) == QUAL_UNION_TYPE
)
4006 && TREE_PURPOSE (link
) != 0)
4007 field
= TREE_PURPOSE (link
);
4009 else if (TREE_CODE (type
) == ARRAY_TYPE
)
4010 index
= TREE_PURPOSE (link
);
4012 /* Eliminate the marker that makes a cast not be an lvalue. */
4016 if (index
&& TREE_CODE (index
) == RANGE_EXPR
)
4018 unsigned HOST_WIDE_INT fieldsize
4019 = int_size_in_bytes (TREE_TYPE (type
));
4020 HOST_WIDE_INT lo_index
= tree_low_cst (TREE_OPERAND (index
, 0), 0);
4021 HOST_WIDE_INT hi_index
= tree_low_cst (TREE_OPERAND (index
, 1), 0);
4022 HOST_WIDE_INT index
;
4023 unsigned int align2
= min_align (align
, fieldsize
* BITS_PER_UNIT
);
4025 for (index
= lo_index
; index
<= hi_index
; index
++)
4027 /* Output the element's initial value. */
4029 assemble_zeros (fieldsize
);
4031 output_constant (val
, fieldsize
, align2
);
4033 /* Count its size. */
4034 total_bytes
+= fieldsize
;
4037 else if (field
== 0 || !DECL_BIT_FIELD (field
))
4039 /* An element that is not a bit-field. */
4041 unsigned HOST_WIDE_INT fieldsize
;
4042 /* Since this structure is static,
4043 we know the positions are constant. */
4044 HOST_WIDE_INT pos
= field
? int_byte_position (field
) : 0;
4045 unsigned int align2
;
4048 pos
= (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val
)), 1)
4049 * (tree_low_cst (index
, 0) - tree_low_cst (min_index
, 0)));
4051 /* Output any buffered-up bit-fields preceding this element. */
4052 if (byte_buffer_in_use
)
4054 assemble_integer (GEN_INT (byte
), 1, BITS_PER_UNIT
, 1);
4056 byte_buffer_in_use
= 0;
4059 /* Advance to offset of this element.
4060 Note no alignment needed in an array, since that is guaranteed
4061 if each element has the proper size. */
4062 if ((field
!= 0 || index
!= 0) && pos
!= total_bytes
)
4064 assemble_zeros (pos
- total_bytes
);
4068 /* Find the alignment of this element. */
4069 align2
= min_align (align
, BITS_PER_UNIT
* pos
);
4071 /* Determine size this element should occupy. */
4076 /* If this is an array with an unspecified upper bound,
4077 the initializer determines the size. */
4078 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4079 but we cannot do this until the deprecated support for
4080 initializing zero-length array members is removed. */
4081 if (TREE_CODE (TREE_TYPE (field
)) == ARRAY_TYPE
4082 && TYPE_DOMAIN (TREE_TYPE (field
))
4083 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field
))))
4085 fieldsize
= array_size_for_constructor (val
);
4086 /* Given a non-empty initialization, this field had
4088 if (fieldsize
!= 0 && TREE_CHAIN (field
) != NULL_TREE
)
4091 else if (DECL_SIZE_UNIT (field
))
4093 /* ??? This can't be right. If the decl size overflows
4094 a host integer we will silently emit no data. */
4095 if (host_integerp (DECL_SIZE_UNIT (field
), 1))
4096 fieldsize
= tree_low_cst (DECL_SIZE_UNIT (field
), 1);
4100 fieldsize
= int_size_in_bytes (TREE_TYPE (type
));
4102 /* Output the element's initial value. */
4104 assemble_zeros (fieldsize
);
4106 output_constant (val
, fieldsize
, align2
);
4108 /* Count its size. */
4109 total_bytes
+= fieldsize
;
4111 else if (val
!= 0 && TREE_CODE (val
) != INTEGER_CST
)
4112 error ("invalid initial value for member `%s'",
4113 IDENTIFIER_POINTER (DECL_NAME (field
)));
4116 /* Element that is a bit-field. */
4118 HOST_WIDE_INT next_offset
= int_bit_position (field
);
4119 HOST_WIDE_INT end_offset
4120 = (next_offset
+ tree_low_cst (DECL_SIZE (field
), 1));
4123 val
= integer_zero_node
;
4125 /* If this field does not start in this (or, next) byte,
4127 if (next_offset
/ BITS_PER_UNIT
!= total_bytes
)
4129 /* Output remnant of any bit field in previous bytes. */
4130 if (byte_buffer_in_use
)
4132 assemble_integer (GEN_INT (byte
), 1, BITS_PER_UNIT
, 1);
4134 byte_buffer_in_use
= 0;
4137 /* If still not at proper byte, advance to there. */
4138 if (next_offset
/ BITS_PER_UNIT
!= total_bytes
)
4140 assemble_zeros (next_offset
/ BITS_PER_UNIT
- total_bytes
);
4141 total_bytes
= next_offset
/ BITS_PER_UNIT
;
4145 if (! byte_buffer_in_use
)
4148 /* We must split the element into pieces that fall within
4149 separate bytes, and combine each byte with previous or
4150 following bit-fields. */
4152 /* next_offset is the offset n fbits from the beginning of
4153 the structure to the next bit of this element to be processed.
4154 end_offset is the offset of the first bit past the end of
4156 while (next_offset
< end_offset
)
4160 HOST_WIDE_INT value
;
4161 HOST_WIDE_INT next_byte
= next_offset
/ BITS_PER_UNIT
;
4162 HOST_WIDE_INT next_bit
= next_offset
% BITS_PER_UNIT
;
4164 /* Advance from byte to byte
4165 within this element when necessary. */
4166 while (next_byte
!= total_bytes
)
4168 assemble_integer (GEN_INT (byte
), 1, BITS_PER_UNIT
, 1);
4173 /* Number of bits we can process at once
4174 (all part of the same byte). */
4175 this_time
= MIN (end_offset
- next_offset
,
4176 BITS_PER_UNIT
- next_bit
);
4177 if (BYTES_BIG_ENDIAN
)
4179 /* On big-endian machine, take the most significant bits
4180 first (of the bits that are significant)
4181 and put them into bytes from the most significant end. */
4182 shift
= end_offset
- next_offset
- this_time
;
4184 /* Don't try to take a bunch of bits that cross
4185 the word boundary in the INTEGER_CST. We can
4186 only select bits from the LOW or HIGH part
4188 if (shift
< HOST_BITS_PER_WIDE_INT
4189 && shift
+ this_time
> HOST_BITS_PER_WIDE_INT
)
4191 this_time
= shift
+ this_time
- HOST_BITS_PER_WIDE_INT
;
4192 shift
= HOST_BITS_PER_WIDE_INT
;
4195 /* Now get the bits from the appropriate constant word. */
4196 if (shift
< HOST_BITS_PER_WIDE_INT
)
4197 value
= TREE_INT_CST_LOW (val
);
4198 else if (shift
< 2 * HOST_BITS_PER_WIDE_INT
)
4200 value
= TREE_INT_CST_HIGH (val
);
4201 shift
-= HOST_BITS_PER_WIDE_INT
;
4206 /* Get the result. This works only when:
4207 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4208 byte
|= (((value
>> shift
)
4209 & (((HOST_WIDE_INT
) 2 << (this_time
- 1)) - 1))
4210 << (BITS_PER_UNIT
- this_time
- next_bit
));
4214 /* On little-endian machines,
4215 take first the least significant bits of the value
4216 and pack them starting at the least significant
4217 bits of the bytes. */
4218 shift
= next_offset
- int_bit_position (field
);
4220 /* Don't try to take a bunch of bits that cross
4221 the word boundary in the INTEGER_CST. We can
4222 only select bits from the LOW or HIGH part
4224 if (shift
< HOST_BITS_PER_WIDE_INT
4225 && shift
+ this_time
> HOST_BITS_PER_WIDE_INT
)
4226 this_time
= (HOST_BITS_PER_WIDE_INT
- shift
);
4228 /* Now get the bits from the appropriate constant word. */
4229 if (shift
< HOST_BITS_PER_WIDE_INT
)
4230 value
= TREE_INT_CST_LOW (val
);
4231 else if (shift
< 2 * HOST_BITS_PER_WIDE_INT
)
4233 value
= TREE_INT_CST_HIGH (val
);
4234 shift
-= HOST_BITS_PER_WIDE_INT
;
4239 /* Get the result. This works only when:
4240 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4241 byte
|= (((value
>> shift
)
4242 & (((HOST_WIDE_INT
) 2 << (this_time
- 1)) - 1))
4246 next_offset
+= this_time
;
4247 byte_buffer_in_use
= 1;
4252 if (byte_buffer_in_use
)
4254 assemble_integer (GEN_INT (byte
), 1, BITS_PER_UNIT
, 1);
4258 if (total_bytes
< size
)
4259 assemble_zeros (size
- total_bytes
);
4262 /* This TREE_LIST contains any weak symbol declarations waiting
4264 static GTY(()) tree weak_decls
;
4266 /* Mark DECL as weak. */
4272 DECL_WEAK (decl
) = 1;
4274 if (DECL_RTL_SET_P (decl
)
4275 && GET_CODE (DECL_RTL (decl
)) == MEM
4276 && XEXP (DECL_RTL (decl
), 0)
4277 && GET_CODE (XEXP (DECL_RTL (decl
), 0)) == SYMBOL_REF
)
4278 SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl
), 0)) = 1;
4281 /* Merge weak status between NEWDECL and OLDDECL. */
4284 merge_weak (newdecl
, olddecl
)
4288 if (DECL_WEAK (newdecl
) == DECL_WEAK (olddecl
))
4291 if (DECL_WEAK (newdecl
))
4295 /* NEWDECL is weak, but OLDDECL is not. */
4297 /* If we already output the OLDDECL, we're in trouble; we can't
4298 go back and make it weak. This error cannot caught in
4299 declare_weak because the NEWDECL and OLDDECL was not yet
4300 been merged; therefore, TREE_ASM_WRITTEN was not set. */
4301 if (TREE_ASM_WRITTEN (olddecl
))
4302 error_with_decl (newdecl
,
4303 "weak declaration of `%s' must precede definition");
4305 /* If we've already generated rtl referencing OLDDECL, we may
4306 have done so in a way that will not function properly with
4308 else if (TREE_USED (olddecl
)
4309 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl
)))
4310 warning_with_decl (newdecl
, "weak declaration of `%s' after first use results in unspecified behavior");
4314 /* We put the NEWDECL on the weak_decls list at some point.
4315 Replace it with the OLDDECL. */
4316 for (wd
= weak_decls
; wd
; wd
= TREE_CHAIN (wd
))
4317 if (TREE_VALUE (wd
) == newdecl
)
4319 TREE_VALUE (wd
) = olddecl
;
4322 /* We may not find the entry on the list. If NEWDECL is a
4323 weak alias, then we will have already called
4324 globalize_decl to remove the entry; in that case, we do
4325 not need to do anything. */
4328 /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */
4329 mark_weak (olddecl
);
4332 /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4333 weak. Just update NEWDECL to indicate that it's weak too. */
4334 mark_weak (newdecl
);
4337 /* Declare DECL to be a weak symbol. */
4343 if (! TREE_PUBLIC (decl
))
4344 error_with_decl (decl
, "weak declaration of `%s' must be public");
4345 else if (TREE_CODE (decl
) == FUNCTION_DECL
&& TREE_ASM_WRITTEN (decl
))
4346 error_with_decl (decl
, "weak declaration of `%s' must precede definition");
4347 else if (SUPPORTS_WEAK
)
4349 if (! DECL_WEAK (decl
))
4350 weak_decls
= tree_cons (NULL
, decl
, weak_decls
);
4353 warning_with_decl (decl
, "weak declaration of `%s' not supported");
4358 /* Emit any pending weak declarations. */
4365 for (t
= weak_decls
; t
; t
= TREE_CHAIN (t
))
4367 tree decl
= TREE_VALUE (t
);
4368 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4369 const char *const name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
));
4372 if (! TREE_USED (decl
))
4375 #ifdef ASM_WEAKEN_DECL
4376 ASM_WEAKEN_DECL (asm_out_file
, decl
, name
, NULL
);
4378 #ifdef ASM_WEAKEN_LABEL
4379 ASM_WEAKEN_LABEL (asm_out_file
, name
);
4381 #ifdef ASM_OUTPUT_WEAK_ALIAS
4382 warning ("only weak aliases are supported in this configuration");
4390 /* Emit the assembly bits to indicate that DECL is globally visible. */
4393 globalize_decl (decl
)
4396 const char *name
= XSTR (XEXP (DECL_RTL (decl
), 0), 0);
4398 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4399 if (DECL_WEAK (decl
))
4403 #ifdef ASM_WEAKEN_DECL
4404 ASM_WEAKEN_DECL (asm_out_file
, decl
, name
, 0);
4406 ASM_WEAKEN_LABEL (asm_out_file
, name
);
4409 /* Remove this function from the pending weak list so that
4410 we do not emit multiple .weak directives for it. */
4411 for (p
= &weak_decls
; (t
= *p
) ; )
4413 if (DECL_ASSEMBLER_NAME (decl
) == DECL_ASSEMBLER_NAME (TREE_VALUE (t
)))
4414 *p
= TREE_CHAIN (t
);
4416 p
= &TREE_CHAIN (t
);
4422 (*targetm
.asm_out
.globalize_label
) (asm_out_file
, name
);
4425 /* Emit an assembler directive to make the symbol for DECL an alias to
4426 the symbol for TARGET. */
4429 assemble_alias (decl
, target
)
4430 tree decl
, target ATTRIBUTE_UNUSED
;
4434 /* We must force creation of DECL_RTL for debug info generation, even though
4435 we don't use it here. */
4436 make_decl_rtl (decl
, NULL
);
4438 name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
));
4440 #ifdef ASM_OUTPUT_DEF
4441 /* Make name accessible from other files, if appropriate. */
4443 if (TREE_PUBLIC (decl
))
4445 globalize_decl (decl
);
4446 maybe_assemble_visibility (decl
);
4449 #ifdef ASM_OUTPUT_DEF_FROM_DECLS
4450 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file
, decl
, target
);
4452 ASM_OUTPUT_DEF (asm_out_file
, name
, IDENTIFIER_POINTER (target
));
4454 #else /* !ASM_OUTPUT_DEF */
4455 #if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
4456 if (! DECL_WEAK (decl
))
4457 warning ("only weak aliases are supported in this configuration");
4459 #ifdef ASM_WEAKEN_DECL
4460 ASM_WEAKEN_DECL (asm_out_file
, decl
, name
, IDENTIFIER_POINTER (target
));
4462 ASM_OUTPUT_WEAK_ALIAS (asm_out_file
, name
, IDENTIFIER_POINTER (target
));
4465 warning ("alias definitions not supported in this configuration; ignored");
4469 TREE_USED (decl
) = 1;
4470 TREE_ASM_WRITTEN (decl
) = 1;
4471 TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl
)) = 1;
4474 /* Emit an assembler directive to set symbol for DECL visibility to
4475 the visibility type VIS, which must not be VISIBILITY_DEFAULT. */
4478 default_assemble_visibility (decl
, vis
)
4482 static const char * const visibility_types
[] = {
4483 NULL
, "internal", "hidden", "protected"
4486 const char *name
, *type
;
4488 name
= (* targetm
.strip_name_encoding
)
4489 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
)));
4490 type
= visibility_types
[vis
];
4492 #ifdef HAVE_GAS_HIDDEN
4493 fprintf (asm_out_file
, "\t.%s\t%s\n", type
, name
);
4495 warning ("visibility attribute not supported in this configuration; ignored");
4499 /* A helper function to call assemble_visibility when needed for a decl. */
4502 maybe_assemble_visibility (decl
)
4505 enum symbol_visibility vis
= decl_visibility (decl
);
4507 if (vis
!= VISIBILITY_DEFAULT
)
4508 (* targetm
.asm_out
.visibility
) (decl
, vis
);
4511 /* Returns 1 if the target configuration supports defining public symbols
4512 so that one of them will be chosen at link time instead of generating a
4513 multiply-defined symbol error, whether through the use of weak symbols or
4514 a target-specific mechanism for having duplicates discarded. */
4517 supports_one_only ()
4519 if (SUPPORTS_ONE_ONLY
)
4521 return SUPPORTS_WEAK
;
4524 /* Set up DECL as a public symbol that can be defined in multiple
4525 translation units without generating a linker error. */
4528 make_decl_one_only (decl
)
4531 if (TREE_CODE (decl
) != VAR_DECL
&& TREE_CODE (decl
) != FUNCTION_DECL
)
4534 TREE_PUBLIC (decl
) = 1;
4536 if (TREE_CODE (decl
) == VAR_DECL
4537 && (DECL_INITIAL (decl
) == 0 || DECL_INITIAL (decl
) == error_mark_node
))
4538 DECL_COMMON (decl
) = 1;
4539 else if (SUPPORTS_ONE_ONLY
)
4541 #ifdef MAKE_DECL_ONE_ONLY
4542 MAKE_DECL_ONE_ONLY (decl
);
4544 DECL_ONE_ONLY (decl
) = 1;
4546 else if (SUPPORTS_WEAK
)
4547 DECL_WEAK (decl
) = 1;
4555 in_named_htab
= htab_create_ggc (31, in_named_entry_hash
,
4556 in_named_entry_eq
, NULL
);
4558 const_alias_set
= new_alias_set ();
4562 decl_tls_model (decl
)
4565 enum tls_model kind
;
4566 tree attr
= lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl
));
4571 attr
= TREE_VALUE (TREE_VALUE (attr
));
4572 if (TREE_CODE (attr
) != STRING_CST
)
4574 if (!strcmp (TREE_STRING_POINTER (attr
), "local-exec"))
4575 kind
= TLS_MODEL_LOCAL_EXEC
;
4576 else if (!strcmp (TREE_STRING_POINTER (attr
), "initial-exec"))
4577 kind
= TLS_MODEL_INITIAL_EXEC
;
4578 else if (!strcmp (TREE_STRING_POINTER (attr
), "local-dynamic"))
4579 kind
= optimize
? TLS_MODEL_LOCAL_DYNAMIC
: TLS_MODEL_GLOBAL_DYNAMIC
;
4580 else if (!strcmp (TREE_STRING_POINTER (attr
), "global-dynamic"))
4581 kind
= TLS_MODEL_GLOBAL_DYNAMIC
;
4587 is_local
= (*targetm
.binds_local_p
) (decl
);
4591 kind
= TLS_MODEL_LOCAL_EXEC
;
4593 kind
= TLS_MODEL_INITIAL_EXEC
;
4595 /* Local dynamic is inefficient when we're not combining the
4596 parts of the address. */
4597 else if (optimize
&& is_local
)
4598 kind
= TLS_MODEL_LOCAL_DYNAMIC
;
4600 kind
= TLS_MODEL_GLOBAL_DYNAMIC
;
4601 if (kind
< flag_tls_default
)
4602 kind
= flag_tls_default
;
4607 enum symbol_visibility
4608 decl_visibility (decl
)
4611 tree attr
= lookup_attribute ("visibility", DECL_ATTRIBUTES (decl
));
4615 const char *which
= TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr
)));
4617 if (strcmp (which
, "default") == 0)
4618 return VISIBILITY_DEFAULT
;
4619 if (strcmp (which
, "internal") == 0)
4620 return VISIBILITY_INTERNAL
;
4621 if (strcmp (which
, "hidden") == 0)
4622 return VISIBILITY_HIDDEN
;
4623 if (strcmp (which
, "protected") == 0)
4624 return VISIBILITY_PROTECTED
;
4629 return VISIBILITY_DEFAULT
;
4632 /* Select a set of attributes for section NAME based on the properties
4633 of DECL and whether or not RELOC indicates that DECL's initializer
4634 might contain runtime relocations.
4636 We make the section read-only and executable for a function decl,
4637 read-only for a const data decl, and writable for a non-const data decl. */
4640 default_section_type_flags (decl
, name
, reloc
)
4645 return default_section_type_flags_1 (decl
, name
, reloc
, flag_pic
);
4649 default_section_type_flags_1 (decl
, name
, reloc
, shlib
)
4657 if (decl
&& TREE_CODE (decl
) == FUNCTION_DECL
)
4658 flags
= SECTION_CODE
;
4659 else if (decl
&& decl_readonly_section_1 (decl
, reloc
, shlib
))
4662 flags
= SECTION_WRITE
;
4664 if (decl
&& DECL_ONE_ONLY (decl
))
4665 flags
|= SECTION_LINKONCE
;
4667 if (decl
&& TREE_CODE (decl
) == VAR_DECL
&& DECL_THREAD_LOCAL (decl
))
4668 flags
|= SECTION_TLS
| SECTION_WRITE
;
4670 if (strcmp (name
, ".bss") == 0
4671 || strncmp (name
, ".bss.", 5) == 0
4672 || strncmp (name
, ".gnu.linkonce.b.", 16) == 0
4673 || strcmp (name
, ".sbss") == 0
4674 || strncmp (name
, ".sbss.", 6) == 0
4675 || strncmp (name
, ".gnu.linkonce.sb.", 17) == 0
4676 || strcmp (name
, ".tbss") == 0
4677 || strncmp (name
, ".gnu.linkonce.tb.", 17) == 0)
4678 flags
|= SECTION_BSS
;
4680 if (strcmp (name
, ".tdata") == 0
4681 || strcmp (name
, ".tbss") == 0
4682 || strncmp (name
, ".gnu.linkonce.td.", 17) == 0
4683 || strncmp (name
, ".gnu.linkonce.tb.", 17) == 0)
4684 flags
|= SECTION_TLS
;
4686 /* These three sections have special ELF types. They are neither
4687 SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
4688 want to print a section type (@progbits or @nobits). If someone
4689 is silly enough to emit code or TLS variables to one of these
4690 sections, then don't handle them specially. */
4691 if (!(flags
& (SECTION_CODE
| SECTION_BSS
| SECTION_TLS
))
4692 && (strcmp (name
, ".init_array") == 0
4693 || strcmp (name
, ".fini_array") == 0
4694 || strcmp (name
, ".preinit_array") == 0))
4695 flags
|= SECTION_NOTYPE
;
4700 /* Output assembly to switch to section NAME with attribute FLAGS.
4701 Four variants for common object file formats. */
4704 default_no_named_section (name
, flags
)
4705 const char *name ATTRIBUTE_UNUSED
;
4706 unsigned int flags ATTRIBUTE_UNUSED
;
4708 /* Some object formats don't support named sections at all. The
4709 front-end should already have flagged this as an error. */
4714 default_elf_asm_named_section (name
, flags
)
4718 char flagchars
[10], *f
= flagchars
;
4720 if (! named_section_first_declaration (name
))
4722 fprintf (asm_out_file
, "\t.section\t%s\n", name
);
4726 if (!(flags
& SECTION_DEBUG
))
4728 if (flags
& SECTION_WRITE
)
4730 if (flags
& SECTION_CODE
)
4732 if (flags
& SECTION_SMALL
)
4734 if (flags
& SECTION_MERGE
)
4736 if (flags
& SECTION_STRINGS
)
4738 if (flags
& SECTION_TLS
)
4742 fprintf (asm_out_file
, "\t.section\t%s,\"%s\"", name
, flagchars
);
4744 if (!(flags
& SECTION_NOTYPE
))
4748 if (flags
& SECTION_BSS
)
4753 fprintf (asm_out_file
, ",@%s", type
);
4755 if (flags
& SECTION_ENTSIZE
)
4756 fprintf (asm_out_file
, ",%d", flags
& SECTION_ENTSIZE
);
4759 putc ('\n', asm_out_file
);
4763 default_coff_asm_named_section (name
, flags
)
4767 char flagchars
[8], *f
= flagchars
;
4769 if (flags
& SECTION_WRITE
)
4771 if (flags
& SECTION_CODE
)
4775 fprintf (asm_out_file
, "\t.section\t%s,\"%s\"\n", name
, flagchars
);
4779 default_pe_asm_named_section (name
, flags
)
4783 default_coff_asm_named_section (name
, flags
);
4785 if (flags
& SECTION_LINKONCE
)
4787 /* Functions may have been compiled at various levels of
4788 optimization so we can't use `same_size' here.
4789 Instead, have the linker pick one. */
4790 fprintf (asm_out_file
, "\t.linkonce %s\n",
4791 (flags
& SECTION_CODE
? "discard" : "same_size"));
4795 /* Used for vtable gc in GNU binutils. Record that the pointer at OFFSET
4796 from SYMBOL is used in all classes derived from SYMBOL. */
4799 assemble_vtable_entry (symbol
, offset
)
4801 HOST_WIDE_INT offset
;
4803 fputs ("\t.vtable_entry ", asm_out_file
);
4804 output_addr_const (asm_out_file
, symbol
);
4805 fputs (", ", asm_out_file
);
4806 fprintf (asm_out_file
, HOST_WIDE_INT_PRINT_DEC
, offset
);
4807 fputc ('\n', asm_out_file
);
4810 /* Used for vtable gc in GNU binutils. Record the class hierarchy by noting
4811 that the vtable symbol CHILD is derived from the vtable symbol PARENT. */
4814 assemble_vtable_inherit (child
, parent
)
4817 fputs ("\t.vtable_inherit ", asm_out_file
);
4818 output_addr_const (asm_out_file
, child
);
4819 fputs (", ", asm_out_file
);
4820 output_addr_const (asm_out_file
, parent
);
4821 fputc ('\n', asm_out_file
);
4824 /* The lame default section selector. */
4827 default_select_section (decl
, reloc
, align
)
4830 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED
;
4832 bool readonly
= false;
4836 if (decl_readonly_section (decl
, reloc
))
4839 else if (TREE_CODE (decl
) == CONSTRUCTOR
)
4841 if (! ((flag_pic
&& reloc
)
4842 || !TREE_READONLY (decl
)
4843 || TREE_SIDE_EFFECTS (decl
)
4844 || !TREE_CONSTANT (decl
)))
4847 else if (TREE_CODE (decl
) == STRING_CST
)
4848 readonly
= !flag_writable_strings
;
4849 else if (! (flag_pic
&& reloc
))
4853 readonly_data_section ();
4858 /* A helper function for default_elf_select_section and
4859 default_elf_unique_section. Categorizes the DECL. */
4861 enum section_category
4866 SECCAT_RODATA_MERGE_STR
,
4867 SECCAT_RODATA_MERGE_STR_INIT
,
4868 SECCAT_RODATA_MERGE_CONST
,
4873 /* To optimize loading of shared programs, define following subsections
4875 _REL Contains data that has relocations, so they get grouped
4876 together and dynamic linker will visit fewer pages in memory.
4877 _RO Contains data that is otherwise read-only. This is useful
4878 with prelinking as most relocations won't be dynamically
4879 linked and thus stay read only.
4880 _LOCAL Marks data containing relocations only to local objects.
4881 These relocations will get fully resolved by prelinking. */
4883 SECCAT_DATA_REL_LOCAL
,
4885 SECCAT_DATA_REL_RO_LOCAL
,
4895 static enum section_category
4896 categorize_decl_for_section
PARAMS ((tree
, int, int));
4898 static enum section_category
4899 categorize_decl_for_section (decl
, reloc
, shlib
)
4904 enum section_category ret
;
4906 if (TREE_CODE (decl
) == FUNCTION_DECL
)
4908 else if (TREE_CODE (decl
) == STRING_CST
)
4910 if (flag_writable_strings
)
4913 return SECCAT_RODATA_MERGE_STR
;
4915 else if (TREE_CODE (decl
) == VAR_DECL
)
4917 if (DECL_INITIAL (decl
) == NULL
4918 || DECL_INITIAL (decl
) == error_mark_node
)
4920 else if (! TREE_READONLY (decl
)
4921 || TREE_SIDE_EFFECTS (decl
)
4922 || ! TREE_CONSTANT (DECL_INITIAL (decl
)))
4924 if (shlib
&& (reloc
& 2))
4925 ret
= SECCAT_DATA_REL
;
4926 else if (shlib
&& reloc
)
4927 ret
= SECCAT_DATA_REL_LOCAL
;
4931 else if (shlib
&& (reloc
& 2))
4932 ret
= SECCAT_DATA_REL_RO
;
4933 else if (shlib
&& reloc
)
4934 ret
= SECCAT_DATA_REL_RO_LOCAL
;
4935 else if (reloc
|| flag_merge_constants
< 2)
4936 /* C and C++ don't allow different variables to share the same
4937 location. -fmerge-all-constants allows even that (at the
4938 expense of not conforming). */
4939 ret
= SECCAT_RODATA
;
4940 else if (TREE_CODE (DECL_INITIAL (decl
)) == STRING_CST
)
4941 ret
= SECCAT_RODATA_MERGE_STR_INIT
;
4943 ret
= SECCAT_RODATA_MERGE_CONST
;
4945 else if (TREE_CODE (decl
) == CONSTRUCTOR
)
4947 if ((shlib
&& reloc
)
4948 || TREE_SIDE_EFFECTS (decl
)
4949 || ! TREE_CONSTANT (decl
))
4952 ret
= SECCAT_RODATA
;
4955 ret
= SECCAT_RODATA
;
4957 /* There are no read-only thread-local sections. */
4958 if (TREE_CODE (decl
) == VAR_DECL
&& DECL_THREAD_LOCAL (decl
))
4960 if (ret
== SECCAT_BSS
)
4966 /* If the target uses small data sections, select it. */
4967 else if ((*targetm
.in_small_data_p
) (decl
))
4969 if (ret
== SECCAT_BSS
)
4971 else if (targetm
.have_srodata_section
&& ret
== SECCAT_RODATA
)
4972 ret
= SECCAT_SRODATA
;
4981 decl_readonly_section (decl
, reloc
)
4985 return decl_readonly_section_1 (decl
, reloc
, flag_pic
);
4989 decl_readonly_section_1 (decl
, reloc
, shlib
)
4994 switch (categorize_decl_for_section (decl
, reloc
, shlib
))
4997 case SECCAT_RODATA_MERGE_STR
:
4998 case SECCAT_RODATA_MERGE_STR_INIT
:
4999 case SECCAT_RODATA_MERGE_CONST
:
5000 case SECCAT_SRODATA
:
5009 /* Select a section based on the above categorization. */
5012 default_elf_select_section (decl
, reloc
, align
)
5015 unsigned HOST_WIDE_INT align
;
5017 default_elf_select_section_1 (decl
, reloc
, align
, flag_pic
);
5021 default_elf_select_section_1 (decl
, reloc
, align
, shlib
)
5024 unsigned HOST_WIDE_INT align
;
5027 switch (categorize_decl_for_section (decl
, reloc
, shlib
))
5030 /* We're not supposed to be called on FUNCTION_DECLs. */
5033 readonly_data_section ();
5035 case SECCAT_RODATA_MERGE_STR
:
5036 mergeable_string_section (decl
, align
, 0);
5038 case SECCAT_RODATA_MERGE_STR_INIT
:
5039 mergeable_string_section (DECL_INITIAL (decl
), align
, 0);
5041 case SECCAT_RODATA_MERGE_CONST
:
5042 mergeable_constant_section (DECL_MODE (decl
), align
, 0);
5044 case SECCAT_SRODATA
:
5045 named_section (NULL_TREE
, ".sdata2", reloc
);
5050 case SECCAT_DATA_REL
:
5051 named_section (NULL_TREE
, ".data.rel", reloc
);
5053 case SECCAT_DATA_REL_LOCAL
:
5054 named_section (NULL_TREE
, ".data.rel.local", reloc
);
5056 case SECCAT_DATA_REL_RO
:
5057 named_section (NULL_TREE
, ".data.rel.ro", reloc
);
5059 case SECCAT_DATA_REL_RO_LOCAL
:
5060 named_section (NULL_TREE
, ".data.rel.ro.local", reloc
);
5063 named_section (NULL_TREE
, ".sdata", reloc
);
5066 named_section (NULL_TREE
, ".tdata", reloc
);
5069 #ifdef BSS_SECTION_ASM_OP
5072 named_section (NULL_TREE
, ".bss", reloc
);
5076 named_section (NULL_TREE
, ".sbss", reloc
);
5079 named_section (NULL_TREE
, ".tbss", reloc
);
5086 /* Construct a unique section name based on the decl name and the
5087 categorization performed above. */
5090 default_unique_section (decl
, reloc
)
5094 default_unique_section_1 (decl
, reloc
, flag_pic
);
5098 default_unique_section_1 (decl
, reloc
, shlib
)
5103 bool one_only
= DECL_ONE_ONLY (decl
);
5104 const char *prefix
, *name
;
5108 switch (categorize_decl_for_section (decl
, reloc
, shlib
))
5111 prefix
= one_only
? ".gnu.linkonce.t." : ".text.";
5114 case SECCAT_RODATA_MERGE_STR
:
5115 case SECCAT_RODATA_MERGE_STR_INIT
:
5116 case SECCAT_RODATA_MERGE_CONST
:
5117 prefix
= one_only
? ".gnu.linkonce.r." : ".rodata.";
5119 case SECCAT_SRODATA
:
5120 prefix
= one_only
? ".gnu.linkonce.s2." : ".sdata2.";
5123 case SECCAT_DATA_REL
:
5124 case SECCAT_DATA_REL_LOCAL
:
5125 case SECCAT_DATA_REL_RO
:
5126 case SECCAT_DATA_REL_RO_LOCAL
:
5127 prefix
= one_only
? ".gnu.linkonce.d." : ".data.";
5130 prefix
= one_only
? ".gnu.linkonce.s." : ".sdata.";
5133 prefix
= one_only
? ".gnu.linkonce.b." : ".bss.";
5136 prefix
= one_only
? ".gnu.linkonce.sb." : ".sbss.";
5139 prefix
= one_only
? ".gnu.linkonce.td." : ".tdata.";
5142 prefix
= one_only
? ".gnu.linkonce.tb." : ".tbss.";
5147 plen
= strlen (prefix
);
5149 name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl
));
5150 name
= (* targetm
.strip_name_encoding
) (name
);
5151 nlen
= strlen (name
);
5153 string
= alloca (nlen
+ plen
+ 1);
5154 memcpy (string
, prefix
, plen
);
5155 memcpy (string
+ plen
, name
, nlen
+ 1);
5157 DECL_SECTION_NAME (decl
) = build_string (nlen
+ plen
, string
);
5161 default_select_rtx_section (mode
, x
, align
)
5162 enum machine_mode mode ATTRIBUTE_UNUSED
;
5164 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED
;
5167 switch (GET_CODE (x
))
5179 readonly_data_section ();
5183 default_elf_select_rtx_section (mode
, x
, align
)
5184 enum machine_mode mode
;
5186 unsigned HOST_WIDE_INT align
;
5188 /* ??? Handle small data here somehow. */
5191 switch (GET_CODE (x
))
5195 named_section (NULL_TREE
, ".data.rel.ro", 3);
5199 named_section (NULL_TREE
, ".data.rel.ro.local", 1);
5206 mergeable_constant_section (mode
, align
, 0);
5209 /* Set the generally applicable flags on the SYMBOL_REF for EXP. */
5212 default_encode_section_info (decl
, rtl
, first
)
5215 int first ATTRIBUTE_UNUSED
;
5220 /* Careful not to prod global register variables. */
5221 if (GET_CODE (rtl
) != MEM
)
5223 symbol
= XEXP (rtl
, 0);
5224 if (GET_CODE (symbol
) != SYMBOL_REF
)
5228 if (TREE_CODE (decl
) == FUNCTION_DECL
)
5229 flags
|= SYMBOL_FLAG_FUNCTION
;
5230 if ((*targetm
.binds_local_p
) (decl
))
5231 flags
|= SYMBOL_FLAG_LOCAL
;
5232 if ((*targetm
.in_small_data_p
) (decl
))
5233 flags
|= SYMBOL_FLAG_SMALL
;
5234 if (TREE_CODE (decl
) == VAR_DECL
&& DECL_THREAD_LOCAL (decl
))
5235 flags
|= decl_tls_model (decl
) << SYMBOL_FLAG_TLS_SHIFT
;
5236 /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without
5237 being PUBLIC, the thing *must* be defined in this translation unit.
5238 Prevent this buglet from being propagated into rtl code as well. */
5239 if (DECL_P (decl
) && DECL_EXTERNAL (decl
) && TREE_PUBLIC (decl
))
5240 flags
|= SYMBOL_FLAG_EXTERNAL
;
5242 SYMBOL_REF_FLAGS (symbol
) = flags
;
5245 /* By default, we do nothing for encode_section_info, so we need not
5246 do anything but discard the '*' marker. */
5249 default_strip_name_encoding (str
)
5252 return str
+ (*str
== '*');
5255 /* Assume ELF-ish defaults, since that's pretty much the most liberal
5256 wrt cross-module name binding. */
5259 default_binds_local_p (exp
)
5262 return default_binds_local_p_1 (exp
, flag_pic
);
5266 default_binds_local_p_1 (exp
, shlib
)
5272 /* A non-decl is an entry in the constant pool. */
5275 /* Static variables are always local. */
5276 else if (! TREE_PUBLIC (exp
))
5278 /* A variable is local if the user tells us so. */
5279 else if (decl_visibility (exp
) != VISIBILITY_DEFAULT
)
5281 /* Otherwise, variables defined outside this object may not be local. */
5282 else if (DECL_EXTERNAL (exp
))
5284 /* Linkonce and weak data are never local. */
5285 else if (DECL_ONE_ONLY (exp
) || DECL_WEAK (exp
))
5287 /* If PIC, then assume that any global name can be overridden by
5288 symbols resolved from other modules. */
5291 /* Uninitialized COMMON variable may be unified with symbols
5292 resolved from other modules. */
5293 else if (DECL_COMMON (exp
)
5294 && (DECL_INITIAL (exp
) == NULL
5295 || DECL_INITIAL (exp
) == error_mark_node
))
5297 /* Otherwise we're left with initialized (or non-common) global data
5298 which is of necessity defined locally. */
5305 /* Determine whether or not a pointer mode is valid. Assume defaults
5306 of ptr_mode or Pmode - can be overridden. */
5308 default_valid_pointer_mode (mode
)
5309 enum machine_mode mode
;
5311 return (mode
== ptr_mode
|| mode
== Pmode
);
5314 /* Default function to output code that will globalize a label. A
5315 target must define GLOBAL_ASM_OP or provide it's own function to
5316 globalize a label. */
5317 #ifdef GLOBAL_ASM_OP
5319 default_globalize_label (stream
, name
)
5323 fputs (GLOBAL_ASM_OP
, stream
);
5324 assemble_name (stream
, name
);
5325 putc ('\n', stream
);
5327 #endif /* GLOBAL_ASM_OP */
5329 /* This is how to output an internal numbered label where PREFIX is
5330 the class of label and LABELNO is the number within the class. */
5333 default_internal_label (stream
, prefix
, labelno
)
5336 unsigned long labelno
;
5338 char *const buf
= alloca (40 + strlen (prefix
));
5339 ASM_GENERATE_INTERNAL_LABEL (buf
, prefix
, labelno
);
5340 ASM_OUTPUT_LABEL (stream
, buf
);
5343 #include "gt-varasm.h"