varasm.c revision 259694
118334Speter/* Output variables, constants and external declarations, for GNU compiler. 290075Sobrien Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 3169689Skan 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 4169689Skan Free Software Foundation, Inc. 518334Speter 690075SobrienThis file is part of GCC. 718334Speter 890075SobrienGCC is free software; you can redistribute it and/or modify it under 990075Sobrienthe terms of the GNU General Public License as published by the Free 1090075SobrienSoftware Foundation; either version 2, or (at your option) any later 1190075Sobrienversion. 1218334Speter 1390075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1490075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1590075SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1690075Sobrienfor more details. 1718334Speter 1818334SpeterYou should have received a copy of the GNU General Public License 1990075Sobrienalong with GCC; see the file COPYING. If not, write to the Free 20169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 21169689Skan02110-1301, USA. */ 2218334Speter 2318334Speter 2418334Speter/* This file handles generation of all the assembler code 2518334Speter *except* the instructions of a function. 2618334Speter This includes declarations of variables and their initial values. 2718334Speter 2818334Speter We also output the assembler code for constants stored in memory 2918334Speter and are responsible for combining constants with the same value. */ 3018334Speter 3150397Sobrien#include "config.h" 3250397Sobrien#include "system.h" 33132718Skan#include "coretypes.h" 34132718Skan#include "tm.h" 3518334Speter#include "rtl.h" 3618334Speter#include "tree.h" 3718334Speter#include "flags.h" 3818334Speter#include "function.h" 3918334Speter#include "expr.h" 4018334Speter#include "hard-reg-set.h" 4118334Speter#include "regs.h" 42117395Skan#include "real.h" 4390075Sobrien#include "output.h" 4450397Sobrien#include "toplev.h" 4590075Sobrien#include "hashtab.h" 4618334Speter#include "c-pragma.h" 4790075Sobrien#include "ggc.h" 4890075Sobrien#include "langhooks.h" 4990075Sobrien#include "tm_p.h" 5090075Sobrien#include "debug.h" 5190075Sobrien#include "target.h" 52169689Skan#include "tree-mudflap.h" 53132718Skan#include "cgraph.h" 54169689Skan#include "cfglayout.h" 55169689Skan#include "basic-block.h" 5618334Speter 5718334Speter#ifdef XCOFF_DEBUGGING_INFO 5890075Sobrien#include "xcoffout.h" /* Needed for external data 5990075Sobrien declarations for e.g. AIX 4.x. */ 6018334Speter#endif 6118334Speter 62169689Skan/* The (assembler) name of the first globally-visible object output. */ 63169689Skanextern GTY(()) const char *first_global_object_name; 64169689Skanextern GTY(()) const char *weak_global_object_name; 6518334Speter 6690075Sobrienconst char *first_global_object_name; 6790075Sobrienconst char *weak_global_object_name; 6818334Speter 6990075Sobrienstruct addr_const; 70117395Skanstruct constant_descriptor_rtx; 71169689Skanstruct rtx_constant_pool; 7290075Sobrien 73117395Skanstruct varasm_status GTY(()) 7490075Sobrien{ 75169689Skan /* If we're using a per-function constant pool, this is it. */ 76169689Skan struct rtx_constant_pool *pool; 7790075Sobrien 78132718Skan /* Number of tree-constants deferred during the expansion of this 79132718Skan function. */ 80132718Skan unsigned int deferred_constants; 8190075Sobrien}; 8290075Sobrien 83132718Skan#define n_deferred_constants (cfun->varasm->deferred_constants) 8490075Sobrien 8518334Speter/* Number for making the label on the next 8618334Speter constant that is stored in memory. */ 8718334Speter 88132718Skanstatic GTY(()) int const_labelno; 8918334Speter 9018334Speter/* Carry information from ASM_DECLARE_OBJECT_NAME 9118334Speter to ASM_FINISH_DECLARE_OBJECT. */ 9218334Speter 9318334Speterint size_directive_output; 9418334Speter 9518334Speter/* The last decl for which assemble_variable was called, 9618334Speter if it did ASM_DECLARE_OBJECT_NAME. 9718334Speter If the last call to assemble_variable didn't do that, 9818334Speter this holds 0. */ 9918334Speter 10018334Spetertree last_assemble_variable_decl; 10118334Speter 102169689Skan/* The following global variable indicates if the first basic block 103169689Skan in a function belongs to the cold partition or not. */ 10418334Speter 105169689Skanbool first_function_block_is_cold; 106169689Skan 107169689Skan/* We give all constants their own alias set. Perhaps redundant with 108169689Skan MEM_READONLY_P, but pre-dates it. */ 109169689Skan 11090075Sobrienstatic HOST_WIDE_INT const_alias_set; 11118334Speter 112132718Skanstatic const char *strip_reg_name (const char *); 113132718Skanstatic int contains_pointers_p (tree); 114132718Skan#ifdef ASM_OUTPUT_EXTERNAL 115132718Skanstatic bool incorporeal_function_p (tree); 116132718Skan#endif 117132718Skanstatic void decode_addr_const (tree, struct addr_const *); 118132718Skanstatic hashval_t const_desc_hash (const void *); 119132718Skanstatic int const_desc_eq (const void *, const void *); 120132718Skanstatic hashval_t const_hash_1 (const tree); 121132718Skanstatic int compare_constant (const tree, const tree); 122132718Skanstatic tree copy_constant (tree); 123132718Skanstatic void output_constant_def_contents (rtx); 124132718Skanstatic void output_addressed_constants (tree); 125132718Skanstatic unsigned HOST_WIDE_INT array_size_for_constructor (tree); 126132718Skanstatic unsigned min_align (unsigned, unsigned); 127132718Skanstatic void output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int); 128132718Skanstatic void globalize_decl (tree); 129169689Skan#ifdef BSS_SECTION_ASM_OP 13050397Sobrien#ifdef ASM_OUTPUT_BSS 131132718Skanstatic void asm_output_bss (FILE *, tree, const char *, 132132718Skan unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT); 13350397Sobrien#endif 13450397Sobrien#ifdef ASM_OUTPUT_ALIGNED_BSS 135132718Skanstatic void asm_output_aligned_bss (FILE *, tree, const char *, 136132718Skan unsigned HOST_WIDE_INT, int) 137132718Skan ATTRIBUTE_UNUSED; 13850397Sobrien#endif 13950397Sobrien#endif /* BSS_SECTION_ASM_OP */ 140132718Skanstatic void mark_weak (tree); 141169689Skanstatic void output_constant_pool (const char *, tree); 14218334Speter 143169689Skan/* Well-known sections, each one associated with some sort of *_ASM_OP. */ 144169689Skansection *text_section; 145169689Skansection *data_section; 146169689Skansection *readonly_data_section; 147169689Skansection *sdata_section; 148169689Skansection *ctors_section; 149169689Skansection *dtors_section; 150169689Skansection *bss_section; 151169689Skansection *sbss_section; 15218334Speter 153169689Skan/* Various forms of common section. All are guaranteed to be nonnull. */ 154169689Skansection *tls_comm_section; 155169689Skansection *comm_section; 156169689Skansection *lcomm_section; 157169689Skan 158169689Skan/* A SECTION_NOSWITCH section used for declaring global BSS variables. 159169689Skan May be null. */ 160169689Skansection *bss_noswitch_section; 161169689Skan 162169689Skan/* The section that holds the main exception table, when known. The section 163169689Skan is set either by the target's init_sections hook or by the first call to 164169689Skan switch_to_exception_section. */ 165169689Skansection *exception_section; 166169689Skan 167169689Skan/* The section that holds the DWARF2 frame unwind information, when known. 168169689Skan The section is set either by the target's init_sections hook or by the 169169689Skan first call to switch_to_eh_frame_section. */ 170169689Skansection *eh_frame_section; 171169689Skan 172169689Skan/* asm_out_file's current section. This is NULL if no section has yet 173169689Skan been selected or if we lose track of what the current section is. */ 174169689Skansection *in_section; 175169689Skan 176169689Skan/* True if code for the current function is currently being directed 177169689Skan at the cold section. */ 178169689Skanbool in_cold_section_p; 179169689Skan 180169689Skan/* A linked list of all the unnamed sections. */ 181169689Skanstatic GTY(()) section *unnamed_sections; 182169689Skan 183117395Skan/* Return a nonzero value if DECL has a section attribute. */ 18490075Sobrien#ifndef IN_NAMED_SECTION 18518334Speter#define IN_NAMED_SECTION(DECL) \ 18618334Speter ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \ 18718334Speter && DECL_SECTION_NAME (DECL) != NULL_TREE) 18890075Sobrien#endif 18918334Speter 190169689Skan/* Hash table of named sections. */ 191169689Skanstatic GTY((param_is (section))) htab_t section_htab; 19218334Speter 193169689Skan/* A table of object_blocks, indexed by section. */ 194169689Skanstatic GTY((param_is (struct object_block))) htab_t object_block_htab; 19590075Sobrien 196169689Skan/* The next number to use for internal anchor labels. */ 197169689Skanstatic GTY(()) int anchor_labelno; 19890075Sobrien 199169689Skan/* A pool of constants that can be shared between functions. */ 200169689Skanstatic GTY(()) struct rtx_constant_pool *shared_constant_pool; 20190075Sobrien 202169689Skan/* Helper routines for maintaining section_htab. */ 20318334Speter 204169689Skanstatic int 205169689Skansection_entry_eq (const void *p1, const void *p2) 206169689Skan{ 207169689Skan const section *old = p1; 208169689Skan const char *new = p2; 20918334Speter 210169689Skan return strcmp (old->named.name, new) == 0; 21118334Speter} 21218334Speter 213169689Skanstatic hashval_t 214169689Skansection_entry_hash (const void *p) 21518334Speter{ 216169689Skan const section *old = p; 217169689Skan return htab_hash_string (old->named.name); 21818334Speter} 219117395Skan 220169689Skan/* Return a hash value for section SECT. */ 22118334Speter 222169689Skanstatic hashval_t 223169689Skanhash_section (section *sect) 22418334Speter{ 225169689Skan if (sect->common.flags & SECTION_NAMED) 226169689Skan return htab_hash_string (sect->named.name); 227169689Skan return sect->common.flags; 22818334Speter} 22918334Speter 230169689Skan/* Helper routines for maintaining object_block_htab. */ 23118334Speter 232169689Skanstatic int 233169689Skanobject_block_entry_eq (const void *p1, const void *p2) 23418334Speter{ 235169689Skan const struct object_block *old = p1; 236169689Skan const section *new = p2; 237169689Skan 238169689Skan return old->sect == new; 23918334Speter} 24018334Speter 241169689Skanstatic hashval_t 242169689Skanobject_block_entry_hash (const void *p) 24350397Sobrien{ 244169689Skan const struct object_block *old = p; 245169689Skan return hash_section (old->sect); 24650397Sobrien} 24750397Sobrien 248169689Skan/* Return a new unnamed section with the given fields. */ 24990075Sobrien 250169689Skansection * 251169689Skanget_unnamed_section (unsigned int flags, void (*callback) (const void *), 252169689Skan const void *data) 25390075Sobrien{ 254169689Skan section *sect; 25590075Sobrien 256169689Skan sect = ggc_alloc (sizeof (struct unnamed_section)); 257169689Skan sect->unnamed.common.flags = flags | SECTION_UNNAMED; 258169689Skan sect->unnamed.callback = callback; 259169689Skan sect->unnamed.data = data; 260169689Skan sect->unnamed.next = unnamed_sections; 26190075Sobrien 262169689Skan unnamed_sections = sect; 263169689Skan return sect; 26490075Sobrien} 26590075Sobrien 266169689Skan/* Return a SECTION_NOSWITCH section with the given fields. */ 26790075Sobrien 268169689Skanstatic section * 269169689Skanget_noswitch_section (unsigned int flags, noswitch_section_callback callback) 27090075Sobrien{ 271169689Skan section *sect; 27290075Sobrien 273169689Skan sect = ggc_alloc (sizeof (struct unnamed_section)); 274169689Skan sect->noswitch.common.flags = flags | SECTION_NOSWITCH; 275169689Skan sect->noswitch.callback = callback; 27690075Sobrien 277169689Skan return sect; 27890075Sobrien} 27990075Sobrien 280169689Skan/* Return the named section structure associated with NAME. Create 281169689Skan a new section with the given fields if no such structure exists. */ 28290075Sobrien 283169689Skansection * 284169689Skanget_section (const char *name, unsigned int flags, tree decl) 28590075Sobrien{ 286169689Skan section *sect, **slot; 28790075Sobrien 288169689Skan slot = (section **) 289169689Skan htab_find_slot_with_hash (section_htab, name, 290169689Skan htab_hash_string (name), INSERT); 291169689Skan flags |= SECTION_NAMED; 292169689Skan if (*slot == NULL) 29390075Sobrien { 294169689Skan sect = ggc_alloc (sizeof (struct named_section)); 295169689Skan sect->named.common.flags = flags; 296169689Skan sect->named.name = ggc_strdup (name); 297169689Skan sect->named.decl = decl; 298169689Skan *slot = sect; 29990075Sobrien } 300117395Skan else 30190075Sobrien { 302169689Skan sect = *slot; 303169689Skan if ((sect->common.flags & ~SECTION_DECLARED) != flags 304169689Skan && ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0) 305169689Skan { 306169689Skan /* Sanity check user variables for flag changes. */ 307169689Skan if (decl == 0) 308169689Skan decl = sect->named.decl; 309169689Skan gcc_assert (decl); 310169689Skan error ("%+D causes a section type conflict", decl); 311169689Skan } 31290075Sobrien } 313169689Skan return sect; 31490075Sobrien} 31590075Sobrien 316169689Skan/* Return true if the current compilation mode benefits from having 317169689Skan objects grouped into blocks. */ 31890075Sobrien 319169689Skanstatic bool 320169689Skanuse_object_blocks_p (void) 321169689Skan{ 322169689Skan return flag_section_anchors; 323169689Skan} 32490075Sobrien 325169689Skan/* Return the object_block structure for section SECT. Create a new 326169689Skan structure if we haven't created one already. Return null if SECT 327169689Skan itself is null. */ 328169689Skan 329169689Skanstatic struct object_block * 330169689Skanget_block_for_section (section *sect) 33190075Sobrien{ 332169689Skan struct object_block *block; 333169689Skan void **slot; 33490075Sobrien 335169689Skan if (sect == NULL) 336169689Skan return NULL; 33790075Sobrien 338169689Skan slot = htab_find_slot_with_hash (object_block_htab, sect, 339169689Skan hash_section (sect), INSERT); 340169689Skan block = (struct object_block *) *slot; 341169689Skan if (block == NULL) 34290075Sobrien { 343169689Skan block = (struct object_block *) 344169689Skan ggc_alloc_cleared (sizeof (struct object_block)); 345169689Skan block->sect = sect; 346169689Skan *slot = block; 34790075Sobrien } 348169689Skan return block; 349169689Skan} 35090075Sobrien 351169689Skan/* Create a symbol with label LABEL and place it at byte offset 352169689Skan OFFSET in BLOCK. OFFSET can be negative if the symbol's offset 353169689Skan is not yet known. LABEL must be a garbage-collected string. */ 354169689Skan 355169689Skanstatic rtx 356169689Skancreate_block_symbol (const char *label, struct object_block *block, 357169689Skan HOST_WIDE_INT offset) 358169689Skan{ 359169689Skan rtx symbol; 360169689Skan unsigned int size; 361169689Skan 362169689Skan /* Create the extended SYMBOL_REF. */ 363169689Skan size = RTX_HDR_SIZE + sizeof (struct block_symbol); 364169689Skan symbol = ggc_alloc_zone (size, &rtl_zone); 365169689Skan 366169689Skan /* Initialize the normal SYMBOL_REF fields. */ 367169689Skan memset (symbol, 0, size); 368169689Skan PUT_CODE (symbol, SYMBOL_REF); 369169689Skan PUT_MODE (symbol, Pmode); 370169689Skan XSTR (symbol, 0) = label; 371169689Skan SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_HAS_BLOCK_INFO; 372169689Skan 373169689Skan /* Initialize the block_symbol stuff. */ 374169689Skan SYMBOL_REF_BLOCK (symbol) = block; 375169689Skan SYMBOL_REF_BLOCK_OFFSET (symbol) = offset; 376169689Skan 377169689Skan return symbol; 37890075Sobrien} 37990075Sobrien 380169689Skanstatic void 381169689Skaninitialize_cold_section_name (void) 382169689Skan{ 383169689Skan const char *stripped_name; 384169689Skan char *name, *buffer; 385169689Skan tree dsn; 38690075Sobrien 387169689Skan gcc_assert (cfun && current_function_decl); 388169689Skan if (cfun->unlikely_text_section_name) 389169689Skan return; 390169689Skan 391169689Skan dsn = DECL_SECTION_NAME (current_function_decl); 392169689Skan if (flag_function_sections && dsn) 39390075Sobrien { 394169689Skan name = alloca (TREE_STRING_LENGTH (dsn) + 1); 395169689Skan memcpy (name, TREE_STRING_POINTER (dsn), TREE_STRING_LENGTH (dsn) + 1); 39690075Sobrien 397169689Skan stripped_name = targetm.strip_name_encoding (name); 39890075Sobrien 399169689Skan buffer = ACONCAT ((stripped_name, "_unlikely", NULL)); 400169689Skan cfun->unlikely_text_section_name = ggc_strdup (buffer); 40190075Sobrien } 402169689Skan else 403169689Skan cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME; 40490075Sobrien} 40590075Sobrien 406169689Skan/* Tell assembler to switch to unlikely-to-be-executed text section. */ 40718334Speter 408169689Skansection * 409169689Skanunlikely_text_section (void) 41018334Speter{ 411169689Skan if (cfun) 412169689Skan { 413169689Skan if (!cfun->unlikely_text_section_name) 414169689Skan initialize_cold_section_name (); 415169689Skan 416169689Skan return get_named_section (NULL, cfun->unlikely_text_section_name, 0); 417169689Skan } 418169689Skan else 419169689Skan return get_named_section (NULL, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0); 420169689Skan} 421169689Skan 422169689Skan/* When called within a function context, return true if the function 423169689Skan has been assigned a cold text section and if SECT is that section. 424169689Skan When called outside a function context, return true if SECT is the 425169689Skan default cold section. */ 426169689Skan 427169689Skanbool 428169689Skanunlikely_text_section_p (section *sect) 429169689Skan{ 430169689Skan const char *name; 431169689Skan 432169689Skan if (cfun) 433169689Skan name = cfun->unlikely_text_section_name; 434169689Skan else 435169689Skan name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME; 436169689Skan 437169689Skan return (name 438169689Skan && sect 439169689Skan && SECTION_STYLE (sect) == SECTION_NAMED 440169689Skan && strcmp (name, sect->named.name) == 0); 441169689Skan} 442169689Skan 443169689Skan/* Return a section with a particular name and with whatever SECTION_* 444169689Skan flags section_type_flags deems appropriate. The name of the section 445169689Skan is taken from NAME if nonnull, otherwise it is taken from DECL's 446169689Skan DECL_SECTION_NAME. DECL is the decl associated with the section 447169689Skan (see the section comment for details) and RELOC is as for 448169689Skan section_type_flags. */ 449169689Skan 450169689Skansection * 451169689Skanget_named_section (tree decl, const char *name, int reloc) 452169689Skan{ 45390075Sobrien unsigned int flags; 45490075Sobrien 455169689Skan gcc_assert (!decl || DECL_P (decl)); 45618334Speter if (name == NULL) 45718334Speter name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); 45818334Speter 459169689Skan flags = targetm.section_type_flags (decl, name, reloc); 46090075Sobrien 461169689Skan return get_section (name, flags, decl); 46218334Speter} 46318334Speter 46490075Sobrien/* If required, set DECL_SECTION_NAME to a unique name. */ 46550397Sobrien 466132718Skanvoid 467132718Skanresolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED, 468132718Skan int flag_function_or_data_sections) 46990075Sobrien{ 47090075Sobrien if (DECL_SECTION_NAME (decl) == NULL_TREE 471117395Skan && targetm.have_named_sections 472102780Skan && (flag_function_or_data_sections 473117395Skan || DECL_ONE_ONLY (decl))) 474169689Skan targetm.asm_out.unique_section (decl, reloc); 47590075Sobrien} 47690075Sobrien 47750397Sobrien#ifdef BSS_SECTION_ASM_OP 47850397Sobrien 47950397Sobrien#ifdef ASM_OUTPUT_BSS 48050397Sobrien 48150397Sobrien/* Utility function for ASM_OUTPUT_BSS for targets to use if 48250397Sobrien they don't support alignments in .bss. 48350397Sobrien ??? It is believed that this function will work in most cases so such 48450397Sobrien support is localized here. */ 48550397Sobrien 48650397Sobrienstatic void 487132718Skanasm_output_bss (FILE *file, tree decl ATTRIBUTE_UNUSED, 488132718Skan const char *name, 489132718Skan unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, 490132718Skan unsigned HOST_WIDE_INT rounded) 49150397Sobrien{ 492169689Skan targetm.asm_out.globalize_label (file, name); 493169689Skan switch_to_section (bss_section); 49450397Sobrien#ifdef ASM_DECLARE_OBJECT_NAME 49550397Sobrien last_assemble_variable_decl = decl; 49650397Sobrien ASM_DECLARE_OBJECT_NAME (file, name, decl); 49750397Sobrien#else 49850397Sobrien /* Standard thing is just output label for the object. */ 49950397Sobrien ASM_OUTPUT_LABEL (file, name); 50050397Sobrien#endif /* ASM_DECLARE_OBJECT_NAME */ 501102780Skan ASM_OUTPUT_SKIP (file, rounded ? rounded : 1); 50250397Sobrien} 50350397Sobrien 50450397Sobrien#endif 50550397Sobrien 50650397Sobrien#ifdef ASM_OUTPUT_ALIGNED_BSS 50750397Sobrien 50850397Sobrien/* Utility function for targets to use in implementing 50950397Sobrien ASM_OUTPUT_ALIGNED_BSS. 51050397Sobrien ??? It is believed that this function will work in most cases so such 51150397Sobrien support is localized here. */ 51250397Sobrien 51350397Sobrienstatic void 514132718Skanasm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED, 515132718Skan const char *name, unsigned HOST_WIDE_INT size, 516132718Skan int align) 51750397Sobrien{ 518169689Skan switch_to_section (bss_section); 51950397Sobrien ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT)); 52050397Sobrien#ifdef ASM_DECLARE_OBJECT_NAME 52150397Sobrien last_assemble_variable_decl = decl; 52250397Sobrien ASM_DECLARE_OBJECT_NAME (file, name, decl); 52350397Sobrien#else 52450397Sobrien /* Standard thing is just output label for the object. */ 52550397Sobrien ASM_OUTPUT_LABEL (file, name); 52650397Sobrien#endif /* ASM_DECLARE_OBJECT_NAME */ 52750397Sobrien ASM_OUTPUT_SKIP (file, size ? size : 1); 52850397Sobrien} 52950397Sobrien 53050397Sobrien#endif 53150397Sobrien 53250397Sobrien#endif /* BSS_SECTION_ASM_OP */ 53350397Sobrien 534169689Skan#ifndef USE_SELECT_SECTION_FOR_FUNCTIONS 535169689Skan/* Return the hot section for function DECL. Return text_section for 536169689Skan null DECLs. */ 53718334Speter 538169689Skanstatic section * 539169689Skanhot_function_section (tree decl) 540169689Skan{ 541169689Skan if (decl != NULL_TREE 542169689Skan && DECL_SECTION_NAME (decl) != NULL_TREE 543169689Skan && targetm.have_named_sections) 544169689Skan return get_named_section (decl, NULL, 0); 545169689Skan else 546169689Skan return text_section; 547169689Skan} 548169689Skan#endif 54918334Speter 550169689Skan/* Return the section for function DECL. 551169689Skan 552169689Skan If DECL is NULL_TREE, return the text section. We can be passed 553169689Skan NULL_TREE under some circumstances by dbxout.c at least. */ 554169689Skan 555169689Skansection * 556132718Skanfunction_section (tree decl) 55718334Speter{ 558169689Skan int reloc = 0; 559169689Skan 560169689Skan if (first_function_block_is_cold) 561169689Skan reloc = 1; 562169689Skan 563169689Skan#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS 56418334Speter if (decl != NULL_TREE 56518334Speter && DECL_SECTION_NAME (decl) != NULL_TREE) 566169689Skan return reloc ? unlikely_text_section () 567169689Skan : get_named_section (decl, NULL, 0); 56850397Sobrien else 569169689Skan return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl)); 570169689Skan#else 571169689Skan return reloc ? unlikely_text_section () : hot_function_section (decl); 572169689Skan#endif 57318334Speter} 57450397Sobrien 575169689Skansection * 576169689Skancurrent_function_section (void) 57750397Sobrien{ 578169689Skan#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS 579169689Skan if (current_function_decl != NULL_TREE 580169689Skan && DECL_SECTION_NAME (current_function_decl) != NULL_TREE) 581169689Skan return in_cold_section_p ? unlikely_text_section () 582169689Skan : get_named_section (current_function_decl, 583169689Skan NULL, 0); 58450397Sobrien else 585169689Skan return targetm.asm_out.select_section (current_function_decl, 586169689Skan in_cold_section_p, 587169689Skan DECL_ALIGN (current_function_decl)); 588169689Skan#else 589169689Skan return (in_cold_section_p 590169689Skan ? unlikely_text_section () 591169689Skan : hot_function_section (current_function_decl)); 592169689Skan#endif 59350397Sobrien} 59450397Sobrien 595169689Skan/* Return the read-only data section associated with function DECL. */ 59690075Sobrien 597169689Skansection * 598169689Skandefault_function_rodata_section (tree decl) 599169689Skan{ 600169689Skan if (decl != NULL_TREE && DECL_SECTION_NAME (decl)) 601169689Skan { 602169689Skan const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); 603169689Skan 604169689Skan if (DECL_ONE_ONLY (decl) && HAVE_COMDAT_GROUP) 605169689Skan { 606169689Skan size_t len = strlen (name) + 3; 607169689Skan char* rname = alloca (len); 608169689Skan 609169689Skan strcpy (rname, ".rodata"); 610169689Skan strcat (rname, name + 5); 611169689Skan return get_section (rname, SECTION_LINKONCE, decl); 612169689Skan } 613169689Skan /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo. */ 614169689Skan else if (DECL_ONE_ONLY (decl) 615169689Skan && strncmp (name, ".gnu.linkonce.t.", 16) == 0) 616169689Skan { 617169689Skan size_t len = strlen (name) + 1; 618169689Skan char *rname = alloca (len); 619169689Skan 620169689Skan memcpy (rname, name, len); 621169689Skan rname[14] = 'r'; 622169689Skan return get_section (rname, SECTION_LINKONCE, decl); 623169689Skan } 624169689Skan /* For .text.foo we want to use .rodata.foo. */ 625169689Skan else if (flag_function_sections && flag_data_sections 626169689Skan && strncmp (name, ".text.", 6) == 0) 627169689Skan { 628169689Skan size_t len = strlen (name) + 1; 629169689Skan char *rname = alloca (len + 2); 630169689Skan 631169689Skan memcpy (rname, ".rodata", 7); 632169689Skan memcpy (rname + 7, name + 5, len - 5); 633169689Skan return get_section (rname, 0, decl); 634169689Skan } 635169689Skan } 636169689Skan 637169689Skan return readonly_data_section; 638169689Skan} 639169689Skan 640169689Skan/* Return the read-only data section associated with function DECL 641169689Skan for targets where that section should be always the single 642169689Skan readonly data section. */ 643169689Skan 644169689Skansection * 645169689Skandefault_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED) 646169689Skan{ 647169689Skan return readonly_data_section; 648169689Skan} 649169689Skan 650169689Skan/* Return the section to use for string merging. */ 651169689Skan 652169689Skanstatic section * 653132718Skanmergeable_string_section (tree decl ATTRIBUTE_UNUSED, 654132718Skan unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED, 655132718Skan unsigned int flags ATTRIBUTE_UNUSED) 65618334Speter{ 657169689Skan HOST_WIDE_INT len; 658169689Skan 659132718Skan if (HAVE_GAS_SHF_MERGE && flag_merge_constants 66090075Sobrien && TREE_CODE (decl) == STRING_CST 66190075Sobrien && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE 66290075Sobrien && align <= 256 663169689Skan && (len = int_size_in_bytes (TREE_TYPE (decl))) > 0 664169689Skan && TREE_STRING_LENGTH (decl) >= len) 66518334Speter { 66690075Sobrien enum machine_mode mode; 66790075Sobrien unsigned int modesize; 66890075Sobrien const char *str; 669169689Skan HOST_WIDE_INT i; 670169689Skan int j, unit; 67190075Sobrien char name[30]; 67218334Speter 67390075Sobrien mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl))); 67490075Sobrien modesize = GET_MODE_BITSIZE (mode); 67590075Sobrien if (modesize >= 8 && modesize <= 256 67690075Sobrien && (modesize & (modesize - 1)) == 0) 67790075Sobrien { 67890075Sobrien if (align < modesize) 67990075Sobrien align = modesize; 68018334Speter 68190075Sobrien str = TREE_STRING_POINTER (decl); 68290075Sobrien unit = GET_MODE_SIZE (mode); 68318334Speter 68490075Sobrien /* Check for embedded NUL characters. */ 68590075Sobrien for (i = 0; i < len; i += unit) 68690075Sobrien { 68790075Sobrien for (j = 0; j < unit; j++) 688117395Skan if (str[i + j] != '\0') 68990075Sobrien break; 69090075Sobrien if (j == unit) 69190075Sobrien break; 69290075Sobrien } 69390075Sobrien if (i == len - unit) 69490075Sobrien { 69590075Sobrien sprintf (name, ".rodata.str%d.%d", modesize / 8, 69690075Sobrien (int) (align / 8)); 69790075Sobrien flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS; 698169689Skan return get_section (name, flags, NULL); 69990075Sobrien } 70090075Sobrien } 70118334Speter } 702132718Skan 703169689Skan return readonly_data_section; 704117395Skan} 70590075Sobrien 706169689Skan/* Return the section to use for constant merging. */ 70790075Sobrien 708169689Skansection * 709132718Skanmergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED, 710132718Skan unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED, 711132718Skan unsigned int flags ATTRIBUTE_UNUSED) 71290075Sobrien{ 71390075Sobrien unsigned int modesize = GET_MODE_BITSIZE (mode); 71490075Sobrien 715132718Skan if (HAVE_GAS_SHF_MERGE && flag_merge_constants 71690075Sobrien && mode != VOIDmode 71790075Sobrien && mode != BLKmode 71890075Sobrien && modesize <= align 71990075Sobrien && align >= 8 72090075Sobrien && align <= 256 72190075Sobrien && (align & (align - 1)) == 0) 72250397Sobrien { 72390075Sobrien char name[24]; 72490075Sobrien 72590075Sobrien sprintf (name, ".rodata.cst%d", (int) (align / 8)); 72690075Sobrien flags |= (align / 8) | SECTION_MERGE; 727169689Skan return get_section (name, flags, NULL); 728117395Skan } 729169689Skan return readonly_data_section; 73018334Speter} 73190075Sobrien 73218334Speter/* Given NAME, a putative register name, discard any customary prefixes. */ 73318334Speter 73452284Sobrienstatic const char * 735132718Skanstrip_reg_name (const char *name) 73618334Speter{ 73718334Speter#ifdef REGISTER_PREFIX 73818334Speter if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX))) 73918334Speter name += strlen (REGISTER_PREFIX); 74018334Speter#endif 74118334Speter if (name[0] == '%' || name[0] == '#') 74218334Speter name++; 74318334Speter return name; 74418334Speter} 74518334Speter 746169689Skan/* The user has asked for a DECL to have a particular name. Set (or 747169689Skan change) it in such a way that we don't prefix an underscore to 748169689Skan it. */ 749169689Skanvoid 750169689Skanset_user_assembler_name (tree decl, const char *name) 751169689Skan{ 752169689Skan char *starred = alloca (strlen (name) + 2); 753169689Skan starred[0] = '*'; 754169689Skan strcpy (starred + 1, name); 755169689Skan change_decl_assembler_name (decl, get_identifier (starred)); 756169689Skan SET_DECL_RTL (decl, NULL_RTX); 757169689Skan} 758169689Skan 75918334Speter/* Decode an `asm' spec for a declaration as a register name. 76018334Speter Return the register number, or -1 if nothing specified, 76118334Speter or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized, 76218334Speter or -3 if ASMSPEC is `cc' and is not recognized, 76318334Speter or -4 if ASMSPEC is `memory' and is not recognized. 76418334Speter Accept an exact spelling or a decimal number. 76518334Speter Prefixes such as % are optional. */ 76618334Speter 76718334Speterint 768132718Skandecode_reg_name (const char *asmspec) 76918334Speter{ 77018334Speter if (asmspec != 0) 77118334Speter { 77218334Speter int i; 77318334Speter 77418334Speter /* Get rid of confusing prefixes. */ 77518334Speter asmspec = strip_reg_name (asmspec); 77690075Sobrien 77718334Speter /* Allow a decimal number as a "register name". */ 77818334Speter for (i = strlen (asmspec) - 1; i >= 0; i--) 77990075Sobrien if (! ISDIGIT (asmspec[i])) 78018334Speter break; 78118334Speter if (asmspec[0] != 0 && i < 0) 78218334Speter { 78318334Speter i = atoi (asmspec); 78418334Speter if (i < FIRST_PSEUDO_REGISTER && i >= 0) 78518334Speter return i; 78618334Speter else 78718334Speter return -2; 78818334Speter } 78918334Speter 79018334Speter for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 79118334Speter if (reg_names[i][0] 79218334Speter && ! strcmp (asmspec, strip_reg_name (reg_names[i]))) 79318334Speter return i; 79418334Speter 79518334Speter#ifdef ADDITIONAL_REGISTER_NAMES 79618334Speter { 79790075Sobrien static const struct { const char *const name; const int number; } table[] 79818334Speter = ADDITIONAL_REGISTER_NAMES; 79918334Speter 80090075Sobrien for (i = 0; i < (int) ARRAY_SIZE (table); i++) 801169689Skan if (table[i].name[0] 802169689Skan && ! strcmp (asmspec, table[i].name)) 80318334Speter return table[i].number; 80418334Speter } 80518334Speter#endif /* ADDITIONAL_REGISTER_NAMES */ 80618334Speter 80718334Speter if (!strcmp (asmspec, "memory")) 80818334Speter return -4; 80918334Speter 81018334Speter if (!strcmp (asmspec, "cc")) 81118334Speter return -3; 81218334Speter 81318334Speter return -2; 81418334Speter } 81518334Speter 81618334Speter return -1; 81718334Speter} 81818334Speter 819169689Skan/* Return true if DECL's initializer is suitable for a BSS section. */ 820169689Skan 821169689Skanstatic bool 822169689Skanbss_initializer_p (tree decl) 823169689Skan{ 824169689Skan return (DECL_INITIAL (decl) == NULL 825169689Skan || DECL_INITIAL (decl) == error_mark_node 826169689Skan || (flag_zero_initialized_in_bss 827169689Skan /* Leave constant zeroes in .rodata so they 828169689Skan can be shared. */ 829169689Skan && !TREE_READONLY (decl) 830169689Skan && initializer_zerop (DECL_INITIAL (decl)))); 831169689Skan} 832169689Skan 833169689Skan/* Compute the alignment of variable specified by DECL. 834169689Skan DONT_OUTPUT_DATA is from assemble_variable. */ 835169689Skan 836169689Skanvoid 837169689Skanalign_variable (tree decl, bool dont_output_data) 838169689Skan{ 839169689Skan unsigned int align = DECL_ALIGN (decl); 840169689Skan 841169689Skan /* In the case for initialing an array whose length isn't specified, 842169689Skan where we have not yet been able to do the layout, 843169689Skan figure out the proper alignment now. */ 844169689Skan if (dont_output_data && DECL_SIZE (decl) == 0 845169689Skan && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) 846169689Skan align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl)))); 847169689Skan 848169689Skan /* Some object file formats have a maximum alignment which they support. 849169689Skan In particular, a.out format supports a maximum alignment of 4. */ 850169689Skan if (align > MAX_OFILE_ALIGNMENT) 851169689Skan { 852169689Skan warning (0, "alignment of %q+D is greater than maximum object " 853169689Skan "file alignment. Using %d", decl, 854169689Skan MAX_OFILE_ALIGNMENT/BITS_PER_UNIT); 855169689Skan align = MAX_OFILE_ALIGNMENT; 856169689Skan } 857169689Skan 858169689Skan /* On some machines, it is good to increase alignment sometimes. */ 859169689Skan if (! DECL_USER_ALIGN (decl)) 860169689Skan { 861169689Skan#ifdef DATA_ALIGNMENT 862169689Skan align = DATA_ALIGNMENT (TREE_TYPE (decl), align); 863169689Skan#endif 864169689Skan#ifdef CONSTANT_ALIGNMENT 865169689Skan if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node) 866169689Skan align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align); 867169689Skan#endif 868169689Skan } 869169689Skan 870169689Skan /* Reset the alignment in case we have made it tighter, so we can benefit 871169689Skan from it in get_pointer_alignment. */ 872169689Skan DECL_ALIGN (decl) = align; 873169689Skan} 874169689Skan 875169689Skan/* Return the section into which the given VAR_DECL or CONST_DECL 876169689Skan should be placed. PREFER_NOSWITCH_P is true if a noswitch 877169689Skan section should be used wherever possible. */ 878169689Skan 879169689Skanstatic section * 880169689Skanget_variable_section (tree decl, bool prefer_noswitch_p) 881169689Skan{ 882169689Skan int reloc; 883169689Skan 884169689Skan /* If the decl has been given an explicit section name, then it 885169689Skan isn't common, and shouldn't be handled as such. */ 886169689Skan if (DECL_COMMON (decl) && DECL_SECTION_NAME (decl) == NULL) 887169689Skan { 888169689Skan if (DECL_THREAD_LOCAL_P (decl)) 889169689Skan return tls_comm_section; 890169689Skan if (TREE_PUBLIC (decl) && bss_initializer_p (decl)) 891169689Skan return comm_section; 892169689Skan } 893169689Skan 894169689Skan if (DECL_INITIAL (decl) == error_mark_node) 895169689Skan reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0; 896169689Skan else if (DECL_INITIAL (decl)) 897169689Skan reloc = compute_reloc_for_constant (DECL_INITIAL (decl)); 898169689Skan else 899169689Skan reloc = 0; 900169689Skan 901169689Skan resolve_unique_section (decl, reloc, flag_data_sections); 902169689Skan if (IN_NAMED_SECTION (decl)) 903169689Skan return get_named_section (decl, NULL, reloc); 904169689Skan 905169689Skan if (!DECL_THREAD_LOCAL_P (decl) 906169689Skan && !(prefer_noswitch_p && targetm.have_switchable_bss_sections) 907169689Skan && bss_initializer_p (decl)) 908169689Skan { 909169689Skan if (!TREE_PUBLIC (decl)) 910169689Skan return lcomm_section; 911169689Skan if (bss_noswitch_section) 912169689Skan return bss_noswitch_section; 913169689Skan } 914169689Skan 915169689Skan return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl)); 916169689Skan} 917169689Skan 918169689Skan/* Return the block into which object_block DECL should be placed. */ 919169689Skan 920169689Skanstatic struct object_block * 921169689Skanget_block_for_decl (tree decl) 922169689Skan{ 923169689Skan section *sect; 924169689Skan 925169689Skan if (TREE_CODE (decl) == VAR_DECL) 926169689Skan { 927169689Skan /* The object must be defined in this translation unit. */ 928169689Skan if (DECL_EXTERNAL (decl)) 929169689Skan return NULL; 930169689Skan 931169689Skan /* There's no point using object blocks for something that is 932169689Skan isolated by definition. */ 933169689Skan if (DECL_ONE_ONLY (decl)) 934169689Skan return NULL; 935169689Skan } 936169689Skan 937169689Skan /* We can only calculate block offsets if the decl has a known 938169689Skan constant size. */ 939169689Skan if (DECL_SIZE_UNIT (decl) == NULL) 940169689Skan return NULL; 941169689Skan if (!host_integerp (DECL_SIZE_UNIT (decl), 1)) 942169689Skan return NULL; 943169689Skan 944169689Skan /* Find out which section should contain DECL. We cannot put it into 945169689Skan an object block if it requires a standalone definition. */ 946169689Skan if (TREE_CODE (decl) == VAR_DECL) 947169689Skan align_variable (decl, 0); 948169689Skan sect = get_variable_section (decl, true); 949169689Skan if (SECTION_STYLE (sect) == SECTION_NOSWITCH) 950169689Skan return NULL; 951169689Skan 952169689Skan return get_block_for_section (sect); 953169689Skan} 954169689Skan 955169689Skan/* Make sure block symbol SYMBOL is in block BLOCK. */ 956169689Skan 957169689Skanstatic void 958169689Skanchange_symbol_block (rtx symbol, struct object_block *block) 959169689Skan{ 960169689Skan if (block != SYMBOL_REF_BLOCK (symbol)) 961169689Skan { 962169689Skan gcc_assert (SYMBOL_REF_BLOCK_OFFSET (symbol) < 0); 963169689Skan SYMBOL_REF_BLOCK (symbol) = block; 964169689Skan } 965169689Skan} 966169689Skan 967169689Skan/* Return true if it is possible to put DECL in an object_block. */ 968169689Skan 969169689Skanstatic bool 970169689Skanuse_blocks_for_decl_p (tree decl) 971169689Skan{ 972169689Skan /* Only data DECLs can be placed into object blocks. */ 973169689Skan if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != CONST_DECL) 974169689Skan return false; 975169689Skan 976169689Skan /* Detect decls created by dw2_force_const_mem. Such decls are 977169689Skan special because DECL_INITIAL doesn't specify the decl's true value. 978169689Skan dw2_output_indirect_constants will instead call assemble_variable 979169689Skan with dont_output_data set to 1 and then print the contents itself. */ 980169689Skan if (DECL_INITIAL (decl) == decl) 981169689Skan return false; 982169689Skan 983169689Skan /* If this decl is an alias, then we don't want to emit a definition. */ 984169689Skan if (lookup_attribute ("alias", DECL_ATTRIBUTES (decl))) 985169689Skan return false; 986169689Skan 987169689Skan return true; 988169689Skan} 989169689Skan 99090075Sobrien/* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should 99190075Sobrien have static storage duration. In other words, it should not be an 99290075Sobrien automatic variable, including PARM_DECLs. 99318334Speter 99490075Sobrien There is, however, one exception: this function handles variables 99590075Sobrien explicitly placed in a particular register by the user. 99690075Sobrien 99718334Speter This is never called for PARM_DECL nodes. */ 99818334Speter 99918334Spetervoid 1000169689Skanmake_decl_rtl (tree decl) 100118334Speter{ 100290075Sobrien const char *name = 0; 100318334Speter int reg_number; 100490075Sobrien rtx x; 100518334Speter 100690075Sobrien /* Check that we are not being given an automatic variable. */ 1007169689Skan gcc_assert (TREE_CODE (decl) != PARM_DECL 1008169689Skan && TREE_CODE (decl) != RESULT_DECL); 1009169689Skan 101090075Sobrien /* A weak alias has TREE_PUBLIC set but not the other bits. */ 1011169689Skan gcc_assert (TREE_CODE (decl) != VAR_DECL 1012169689Skan || TREE_STATIC (decl) 1013169689Skan || TREE_PUBLIC (decl) 1014169689Skan || DECL_EXTERNAL (decl) 1015169689Skan || DECL_REGISTER (decl)); 1016169689Skan 101790075Sobrien /* And that we were not given a type or a label. */ 1018169689Skan gcc_assert (TREE_CODE (decl) != TYPE_DECL 1019169689Skan && TREE_CODE (decl) != LABEL_DECL); 102018334Speter 102190075Sobrien /* For a duplicate declaration, we can be called twice on the 102290075Sobrien same DECL node. Don't discard the RTL already made. */ 102390075Sobrien if (DECL_RTL_SET_P (decl)) 102490075Sobrien { 102590075Sobrien /* If the old RTL had the wrong mode, fix the mode. */ 1026169689Skan x = DECL_RTL (decl); 1027169689Skan if (GET_MODE (x) != DECL_MODE (decl)) 1028169689Skan SET_DECL_RTL (decl, adjust_address_nv (x, DECL_MODE (decl), 0)); 102918334Speter 1030169689Skan if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)) 1031169689Skan return; 1032169689Skan 1033117395Skan /* ??? Another way to do this would be to maintain a hashed 1034117395Skan table of such critters. Instead of adding stuff to a DECL 1035117395Skan to give certain attributes to it, we could use an external 1036117395Skan hash map from DECL to set of attributes. */ 1037117395Skan 103890075Sobrien /* Let the target reassign the RTL if it wants. 103990075Sobrien This is necessary, for example, when one machine specific 104090075Sobrien decl attribute overrides another. */ 1041169689Skan targetm.encode_section_info (decl, DECL_RTL (decl), false); 1042169689Skan 1043169689Skan /* If the symbol has a SYMBOL_REF_BLOCK field, update it based 1044169689Skan on the new decl information. */ 1045169689Skan if (MEM_P (x) 1046169689Skan && GET_CODE (XEXP (x, 0)) == SYMBOL_REF 1047169689Skan && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (x, 0))) 1048169689Skan change_symbol_block (XEXP (x, 0), get_block_for_decl (decl)); 1049169689Skan 1050169689Skan /* Make this function static known to the mudflap runtime. */ 1051169689Skan if (flag_mudflap && TREE_CODE (decl) == VAR_DECL) 1052169689Skan mudflap_enqueue_decl (decl); 1053169689Skan 105490075Sobrien return; 105590075Sobrien } 105690075Sobrien 1057132718Skan name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); 1058132718Skan 1059169689Skan if (name[0] != '*' && TREE_CODE (decl) != FUNCTION_DECL 1060169689Skan && DECL_REGISTER (decl)) 106118334Speter { 1062169689Skan error ("register name not specified for %q+D", decl); 1063169689Skan } 1064169689Skan else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)) 1065169689Skan { 1066169689Skan const char *asmspec = name+1; 1067169689Skan reg_number = decode_reg_name (asmspec); 106818334Speter /* First detect errors in declaring global registers. */ 106990075Sobrien if (reg_number == -1) 1070169689Skan error ("register name not specified for %q+D", decl); 107190075Sobrien else if (reg_number < 0) 1072169689Skan error ("invalid register name for %q+D", decl); 107390075Sobrien else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode) 1074169689Skan error ("data type of %q+D isn%'t suitable for a register", 1075169689Skan decl); 107690075Sobrien else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl)))) 1077169689Skan error ("register specified for %q+D isn%'t suitable for data type", 1078169689Skan decl); 107918334Speter /* Now handle properly declared static register variables. */ 108090075Sobrien else 108118334Speter { 108218334Speter int nregs; 108350397Sobrien 108490075Sobrien if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl)) 108518334Speter { 108618334Speter DECL_INITIAL (decl) = 0; 108718334Speter error ("global register variable has initial value"); 108818334Speter } 108918334Speter if (TREE_THIS_VOLATILE (decl)) 1090169689Skan warning (OPT_Wvolatile_register_var, 1091169689Skan "optimization may eliminate reads and/or " 1092169689Skan "writes to register variables"); 109318334Speter 109418334Speter /* If the user specified one of the eliminables registers here, 109518334Speter e.g., FRAME_POINTER_REGNUM, we don't want to get this variable 109690075Sobrien confused with that register and be eliminated. This usage is 109790075Sobrien somewhat suspect... */ 109818334Speter 109990075Sobrien SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number)); 110090075Sobrien ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number; 110118334Speter REG_USERVAR_P (DECL_RTL (decl)) = 1; 110218334Speter 110390075Sobrien if (TREE_STATIC (decl)) 110418334Speter { 110518334Speter /* Make this register global, so not usable for anything 110618334Speter else. */ 110790075Sobrien#ifdef ASM_DECLARE_REGISTER_GLOBAL 1108169689Skan name = IDENTIFIER_POINTER (DECL_NAME (decl)); 110990075Sobrien ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name); 111090075Sobrien#endif 1111169689Skan nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)]; 111218334Speter while (nregs > 0) 111318334Speter globalize_reg (reg_number + --nregs); 111418334Speter } 111590075Sobrien 111690075Sobrien /* As a register variable, it has no section. */ 111790075Sobrien return; 111818334Speter } 111990075Sobrien } 112090075Sobrien /* Now handle ordinary static variables and functions (in memory). 112190075Sobrien Also handle vars declared register invalidly. */ 1122169689Skan else if (name[0] == '*') 1123169689Skan { 1124169689Skan#ifdef REGISTER_PREFIX 1125169689Skan if (strlen (REGISTER_PREFIX) != 0) 1126169689Skan { 1127169689Skan reg_number = decode_reg_name (name); 1128169689Skan if (reg_number >= 0 || reg_number == -3) 1129169689Skan error ("register name given for non-register variable %q+D", decl); 1130169689Skan } 1131169689Skan#endif 1132169689Skan } 113318334Speter 113490075Sobrien /* Specifying a section attribute on a variable forces it into a 113590075Sobrien non-.bss section, and thus it cannot be common. */ 113690075Sobrien if (TREE_CODE (decl) == VAR_DECL 113790075Sobrien && DECL_SECTION_NAME (decl) != NULL_TREE 113890075Sobrien && DECL_INITIAL (decl) == NULL_TREE 113990075Sobrien && DECL_COMMON (decl)) 114090075Sobrien DECL_COMMON (decl) = 0; 114118334Speter 1142117395Skan /* Variables can't be both common and weak. */ 1143117395Skan if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl)) 1144117395Skan DECL_COMMON (decl) = 0; 1145117395Skan 1146169689Skan if (use_object_blocks_p () && use_blocks_for_decl_p (decl)) 1147169689Skan x = create_block_symbol (name, get_block_for_decl (decl), -1); 1148169689Skan else 1149169689Skan x = gen_rtx_SYMBOL_REF (Pmode, name); 1150132718Skan SYMBOL_REF_WEAK (x) = DECL_WEAK (decl); 1151169689Skan SET_SYMBOL_REF_DECL (x, decl); 115218334Speter 1153132718Skan x = gen_rtx_MEM (DECL_MODE (decl), x); 115490075Sobrien if (TREE_CODE (decl) != FUNCTION_DECL) 115590075Sobrien set_mem_attributes (x, decl, 1); 115690075Sobrien SET_DECL_RTL (decl, x); 115790075Sobrien 115890075Sobrien /* Optionally set flags or add text to the name to record information 115990075Sobrien such as that it is a function name. 116090075Sobrien If the name is changed, the macro ASM_OUTPUT_LABELREF 116190075Sobrien will have to know how to strip this information. */ 1162169689Skan targetm.encode_section_info (decl, DECL_RTL (decl), true); 116318334Speter 1164169689Skan /* Make this function static known to the mudflap runtime. */ 1165169689Skan if (flag_mudflap && TREE_CODE (decl) == VAR_DECL) 1166169689Skan mudflap_enqueue_decl (decl); 116718334Speter} 116818334Speter 116918334Speter/* Output a string of literal assembler code 117018334Speter for an `asm' keyword used between functions. */ 117118334Speter 117218334Spetervoid 1173132718Skanassemble_asm (tree string) 117418334Speter{ 117518334Speter app_enable (); 117618334Speter 117718334Speter if (TREE_CODE (string) == ADDR_EXPR) 117818334Speter string = TREE_OPERAND (string, 0); 117918334Speter 118018334Speter fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string)); 118118334Speter} 118218334Speter 118390075Sobrien/* Record an element in the table of global destructors. SYMBOL is 118490075Sobrien a SYMBOL_REF of the function to be called; PRIORITY is a number 118590075Sobrien between 0 and MAX_INIT_PRIORITY. */ 118618334Speter 118790075Sobrienvoid 1188169689Skandefault_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED, 1189169689Skan int priority ATTRIBUTE_UNUSED) 119090075Sobrien{ 1191169689Skan#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO 119290075Sobrien /* Tell GNU LD that this is part of the static destructor set. 119390075Sobrien This will work for any system that uses stabs, most usefully 119490075Sobrien aout systems. */ 1195169689Skan dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */); 1196169689Skan dbxout_stab_value_label (XSTR (symbol, 0)); 1197169689Skan#else 1198169689Skan sorry ("global destructors not supported on this target"); 1199169689Skan#endif 120090075Sobrien} 120118334Speter 120290075Sobrienvoid 1203132718Skandefault_named_section_asm_out_destructor (rtx symbol, int priority) 120490075Sobrien{ 120590075Sobrien const char *section = ".dtors"; 120690075Sobrien char buf[16]; 120718334Speter 120890075Sobrien /* ??? This only works reliably with the GNU linker. */ 120990075Sobrien if (priority != DEFAULT_INIT_PRIORITY) 121090075Sobrien { 121190075Sobrien sprintf (buf, ".dtors.%.5u", 121290075Sobrien /* Invert the numbering so the linker puts us in the proper 121390075Sobrien order; constructors are run from right to left, and the 121490075Sobrien linker sorts in increasing order. */ 121590075Sobrien MAX_INIT_PRIORITY - priority); 121690075Sobrien section = buf; 121790075Sobrien } 121890075Sobrien 1219169689Skan switch_to_section (get_section (section, SECTION_WRITE, NULL)); 122090075Sobrien assemble_align (POINTER_SIZE); 122190075Sobrien assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); 122290075Sobrien} 122390075Sobrien 122490075Sobrien#ifdef DTORS_SECTION_ASM_OP 122518334Spetervoid 1226132718Skandefault_dtor_section_asm_out_destructor (rtx symbol, 1227132718Skan int priority ATTRIBUTE_UNUSED) 122890075Sobrien{ 1229169689Skan switch_to_section (dtors_section); 123090075Sobrien assemble_align (POINTER_SIZE); 123190075Sobrien assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); 123290075Sobrien} 123390075Sobrien#endif 123490075Sobrien 123518334Speter/* Likewise for global constructors. */ 123618334Speter 123718334Spetervoid 1238169689Skandefault_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED, 1239169689Skan int priority ATTRIBUTE_UNUSED) 124018334Speter{ 1241169689Skan#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO 124290075Sobrien /* Tell GNU LD that this is part of the static destructor set. 124390075Sobrien This will work for any system that uses stabs, most usefully 124490075Sobrien aout systems. */ 1245169689Skan dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */); 1246169689Skan dbxout_stab_value_label (XSTR (symbol, 0)); 1247169689Skan#else 1248169689Skan sorry ("global constructors not supported on this target"); 1249169689Skan#endif 125090075Sobrien} 125190075Sobrien 125290075Sobrienvoid 1253132718Skandefault_named_section_asm_out_constructor (rtx symbol, int priority) 125490075Sobrien{ 125590075Sobrien const char *section = ".ctors"; 125690075Sobrien char buf[16]; 125790075Sobrien 125890075Sobrien /* ??? This only works reliably with the GNU linker. */ 125990075Sobrien if (priority != DEFAULT_INIT_PRIORITY) 126018334Speter { 126190075Sobrien sprintf (buf, ".ctors.%.5u", 126290075Sobrien /* Invert the numbering so the linker puts us in the proper 126390075Sobrien order; constructors are run from right to left, and the 126490075Sobrien linker sorts in increasing order. */ 126590075Sobrien MAX_INIT_PRIORITY - priority); 126690075Sobrien section = buf; 126718334Speter } 126890075Sobrien 1269169689Skan switch_to_section (get_section (section, SECTION_WRITE, NULL)); 127090075Sobrien assemble_align (POINTER_SIZE); 127190075Sobrien assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); 127218334Speter} 127318334Speter 127490075Sobrien#ifdef CTORS_SECTION_ASM_OP 127518334Spetervoid 1276132718Skandefault_ctor_section_asm_out_constructor (rtx symbol, 1277132718Skan int priority ATTRIBUTE_UNUSED) 127890075Sobrien{ 1279169689Skan switch_to_section (ctors_section); 128090075Sobrien assemble_align (POINTER_SIZE); 128190075Sobrien assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); 128290075Sobrien} 128318334Speter#endif 128418334Speter 128550397Sobrien/* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with 1286117395Skan a nonzero value if the constant pool should be output before the 128750397Sobrien start of the function, or a zero value if the pool should output 128850397Sobrien after the end of the function. The default is to put it before the 128950397Sobrien start. */ 129050397Sobrien 129150397Sobrien#ifndef CONSTANT_POOL_BEFORE_FUNCTION 129250397Sobrien#define CONSTANT_POOL_BEFORE_FUNCTION 1 129350397Sobrien#endif 129450397Sobrien 1295132718Skan/* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going 1296132718Skan to be output to assembler. 1297132718Skan Set first_global_object_name and weak_global_object_name as appropriate. */ 1298132718Skan 1299132718Skanvoid 1300132718Skannotice_global_symbol (tree decl) 1301132718Skan{ 1302132718Skan const char **type = &first_global_object_name; 1303132718Skan 1304132718Skan if (first_global_object_name 1305169689Skan || !TREE_PUBLIC (decl) 1306169689Skan || DECL_EXTERNAL (decl) 1307132718Skan || !DECL_NAME (decl) 1308132718Skan || (TREE_CODE (decl) != FUNCTION_DECL 1309132718Skan && (TREE_CODE (decl) != VAR_DECL 1310132718Skan || (DECL_COMMON (decl) 1311132718Skan && (DECL_INITIAL (decl) == 0 1312132718Skan || DECL_INITIAL (decl) == error_mark_node)))) 1313169689Skan || !MEM_P (DECL_RTL (decl))) 1314132718Skan return; 1315132718Skan 1316169689Skan /* We win when global object is found, but it is useful to know about weak 1317132718Skan symbol as well so we can produce nicer unique names. */ 1318132718Skan if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl)) 1319132718Skan type = &weak_global_object_name; 1320132718Skan 1321132718Skan if (!*type) 1322132718Skan { 1323132718Skan const char *p; 1324169689Skan const char *name; 1325132718Skan rtx decl_rtl = DECL_RTL (decl); 1326132718Skan 1327169689Skan p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0)); 1328169689Skan name = ggc_strdup (p); 1329132718Skan 1330132718Skan *type = name; 1331132718Skan } 1332132718Skan} 1333132718Skan 133418334Speter/* Output assembler code for the constant pool of a function and associated 133518334Speter with defining the name of the function. DECL describes the function. 133618334Speter NAME is the function's name. For the constant pool, we use the current 133718334Speter constant pool data. */ 133818334Speter 133918334Spetervoid 1340132718Skanassemble_start_function (tree decl, const char *fnname) 134118334Speter{ 134218334Speter int align; 1343169689Skan char tmp_label[100]; 1344169689Skan bool hot_label_written = false; 134518334Speter 1346169689Skan cfun->unlikely_text_section_name = NULL; 1347169689Skan 1348169689Skan first_function_block_is_cold = false; 1349169689Skan if (flag_reorder_blocks_and_partition) 1350169689Skan { 1351169689Skan ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno); 1352169689Skan cfun->hot_section_label = ggc_strdup (tmp_label); 1353169689Skan ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno); 1354169689Skan cfun->cold_section_label = ggc_strdup (tmp_label); 1355169689Skan ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno); 1356169689Skan cfun->hot_section_end_label = ggc_strdup (tmp_label); 1357169689Skan ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno); 1358169689Skan cfun->cold_section_end_label = ggc_strdup (tmp_label); 1359169689Skan const_labelno++; 1360169689Skan } 1361169689Skan else 1362169689Skan { 1363169689Skan cfun->hot_section_label = NULL; 1364169689Skan cfun->cold_section_label = NULL; 1365169689Skan cfun->hot_section_end_label = NULL; 1366169689Skan cfun->cold_section_end_label = NULL; 1367169689Skan } 1368169689Skan 136918334Speter /* The following code does not need preprocessing in the assembler. */ 137018334Speter 137118334Speter app_disable (); 137218334Speter 137350397Sobrien if (CONSTANT_POOL_BEFORE_FUNCTION) 137450397Sobrien output_constant_pool (fnname, decl); 137518334Speter 1376102780Skan resolve_unique_section (decl, 0, flag_function_sections); 137718334Speter 1378169689Skan /* Make sure the not and cold text (code) sections are properly 1379169689Skan aligned. This is necessary here in the case where the function 1380169689Skan has both hot and cold sections, because we don't want to re-set 1381169689Skan the alignment when the section switch happens mid-function. */ 1382169689Skan 1383169689Skan if (flag_reorder_blocks_and_partition) 1384169689Skan { 1385169689Skan switch_to_section (unlikely_text_section ()); 1386258748Spfg assemble_align (DECL_ALIGN (decl)); 1387169689Skan ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label); 1388169689Skan 1389169689Skan /* When the function starts with a cold section, we need to explicitly 1390169689Skan align the hot section and write out the hot section label. 1391169689Skan But if the current function is a thunk, we do not have a CFG. */ 1392169689Skan if (!current_function_is_thunk 1393169689Skan && BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION) 1394169689Skan { 1395169689Skan switch_to_section (text_section); 1396258748Spfg assemble_align (DECL_ALIGN (decl)); 1397169689Skan ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label); 1398169689Skan hot_label_written = true; 1399169689Skan first_function_block_is_cold = true; 1400169689Skan } 1401169689Skan } 1402169689Skan else if (DECL_SECTION_NAME (decl)) 1403169689Skan { 1404169689Skan /* Calls to function_section rely on first_function_block_is_cold 1405169689Skan being accurate. The first block may be cold even if we aren't 1406169689Skan doing partitioning, if the entire function was decided by 1407169689Skan choose_function_section (predict.c) to be cold. */ 1408169689Skan 1409169689Skan initialize_cold_section_name (); 1410169689Skan 1411169689Skan if (cfun->unlikely_text_section_name 1412169689Skan && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), 1413169689Skan cfun->unlikely_text_section_name) == 0) 1414169689Skan first_function_block_is_cold = true; 1415169689Skan } 1416169689Skan 1417169689Skan in_cold_section_p = first_function_block_is_cold; 1418169689Skan 1419169689Skan /* Switch to the correct text section for the start of the function. */ 1420169689Skan 1421169689Skan switch_to_section (function_section (decl)); 1422169689Skan if (flag_reorder_blocks_and_partition 1423169689Skan && !hot_label_written) 1424169689Skan ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label); 1425169689Skan 142618334Speter /* Tell assembler to move to target machine's alignment for functions. */ 1427258748Spfg align = floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT); 142818334Speter if (align > 0) 142990075Sobrien { 143090075Sobrien ASM_OUTPUT_ALIGN (asm_out_file, align); 143190075Sobrien } 143218334Speter 143390075Sobrien /* Handle a user-specified function alignment. 1434258748Spfg Note that we still need to align to DECL_ALIGN, as above, 143590075Sobrien because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */ 1436258748Spfg if (! DECL_USER_ALIGN (decl) 1437258748Spfg && align_functions_log > align 1438117395Skan && cfun->function_frequency != FUNCTION_FREQUENCY_UNLIKELY_EXECUTED) 143990075Sobrien { 144090075Sobrien#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN 144190075Sobrien ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file, 1442117395Skan align_functions_log, align_functions - 1); 144390075Sobrien#else 144490075Sobrien ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log); 144590075Sobrien#endif 144690075Sobrien } 144790075Sobrien 144818334Speter#ifdef ASM_OUTPUT_FUNCTION_PREFIX 144918334Speter ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname); 145018334Speter#endif 145118334Speter 145290075Sobrien (*debug_hooks->begin_function) (decl); 145318334Speter 145418334Speter /* Make function name accessible from other files, if appropriate. */ 145518334Speter 145618334Speter if (TREE_PUBLIC (decl)) 145718334Speter { 1458132718Skan notice_global_symbol (decl); 145918334Speter 146096263Sobrien globalize_decl (decl); 1461117395Skan 1462117395Skan maybe_assemble_visibility (decl); 146318334Speter } 146418334Speter 1465169689Skan if (DECL_PRESERVE_P (decl)) 1466169689Skan targetm.asm_out.mark_decl_preserved (fnname); 1467169689Skan 1468132718Skan /* Do any machine/system dependent processing of the function name. */ 146918334Speter#ifdef ASM_DECLARE_FUNCTION_NAME 147018334Speter ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl); 147118334Speter#else 147218334Speter /* Standard thing is just output label for the function. */ 147350397Sobrien ASM_OUTPUT_LABEL (asm_out_file, fnname); 147418334Speter#endif /* ASM_DECLARE_FUNCTION_NAME */ 147518334Speter} 147618334Speter 147718334Speter/* Output assembler code associated with defining the size of the 147818334Speter function. DECL describes the function. NAME is the function's name. */ 147918334Speter 148018334Spetervoid 1481169689Skanassemble_end_function (tree decl, const char *fnname ATTRIBUTE_UNUSED) 148218334Speter{ 148318334Speter#ifdef ASM_DECLARE_FUNCTION_SIZE 1484169689Skan /* We could have switched section in the middle of the function. */ 1485169689Skan if (flag_reorder_blocks_and_partition) 1486169689Skan switch_to_section (function_section (decl)); 148718334Speter ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl); 148818334Speter#endif 148950397Sobrien if (! CONSTANT_POOL_BEFORE_FUNCTION) 149050397Sobrien { 149150397Sobrien output_constant_pool (fnname, decl); 1492169689Skan switch_to_section (function_section (decl)); /* need to switch back */ 149350397Sobrien } 1494169689Skan /* Output labels for end of hot/cold text sections (to be used by 1495169689Skan debug info.) */ 1496169689Skan if (flag_reorder_blocks_and_partition) 1497169689Skan { 1498169689Skan section *save_text_section; 1499169689Skan 1500169689Skan save_text_section = in_section; 1501169689Skan switch_to_section (unlikely_text_section ()); 1502169689Skan ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label); 1503169689Skan if (first_function_block_is_cold) 1504169689Skan switch_to_section (text_section); 1505169689Skan else 1506169689Skan switch_to_section (function_section (decl)); 1507169689Skan ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_end_label); 1508169689Skan switch_to_section (save_text_section); 1509169689Skan } 151018334Speter} 151118334Speter 151218334Speter/* Assemble code to leave SIZE bytes of zeros. */ 151318334Speter 151418334Spetervoid 1515132718Skanassemble_zeros (unsigned HOST_WIDE_INT size) 151618334Speter{ 151752284Sobrien /* Do no output if -fsyntax-only. */ 151852284Sobrien if (flag_syntax_only) 151952284Sobrien return; 152052284Sobrien 152118334Speter#ifdef ASM_NO_SKIP_IN_TEXT 152218334Speter /* The `space' pseudo in the text section outputs nop insns rather than 0s, 152318334Speter so we must output 0s explicitly in the text section. */ 1524169689Skan if (ASM_NO_SKIP_IN_TEXT && (in_section->common.flags & SECTION_CODE) != 0) 152518334Speter { 1526132718Skan unsigned HOST_WIDE_INT i; 152790075Sobrien for (i = 0; i < size; i++) 152890075Sobrien assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1); 152918334Speter } 153018334Speter else 153118334Speter#endif 153218334Speter if (size > 0) 153350397Sobrien ASM_OUTPUT_SKIP (asm_out_file, size); 153418334Speter} 153518334Speter 153618334Speter/* Assemble an alignment pseudo op for an ALIGN-bit boundary. */ 153718334Speter 153818334Spetervoid 1539132718Skanassemble_align (int align) 154018334Speter{ 154118334Speter if (align > BITS_PER_UNIT) 154290075Sobrien { 154390075Sobrien ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT)); 154490075Sobrien } 154518334Speter} 154618334Speter 154718334Speter/* Assemble a string constant with the specified C string as contents. */ 154818334Speter 154918334Spetervoid 1550132718Skanassemble_string (const char *p, int size) 155118334Speter{ 155218334Speter int pos = 0; 155318334Speter int maximum = 2000; 155418334Speter 155518334Speter /* If the string is very long, split it up. */ 155618334Speter 155718334Speter while (pos < size) 155818334Speter { 155918334Speter int thissize = size - pos; 156018334Speter if (thissize > maximum) 156118334Speter thissize = maximum; 156218334Speter 156350397Sobrien ASM_OUTPUT_ASCII (asm_out_file, p, thissize); 156418334Speter 156518334Speter pos += thissize; 156618334Speter p += thissize; 156718334Speter } 156818334Speter} 156918334Speter 157018334Speter 1571169689Skan/* A noswitch_section_callback for lcomm_section. */ 1572169689Skan 1573169689Skanstatic bool 1574169689Skanemit_local (tree decl ATTRIBUTE_UNUSED, 1575169689Skan const char *name ATTRIBUTE_UNUSED, 1576169689Skan unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, 1577169689Skan unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) 1578169689Skan{ 1579169689Skan#if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL 1580169689Skan ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, 1581169689Skan size, DECL_ALIGN (decl)); 1582169689Skan return true; 1583169689Skan#elif defined ASM_OUTPUT_ALIGNED_LOCAL 1584169689Skan ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl)); 1585169689Skan return true; 158690075Sobrien#else 1587169689Skan ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded); 1588169689Skan return false; 158990075Sobrien#endif 1590169689Skan} 159190075Sobrien 1592169689Skan/* A noswitch_section_callback for bss_noswitch_section. */ 1593169689Skan 1594169689Skan#if defined ASM_OUTPUT_ALIGNED_BSS || defined ASM_OUTPUT_BSS 1595169689Skanstatic bool 1596169689Skanemit_bss (tree decl ATTRIBUTE_UNUSED, 1597169689Skan const char *name ATTRIBUTE_UNUSED, 1598169689Skan unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, 1599169689Skan unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) 1600169689Skan{ 160190075Sobrien#if defined ASM_OUTPUT_ALIGNED_BSS 1602169689Skan ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl)); 1603169689Skan return true; 160490075Sobrien#else 1605169689Skan ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded); 1606169689Skan return false; 160790075Sobrien#endif 1608169689Skan} 160990075Sobrien#endif 161090075Sobrien 1611169689Skan/* A noswitch_section_callback for comm_section. */ 1612169689Skan 1613169689Skanstatic bool 1614169689Skanemit_common (tree decl ATTRIBUTE_UNUSED, 1615169689Skan const char *name ATTRIBUTE_UNUSED, 1616169689Skan unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, 1617169689Skan unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) 1618169689Skan{ 161990075Sobrien#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON 1620169689Skan ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, 1621169689Skan size, DECL_ALIGN (decl)); 1622169689Skan return true; 1623169689Skan#elif defined ASM_OUTPUT_ALIGNED_COMMON 1624169689Skan ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl)); 1625169689Skan return true; 162690075Sobrien#else 1627169689Skan ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded); 1628169689Skan return false; 162990075Sobrien#endif 1630169689Skan} 163190075Sobrien 1632169689Skan/* A noswitch_section_callback for tls_comm_section. */ 1633169689Skan 1634117395Skanstatic bool 1635169689Skanemit_tls_common (tree decl ATTRIBUTE_UNUSED, 1636169689Skan const char *name ATTRIBUTE_UNUSED, 1637169689Skan unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, 1638169689Skan unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) 163990075Sobrien{ 1640169689Skan#ifdef ASM_OUTPUT_TLS_COMMON 1641169689Skan ASM_OUTPUT_TLS_COMMON (asm_out_file, decl, name, size); 1642169689Skan return true; 1643117395Skan#else 1644169689Skan sorry ("thread-local COMMON data not implemented"); 1645169689Skan return true; 1646117395Skan#endif 1647169689Skan} 164890075Sobrien 1649169689Skan/* Assemble DECL given that it belongs in SECTION_NOSWITCH section SECT. 1650169689Skan NAME is the name of DECL's SYMBOL_REF. */ 165196263Sobrien 1652169689Skanstatic void 1653169689Skanassemble_noswitch_variable (tree decl, const char *name, section *sect) 1654169689Skan{ 1655169689Skan unsigned HOST_WIDE_INT size, rounded; 165690075Sobrien 1657169689Skan size = tree_low_cst (DECL_SIZE_UNIT (decl), 1); 1658169689Skan rounded = size; 1659169689Skan 1660169689Skan /* Don't allocate zero bytes of common, 1661169689Skan since that means "undefined external" in the linker. */ 1662169689Skan if (size == 0) 1663169689Skan rounded = 1; 1664169689Skan 1665169689Skan /* Round size up to multiple of BIGGEST_ALIGNMENT bits 1666169689Skan so that each uninitialized object starts on such a boundary. */ 1667169689Skan rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; 1668169689Skan rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) 1669169689Skan * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); 1670169689Skan 1671169689Skan if (!sect->noswitch.callback (decl, name, size, rounded) 1672169689Skan && (unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded) 1673169689Skan warning (0, "requested alignment for %q+D is greater than " 1674169689Skan "implemented alignment of %wu", decl, rounded); 1675169689Skan} 1676169689Skan 1677169689Skan/* A subroutine of assemble_variable. Output the label and contents of 1678169689Skan DECL, whose address is a SYMBOL_REF with name NAME. DONT_OUTPUT_DATA 1679169689Skan is as for assemble_variable. */ 1680169689Skan 1681169689Skanstatic void 1682169689Skanassemble_variable_contents (tree decl, const char *name, 1683169689Skan bool dont_output_data) 1684169689Skan{ 1685169689Skan /* Do any machine/system dependent processing of the object. */ 1686169689Skan#ifdef ASM_DECLARE_OBJECT_NAME 1687169689Skan last_assemble_variable_decl = decl; 1688169689Skan ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl); 1689169689Skan#else 1690169689Skan /* Standard thing is just output label for the object. */ 1691169689Skan ASM_OUTPUT_LABEL (asm_out_file, name); 1692169689Skan#endif /* ASM_DECLARE_OBJECT_NAME */ 1693169689Skan 1694169689Skan if (!dont_output_data) 169590075Sobrien { 1696169689Skan if (DECL_INITIAL (decl) 1697169689Skan && DECL_INITIAL (decl) != error_mark_node 1698169689Skan && !initializer_zerop (DECL_INITIAL (decl))) 1699169689Skan /* Output the actual data. */ 1700169689Skan output_constant (DECL_INITIAL (decl), 1701169689Skan tree_low_cst (DECL_SIZE_UNIT (decl), 1), 1702169689Skan DECL_ALIGN (decl)); 1703169689Skan else 1704169689Skan /* Leave space for it. */ 1705169689Skan assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1)); 170690075Sobrien } 170790075Sobrien} 170890075Sobrien 170918334Speter/* Assemble everything that is needed for a variable or function declaration. 171018334Speter Not used for automatic variables, and not used for function definitions. 171118334Speter Should not be called for variables of incomplete structure type. 171218334Speter 171318334Speter TOP_LEVEL is nonzero if this variable has file scope. 171418334Speter AT_END is nonzero if this is the special handling, at end of compilation, 171518334Speter to define things that have had only tentative definitions. 171618334Speter DONT_OUTPUT_DATA if nonzero means don't actually output the 171718334Speter initial value (that will be done by the caller). */ 171818334Speter 171918334Spetervoid 1720132718Skanassemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED, 1721132718Skan int at_end ATTRIBUTE_UNUSED, int dont_output_data) 172218334Speter{ 172390075Sobrien const char *name; 1724169689Skan rtx decl_rtl, symbol; 1725169689Skan section *sect; 172618334Speter 1727132718Skan if (lang_hooks.decls.prepare_assemble_variable) 1728169689Skan lang_hooks.decls.prepare_assemble_variable (decl); 1729132718Skan 173018334Speter last_assemble_variable_decl = 0; 173118334Speter 173218334Speter /* Normally no need to say anything here for external references, 173318334Speter since assemble_external is called by the language-specific code 173418334Speter when a declaration is first seen. */ 173518334Speter 173618334Speter if (DECL_EXTERNAL (decl)) 173718334Speter return; 173818334Speter 173918334Speter /* Output no assembler code for a function declaration. 174018334Speter Only definitions of functions output anything. */ 174118334Speter 174218334Speter if (TREE_CODE (decl) == FUNCTION_DECL) 174318334Speter return; 174418334Speter 174590075Sobrien /* Do nothing for global register variables. */ 1746169689Skan if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl))) 174790075Sobrien { 174890075Sobrien TREE_ASM_WRITTEN (decl) = 1; 174990075Sobrien return; 175090075Sobrien } 175190075Sobrien 175218334Speter /* If type was incomplete when the variable was declared, 175318334Speter see if it is complete now. */ 175418334Speter 175518334Speter if (DECL_SIZE (decl) == 0) 175618334Speter layout_decl (decl, 0); 175718334Speter 175818334Speter /* Still incomplete => don't allocate it; treat the tentative defn 175918334Speter (which is what it must have been) as an `extern' reference. */ 176018334Speter 176118334Speter if (!dont_output_data && DECL_SIZE (decl) == 0) 176218334Speter { 1763169689Skan error ("storage size of %q+D isn%'t known", decl); 176418334Speter TREE_ASM_WRITTEN (decl) = 1; 176518334Speter return; 176618334Speter } 176718334Speter 176818334Speter /* The first declaration of a variable that comes through this function 176918334Speter decides whether it is global (in C, has external linkage) 177018334Speter or local (in C, has internal linkage). So do nothing more 177118334Speter if this function has already run. */ 177218334Speter 177318334Speter if (TREE_ASM_WRITTEN (decl)) 177418334Speter return; 177518334Speter 1776117395Skan /* Make sure targetm.encode_section_info is invoked before we set 1777117395Skan ASM_WRITTEN. */ 177890075Sobrien decl_rtl = DECL_RTL (decl); 177990075Sobrien 178018334Speter TREE_ASM_WRITTEN (decl) = 1; 178118334Speter 178252284Sobrien /* Do no output if -fsyntax-only. */ 178352284Sobrien if (flag_syntax_only) 178452284Sobrien return; 178552284Sobrien 178618334Speter app_disable (); 178718334Speter 178890075Sobrien if (! dont_output_data 178990075Sobrien && ! host_integerp (DECL_SIZE_UNIT (decl), 1)) 179018334Speter { 1791169689Skan error ("size of variable %q+D is too large", decl); 179290075Sobrien return; 179318334Speter } 179418334Speter 1795169689Skan gcc_assert (MEM_P (decl_rtl)); 1796169689Skan gcc_assert (GET_CODE (XEXP (decl_rtl, 0)) == SYMBOL_REF); 1797169689Skan symbol = XEXP (decl_rtl, 0); 1798169689Skan name = XSTR (symbol, 0); 1799132718Skan if (TREE_PUBLIC (decl) && DECL_NAME (decl)) 1800132718Skan notice_global_symbol (decl); 180150397Sobrien 180250397Sobrien /* Compute the alignment of this data. */ 180350397Sobrien 1804169689Skan align_variable (decl, dont_output_data); 1805169689Skan set_mem_align (decl_rtl, DECL_ALIGN (decl)); 180650397Sobrien 1807117395Skan if (TREE_PUBLIC (decl)) 1808117395Skan maybe_assemble_visibility (decl); 1809117395Skan 1810169689Skan if (DECL_PRESERVE_P (decl)) 1811169689Skan targetm.asm_out.mark_decl_preserved (name); 1812117395Skan 181318334Speter /* First make the assembler name(s) global if appropriate. */ 1814169689Skan sect = get_variable_section (decl, false); 1815169689Skan if (TREE_PUBLIC (decl) 1816169689Skan && DECL_NAME (decl) 1817169689Skan && (sect->common.flags & SECTION_COMMON) == 0) 181896263Sobrien globalize_decl (decl); 181918334Speter 1820169689Skan /* Output any data that we will need to use the address of. */ 1821169689Skan if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node) 1822169689Skan output_addressed_constants (DECL_INITIAL (decl)); 182350397Sobrien 182418334Speter /* dbxout.c needs to know this. */ 1825169689Skan if (sect && (sect->common.flags & SECTION_CODE) != 0) 182618334Speter DECL_IN_TEXT_SECTION (decl) = 1; 182718334Speter 1828169689Skan /* If the decl is part of an object_block, make sure that the decl 1829169689Skan has been positioned within its block, but do not write out its 1830169689Skan definition yet. output_object_blocks will do that later. */ 1831169689Skan if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol)) 183290075Sobrien { 1833169689Skan gcc_assert (!dont_output_data); 1834169689Skan place_block_symbol (symbol); 183590075Sobrien } 1836169689Skan else if (SECTION_STYLE (sect) == SECTION_NOSWITCH) 1837169689Skan assemble_noswitch_variable (decl, name, sect); 1838169689Skan else 183918334Speter { 1840169689Skan switch_to_section (sect); 1841169689Skan if (DECL_ALIGN (decl) > BITS_PER_UNIT) 1842169689Skan ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl))); 1843169689Skan assemble_variable_contents (decl, name, dont_output_data); 184418334Speter } 184518334Speter} 184618334Speter 184718334Speter/* Return 1 if type TYPE contains any pointers. */ 184818334Speter 184918334Speterstatic int 1850132718Skancontains_pointers_p (tree type) 185118334Speter{ 185218334Speter switch (TREE_CODE (type)) 185318334Speter { 185418334Speter case POINTER_TYPE: 185518334Speter case REFERENCE_TYPE: 185618334Speter /* I'm not sure whether OFFSET_TYPE needs this treatment, 185718334Speter so I'll play safe and return 1. */ 185818334Speter case OFFSET_TYPE: 185918334Speter return 1; 186018334Speter 186118334Speter case RECORD_TYPE: 186218334Speter case UNION_TYPE: 186318334Speter case QUAL_UNION_TYPE: 186418334Speter { 186518334Speter tree fields; 186618334Speter /* For a type that has fields, see if the fields have pointers. */ 186718334Speter for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields)) 186818334Speter if (TREE_CODE (fields) == FIELD_DECL 186918334Speter && contains_pointers_p (TREE_TYPE (fields))) 187018334Speter return 1; 187118334Speter return 0; 187218334Speter } 187318334Speter 187418334Speter case ARRAY_TYPE: 187518334Speter /* An array type contains pointers if its element type does. */ 187618334Speter return contains_pointers_p (TREE_TYPE (type)); 187718334Speter 187818334Speter default: 187918334Speter return 0; 188018334Speter } 188118334Speter} 188218334Speter 1883169689Skan/* In unit-at-a-time mode, we delay assemble_external processing until 1884169689Skan the compilation unit is finalized. This is the best we can do for 1885169689Skan right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay 1886169689Skan it all the way to final. See PR 17982 for further discussion. */ 1887169689Skanstatic GTY(()) tree pending_assemble_externals; 1888169689Skan 1889132718Skan#ifdef ASM_OUTPUT_EXTERNAL 1890132718Skan/* True if DECL is a function decl for which no out-of-line copy exists. 1891132718Skan It is assumed that DECL's assembler name has been set. */ 1892132718Skan 1893132718Skanstatic bool 1894132718Skanincorporeal_function_p (tree decl) 1895132718Skan{ 1896132718Skan if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl)) 1897132718Skan { 1898132718Skan const char *name; 1899132718Skan 1900132718Skan if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL 1901132718Skan && DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA) 1902132718Skan return true; 1903132718Skan 1904132718Skan name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); 1905132718Skan if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0) 1906132718Skan return true; 1907132718Skan } 1908132718Skan return false; 1909132718Skan} 1910169689Skan 1911169689Skan/* Actually do the tests to determine if this is necessary, and invoke 1912169689Skan ASM_OUTPUT_EXTERNAL. */ 1913169689Skanstatic void 1914169689Skanassemble_external_real (tree decl) 1915169689Skan{ 1916169689Skan rtx rtl = DECL_RTL (decl); 1917169689Skan 1918169689Skan if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF 1919169689Skan && !SYMBOL_REF_USED (XEXP (rtl, 0)) 1920169689Skan && !incorporeal_function_p (decl)) 1921169689Skan { 1922169689Skan /* Some systems do require some output. */ 1923169689Skan SYMBOL_REF_USED (XEXP (rtl, 0)) = 1; 1924169689Skan ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0)); 1925169689Skan } 1926169689Skan} 1927132718Skan#endif 1928132718Skan 1929169689Skanvoid 1930169689Skanprocess_pending_assemble_externals (void) 1931169689Skan{ 1932169689Skan#ifdef ASM_OUTPUT_EXTERNAL 1933169689Skan tree list; 1934169689Skan for (list = pending_assemble_externals; list; list = TREE_CHAIN (list)) 1935169689Skan assemble_external_real (TREE_VALUE (list)); 1936169689Skan 1937169689Skan pending_assemble_externals = 0; 1938169689Skan#endif 1939169689Skan} 1940169689Skan 194118334Speter/* Output something to declare an external symbol to the assembler. 194218334Speter (Most assemblers don't need this, so we normally output nothing.) 194318334Speter Do nothing if DECL is not external. */ 194418334Speter 194518334Spetervoid 1946132718Skanassemble_external (tree decl ATTRIBUTE_UNUSED) 194718334Speter{ 194890075Sobrien /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the 194990075Sobrien main body of this code is only rarely exercised. To provide some 195090075Sobrien testing, on all platforms, we make sure that the ASM_OUT_FILE is 195190075Sobrien open. If it's not, we should not be calling this function. */ 1952169689Skan gcc_assert (asm_out_file); 195390075Sobrien 195418334Speter#ifdef ASM_OUTPUT_EXTERNAL 1955169689Skan if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl)) 1956169689Skan return; 195718334Speter 1958215840Sdim /* We want to output external symbols at very last to check if they 1959215840Sdim are references or not. */ 1960215840Sdim pending_assemble_externals = tree_cons (0, decl, 1961215840Sdim pending_assemble_externals); 196218334Speter#endif 196318334Speter} 196418334Speter 196518334Speter/* Similar, for calling a library function FUN. */ 196618334Speter 196718334Spetervoid 1968132718Skanassemble_external_libcall (rtx fun) 196918334Speter{ 197050397Sobrien /* Declare library function name external when first used, if nec. */ 197150397Sobrien if (! SYMBOL_REF_USED (fun)) 197218334Speter { 197350397Sobrien SYMBOL_REF_USED (fun) = 1; 1974169689Skan targetm.asm_out.external_libcall (fun); 197518334Speter } 197618334Speter} 197718334Speter 197818334Speter/* Assemble a label named NAME. */ 197918334Speter 198018334Spetervoid 1981132718Skanassemble_label (const char *name) 198218334Speter{ 198350397Sobrien ASM_OUTPUT_LABEL (asm_out_file, name); 198418334Speter} 198518334Speter 1986169689Skan/* Set the symbol_referenced flag for ID. */ 1987132718Skanvoid 1988132718Skanmark_referenced (tree id) 1989132718Skan{ 1990169689Skan TREE_SYMBOL_REFERENCED (id) = 1; 1991169689Skan} 1992169689Skan 1993169689Skan/* Set the symbol_referenced flag for DECL and notify callgraph. */ 1994169689Skanvoid 1995169689Skanmark_decl_referenced (tree decl) 1996169689Skan{ 1997169689Skan if (TREE_CODE (decl) == FUNCTION_DECL) 1998132718Skan { 1999169689Skan /* Extern inline functions don't become needed when referenced. 2000169689Skan If we know a method will be emitted in other TU and no new 2001169689Skan functions can be marked reachable, just use the external 2002169689Skan definition. */ 2003169689Skan struct cgraph_node *node = cgraph_node (decl); 2004169689Skan if (!DECL_EXTERNAL (decl) 2005169689Skan && (!node->local.vtable_method || !cgraph_global_info_ready 2006169689Skan || !node->local.finalized)) 2007169689Skan cgraph_mark_needed_node (node); 2008169689Skan } 2009169689Skan else if (TREE_CODE (decl) == VAR_DECL) 2010169689Skan { 2011169689Skan struct cgraph_varpool_node *node = cgraph_varpool_node (decl); 2012169689Skan cgraph_varpool_mark_needed_node (node); 2013169689Skan /* C++ frontend use mark_decl_references to force COMDAT variables 2014169689Skan to be output that might appear dead otherwise. */ 2015169689Skan node->force_output = true; 2016169689Skan } 2017169689Skan /* else do nothing - we can get various sorts of CST nodes here, 2018169689Skan which do not need to be marked. */ 2019169689Skan} 2020132718Skan 2021132718Skan 2022169689Skan/* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS 2023169689Skan until we find an identifier that is not itself a transparent alias. 2024169689Skan Modify the alias passed to it by reference (and all aliases on the 2025169689Skan way to the ultimate target), such that they do not have to be 2026169689Skan followed again, and return the ultimate target of the alias 2027169689Skan chain. */ 2028169689Skan 2029169689Skanstatic inline tree 2030169689Skanultimate_transparent_alias_target (tree *alias) 2031169689Skan{ 2032169689Skan tree target = *alias; 2033169689Skan 2034169689Skan if (IDENTIFIER_TRANSPARENT_ALIAS (target)) 2035169689Skan { 2036169689Skan gcc_assert (TREE_CHAIN (target)); 2037169689Skan target = ultimate_transparent_alias_target (&TREE_CHAIN (target)); 2038169689Skan gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target) 2039169689Skan && ! TREE_CHAIN (target)); 2040169689Skan *alias = target; 2041132718Skan } 2042169689Skan 2043169689Skan return target; 2044132718Skan} 2045132718Skan 2046169689Skan/* Output to FILE (an assembly file) a reference to NAME. If NAME 2047169689Skan starts with a *, the rest of NAME is output verbatim. Otherwise 2048169689Skan NAME is transformed in a target-specific way (usually by the 2049169689Skan addition of an underscore). */ 205018334Speter 205118334Spetervoid 2052169689Skanassemble_name_raw (FILE *file, const char *name) 2053169689Skan{ 2054169689Skan if (name[0] == '*') 2055169689Skan fputs (&name[1], file); 2056169689Skan else 2057169689Skan ASM_OUTPUT_LABELREF (file, name); 2058169689Skan} 2059169689Skan 2060169689Skan/* Like assemble_name_raw, but should be used when NAME might refer to 2061169689Skan an entity that is also represented as a tree (like a function or 2062169689Skan variable). If NAME does refer to such an entity, that entity will 2063169689Skan be marked as referenced. */ 2064169689Skan 2065169689Skanvoid 2066132718Skanassemble_name (FILE *file, const char *name) 206718334Speter{ 206890075Sobrien const char *real_name; 206950397Sobrien tree id; 207018334Speter 2071169689Skan real_name = targetm.strip_name_encoding (name); 207218334Speter 207350397Sobrien id = maybe_get_identifier (real_name); 207450397Sobrien if (id) 2075169689Skan { 2076169689Skan tree id_orig = id; 207718334Speter 2078169689Skan mark_referenced (id); 2079169689Skan ultimate_transparent_alias_target (&id); 2080169689Skan if (id != id_orig) 2081169689Skan name = IDENTIFIER_POINTER (id); 2082169689Skan gcc_assert (! TREE_CHAIN (id)); 2083169689Skan } 2084169689Skan 2085169689Skan assemble_name_raw (file, name); 208618334Speter} 208718334Speter 208818334Speter/* Allocate SIZE bytes writable static space with a gensym name 208918334Speter and return an RTX to refer to its address. */ 209018334Speter 209118334Speterrtx 2092132718Skanassemble_static_space (unsigned HOST_WIDE_INT size) 209318334Speter{ 209418334Speter char name[12]; 209590075Sobrien const char *namestring; 209618334Speter rtx x; 209718334Speter 209818334Speter ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno); 209918334Speter ++const_labelno; 210090075Sobrien namestring = ggc_strdup (name); 210118334Speter 210250397Sobrien x = gen_rtx_SYMBOL_REF (Pmode, namestring); 2103132718Skan SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL; 210418334Speter 210550397Sobrien#ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL 210650397Sobrien ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size, 210750397Sobrien BIGGEST_ALIGNMENT); 210850397Sobrien#else 210918334Speter#ifdef ASM_OUTPUT_ALIGNED_LOCAL 211050397Sobrien ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT); 211118334Speter#else 211250397Sobrien { 211350397Sobrien /* Round size up to multiple of BIGGEST_ALIGNMENT bits 211450397Sobrien so that each uninitialized object starts on such a boundary. */ 211590075Sobrien /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */ 2116132718Skan unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED 211752284Sobrien = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1) 211852284Sobrien / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) 211952284Sobrien * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); 212050397Sobrien ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded); 212150397Sobrien } 212218334Speter#endif 212350397Sobrien#endif 212418334Speter return x; 212518334Speter} 212618334Speter 212718334Speter/* Assemble the static constant template for function entry trampolines. 212818334Speter This is done at most once per compilation. 212918334Speter Returns an RTX for the address of the template. */ 213018334Speter 2131169689Skanstatic GTY(()) rtx initial_trampoline; 2132169689Skan 213348743Sobrien#ifdef TRAMPOLINE_TEMPLATE 213418334Speterrtx 2135132718Skanassemble_trampoline_template (void) 213618334Speter{ 213718334Speter char label[256]; 213890075Sobrien const char *name; 213918334Speter int align; 2140132718Skan rtx symbol; 214118334Speter 2142169689Skan if (initial_trampoline) 2143169689Skan return initial_trampoline; 2144169689Skan 214518334Speter /* By default, put trampoline templates in read-only data section. */ 214618334Speter 214718334Speter#ifdef TRAMPOLINE_SECTION 2148169689Skan switch_to_section (TRAMPOLINE_SECTION); 214918334Speter#else 2150169689Skan switch_to_section (readonly_data_section); 215118334Speter#endif 215218334Speter 215318334Speter /* Write the assembler code to define one. */ 215450397Sobrien align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT); 215518334Speter if (align > 0) 215690075Sobrien { 215790075Sobrien ASM_OUTPUT_ALIGN (asm_out_file, align); 215890075Sobrien } 215918334Speter 2160169689Skan targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0); 216118334Speter TRAMPOLINE_TEMPLATE (asm_out_file); 216218334Speter 216318334Speter /* Record the rtl to refer to it. */ 216418334Speter ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0); 216590075Sobrien name = ggc_strdup (label); 2166132718Skan symbol = gen_rtx_SYMBOL_REF (Pmode, name); 2167132718Skan SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL; 2168132718Skan 2169169689Skan initial_trampoline = gen_rtx_MEM (BLKmode, symbol); 2170169689Skan set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT); 2171169689Skan 2172169689Skan return initial_trampoline; 217318334Speter} 217448743Sobrien#endif 217518334Speter 217690075Sobrien/* A and B are either alignments or offsets. Return the minimum alignment 217790075Sobrien that may be assumed after adding the two together. */ 217818334Speter 217990075Sobrienstatic inline unsigned 2180132718Skanmin_align (unsigned int a, unsigned int b) 218190075Sobrien{ 218290075Sobrien return (a | b) & -(a | b); 218390075Sobrien} 218418334Speter 218590075Sobrien/* Return the assembler directive for creating a given kind of integer 218690075Sobrien object. SIZE is the number of bytes in the object and ALIGNED_P 218790075Sobrien indicates whether it is known to be aligned. Return NULL if the 218890075Sobrien assembly dialect has no such directive. 218990075Sobrien 219090075Sobrien The returned string should be printed at the start of a new line and 219190075Sobrien be followed immediately by the object's initial value. */ 219290075Sobrien 219390075Sobrienconst char * 2194132718Skaninteger_asm_op (int size, int aligned_p) 219518334Speter{ 219690075Sobrien struct asm_int_op *ops; 219718334Speter 219890075Sobrien if (aligned_p) 219990075Sobrien ops = &targetm.asm_out.aligned_op; 220090075Sobrien else 220190075Sobrien ops = &targetm.asm_out.unaligned_op; 220290075Sobrien 220318334Speter switch (size) 220418334Speter { 220518334Speter case 1: 220690075Sobrien return targetm.asm_out.byte_op; 220718334Speter case 2: 220890075Sobrien return ops->hi; 220918334Speter case 4: 221090075Sobrien return ops->si; 221118334Speter case 8: 221290075Sobrien return ops->di; 221318334Speter case 16: 221490075Sobrien return ops->ti; 221590075Sobrien default: 221690075Sobrien return NULL; 221718334Speter } 221890075Sobrien} 221918334Speter 222090075Sobrien/* Use directive OP to assemble an integer object X. Print OP at the 222190075Sobrien start of the line, followed immediately by the value of X. */ 222218334Speter 222390075Sobrienvoid 2224132718Skanassemble_integer_with_op (const char *op, rtx x) 222590075Sobrien{ 222690075Sobrien fputs (op, asm_out_file); 222790075Sobrien output_addr_const (asm_out_file, x); 222890075Sobrien fputc ('\n', asm_out_file); 222990075Sobrien} 223018334Speter 223190075Sobrien/* The default implementation of the asm_out.integer target hook. */ 223218334Speter 223390075Sobrienbool 2234132718Skandefault_assemble_integer (rtx x ATTRIBUTE_UNUSED, 2235132718Skan unsigned int size ATTRIBUTE_UNUSED, 2236132718Skan int aligned_p ATTRIBUTE_UNUSED) 223790075Sobrien{ 223890075Sobrien const char *op = integer_asm_op (size, aligned_p); 2239169689Skan /* Avoid GAS bugs for large values. Specifically negative values whose 2240169689Skan absolute value fits in a bfd_vma, but not in a bfd_signed_vma. */ 2241169689Skan if (size > UNITS_PER_WORD && size > POINTER_SIZE / BITS_PER_UNIT) 2242169689Skan return false; 224390075Sobrien return op && (assemble_integer_with_op (op, x), true); 224490075Sobrien} 224590075Sobrien 224690075Sobrien/* Assemble the integer constant X into an object of SIZE bytes. ALIGN is 224790075Sobrien the alignment of the integer in bits. Return 1 if we were able to output 2248169689Skan the constant, otherwise 0. We must be able to output the constant, 2249169689Skan if FORCE is nonzero. */ 225090075Sobrien 225190075Sobrienbool 2252132718Skanassemble_integer (rtx x, unsigned int size, unsigned int align, int force) 225390075Sobrien{ 225490075Sobrien int aligned_p; 225590075Sobrien 225690075Sobrien aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT)); 225790075Sobrien 225890075Sobrien /* See if the target hook can handle this kind of object. */ 2259169689Skan if (targetm.asm_out.integer (x, size, aligned_p)) 226090075Sobrien return true; 226190075Sobrien 226290075Sobrien /* If the object is a multi-byte one, try splitting it up. Split 226390075Sobrien it into words it if is multi-word, otherwise split it into bytes. */ 226490075Sobrien if (size > 1) 226518334Speter { 226690075Sobrien enum machine_mode omode, imode; 226790075Sobrien unsigned int subalign; 226890075Sobrien unsigned int subsize, i; 226918334Speter 227090075Sobrien subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1; 227190075Sobrien subalign = MIN (align, subsize * BITS_PER_UNIT); 227290075Sobrien omode = mode_for_size (subsize * BITS_PER_UNIT, MODE_INT, 0); 227390075Sobrien imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0); 227490075Sobrien 227590075Sobrien for (i = 0; i < size; i += subsize) 227618334Speter { 227790075Sobrien rtx partial = simplify_subreg (omode, x, imode, i); 227890075Sobrien if (!partial || !assemble_integer (partial, subsize, subalign, 0)) 227918334Speter break; 228018334Speter } 228190075Sobrien if (i == size) 228290075Sobrien return true; 228318334Speter 228490075Sobrien /* If we've printed some of it, but not all of it, there's no going 228590075Sobrien back now. */ 2286169689Skan gcc_assert (!i); 228718334Speter } 228818334Speter 2289169689Skan gcc_assert (!force); 229018334Speter 229190075Sobrien return false; 229218334Speter} 229318334Speter 229418334Spetervoid 2295132718Skanassemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align) 229618334Speter{ 2297169689Skan long data[4] = {0, 0, 0, 0}; 2298132718Skan int i; 2299132718Skan int bitsize, nelts, nunits, units_per; 230018334Speter 2301132718Skan /* This is hairy. We have a quantity of known size. real_to_target 2302132718Skan will put it into an array of *host* longs, 32 bits per element 2303132718Skan (even if long is more than 32 bits). We need to determine the 2304132718Skan number of array elements that are occupied (nelts) and the number 2305132718Skan of *target* min-addressable units that will be occupied in the 2306132718Skan object file (nunits). We cannot assume that 32 divides the 2307132718Skan mode's bitsize (size * BITS_PER_UNIT) evenly. 230818334Speter 2309132718Skan size * BITS_PER_UNIT is used here to make sure that padding bits 2310132718Skan (which might appear at either end of the value; real_to_target 2311132718Skan will include the padding bits in its output array) are included. */ 231218334Speter 2313132718Skan nunits = GET_MODE_SIZE (mode); 2314132718Skan bitsize = nunits * BITS_PER_UNIT; 2315132718Skan nelts = CEIL (bitsize, 32); 2316132718Skan units_per = 32 / BITS_PER_UNIT; 231718334Speter 2318132718Skan real_to_target (data, &d, mode); 2319132718Skan 2320132718Skan /* Put out the first word with the specified alignment. */ 2321132718Skan assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1); 2322132718Skan nunits -= units_per; 2323132718Skan 2324132718Skan /* Subsequent words need only 32-bit alignment. */ 2325132718Skan align = min_align (align, 32); 2326132718Skan 2327132718Skan for (i = 1; i < nelts; i++) 2328132718Skan { 2329132718Skan assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1); 2330132718Skan nunits -= units_per; 233118334Speter } 233218334Speter} 233318334Speter 233418334Speter/* Given an expression EXP with a constant value, 233518334Speter reduce it to the sum of an assembler symbol and an integer. 233618334Speter Store them both in the structure *VALUE. 2337169689Skan EXP must be reducible. */ 233818334Speter 2339117395Skanstruct addr_const GTY(()) 234018334Speter{ 234118334Speter rtx base; 234218334Speter HOST_WIDE_INT offset; 234318334Speter}; 234418334Speter 234518334Speterstatic void 2346132718Skandecode_addr_const (tree exp, struct addr_const *value) 234718334Speter{ 234890075Sobrien tree target = TREE_OPERAND (exp, 0); 234990075Sobrien int offset = 0; 235090075Sobrien rtx x; 235118334Speter 235218334Speter while (1) 235318334Speter { 235418334Speter if (TREE_CODE (target) == COMPONENT_REF 235590075Sobrien && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0)) 235690075Sobrien 235718334Speter { 235890075Sobrien offset += int_byte_position (TREE_OPERAND (target, 1)); 235918334Speter target = TREE_OPERAND (target, 0); 236018334Speter } 236190075Sobrien else if (TREE_CODE (target) == ARRAY_REF 236290075Sobrien || TREE_CODE (target) == ARRAY_RANGE_REF) 236318334Speter { 236490075Sobrien offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1) 236590075Sobrien * tree_low_cst (TREE_OPERAND (target, 1), 0)); 236618334Speter target = TREE_OPERAND (target, 0); 236718334Speter } 236818334Speter else 236918334Speter break; 237018334Speter } 237118334Speter 237218334Speter switch (TREE_CODE (target)) 237318334Speter { 237418334Speter case VAR_DECL: 237518334Speter case FUNCTION_DECL: 237618334Speter x = DECL_RTL (target); 237718334Speter break; 237818334Speter 237918334Speter case LABEL_DECL: 238050397Sobrien x = gen_rtx_MEM (FUNCTION_MODE, 2381169689Skan gen_rtx_LABEL_REF (Pmode, force_label_rtx (target))); 238218334Speter break; 238318334Speter 238418334Speter case REAL_CST: 238518334Speter case STRING_CST: 238618334Speter case COMPLEX_CST: 238718334Speter case CONSTRUCTOR: 238850397Sobrien case INTEGER_CST: 238990075Sobrien x = output_constant_def (target, 1); 239018334Speter break; 239118334Speter 239218334Speter default: 2393169689Skan gcc_unreachable (); 239418334Speter } 239518334Speter 2396169689Skan gcc_assert (MEM_P (x)); 239750397Sobrien x = XEXP (x, 0); 239818334Speter 239918334Speter value->base = x; 240018334Speter value->offset = offset; 240118334Speter} 240218334Speter 240318334Speter/* Uniquize all constants that appear in memory. 240418334Speter Each constant in memory thus far output is recorded 2405132718Skan in `const_desc_table'. */ 240618334Speter 2407117395Skanstruct constant_descriptor_tree GTY(()) 2408117395Skan{ 2409117395Skan /* A MEM for the constant. */ 241090075Sobrien rtx rtl; 2411117395Skan 2412117395Skan /* The value of the constant. */ 2413117395Skan tree value; 2414169689Skan 2415169689Skan /* Hash of value. Computing the hash from value each time 2416169689Skan hashfn is called can't work properly, as that means recursive 2417169689Skan use of the hash table during hash table expansion. */ 2418169689Skan hashval_t hash; 241918334Speter}; 242018334Speter 2421132718Skanstatic GTY((param_is (struct constant_descriptor_tree))) 2422132718Skan htab_t const_desc_htab; 242318334Speter 2424132718Skanstatic struct constant_descriptor_tree * build_constant_desc (tree); 2425132718Skanstatic void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int); 242690075Sobrien 2427132718Skan/* Compute a hash code for a constant expression. */ 242890075Sobrien 242990075Sobrienstatic hashval_t 2430132718Skanconst_desc_hash (const void *ptr) 243190075Sobrien{ 2432169689Skan return ((struct constant_descriptor_tree *)ptr)->hash; 243390075Sobrien} 243490075Sobrien 2435132718Skanstatic hashval_t 2436132718Skanconst_hash_1 (const tree exp) 243790075Sobrien{ 243890075Sobrien const char *p; 2439132718Skan hashval_t hi; 2440117395Skan int len, i; 244190075Sobrien enum tree_code code = TREE_CODE (exp); 244218334Speter 244350397Sobrien /* Either set P and LEN to the address and len of something to hash and 244450397Sobrien exit the switch or return a value. */ 244550397Sobrien 244650397Sobrien switch (code) 244718334Speter { 244850397Sobrien case INTEGER_CST: 244990075Sobrien p = (char *) &TREE_INT_CST (exp); 245090075Sobrien len = sizeof TREE_INT_CST (exp); 245150397Sobrien break; 245250397Sobrien 245350397Sobrien case REAL_CST: 2454117395Skan return real_hash (TREE_REAL_CST_PTR (exp)); 245518334Speter 245650397Sobrien case STRING_CST: 2457169689Skan p = TREE_STRING_POINTER (exp); 2458169689Skan len = TREE_STRING_LENGTH (exp); 245950397Sobrien break; 246018334Speter 246150397Sobrien case COMPLEX_CST: 2462117395Skan return (const_hash_1 (TREE_REALPART (exp)) * 5 2463117395Skan + const_hash_1 (TREE_IMAGPART (exp))); 246418334Speter 246550397Sobrien case CONSTRUCTOR: 2466169689Skan { 2467169689Skan unsigned HOST_WIDE_INT idx; 2468169689Skan tree value; 246990075Sobrien 2470169689Skan hi = 5 + int_size_in_bytes (TREE_TYPE (exp)); 247118334Speter 2472169689Skan FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value) 2473169689Skan if (value) 2474169689Skan hi = hi * 603 + const_hash_1 (value); 247550397Sobrien 2476169689Skan return hi; 2477169689Skan } 247850397Sobrien 247950397Sobrien case ADDR_EXPR: 2480102780Skan case FDESC_EXPR: 248150397Sobrien { 248250397Sobrien struct addr_const value; 248350397Sobrien 248450397Sobrien decode_addr_const (exp, &value); 2485169689Skan switch (GET_CODE (value.base)) 248650397Sobrien { 2487169689Skan case SYMBOL_REF: 248850397Sobrien /* Don't hash the address of the SYMBOL_REF; 248950397Sobrien only use the offset and the symbol name. */ 249050397Sobrien hi = value.offset; 249150397Sobrien p = XSTR (value.base, 0); 249250397Sobrien for (i = 0; p[i] != 0; i++) 249350397Sobrien hi = ((hi * 613) + (unsigned) (p[i])); 2494169689Skan break; 2495169689Skan 2496169689Skan case LABEL_REF: 2497169689Skan hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13; 2498169689Skan break; 2499169689Skan 2500169689Skan default: 2501169689Skan gcc_unreachable (); 250250397Sobrien } 250350397Sobrien } 250418334Speter return hi; 250550397Sobrien 250650397Sobrien case PLUS_EXPR: 250750397Sobrien case MINUS_EXPR: 2508117395Skan return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9 2509117395Skan + const_hash_1 (TREE_OPERAND (exp, 1))); 251050397Sobrien 251150397Sobrien case NOP_EXPR: 251250397Sobrien case CONVERT_EXPR: 251350397Sobrien case NON_LVALUE_EXPR: 2514117395Skan return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2; 251590075Sobrien 251650397Sobrien default: 251790075Sobrien /* A language specific constant. Just hash the code. */ 2518117395Skan return code; 251918334Speter } 252018334Speter 2521132718Skan /* Compute hashing function. */ 252218334Speter hi = len; 252318334Speter for (i = 0; i < len; i++) 252450397Sobrien hi = ((hi * 613) + (unsigned) (p[i])); 252518334Speter 252618334Speter return hi; 252718334Speter} 252818334Speter 2529132718Skan/* Wrapper of compare_constant, for the htab interface. */ 2530132718Skanstatic int 2531132718Skanconst_desc_eq (const void *p1, const void *p2) 2532132718Skan{ 2533169689Skan const struct constant_descriptor_tree *c1 = p1; 2534169689Skan const struct constant_descriptor_tree *c2 = p2; 2535169689Skan if (c1->hash != c2->hash) 2536169689Skan return 0; 2537169689Skan return compare_constant (c1->value, c2->value); 2538132718Skan} 2539132718Skan 2540117395Skan/* Compare t1 and t2, and return 1 only if they are known to result in 2541117395Skan the same bit pattern on output. */ 2542117395Skan 254318334Speterstatic int 2544132718Skancompare_constant (const tree t1, const tree t2) 254518334Speter{ 2546117395Skan enum tree_code typecode; 254718334Speter 2548117395Skan if (t1 == NULL_TREE) 2549117395Skan return t2 == NULL_TREE; 2550117395Skan if (t2 == NULL_TREE) 2551117395Skan return 0; 255218334Speter 2553117395Skan if (TREE_CODE (t1) != TREE_CODE (t2)) 255418334Speter return 0; 255518334Speter 2556117395Skan switch (TREE_CODE (t1)) 255718334Speter { 255850397Sobrien case INTEGER_CST: 255918334Speter /* Integer constants are the same only if the same width of type. */ 2560117395Skan if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2))) 256118334Speter return 0; 2562169689Skan if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))) 2563169689Skan return 0; 2564117395Skan return tree_int_cst_equal (t1, t2); 256550397Sobrien 256650397Sobrien case REAL_CST: 256718334Speter /* Real constants are the same only if the same width of type. */ 2568117395Skan if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2))) 256918334Speter return 0; 257050397Sobrien 2571117395Skan return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2)); 257250397Sobrien 257350397Sobrien case STRING_CST: 2574117395Skan if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))) 257550397Sobrien return 0; 257650397Sobrien 2577117395Skan return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2) 2578117395Skan && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2), 2579117395Skan TREE_STRING_LENGTH (t1))); 258050397Sobrien 2581117395Skan case COMPLEX_CST: 2582117395Skan return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2)) 2583117395Skan && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2))); 258450397Sobrien 2585117395Skan case CONSTRUCTOR: 2586169689Skan { 2587169689Skan VEC(constructor_elt, gc) *v1, *v2; 2588169689Skan unsigned HOST_WIDE_INT idx; 258918334Speter 2590169689Skan typecode = TREE_CODE (TREE_TYPE (t1)); 2591169689Skan if (typecode != TREE_CODE (TREE_TYPE (t2))) 2592169689Skan return 0; 259350397Sobrien 2594169689Skan if (typecode == ARRAY_TYPE) 2595169689Skan { 2596169689Skan HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1)); 2597169689Skan /* For arrays, check that the sizes all match. */ 2598169689Skan if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)) 2599169689Skan || size_1 == -1 2600169689Skan || size_1 != int_size_in_bytes (TREE_TYPE (t2))) 2601169689Skan return 0; 2602169689Skan } 2603169689Skan else 2604169689Skan { 2605169689Skan /* For record and union constructors, require exact type 2606169689Skan equality. */ 2607169689Skan if (TREE_TYPE (t1) != TREE_TYPE (t2)) 2608169689Skan return 0; 2609169689Skan } 261050397Sobrien 2611169689Skan v1 = CONSTRUCTOR_ELTS (t1); 2612169689Skan v2 = CONSTRUCTOR_ELTS (t2); 2613169689Skan if (VEC_length (constructor_elt, v1) 2614169689Skan != VEC_length (constructor_elt, v2)) 2615117395Skan return 0; 2616117395Skan 2617169689Skan for (idx = 0; idx < VEC_length (constructor_elt, v1); ++idx) 2618169689Skan { 2619169689Skan constructor_elt *c1 = VEC_index (constructor_elt, v1, idx); 2620169689Skan constructor_elt *c2 = VEC_index (constructor_elt, v2, idx); 262118334Speter 2622169689Skan /* Check that each value is the same... */ 2623169689Skan if (!compare_constant (c1->value, c2->value)) 2624169689Skan return 0; 2625169689Skan /* ... and that they apply to the same fields! */ 2626169689Skan if (typecode == ARRAY_TYPE) 2627169689Skan { 2628169689Skan if (!compare_constant (c1->index, c2->index)) 2629169689Skan return 0; 2630169689Skan } 2631169689Skan else 2632169689Skan { 2633169689Skan if (c1->index != c2->index) 2634169689Skan return 0; 2635169689Skan } 2636169689Skan } 263750397Sobrien 2638169689Skan return 1; 2639169689Skan } 264050397Sobrien 264150397Sobrien case ADDR_EXPR: 2642102780Skan case FDESC_EXPR: 264350397Sobrien { 2644117395Skan struct addr_const value1, value2; 264550397Sobrien 2646117395Skan decode_addr_const (t1, &value1); 2647117395Skan decode_addr_const (t2, &value2); 2648117395Skan return (value1.offset == value2.offset 2649117395Skan && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0); 265050397Sobrien } 265150397Sobrien 265250397Sobrien case PLUS_EXPR: 265350397Sobrien case MINUS_EXPR: 265452284Sobrien case RANGE_EXPR: 2655117395Skan return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)) 2656117395Skan && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1))); 265750397Sobrien 265850397Sobrien case NOP_EXPR: 265950397Sobrien case CONVERT_EXPR: 266050397Sobrien case NON_LVALUE_EXPR: 2661169689Skan case VIEW_CONVERT_EXPR: 2662117395Skan return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); 266350397Sobrien 266450397Sobrien default: 266590075Sobrien { 2666117395Skan tree nt1, nt2; 2667169689Skan nt1 = lang_hooks.expand_constant (t1); 2668169689Skan nt2 = lang_hooks.expand_constant (t2); 2669117395Skan if (nt1 != t1 || nt2 != t2) 2670117395Skan return compare_constant (nt1, nt2); 267190075Sobrien else 267290075Sobrien return 0; 267390075Sobrien } 267418334Speter } 267518334Speter 2676169689Skan gcc_unreachable (); 267718334Speter} 267818334Speter 2679117395Skan/* Make a copy of the whole tree structure for a constant. This 2680169689Skan handles the same types of nodes that compare_constant handles. */ 268118334Speter 268218334Speterstatic tree 2683132718Skancopy_constant (tree exp) 268418334Speter{ 268518334Speter switch (TREE_CODE (exp)) 268618334Speter { 268718334Speter case ADDR_EXPR: 268818334Speter /* For ADDR_EXPR, we do not want to copy the decl whose address 268918334Speter is requested. We do want to copy constants though. */ 2690169689Skan if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0))) 269118334Speter return build1 (TREE_CODE (exp), TREE_TYPE (exp), 269218334Speter copy_constant (TREE_OPERAND (exp, 0))); 269318334Speter else 269418334Speter return copy_node (exp); 269518334Speter 269618334Speter case INTEGER_CST: 269718334Speter case REAL_CST: 2698169689Skan case STRING_CST: 269918334Speter return copy_node (exp); 270018334Speter 270118334Speter case COMPLEX_CST: 270250397Sobrien return build_complex (TREE_TYPE (exp), 270350397Sobrien copy_constant (TREE_REALPART (exp)), 270418334Speter copy_constant (TREE_IMAGPART (exp))); 270518334Speter 270618334Speter case PLUS_EXPR: 270718334Speter case MINUS_EXPR: 2708169689Skan return build2 (TREE_CODE (exp), TREE_TYPE (exp), 2709169689Skan copy_constant (TREE_OPERAND (exp, 0)), 2710169689Skan copy_constant (TREE_OPERAND (exp, 1))); 271118334Speter 271218334Speter case NOP_EXPR: 271318334Speter case CONVERT_EXPR: 271450397Sobrien case NON_LVALUE_EXPR: 2715132718Skan case VIEW_CONVERT_EXPR: 271618334Speter return build1 (TREE_CODE (exp), TREE_TYPE (exp), 271718334Speter copy_constant (TREE_OPERAND (exp, 0))); 271818334Speter 271918334Speter case CONSTRUCTOR: 272018334Speter { 272118334Speter tree copy = copy_node (exp); 2722169689Skan VEC(constructor_elt, gc) *v; 2723169689Skan unsigned HOST_WIDE_INT idx; 2724169689Skan tree purpose, value; 272518334Speter 2726169689Skan v = VEC_alloc(constructor_elt, gc, VEC_length(constructor_elt, 2727169689Skan CONSTRUCTOR_ELTS (exp))); 2728169689Skan FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value) 2729169689Skan { 2730169689Skan constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL); 2731169689Skan ce->index = purpose; 2732169689Skan ce->value = copy_constant (value); 2733169689Skan } 2734169689Skan CONSTRUCTOR_ELTS (copy) = v; 273518334Speter return copy; 273618334Speter } 273718334Speter 273818334Speter default: 2739117395Skan { 2740169689Skan tree t = lang_hooks.expand_constant (exp); 2741169689Skan 2742169689Skan gcc_assert (t != exp); 2743169689Skan return copy_constant (t); 2744117395Skan } 274518334Speter } 274618334Speter} 274718334Speter 2748169689Skan/* Return the alignment of constant EXP in bits. */ 2749169689Skan 2750169689Skanstatic unsigned int 2751169689Skanget_constant_alignment (tree exp) 2752169689Skan{ 2753169689Skan unsigned int align; 2754169689Skan 2755169689Skan align = TYPE_ALIGN (TREE_TYPE (exp)); 2756169689Skan#ifdef CONSTANT_ALIGNMENT 2757169689Skan align = CONSTANT_ALIGNMENT (exp, align); 2758169689Skan#endif 2759169689Skan return align; 2760169689Skan} 2761169689Skan 2762169689Skan/* Return the section into which constant EXP should be placed. */ 2763169689Skan 2764169689Skanstatic section * 2765169689Skanget_constant_section (tree exp) 2766169689Skan{ 2767169689Skan if (IN_NAMED_SECTION (exp)) 2768169689Skan return get_named_section (exp, NULL, compute_reloc_for_constant (exp)); 2769169689Skan else 2770169689Skan return targetm.asm_out.select_section (exp, 2771169689Skan compute_reloc_for_constant (exp), 2772169689Skan get_constant_alignment (exp)); 2773169689Skan} 2774169689Skan 2775169689Skan/* Return the size of constant EXP in bytes. */ 2776169689Skan 2777169689Skanstatic HOST_WIDE_INT 2778169689Skanget_constant_size (tree exp) 2779169689Skan{ 2780169689Skan HOST_WIDE_INT size; 2781169689Skan 2782169689Skan size = int_size_in_bytes (TREE_TYPE (exp)); 2783169689Skan if (TREE_CODE (exp) == STRING_CST) 2784169689Skan size = MAX (TREE_STRING_LENGTH (exp), size); 2785169689Skan return size; 2786169689Skan} 2787169689Skan 2788132718Skan/* Subroutine of output_constant_def: 2789132718Skan No constant equal to EXP is known to have been output. 2790132718Skan Make a constant descriptor to enter EXP in the hash table. 2791132718Skan Assign the label number and construct RTL to refer to the 2792132718Skan constant's location in memory. 2793132718Skan Caller is responsible for updating the hash table. */ 279418334Speter 2795132718Skanstatic struct constant_descriptor_tree * 2796132718Skanbuild_constant_desc (tree exp) 279718334Speter{ 2798132718Skan rtx symbol; 2799132718Skan rtx rtl; 2800132718Skan char label[256]; 2801132718Skan int labelno; 2802117395Skan struct constant_descriptor_tree *desc; 280318334Speter 2804132718Skan desc = ggc_alloc (sizeof (*desc)); 2805146895Skan desc->value = copy_constant (exp); 2806122180Skan 2807169689Skan /* Propagate marked-ness to copied constant. */ 2808169689Skan if (flag_mudflap && mf_marked_p (exp)) 2809169689Skan mf_mark (desc->value); 2810169689Skan 2811132718Skan /* Create a string containing the label name, in LABEL. */ 2812132718Skan labelno = const_labelno++; 2813132718Skan ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno); 281418334Speter 2815132718Skan /* We have a symbol name; construct the SYMBOL_REF and the MEM. */ 2816169689Skan if (use_object_blocks_p ()) 2817169689Skan { 2818169689Skan section *sect = get_constant_section (exp); 2819169689Skan symbol = create_block_symbol (ggc_strdup (label), 2820169689Skan get_block_for_section (sect), -1); 2821169689Skan } 2822169689Skan else 2823169689Skan symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label)); 2824169689Skan SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL; 2825169689Skan SET_SYMBOL_REF_DECL (symbol, desc->value); 2826132718Skan TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1; 282718334Speter 2828132718Skan rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol); 2829132718Skan set_mem_attributes (rtl, exp, 1); 2830132718Skan set_mem_alias_set (rtl, 0); 2831132718Skan set_mem_alias_set (rtl, const_alias_set); 283218334Speter 2833132718Skan /* Set flags or add text to the name to record information, such as 2834132718Skan that it is a local symbol. If the name is changed, the macro 2835132718Skan ASM_OUTPUT_LABELREF will have to know how to strip this 2836132718Skan information. This call might invalidate our local variable 2837132718Skan SYMBOL; we can't use it afterward. */ 283818334Speter 2839169689Skan targetm.encode_section_info (exp, rtl, true); 284090075Sobrien 2841132718Skan desc->rtl = rtl; 284290075Sobrien 2843132718Skan return desc; 2844132718Skan} 284590075Sobrien 2846132718Skan/* Return an rtx representing a reference to constant data in memory 2847132718Skan for the constant expression EXP. 284818334Speter 2849132718Skan If assembler code for such a constant has already been output, 2850132718Skan return an rtx to refer to it. 2851132718Skan Otherwise, output such a constant in memory 2852132718Skan and generate an rtx for it. 285390075Sobrien 2854132718Skan If DEFER is nonzero, this constant can be deferred and output only 2855132718Skan if referenced in the function after all optimizations. 285690075Sobrien 2857132718Skan `const_desc_table' records which constants already have label strings. */ 285890075Sobrien 2859132718Skanrtx 2860132718Skanoutput_constant_def (tree exp, int defer) 2861132718Skan{ 2862132718Skan struct constant_descriptor_tree *desc; 2863132718Skan struct constant_descriptor_tree key; 2864132718Skan void **loc; 286518334Speter 2866132718Skan /* Look up EXP in the table of constant descriptors. If we didn't find 2867132718Skan it, create a new one. */ 2868132718Skan key.value = exp; 2869169689Skan key.hash = const_hash_1 (exp); 2870169689Skan loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT); 287118334Speter 2872132718Skan desc = *loc; 2873132718Skan if (desc == 0) 287490075Sobrien { 2875132718Skan desc = build_constant_desc (exp); 2876169689Skan desc->hash = key.hash; 2877132718Skan *loc = desc; 287890075Sobrien } 287918334Speter 2880132718Skan maybe_output_constant_def_contents (desc, defer); 2881132718Skan return desc->rtl; 2882132718Skan} 288390075Sobrien 2884132718Skan/* Subroutine of output_constant_def: Decide whether or not we need to 2885132718Skan output the constant DESC now, and if so, do it. */ 2886132718Skanstatic void 2887132718Skanmaybe_output_constant_def_contents (struct constant_descriptor_tree *desc, 2888132718Skan int defer) 2889132718Skan{ 2890132718Skan rtx symbol = XEXP (desc->rtl, 0); 2891132718Skan tree exp = desc->value; 289290075Sobrien 2893132718Skan if (flag_syntax_only) 2894132718Skan return; 289518334Speter 2896132718Skan if (TREE_ASM_WRITTEN (exp)) 2897132718Skan /* Already output; don't do it again. */ 2898132718Skan return; 289990075Sobrien 2900169689Skan /* We can always defer constants as long as the context allows 2901169689Skan doing so. */ 2902169689Skan if (defer) 2903132718Skan { 2904132718Skan /* Increment n_deferred_constants if it exists. It needs to be at 2905132718Skan least as large as the number of constants actually referred to 2906132718Skan by the function. If it's too small we'll stop looking too early 2907132718Skan and fail to emit constants; if it's too large we'll only look 2908132718Skan through the entire function when we could have stopped earlier. */ 2909132718Skan if (cfun) 2910132718Skan n_deferred_constants++; 2911132718Skan return; 291218334Speter } 291318334Speter 2914132718Skan output_constant_def_contents (symbol); 291518334Speter} 291618334Speter 2917169689Skan/* Subroutine of output_constant_def_contents. Output the definition 2918169689Skan of constant EXP, which is pointed to by label LABEL. ALIGN is the 2919169689Skan constant's alignment in bits. */ 292018334Speter 292118334Speterstatic void 2922169689Skanassemble_constant_contents (tree exp, const char *label, unsigned int align) 292318334Speter{ 2924122180Skan HOST_WIDE_INT size; 292518334Speter 2926169689Skan size = get_constant_size (exp); 2927132718Skan 2928122180Skan /* Do any machine/system dependent processing of the constant. */ 2929122180Skan#ifdef ASM_DECLARE_CONSTANT_NAME 2930132718Skan ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size); 2931122180Skan#else 2932122180Skan /* Standard thing is just output label for the constant. */ 2933132718Skan ASM_OUTPUT_LABEL (asm_out_file, label); 2934122180Skan#endif /* ASM_DECLARE_CONSTANT_NAME */ 293518334Speter 293618334Speter /* Output the value of EXP. */ 2937122180Skan output_constant (exp, size, align); 293818334Speter} 2939132718Skan 2940169689Skan/* We must output the constant data referred to by SYMBOL; do so. */ 2941169689Skan 2942169689Skanstatic void 2943169689Skanoutput_constant_def_contents (rtx symbol) 2944132718Skan{ 2945169689Skan tree exp = SYMBOL_REF_DECL (symbol); 2946169689Skan unsigned int align; 2947169689Skan 2948169689Skan /* Make sure any other constants whose addresses appear in EXP 2949169689Skan are assigned label numbers. */ 2950169689Skan output_addressed_constants (exp); 2951169689Skan 2952169689Skan /* We are no longer deferring this constant. */ 2953169689Skan TREE_ASM_WRITTEN (exp) = 1; 2954169689Skan 2955169689Skan /* If the constant is part of an object block, make sure that the 2956169689Skan decl has been positioned within its block, but do not write out 2957169689Skan its definition yet. output_object_blocks will do that later. */ 2958169689Skan if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol)) 2959169689Skan place_block_symbol (symbol); 2960169689Skan else 2961169689Skan { 2962169689Skan switch_to_section (get_constant_section (exp)); 2963169689Skan align = get_constant_alignment (exp); 2964169689Skan if (align > BITS_PER_UNIT) 2965169689Skan ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT)); 2966169689Skan assemble_constant_contents (exp, XSTR (symbol, 0), align); 2967169689Skan } 2968169689Skan if (flag_mudflap) 2969169689Skan mudflap_enqueue_constant (exp); 2970132718Skan} 2971132718Skan 2972132718Skan/* Look up EXP in the table of constant descriptors. Return the rtl 2973132718Skan if it has been emitted, else null. */ 2974132718Skan 2975132718Skanrtx 2976132718Skanlookup_constant_def (tree exp) 2977132718Skan{ 2978132718Skan struct constant_descriptor_tree *desc; 2979132718Skan struct constant_descriptor_tree key; 2980132718Skan 2981132718Skan key.value = exp; 2982169689Skan key.hash = const_hash_1 (exp); 2983169689Skan desc = htab_find_with_hash (const_desc_htab, &key, key.hash); 2984132718Skan 2985132718Skan return (desc ? desc->rtl : NULL_RTX); 2986132718Skan} 298718334Speter 2988117395Skan/* Used in the hash tables to avoid outputting the same constant 2989117395Skan twice. Unlike 'struct constant_descriptor_tree', RTX constants 2990169689Skan are output once per function, not once per file. */ 2991169689Skan/* ??? Only a few targets need per-function constant pools. Most 2992169689Skan can use one per-file pool. Should add a targetm bit to tell the 2993169689Skan difference. */ 2994117395Skan 2995169689Skanstruct rtx_constant_pool GTY(()) 2996117395Skan{ 2997169689Skan /* Pointers to first and last constant in pool, as ordered by offset. */ 2998169689Skan struct constant_descriptor_rtx *first; 2999169689Skan struct constant_descriptor_rtx *last; 3000117395Skan 3001169689Skan /* Hash facility for making memory-constants from constant rtl-expressions. 3002169689Skan It is used on RISC machines where immediate integer arguments and 3003169689Skan constant addresses are restricted so that such constants must be stored 3004169689Skan in memory. */ 3005169689Skan htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab; 3006117395Skan 3007169689Skan /* Current offset in constant pool (does not include any 3008169689Skan machine-specific header). */ 3009169689Skan HOST_WIDE_INT offset; 3010117395Skan}; 3011117395Skan 3012169689Skanstruct constant_descriptor_rtx GTY((chain_next ("%h.next"))) 301318334Speter{ 3014169689Skan struct constant_descriptor_rtx *next; 3015169689Skan rtx mem; 3016169689Skan rtx sym; 301790075Sobrien rtx constant; 3018169689Skan HOST_WIDE_INT offset; 3019169689Skan hashval_t hash; 302018334Speter enum machine_mode mode; 3021169689Skan unsigned int align; 302218334Speter int labelno; 302350397Sobrien int mark; 302418334Speter}; 302518334Speter 3026169689Skan/* Hash and compare functions for const_rtx_htab. */ 302718334Speter 3028169689Skanstatic hashval_t 3029169689Skanconst_desc_rtx_hash (const void *ptr) 3030169689Skan{ 3031169689Skan const struct constant_descriptor_rtx *desc = ptr; 3032169689Skan return desc->hash; 3033169689Skan} 303418334Speter 3035169689Skanstatic int 3036169689Skanconst_desc_rtx_eq (const void *a, const void *b) 303718334Speter{ 3038169689Skan const struct constant_descriptor_rtx *x = a; 3039169689Skan const struct constant_descriptor_rtx *y = b; 304018334Speter 3041169689Skan if (x->mode != y->mode) 3042169689Skan return 0; 3043169689Skan return rtx_equal_p (x->constant, y->constant); 304418334Speter} 304518334Speter 3046169689Skan/* This is the worker function for const_rtx_hash, called via for_each_rtx. */ 304718334Speter 3048169689Skanstatic int 3049169689Skanconst_rtx_hash_1 (rtx *xp, void *data) 305018334Speter{ 3051169689Skan unsigned HOST_WIDE_INT hwi; 3052169689Skan enum machine_mode mode; 3053169689Skan enum rtx_code code; 3054169689Skan hashval_t h, *hp; 3055169689Skan rtx x; 305618334Speter 3057169689Skan x = *xp; 3058169689Skan code = GET_CODE (x); 3059169689Skan mode = GET_MODE (x); 3060169689Skan h = (hashval_t) code * 1048573 + mode; 306118334Speter 3062169689Skan switch (code) 306318334Speter { 3064169689Skan case CONST_INT: 3065169689Skan hwi = INTVAL (x); 3066169689Skan fold_hwi: 3067169689Skan { 3068169689Skan const int shift = sizeof (hashval_t) * CHAR_BIT; 3069169689Skan const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t); 3070169689Skan int i; 3071169689Skan 3072169689Skan h ^= (hashval_t) hwi; 3073169689Skan for (i = 1; i < n; ++i) 3074169689Skan { 3075169689Skan hwi >>= shift; 3076169689Skan h ^= (hashval_t) hwi; 3077169689Skan } 3078169689Skan } 3079169689Skan break; 3080169689Skan 308118334Speter case CONST_DOUBLE: 3082169689Skan if (mode == VOIDmode) 308318334Speter { 3084169689Skan hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x); 3085169689Skan goto fold_hwi; 308618334Speter } 308718334Speter else 3088169689Skan h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x)); 308918334Speter break; 309018334Speter 309196263Sobrien case CONST_VECTOR: 309296263Sobrien { 3093169689Skan int i; 3094169689Skan for (i = XVECLEN (x, 0); i-- > 0; ) 3095169689Skan h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data); 309696263Sobrien } 309796263Sobrien break; 309896263Sobrien 3099169689Skan case SYMBOL_REF: 3100169689Skan h ^= htab_hash_string (XSTR (x, 0)); 310118334Speter break; 310218334Speter 310318334Speter case LABEL_REF: 3104169689Skan h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0)); 310518334Speter break; 310618334Speter 3107169689Skan case UNSPEC: 3108169689Skan case UNSPEC_VOLATILE: 3109169689Skan h = h * 251 + XINT (x, 1); 311018334Speter break; 311118334Speter 311218334Speter default: 311396263Sobrien break; 311418334Speter } 311518334Speter 3116169689Skan hp = data; 3117169689Skan *hp = *hp * 509 + h; 3118169689Skan return 0; 311918334Speter} 312018334Speter 3121169689Skan/* Compute a hash value for X, which should be a constant. */ 312218334Speter 3123169689Skanstatic hashval_t 3124169689Skanconst_rtx_hash (rtx x) 312518334Speter{ 3126169689Skan hashval_t h = 0; 3127169689Skan for_each_rtx (&x, const_rtx_hash_1, &h); 3128169689Skan return h; 312918334Speter} 313018334Speter 3131169689Skan 3132169689Skan/* Create and return a new rtx constant pool. */ 313318334Speter 3134169689Skanstatic struct rtx_constant_pool * 3135169689Skancreate_constant_pool (void) 313618334Speter{ 3137169689Skan struct rtx_constant_pool *pool; 3138117395Skan 3139169689Skan pool = ggc_alloc (sizeof (struct rtx_constant_pool)); 3140169689Skan pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash, 3141169689Skan const_desc_rtx_eq, NULL); 3142169689Skan pool->first = NULL; 3143169689Skan pool->last = NULL; 3144169689Skan pool->offset = 0; 3145169689Skan return pool; 314618334Speter} 314718334Speter 3148169689Skan/* Initialize constant pool hashing for a new function. */ 314918334Speter 3150169689Skanvoid 3151169689Skaninit_varasm_status (struct function *f) 315218334Speter{ 3153169689Skan struct varasm_status *p; 315418334Speter 3155169689Skan p = ggc_alloc (sizeof (struct varasm_status)); 3156169689Skan f->varasm = p; 315718334Speter 3158169689Skan p->pool = create_constant_pool (); 3159169689Skan p->deferred_constants = 0; 316018334Speter} 3161169689Skan 3162169689Skan/* Given a MINUS expression, simplify it if both sides 3163169689Skan include the same symbol. */ 316418334Speter 3165169689Skanrtx 3166169689Skansimplify_subtraction (rtx x) 316718334Speter{ 3168169689Skan rtx r = simplify_rtx (x); 3169169689Skan return r ? r : x; 317090075Sobrien} 317190075Sobrien 317218334Speter/* Given a constant rtx X, make (or find) a memory constant for its value 317318334Speter and return a MEM rtx to refer to it in memory. */ 317418334Speter 317518334Speterrtx 3176132718Skanforce_const_mem (enum machine_mode mode, rtx x) 317718334Speter{ 3178169689Skan struct constant_descriptor_rtx *desc, tmp; 3179169689Skan struct rtx_constant_pool *pool; 318018334Speter char label[256]; 3181132718Skan rtx def, symbol; 3182169689Skan hashval_t hash; 318390075Sobrien unsigned int align; 3184169689Skan void **slot; 318518334Speter 3186117395Skan /* If we're not allowed to drop X into the constant pool, don't. */ 3187169689Skan if (targetm.cannot_force_const_mem (x)) 3188117395Skan return NULL_RTX; 3189117395Skan 3190169689Skan /* Record that this function has used a constant pool entry. */ 3191169689Skan current_function_uses_const_pool = 1; 319218334Speter 3193169689Skan /* Decide which pool to use. */ 3194169689Skan pool = (targetm.use_blocks_for_constant_p (mode, x) 3195169689Skan ? shared_constant_pool 3196169689Skan : cfun->varasm->pool); 3197117395Skan 3198169689Skan /* Lookup the value in the hashtable. */ 3199169689Skan tmp.constant = x; 3200169689Skan tmp.mode = mode; 3201169689Skan hash = const_rtx_hash (x); 3202169689Skan slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT); 3203169689Skan desc = *slot; 3204169689Skan 3205169689Skan /* If the constant was already present, return its memory. */ 3206169689Skan if (desc) 3207169689Skan return copy_rtx (desc->mem); 3208169689Skan 3209169689Skan /* Otherwise, create a new descriptor. */ 3210169689Skan desc = ggc_alloc (sizeof (*desc)); 3211169689Skan *slot = desc; 3212169689Skan 321390075Sobrien /* Align the location counter as required by EXP's data type. */ 321490075Sobrien align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode); 321550397Sobrien#ifdef CONSTANT_ALIGNMENT 3216132718Skan { 3217169689Skan tree type = lang_hooks.types.type_for_mode (mode, 0); 3218132718Skan if (type != NULL_TREE) 3219132718Skan align = CONSTANT_ALIGNMENT (make_tree (type, x), align); 3220132718Skan } 322150397Sobrien#endif 322218334Speter 3223169689Skan pool->offset += (align / BITS_PER_UNIT) - 1; 3224169689Skan pool->offset &= ~ ((align / BITS_PER_UNIT) - 1); 322518334Speter 3226169689Skan desc->next = NULL; 3227169689Skan desc->constant = tmp.constant; 3228169689Skan desc->offset = pool->offset; 3229169689Skan desc->hash = hash; 3230169689Skan desc->mode = mode; 3231169689Skan desc->align = align; 3232169689Skan desc->labelno = const_labelno; 3233169689Skan desc->mark = 0; 323418334Speter 3235169689Skan pool->offset += GET_MODE_SIZE (mode); 3236169689Skan if (pool->last) 3237169689Skan pool->last->next = desc; 323890075Sobrien else 3239169689Skan pool->first = pool->last = desc; 3240169689Skan pool->last = desc; 3241117395Skan 324290075Sobrien /* Create a string containing the label name, in LABEL. */ 324390075Sobrien ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno); 324490075Sobrien ++const_labelno; 324574722Sobrien 3246169689Skan /* Construct the SYMBOL_REF. Make sure to mark it as belonging to 3247169689Skan the constants pool. */ 3248169689Skan if (use_object_blocks_p () && targetm.use_blocks_for_constant_p (mode, x)) 3249169689Skan { 3250169689Skan section *sect = targetm.asm_out.select_rtx_section (mode, x, align); 3251169689Skan symbol = create_block_symbol (ggc_strdup (label), 3252169689Skan get_block_for_section (sect), -1); 3253169689Skan } 3254169689Skan else 3255169689Skan symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label)); 3256169689Skan desc->sym = symbol; 3257169689Skan SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL; 3258169689Skan CONSTANT_POOL_ADDRESS_P (symbol) = 1; 3259169689Skan SET_SYMBOL_REF_CONSTANT (symbol, desc); 326018334Speter 3261169689Skan /* Construct the MEM. */ 3262169689Skan desc->mem = def = gen_const_mem (mode, symbol); 3263169689Skan set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1); 3264169689Skan set_mem_align (def, align); 3265132718Skan 3266169689Skan /* If we're dropping a label to the constant pool, make sure we 3267169689Skan don't delete it. */ 3268169689Skan if (GET_CODE (x) == LABEL_REF) 3269169689Skan LABEL_PRESERVE_P (XEXP (x, 0)) = 1; 327018334Speter 3271132718Skan return copy_rtx (def); 327218334Speter} 327318334Speter 327418334Speter/* Given a constant pool SYMBOL_REF, return the corresponding constant. */ 327518334Speter 327618334Speterrtx 3277132718Skanget_pool_constant (rtx addr) 327818334Speter{ 3279169689Skan return SYMBOL_REF_CONSTANT (addr)->constant; 328018334Speter} 328118334Speter 328296263Sobrien/* Given a constant pool SYMBOL_REF, return the corresponding constant 328396263Sobrien and whether it has been output or not. */ 328496263Sobrien 328596263Sobrienrtx 3286132718Skanget_pool_constant_mark (rtx addr, bool *pmarked) 328796263Sobrien{ 3288169689Skan struct constant_descriptor_rtx *desc; 328996263Sobrien 3290169689Skan desc = SYMBOL_REF_CONSTANT (addr); 3291169689Skan *pmarked = (desc->mark != 0); 3292169689Skan return desc->constant; 329390075Sobrien} 329490075Sobrien 329518334Speter/* Similar, return the mode. */ 329618334Speter 329718334Speterenum machine_mode 3298132718Skanget_pool_mode (rtx addr) 329918334Speter{ 3300169689Skan return SYMBOL_REF_CONSTANT (addr)->mode; 330118334Speter} 330218334Speter 330318334Speter/* Return the size of the constant pool. */ 330418334Speter 330518334Speterint 3306132718Skanget_pool_size (void) 330718334Speter{ 3308169689Skan return cfun->varasm->pool->offset; 330918334Speter} 331018334Speter 3311169689Skan/* Worker function for output_constant_pool_1. Emit assembly for X 3312169689Skan in MODE with known alignment ALIGN. */ 331318334Speter 3314169689Skanstatic void 3315169689Skanoutput_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align) 331618334Speter{ 3317169689Skan switch (GET_MODE_CLASS (mode)) 3318169689Skan { 3319169689Skan case MODE_FLOAT: 3320169689Skan case MODE_DECIMAL_FLOAT: 3321169689Skan { 3322169689Skan REAL_VALUE_TYPE r; 332318334Speter 3324169689Skan gcc_assert (GET_CODE (x) == CONST_DOUBLE); 3325169689Skan REAL_VALUE_FROM_CONST_DOUBLE (r, x); 3326169689Skan assemble_real (r, mode, align); 3327169689Skan break; 3328169689Skan } 332950397Sobrien 3330169689Skan case MODE_INT: 3331169689Skan case MODE_PARTIAL_INT: 3332169689Skan assemble_integer (x, GET_MODE_SIZE (mode), align, 1); 3333169689Skan break; 333418334Speter 3335169689Skan case MODE_VECTOR_FLOAT: 3336169689Skan case MODE_VECTOR_INT: 3337169689Skan { 3338169689Skan int i, units; 3339169689Skan enum machine_mode submode = GET_MODE_INNER (mode); 3340169689Skan unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode)); 334190075Sobrien 3342169689Skan gcc_assert (GET_CODE (x) == CONST_VECTOR); 3343169689Skan units = CONST_VECTOR_NUNITS (x); 334418334Speter 3345169689Skan for (i = 0; i < units; i++) 3346169689Skan { 3347169689Skan rtx elt = CONST_VECTOR_ELT (x, i); 3348169689Skan output_constant_pool_2 (submode, elt, i ? subalign : align); 3349169689Skan } 3350169689Skan } 3351169689Skan break; 335250397Sobrien 3353169689Skan default: 3354169689Skan gcc_unreachable (); 3355169689Skan } 3356169689Skan} 335718334Speter 3358169689Skan/* Worker function for output_constant_pool. Emit constant DESC, 3359169689Skan giving it ALIGN bits of alignment. */ 336090075Sobrien 3361169689Skanstatic void 3362169689Skanoutput_constant_pool_1 (struct constant_descriptor_rtx *desc, 3363169689Skan unsigned int align) 3364169689Skan{ 3365169689Skan rtx x, tmp; 336690075Sobrien 3367169689Skan x = desc->constant; 336890075Sobrien 3369169689Skan /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF) 3370169689Skan whose CODE_LABEL has been deleted. This can occur if a jump table 3371169689Skan is eliminated by optimization. If so, write a constant of zero 3372169689Skan instead. Note that this can also happen by turning the 3373169689Skan CODE_LABEL into a NOTE. */ 3374169689Skan /* ??? This seems completely and utterly wrong. Certainly it's 3375169689Skan not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper 3376169689Skan functioning even with INSN_DELETED_P and friends. */ 337718334Speter 3378169689Skan tmp = x; 3379169689Skan switch (GET_CODE (x)) 3380169689Skan { 3381169689Skan case CONST: 3382169689Skan if (GET_CODE (XEXP (x, 0)) != PLUS 3383169689Skan || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF) 3384169689Skan break; 3385169689Skan tmp = XEXP (XEXP (x, 0), 0); 3386169689Skan /* FALLTHRU */ 3387169689Skan 3388169689Skan case LABEL_REF: 3389169689Skan tmp = XEXP (x, 0); 3390169689Skan gcc_assert (!INSN_DELETED_P (tmp)); 3391169689Skan gcc_assert (!NOTE_P (tmp) 3392169689Skan || NOTE_LINE_NUMBER (tmp) != NOTE_INSN_DELETED); 3393169689Skan break; 3394169689Skan 3395169689Skan default: 3396169689Skan break; 3397169689Skan } 3398169689Skan 339918334Speter#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY 3400169689Skan ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode, 3401169689Skan align, desc->labelno, done); 340218334Speter#endif 340318334Speter 3404169689Skan assemble_align (align); 340518334Speter 3406169689Skan /* Output the label. */ 3407169689Skan targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno); 340818334Speter 3409169689Skan /* Output the data. */ 3410169689Skan output_constant_pool_2 (desc->mode, x, align); 341118334Speter 3412169689Skan /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS 3413169689Skan sections have proper size. */ 3414169689Skan if (align > GET_MODE_BITSIZE (desc->mode) 3415169689Skan && in_section 3416169689Skan && (in_section->common.flags & SECTION_MERGE)) 3417169689Skan assemble_align (align); 341818334Speter 3419169689Skan#ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY 3420169689Skan done: 3421169689Skan#endif 3422169689Skan return; 3423169689Skan} 342418334Speter 3425169689Skan/* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers 3426169689Skan to as used. Emit referenced deferred strings. This function can 3427169689Skan be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */ 342896263Sobrien 3429169689Skanstatic int 3430169689Skanmark_constant (rtx *current_rtx, void *data ATTRIBUTE_UNUSED) 3431169689Skan{ 3432169689Skan rtx x = *current_rtx; 343396263Sobrien 3434169689Skan if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF) 3435169689Skan return 0; 343696263Sobrien 3437169689Skan if (CONSTANT_POOL_ADDRESS_P (x)) 3438169689Skan { 3439169689Skan struct constant_descriptor_rtx *desc = SYMBOL_REF_CONSTANT (x); 3440169689Skan if (desc->mark == 0) 3441169689Skan { 3442169689Skan desc->mark = 1; 3443169689Skan for_each_rtx (&desc->constant, mark_constant, NULL); 3444169689Skan } 3445169689Skan } 3446169689Skan else if (TREE_CONSTANT_POOL_ADDRESS_P (x)) 3447169689Skan { 3448169689Skan tree exp = SYMBOL_REF_DECL (x); 3449169689Skan if (!TREE_ASM_WRITTEN (exp)) 3450169689Skan { 3451169689Skan n_deferred_constants--; 3452169689Skan output_constant_def_contents (x); 3453169689Skan } 3454169689Skan } 345596263Sobrien 3456169689Skan return -1; 3457169689Skan} 345896263Sobrien 3459169689Skan/* Look through appropriate parts of INSN, marking all entries in the 3460169689Skan constant pool which are actually being used. Entries that are only 3461169689Skan referenced by other constants are also marked as used. Emit 3462169689Skan deferred strings that are used. */ 346396263Sobrien 3464169689Skanstatic void 3465169689Skanmark_constants (rtx insn) 3466169689Skan{ 3467169689Skan if (!INSN_P (insn)) 3468169689Skan return; 346996263Sobrien 3470169689Skan /* Insns may appear inside a SEQUENCE. Only check the patterns of 3471169689Skan insns, not any notes that may be attached. We don't want to mark 3472169689Skan a constant just because it happens to appear in a REG_EQUIV note. */ 3473169689Skan if (GET_CODE (PATTERN (insn)) == SEQUENCE) 3474169689Skan { 3475169689Skan rtx seq = PATTERN (insn); 3476169689Skan int i, n = XVECLEN (seq, 0); 3477169689Skan for (i = 0; i < n; ++i) 3478169689Skan { 3479169689Skan rtx subinsn = XVECEXP (seq, 0, i); 3480169689Skan if (INSN_P (subinsn)) 3481169689Skan for_each_rtx (&PATTERN (subinsn), mark_constant, NULL); 348218334Speter } 348318334Speter } 3484169689Skan else 3485169689Skan for_each_rtx (&PATTERN (insn), mark_constant, NULL); 348618334Speter} 348750397Sobrien 348850397Sobrien/* Look through the instructions for this function, and mark all the 3489169689Skan entries in POOL which are actually being used. Emit deferred constants 3490169689Skan which have indeed been used. */ 349150397Sobrien 349250397Sobrienstatic void 3493132718Skanmark_constant_pool (void) 349450397Sobrien{ 3495169689Skan rtx insn, link; 349650397Sobrien 3497169689Skan if (!current_function_uses_const_pool && n_deferred_constants == 0) 349850397Sobrien return; 349950397Sobrien 350050397Sobrien for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) 3501169689Skan mark_constants (insn); 350250397Sobrien 3503117395Skan for (link = current_function_epilogue_delay_list; 3504117395Skan link; 3505117395Skan link = XEXP (link, 1)) 3506169689Skan mark_constants (XEXP (link, 0)); 350790075Sobrien} 350852284Sobrien 3509169689Skan/* Write all the constants in POOL. */ 351052284Sobrien 351150397Sobrienstatic void 3512169689Skanoutput_constant_pool_contents (struct rtx_constant_pool *pool) 351350397Sobrien{ 3514169689Skan struct constant_descriptor_rtx *desc; 351550397Sobrien 3516169689Skan for (desc = pool->first; desc ; desc = desc->next) 3517169689Skan if (desc->mark) 3518169689Skan { 3519169689Skan /* If the constant is part of an object_block, make sure that 3520169689Skan the constant has been positioned within its block, but do not 3521169689Skan write out its definition yet. output_object_blocks will do 3522169689Skan that later. */ 3523169689Skan if (SYMBOL_REF_HAS_BLOCK_INFO_P (desc->sym) 3524169689Skan && SYMBOL_REF_BLOCK (desc->sym)) 3525169689Skan place_block_symbol (desc->sym); 3526169689Skan else 3527169689Skan { 3528169689Skan switch_to_section (targetm.asm_out.select_rtx_section 3529169689Skan (desc->mode, desc->constant, desc->align)); 3530169689Skan output_constant_pool_1 (desc, desc->align); 3531169689Skan } 3532169689Skan } 3533169689Skan} 353450397Sobrien 3535169689Skan/* Mark all constants that are used in the current function, then write 3536169689Skan out the function's private constant pool. */ 353750397Sobrien 3538169689Skanstatic void 3539169689Skanoutput_constant_pool (const char *fnname ATTRIBUTE_UNUSED, 3540169689Skan tree fndecl ATTRIBUTE_UNUSED) 3541169689Skan{ 3542169689Skan struct rtx_constant_pool *pool = cfun->varasm->pool; 354350397Sobrien 3544169689Skan /* It is possible for gcc to call force_const_mem and then to later 3545169689Skan discard the instructions which refer to the constant. In such a 3546169689Skan case we do not need to output the constant. */ 3547169689Skan mark_constant_pool (); 354850397Sobrien 3549169689Skan#ifdef ASM_OUTPUT_POOL_PROLOGUE 3550169689Skan ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset); 3551169689Skan#endif 355250397Sobrien 3553169689Skan output_constant_pool_contents (pool); 355450397Sobrien 3555169689Skan#ifdef ASM_OUTPUT_POOL_EPILOGUE 3556169689Skan ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset); 3557169689Skan#endif 355850397Sobrien} 3559169689Skan 3560169689Skan/* Write the contents of the shared constant pool. */ 356190075Sobrien 3562169689Skanvoid 3563169689Skanoutput_shared_constant_pool (void) 356490075Sobrien{ 3565169689Skan output_constant_pool_contents (shared_constant_pool); 356690075Sobrien} 356718334Speter 3568132718Skan/* Determine what kind of relocations EXP may need. */ 356918334Speter 3570132718Skanint 3571132718Skancompute_reloc_for_constant (tree exp) 357218334Speter{ 3573117395Skan int reloc = 0, reloc2; 357490075Sobrien tree tem; 357518334Speter 357690075Sobrien /* Give the front-end a chance to convert VALUE to something that 357790075Sobrien looks more like a constant to the back-end. */ 3578169689Skan exp = lang_hooks.expand_constant (exp); 357990075Sobrien 358018334Speter switch (TREE_CODE (exp)) 358118334Speter { 358218334Speter case ADDR_EXPR: 3583102780Skan case FDESC_EXPR: 358490075Sobrien /* Go inside any operations that get_inner_reference can handle and see 358590075Sobrien if what's inside is a constant: no need to do anything here for 358690075Sobrien addresses of variables or functions. */ 358790075Sobrien for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem); 358890075Sobrien tem = TREE_OPERAND (tem, 0)) 358990075Sobrien ; 359018334Speter 359190075Sobrien if (TREE_PUBLIC (tem)) 359290075Sobrien reloc |= 2; 359390075Sobrien else 359490075Sobrien reloc |= 1; 359518334Speter break; 359618334Speter 359718334Speter case PLUS_EXPR: 3598132718Skan reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0)); 3599132718Skan reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1)); 360018334Speter break; 360118334Speter 3602117395Skan case MINUS_EXPR: 3603132718Skan reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0)); 3604132718Skan reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1)); 3605117395Skan /* The difference of two local labels is computable at link time. */ 3606117395Skan if (reloc == 1 && reloc2 == 1) 3607117395Skan reloc = 0; 3608117395Skan else 3609117395Skan reloc |= reloc2; 3610117395Skan break; 3611117395Skan 361218334Speter case NOP_EXPR: 361318334Speter case CONVERT_EXPR: 361418334Speter case NON_LVALUE_EXPR: 3615169689Skan case VIEW_CONVERT_EXPR: 3616132718Skan reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0)); 361718334Speter break; 361818334Speter 361918334Speter case CONSTRUCTOR: 3620169689Skan { 3621169689Skan unsigned HOST_WIDE_INT idx; 3622169689Skan FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem) 3623169689Skan if (tem != 0) 3624169689Skan reloc |= compute_reloc_for_constant (tem); 3625169689Skan } 362618334Speter break; 362718334Speter 362850397Sobrien default: 362918334Speter break; 363018334Speter } 363118334Speter return reloc; 363218334Speter} 3633132718Skan 3634132718Skan/* Find all the constants whose addresses are referenced inside of EXP, 3635132718Skan and make sure assembler code with a label has been output for each one. 3636132718Skan Indicate whether an ADDR_EXPR has been encountered. */ 3637132718Skan 3638132718Skanstatic void 3639132718Skanoutput_addressed_constants (tree exp) 3640132718Skan{ 3641132718Skan tree tem; 3642132718Skan 3643132718Skan /* Give the front-end a chance to convert VALUE to something that 3644132718Skan looks more like a constant to the back-end. */ 3645169689Skan exp = lang_hooks.expand_constant (exp); 3646132718Skan 3647132718Skan switch (TREE_CODE (exp)) 3648132718Skan { 3649132718Skan case ADDR_EXPR: 3650132718Skan case FDESC_EXPR: 3651132718Skan /* Go inside any operations that get_inner_reference can handle and see 3652132718Skan if what's inside is a constant: no need to do anything here for 3653132718Skan addresses of variables or functions. */ 3654132718Skan for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem); 3655132718Skan tem = TREE_OPERAND (tem, 0)) 3656132718Skan ; 3657132718Skan 3658169689Skan /* If we have an initialized CONST_DECL, retrieve the initializer. */ 3659169689Skan if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem)) 3660169689Skan tem = DECL_INITIAL (tem); 3661169689Skan 3662169689Skan if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR) 3663132718Skan output_constant_def (tem, 0); 3664132718Skan break; 3665132718Skan 3666132718Skan case PLUS_EXPR: 3667132718Skan case MINUS_EXPR: 3668132718Skan output_addressed_constants (TREE_OPERAND (exp, 1)); 3669132718Skan /* Fall through. */ 3670132718Skan 3671132718Skan case NOP_EXPR: 3672132718Skan case CONVERT_EXPR: 3673132718Skan case NON_LVALUE_EXPR: 3674169689Skan case VIEW_CONVERT_EXPR: 3675132718Skan output_addressed_constants (TREE_OPERAND (exp, 0)); 3676132718Skan break; 3677132718Skan 3678132718Skan case CONSTRUCTOR: 3679169689Skan { 3680169689Skan unsigned HOST_WIDE_INT idx; 3681169689Skan FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem) 3682169689Skan if (tem != 0) 3683169689Skan output_addressed_constants (tem); 3684169689Skan } 3685132718Skan break; 3686132718Skan 3687132718Skan default: 3688132718Skan break; 3689132718Skan } 3690132718Skan} 369118334Speter 3692169689Skan/* Whether a constructor CTOR is a valid static constant initializer if all 3693169689Skan its elements are. This used to be internal to initializer_constant_valid_p 3694169689Skan and has been exposed to let other functions like categorize_ctor_elements 3695169689Skan evaluate the property while walking a constructor for other purposes. */ 3696169689Skan 3697169689Skanbool 3698169689Skanconstructor_static_from_elts_p (tree ctor) 3699169689Skan{ 3700169689Skan return (TREE_CONSTANT (ctor) 3701169689Skan && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE 3702169689Skan || TREE_CODE (TREE_TYPE (ctor)) == RECORD_TYPE) 3703169689Skan && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor))); 3704169689Skan} 3705169689Skan 370690075Sobrien/* Return nonzero if VALUE is a valid constant-valued expression 370790075Sobrien for use in initializing a static variable; one that can be an 370890075Sobrien element of a "constant" initializer. 370990075Sobrien 371090075Sobrien Return null_pointer_node if the value is absolute; 371190075Sobrien if it is relocatable, return the variable that determines the relocation. 371290075Sobrien We assume that VALUE has been folded as much as possible; 371390075Sobrien therefore, we do not need to check for such things as 371490075Sobrien arithmetic-combinations of integers. */ 371590075Sobrien 371690075Sobrientree 3717132718Skaninitializer_constant_valid_p (tree value, tree endtype) 371890075Sobrien{ 371990075Sobrien /* Give the front-end a chance to convert VALUE to something that 372090075Sobrien looks more like a constant to the back-end. */ 3721169689Skan value = lang_hooks.expand_constant (value); 372290075Sobrien 372390075Sobrien switch (TREE_CODE (value)) 372490075Sobrien { 372590075Sobrien case CONSTRUCTOR: 3726169689Skan if (constructor_static_from_elts_p (value)) 3727122180Skan { 3728169689Skan unsigned HOST_WIDE_INT idx; 3729122180Skan tree elt; 3730122180Skan bool absolute = true; 373190075Sobrien 3732169689Skan FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt) 3733122180Skan { 3734122180Skan tree reloc; 3735169689Skan reloc = initializer_constant_valid_p (elt, TREE_TYPE (elt)); 3736122180Skan if (!reloc) 3737122180Skan return NULL_TREE; 3738122180Skan if (reloc != null_pointer_node) 3739122180Skan absolute = false; 3740122180Skan } 3741122180Skan /* For a non-absolute relocation, there is no single 3742122180Skan variable that can be "the variable that determines the 3743122180Skan relocation." */ 3744122180Skan return absolute ? null_pointer_node : error_mark_node; 3745122180Skan } 374690075Sobrien 3747122180Skan return TREE_STATIC (value) ? null_pointer_node : NULL_TREE; 3748122180Skan 374990075Sobrien case INTEGER_CST: 375096263Sobrien case VECTOR_CST: 375190075Sobrien case REAL_CST: 375290075Sobrien case STRING_CST: 375390075Sobrien case COMPLEX_CST: 375490075Sobrien return null_pointer_node; 375590075Sobrien 375690075Sobrien case ADDR_EXPR: 375790075Sobrien case FDESC_EXPR: 3758169689Skan value = staticp (TREE_OPERAND (value, 0)); 3759169689Skan if (value) 3760169689Skan { 3761169689Skan /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to 3762169689Skan be a constant, this is old-skool offsetof-like nonsense. */ 3763169689Skan if (TREE_CODE (value) == INDIRECT_REF 3764169689Skan && TREE_CONSTANT (TREE_OPERAND (value, 0))) 3765169689Skan return null_pointer_node; 3766169689Skan /* Taking the address of a nested function involves a trampoline. */ 3767169689Skan if (TREE_CODE (value) == FUNCTION_DECL 3768169689Skan && ((decl_function_context (value) 3769169689Skan && !DECL_NO_STATIC_CHAIN (value)) 3770169689Skan || DECL_DLLIMPORT_P (value))) 3771169689Skan return NULL_TREE; 3772169689Skan /* "&{...}" requires a temporary to hold the constructed 3773169689Skan object. */ 3774169689Skan if (TREE_CODE (value) == CONSTRUCTOR) 3775169689Skan return NULL_TREE; 3776169689Skan } 3777169689Skan return value; 377890075Sobrien 377990075Sobrien case VIEW_CONVERT_EXPR: 378090075Sobrien case NON_LVALUE_EXPR: 378190075Sobrien return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype); 378290075Sobrien 378390075Sobrien case CONVERT_EXPR: 378490075Sobrien case NOP_EXPR: 3785146895Skan { 3786146895Skan tree src; 3787146895Skan tree src_type; 3788146895Skan tree dest_type; 378990075Sobrien 3790146895Skan src = TREE_OPERAND (value, 0); 3791146895Skan src_type = TREE_TYPE (src); 3792146895Skan dest_type = TREE_TYPE (value); 379390075Sobrien 3794146895Skan /* Allow conversions between pointer types, floating-point 3795146895Skan types, and offset types. */ 3796146895Skan if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)) 3797146895Skan || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type)) 3798146895Skan || (TREE_CODE (dest_type) == OFFSET_TYPE 3799146895Skan && TREE_CODE (src_type) == OFFSET_TYPE)) 3800146895Skan return initializer_constant_valid_p (src, endtype); 380190075Sobrien 3802146895Skan /* Allow length-preserving conversions between integer types. */ 3803146895Skan if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type) 3804146895Skan && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type))) 3805146895Skan return initializer_constant_valid_p (src, endtype); 380690075Sobrien 3807146895Skan /* Allow conversions between other integer types only if 3808146895Skan explicit value. */ 3809146895Skan if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)) 3810146895Skan { 3811146895Skan tree inner = initializer_constant_valid_p (src, endtype); 3812146895Skan if (inner == null_pointer_node) 3813146895Skan return null_pointer_node; 3814146895Skan break; 3815146895Skan } 381690075Sobrien 3817146895Skan /* Allow (int) &foo provided int is as wide as a pointer. */ 3818146895Skan if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type) 3819146895Skan && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type))) 3820146895Skan return initializer_constant_valid_p (src, endtype); 382190075Sobrien 3822146895Skan /* Likewise conversions from int to pointers, but also allow 3823146895Skan conversions from 0. */ 3824146895Skan if ((POINTER_TYPE_P (dest_type) 3825146895Skan || TREE_CODE (dest_type) == OFFSET_TYPE) 3826146895Skan && INTEGRAL_TYPE_P (src_type)) 3827146895Skan { 3828169689Skan if (TREE_CODE (src) == INTEGER_CST 3829169689Skan && TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)) 3830169689Skan return null_pointer_node; 3831146895Skan if (integer_zerop (src)) 3832146895Skan return null_pointer_node; 3833146895Skan else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type)) 3834146895Skan return initializer_constant_valid_p (src, endtype); 3835146895Skan } 3836146895Skan 3837146895Skan /* Allow conversions to struct or union types if the value 3838146895Skan inside is okay. */ 3839146895Skan if (TREE_CODE (dest_type) == RECORD_TYPE 3840146895Skan || TREE_CODE (dest_type) == UNION_TYPE) 3841146895Skan return initializer_constant_valid_p (src, endtype); 3842146895Skan } 384390075Sobrien break; 384490075Sobrien 384590075Sobrien case PLUS_EXPR: 384690075Sobrien if (! INTEGRAL_TYPE_P (endtype) 384790075Sobrien || TYPE_PRECISION (endtype) >= POINTER_SIZE) 3848117395Skan { 384990075Sobrien tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0), 385090075Sobrien endtype); 385190075Sobrien tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1), 385290075Sobrien endtype); 385390075Sobrien /* If either term is absolute, use the other terms relocation. */ 385490075Sobrien if (valid0 == null_pointer_node) 385590075Sobrien return valid1; 385690075Sobrien if (valid1 == null_pointer_node) 385790075Sobrien return valid0; 3858117395Skan } 385990075Sobrien break; 386090075Sobrien 386190075Sobrien case MINUS_EXPR: 386290075Sobrien if (! INTEGRAL_TYPE_P (endtype) 386390075Sobrien || TYPE_PRECISION (endtype) >= POINTER_SIZE) 386490075Sobrien { 386590075Sobrien tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0), 386690075Sobrien endtype); 386790075Sobrien tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1), 386890075Sobrien endtype); 386990075Sobrien /* Win if second argument is absolute. */ 387090075Sobrien if (valid1 == null_pointer_node) 387190075Sobrien return valid0; 387290075Sobrien /* Win if both arguments have the same relocation. 387390075Sobrien Then the value is absolute. */ 387490075Sobrien if (valid0 == valid1 && valid0 != 0) 387590075Sobrien return null_pointer_node; 387690075Sobrien 387790075Sobrien /* Since GCC guarantees that string constants are unique in the 387890075Sobrien generated code, a subtraction between two copies of the same 387990075Sobrien constant string is absolute. */ 3880169689Skan if (valid0 && TREE_CODE (valid0) == STRING_CST 3881169689Skan && valid1 && TREE_CODE (valid1) == STRING_CST 3882169689Skan && operand_equal_p (valid0, valid1, 1)) 388390075Sobrien return null_pointer_node; 388490075Sobrien } 388590075Sobrien 3886169689Skan /* Support narrowing differences. */ 388790075Sobrien if (INTEGRAL_TYPE_P (endtype)) 388890075Sobrien { 388990075Sobrien tree op0, op1; 3890169689Skan 389190075Sobrien op0 = TREE_OPERAND (value, 0); 389290075Sobrien op1 = TREE_OPERAND (value, 1); 389390075Sobrien 389496263Sobrien /* Like STRIP_NOPS except allow the operand mode to widen. 3895132718Skan This works around a feature of fold that simplifies 389696263Sobrien (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory 389796263Sobrien that the narrower operation is cheaper. */ 389896263Sobrien 389996263Sobrien while (TREE_CODE (op0) == NOP_EXPR 390096263Sobrien || TREE_CODE (op0) == CONVERT_EXPR 390196263Sobrien || TREE_CODE (op0) == NON_LVALUE_EXPR) 390296263Sobrien { 390396263Sobrien tree inner = TREE_OPERAND (op0, 0); 390496263Sobrien if (inner == error_mark_node 390596263Sobrien || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner))) 390696263Sobrien || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))) 390796263Sobrien > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner))))) 390896263Sobrien break; 390996263Sobrien op0 = inner; 391096263Sobrien } 391196263Sobrien 391296263Sobrien while (TREE_CODE (op1) == NOP_EXPR 391396263Sobrien || TREE_CODE (op1) == CONVERT_EXPR 391496263Sobrien || TREE_CODE (op1) == NON_LVALUE_EXPR) 391596263Sobrien { 391696263Sobrien tree inner = TREE_OPERAND (op1, 0); 391796263Sobrien if (inner == error_mark_node 391896263Sobrien || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner))) 391996263Sobrien || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1))) 392096263Sobrien > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner))))) 392196263Sobrien break; 392296263Sobrien op1 = inner; 392396263Sobrien } 392496263Sobrien 3925169689Skan op0 = initializer_constant_valid_p (op0, endtype); 3926169689Skan op1 = initializer_constant_valid_p (op1, endtype); 3927169689Skan 3928169689Skan /* Both initializers must be known. */ 3929169689Skan if (op0 && op1) 3930169689Skan { 3931169689Skan if (op0 == op1) 3932169689Skan return null_pointer_node; 3933169689Skan 3934169689Skan /* Support differences between labels. */ 3935169689Skan if (TREE_CODE (op0) == LABEL_DECL 3936169689Skan && TREE_CODE (op1) == LABEL_DECL) 3937169689Skan return null_pointer_node; 3938169689Skan 3939169689Skan if (TREE_CODE (op0) == STRING_CST 3940169689Skan && TREE_CODE (op1) == STRING_CST 3941169689Skan && operand_equal_p (op0, op1, 1)) 3942169689Skan return null_pointer_node; 3943169689Skan } 394490075Sobrien } 394590075Sobrien break; 394690075Sobrien 394790075Sobrien default: 394890075Sobrien break; 394990075Sobrien } 395090075Sobrien 395190075Sobrien return 0; 395290075Sobrien} 395390075Sobrien 395418334Speter/* Output assembler code for constant EXP to FILE, with no label. 395518334Speter This includes the pseudo-op such as ".int" or ".byte", and a newline. 395618334Speter Assumes output_addressed_constants has been done on EXP already. 395718334Speter 395818334Speter Generate exactly SIZE bytes of assembler data, padding at the end 395918334Speter with zeros if necessary. SIZE must always be specified. 396018334Speter 396118334Speter SIZE is important for structure constructors, 396218334Speter since trailing members may have been omitted from the constructor. 396318334Speter It is also important for initialization of arrays from string constants 396418334Speter since the full length of the string constant might not be wanted. 396518334Speter It is also needed for initialization of unions, where the initializer's 396618334Speter type is just one member, and that may not be as long as the union. 396718334Speter 396818334Speter There a case in which we would fail to output exactly SIZE bytes: 396918334Speter for a structure constructor that wants to produce more than SIZE bytes. 397090075Sobrien But such constructors will never be generated for any possible input. 397118334Speter 397290075Sobrien ALIGN is the alignment of the data in bits. */ 397390075Sobrien 397418334Spetervoid 3975132718Skanoutput_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align) 397618334Speter{ 397790075Sobrien enum tree_code code; 3978132718Skan unsigned HOST_WIDE_INT thissize; 397918334Speter 3980132718Skan /* Some front-ends use constants other than the standard language-independent 398190075Sobrien varieties, but which may still be output directly. Give the front-end a 398290075Sobrien chance to convert EXP to a language-independent representation. */ 3983169689Skan exp = lang_hooks.expand_constant (exp); 398452284Sobrien 398552284Sobrien if (size == 0 || flag_syntax_only) 398618334Speter return; 398718334Speter 3988169689Skan /* See if we're trying to initialize a pointer in a non-default mode 3989169689Skan to the address of some declaration somewhere. If the target says 3990169689Skan the mode is valid for pointers, assume the target has a way of 3991169689Skan resolving it. */ 3992169689Skan if (TREE_CODE (exp) == NOP_EXPR 3993169689Skan && POINTER_TYPE_P (TREE_TYPE (exp)) 3994169689Skan && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp)))) 3995169689Skan { 3996169689Skan tree saved_type = TREE_TYPE (exp); 3997169689Skan 3998169689Skan /* Peel off any intermediate conversions-to-pointer for valid 3999169689Skan pointer modes. */ 4000169689Skan while (TREE_CODE (exp) == NOP_EXPR 4001169689Skan && POINTER_TYPE_P (TREE_TYPE (exp)) 4002169689Skan && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp)))) 4003169689Skan exp = TREE_OPERAND (exp, 0); 4004169689Skan 4005169689Skan /* If what we're left with is the address of something, we can 4006169689Skan convert the address to the final type and output it that 4007169689Skan way. */ 4008169689Skan if (TREE_CODE (exp) == ADDR_EXPR) 4009169689Skan exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0)); 4010169689Skan /* Likewise for constant ints. */ 4011169689Skan else if (TREE_CODE (exp) == INTEGER_CST) 4012169689Skan exp = build_int_cst_wide (saved_type, TREE_INT_CST_LOW (exp), 4013169689Skan TREE_INT_CST_HIGH (exp)); 4014169689Skan 4015169689Skan } 4016169689Skan 401790075Sobrien /* Eliminate any conversions since we'll be outputting the underlying 401890075Sobrien constant. */ 401990075Sobrien while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR 402090075Sobrien || TREE_CODE (exp) == NON_LVALUE_EXPR 402190075Sobrien || TREE_CODE (exp) == VIEW_CONVERT_EXPR) 4022169689Skan { 4023169689Skan HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp)); 4024169689Skan HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0))); 402518334Speter 4026169689Skan /* Make sure eliminating the conversion is really a no-op, except with 4027169689Skan VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and 4028169689Skan union types to allow for Ada unchecked unions. */ 4029169689Skan if (type_size > op_size 4030169689Skan && TREE_CODE (exp) != VIEW_CONVERT_EXPR 4031169689Skan && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE) 4032169689Skan /* Keep the conversion. */ 4033169689Skan break; 4034169689Skan else 4035169689Skan exp = TREE_OPERAND (exp, 0); 4036169689Skan } 4037169689Skan 403890075Sobrien code = TREE_CODE (TREE_TYPE (exp)); 403990075Sobrien thissize = int_size_in_bytes (TREE_TYPE (exp)); 404090075Sobrien 4041169689Skan /* Give the front end another chance to expand constants. */ 4042169689Skan exp = lang_hooks.expand_constant (exp); 4043169689Skan 404418334Speter /* Allow a constructor with no elements for any data type. 404518334Speter This means to fill the space with zeros. */ 4046169689Skan if (TREE_CODE (exp) == CONSTRUCTOR 4047169689Skan && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (exp))) 404818334Speter { 404950397Sobrien assemble_zeros (size); 405018334Speter return; 405118334Speter } 405218334Speter 405390075Sobrien if (TREE_CODE (exp) == FDESC_EXPR) 405490075Sobrien { 405590075Sobrien#ifdef ASM_OUTPUT_FDESC 405690075Sobrien HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0); 405790075Sobrien tree decl = TREE_OPERAND (exp, 0); 405890075Sobrien ASM_OUTPUT_FDESC (asm_out_file, decl, part); 405990075Sobrien#else 4060169689Skan gcc_unreachable (); 406190075Sobrien#endif 406290075Sobrien return; 406390075Sobrien } 406490075Sobrien 406590075Sobrien /* Now output the underlying data. If we've handling the padding, return. 4066169689Skan Otherwise, break and ensure SIZE is the size written. */ 406718334Speter switch (code) 406818334Speter { 406918334Speter case BOOLEAN_TYPE: 407018334Speter case INTEGER_TYPE: 407118334Speter case ENUMERAL_TYPE: 407218334Speter case POINTER_TYPE: 407318334Speter case REFERENCE_TYPE: 4074132718Skan case OFFSET_TYPE: 407518334Speter if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode, 407618334Speter EXPAND_INITIALIZER), 4077169689Skan MIN (size, thissize), align, 0)) 407818334Speter error ("initializer for integer value is too complicated"); 407918334Speter break; 408018334Speter 408118334Speter case REAL_TYPE: 408218334Speter if (TREE_CODE (exp) != REAL_CST) 408318334Speter error ("initializer for floating value is not a floating constant"); 408418334Speter 4085132718Skan assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align); 408618334Speter break; 408718334Speter 408818334Speter case COMPLEX_TYPE: 408990075Sobrien output_constant (TREE_REALPART (exp), thissize / 2, align); 409090075Sobrien output_constant (TREE_IMAGPART (exp), thissize / 2, 409190075Sobrien min_align (align, BITS_PER_UNIT * (thissize / 2))); 409218334Speter break; 409318334Speter 409418334Speter case ARRAY_TYPE: 409596263Sobrien case VECTOR_TYPE: 4096169689Skan switch (TREE_CODE (exp)) 409718334Speter { 4098169689Skan case CONSTRUCTOR: 409990075Sobrien output_constructor (exp, size, align); 410018334Speter return; 4101169689Skan case STRING_CST: 4102132718Skan thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp), 4103132718Skan size); 410490075Sobrien assemble_string (TREE_STRING_POINTER (exp), thissize); 4105169689Skan break; 4106119256Skan 4107169689Skan case VECTOR_CST: 4108169689Skan { 4109169689Skan int elt_size; 4110169689Skan tree link; 4111169689Skan unsigned int nalign; 4112169689Skan enum machine_mode inner; 4113119256Skan 4114169689Skan inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp))); 4115169689Skan nalign = MIN (align, GET_MODE_ALIGNMENT (inner)); 4116119256Skan 4117169689Skan elt_size = GET_MODE_SIZE (inner); 4118169689Skan 4119169689Skan link = TREE_VECTOR_CST_ELTS (exp); 4120169689Skan output_constant (TREE_VALUE (link), elt_size, align); 4121169689Skan thissize = elt_size; 4122169689Skan while ((link = TREE_CHAIN (link)) != NULL) 4123169689Skan { 4124169689Skan output_constant (TREE_VALUE (link), elt_size, nalign); 4125169689Skan thissize += elt_size; 4126169689Skan } 4127169689Skan break; 4128169689Skan } 4129169689Skan default: 4130169689Skan gcc_unreachable (); 4131119256Skan } 413218334Speter break; 413318334Speter 413418334Speter case RECORD_TYPE: 413518334Speter case UNION_TYPE: 4136169689Skan gcc_assert (TREE_CODE (exp) == CONSTRUCTOR); 4137169689Skan output_constructor (exp, size, align); 413818334Speter return; 413918334Speter 414090075Sobrien case ERROR_MARK: 414190075Sobrien return; 414290075Sobrien 414350397Sobrien default: 4144169689Skan gcc_unreachable (); 414518334Speter } 414618334Speter 4147132718Skan if (size > thissize) 4148132718Skan assemble_zeros (size - thissize); 414918334Speter} 415018334Speter 415118334Speter 415290075Sobrien/* Subroutine of output_constructor, used for computing the size of 415390075Sobrien arrays of unspecified length. VAL must be a CONSTRUCTOR of an array 415490075Sobrien type with an unspecified upper bound. */ 415590075Sobrien 415690075Sobrienstatic unsigned HOST_WIDE_INT 4157132718Skanarray_size_for_constructor (tree val) 415890075Sobrien{ 415990075Sobrien tree max_index, i; 4160169689Skan unsigned HOST_WIDE_INT cnt; 4161169689Skan tree index, value, tmp; 416290075Sobrien 416390075Sobrien /* This code used to attempt to handle string constants that are not 416490075Sobrien arrays of single-bytes, but nothing else does, so there's no point in 416590075Sobrien doing it here. */ 416690075Sobrien if (TREE_CODE (val) == STRING_CST) 416790075Sobrien return TREE_STRING_LENGTH (val); 416890075Sobrien 416990075Sobrien max_index = NULL_TREE; 4170169689Skan FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value) 417190075Sobrien { 417290075Sobrien if (TREE_CODE (index) == RANGE_EXPR) 417390075Sobrien index = TREE_OPERAND (index, 1); 417490075Sobrien if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index)) 417590075Sobrien max_index = index; 417690075Sobrien } 417790075Sobrien 417890075Sobrien if (max_index == NULL_TREE) 417990075Sobrien return 0; 418090075Sobrien 418190075Sobrien /* Compute the total number of array elements. */ 4182169689Skan tmp = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val))); 4183169689Skan i = size_binop (MINUS_EXPR, fold_convert (sizetype, max_index), 4184169689Skan fold_convert (sizetype, tmp)); 4185169689Skan i = size_binop (PLUS_EXPR, i, build_int_cst (sizetype, 1)); 418690075Sobrien 418790075Sobrien /* Multiply by the array element unit size to find number of bytes. */ 418890075Sobrien i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val)))); 418990075Sobrien 419090075Sobrien return tree_low_cst (i, 1); 419190075Sobrien} 419290075Sobrien 419390075Sobrien/* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants). 419418334Speter Generate at least SIZE bytes, padding if necessary. */ 419518334Speter 419618334Speterstatic void 4197132718Skanoutput_constructor (tree exp, unsigned HOST_WIDE_INT size, 4198132718Skan unsigned int align) 419918334Speter{ 420090075Sobrien tree type = TREE_TYPE (exp); 4201169689Skan tree field = 0; 420290075Sobrien tree min_index = 0; 420318334Speter /* Number of bytes output or skipped so far. 420418334Speter In other words, current position within the constructor. */ 420590075Sobrien HOST_WIDE_INT total_bytes = 0; 4206132718Skan /* Nonzero means BYTE contains part of a byte, to be output. */ 420718334Speter int byte_buffer_in_use = 0; 420890075Sobrien int byte = 0; 4209169689Skan unsigned HOST_WIDE_INT cnt; 4210169689Skan constructor_elt *ce; 421118334Speter 4212169689Skan gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT); 421318334Speter 421490075Sobrien if (TREE_CODE (type) == RECORD_TYPE) 421590075Sobrien field = TYPE_FIELDS (type); 421618334Speter 421790075Sobrien if (TREE_CODE (type) == ARRAY_TYPE 421890075Sobrien && TYPE_DOMAIN (type) != 0) 421990075Sobrien min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type)); 422018334Speter 422118334Speter /* As LINK goes through the elements of the constant, 422218334Speter FIELD goes through the structure fields, if the constant is a structure. 422318334Speter if the constant is a union, then we override this, 422418334Speter by getting the field from the TREE_LIST element. 422552284Sobrien But the constant could also be an array. Then FIELD is zero. 422652284Sobrien 422752284Sobrien There is always a maximum of one element in the chain LINK for unions 422852284Sobrien (even if the initializer in a source program incorrectly contains 422990075Sobrien more one). */ 4230169689Skan for (cnt = 0; 4231169689Skan VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), cnt, ce); 4232169689Skan cnt++, field = field ? TREE_CHAIN (field) : 0) 423318334Speter { 4234169689Skan tree val = ce->value; 423518334Speter tree index = 0; 423618334Speter 423790075Sobrien /* The element in a union constructor specifies the proper field 423890075Sobrien or index. */ 423990075Sobrien if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE 424090075Sobrien || TREE_CODE (type) == QUAL_UNION_TYPE) 4241169689Skan && ce->index != 0) 4242169689Skan field = ce->index; 424318334Speter 424490075Sobrien else if (TREE_CODE (type) == ARRAY_TYPE) 4245169689Skan index = ce->index; 424618334Speter 4247132718Skan#ifdef ASM_COMMENT_START 4248132718Skan if (field && flag_verbose_asm) 4249132718Skan fprintf (asm_out_file, "%s %s:\n", 4250169689Skan ASM_COMMENT_START, 4251169689Skan DECL_NAME (field) 4252132718Skan ? IDENTIFIER_POINTER (DECL_NAME (field)) 4253132718Skan : "<anonymous>"); 4254132718Skan#endif 4255132718Skan 425618334Speter /* Eliminate the marker that makes a cast not be an lvalue. */ 425718334Speter if (val != 0) 425818334Speter STRIP_NOPS (val); 425918334Speter 426050397Sobrien if (index && TREE_CODE (index) == RANGE_EXPR) 426118334Speter { 426290075Sobrien unsigned HOST_WIDE_INT fieldsize 426390075Sobrien = int_size_in_bytes (TREE_TYPE (type)); 426490075Sobrien HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0); 426590075Sobrien HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0); 426650397Sobrien HOST_WIDE_INT index; 426790075Sobrien unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT); 426890075Sobrien 426950397Sobrien for (index = lo_index; index <= hi_index; index++) 427050397Sobrien { 427150397Sobrien /* Output the element's initial value. */ 427250397Sobrien if (val == 0) 427350397Sobrien assemble_zeros (fieldsize); 427450397Sobrien else 427590075Sobrien output_constant (val, fieldsize, align2); 427650397Sobrien 427750397Sobrien /* Count its size. */ 427850397Sobrien total_bytes += fieldsize; 427950397Sobrien } 428050397Sobrien } 428150397Sobrien else if (field == 0 || !DECL_BIT_FIELD (field)) 428250397Sobrien { 428318334Speter /* An element that is not a bit-field. */ 428418334Speter 428590075Sobrien unsigned HOST_WIDE_INT fieldsize; 428618334Speter /* Since this structure is static, 428718334Speter we know the positions are constant. */ 428890075Sobrien HOST_WIDE_INT pos = field ? int_byte_position (field) : 0; 428990075Sobrien unsigned int align2; 429090075Sobrien 429118334Speter if (index != 0) 429290075Sobrien pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1) 429390075Sobrien * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0))); 429418334Speter 429518334Speter /* Output any buffered-up bit-fields preceding this element. */ 429618334Speter if (byte_buffer_in_use) 429718334Speter { 429890075Sobrien assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); 429918334Speter total_bytes++; 430018334Speter byte_buffer_in_use = 0; 430118334Speter } 430218334Speter 430318334Speter /* Advance to offset of this element. 430418334Speter Note no alignment needed in an array, since that is guaranteed 430518334Speter if each element has the proper size. */ 430690075Sobrien if ((field != 0 || index != 0) && pos != total_bytes) 430718334Speter { 4308169689Skan gcc_assert (pos >= total_bytes); 430990075Sobrien assemble_zeros (pos - total_bytes); 431090075Sobrien total_bytes = pos; 431118334Speter } 431218334Speter 431390075Sobrien /* Find the alignment of this element. */ 431490075Sobrien align2 = min_align (align, BITS_PER_UNIT * pos); 431590075Sobrien 431618334Speter /* Determine size this element should occupy. */ 431718334Speter if (field) 431818334Speter { 431990075Sobrien fieldsize = 0; 432090075Sobrien 432190075Sobrien /* If this is an array with an unspecified upper bound, 432290075Sobrien the initializer determines the size. */ 432390075Sobrien /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL, 432490075Sobrien but we cannot do this until the deprecated support for 432590075Sobrien initializing zero-length array members is removed. */ 432690075Sobrien if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE 432790075Sobrien && TYPE_DOMAIN (TREE_TYPE (field)) 432890075Sobrien && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field)))) 432918334Speter { 433090075Sobrien fieldsize = array_size_for_constructor (val); 433190075Sobrien /* Given a non-empty initialization, this field had 433290075Sobrien better be last. */ 4333169689Skan gcc_assert (!fieldsize || !TREE_CHAIN (field)); 433418334Speter } 433590075Sobrien else if (DECL_SIZE_UNIT (field)) 433618334Speter { 433790075Sobrien /* ??? This can't be right. If the decl size overflows 433890075Sobrien a host integer we will silently emit no data. */ 433990075Sobrien if (host_integerp (DECL_SIZE_UNIT (field), 1)) 434090075Sobrien fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1); 434118334Speter } 434218334Speter } 434318334Speter else 434490075Sobrien fieldsize = int_size_in_bytes (TREE_TYPE (type)); 434518334Speter 434618334Speter /* Output the element's initial value. */ 434718334Speter if (val == 0) 434818334Speter assemble_zeros (fieldsize); 434918334Speter else 435090075Sobrien output_constant (val, fieldsize, align2); 435118334Speter 435218334Speter /* Count its size. */ 435318334Speter total_bytes += fieldsize; 435418334Speter } 435518334Speter else if (val != 0 && TREE_CODE (val) != INTEGER_CST) 4356169689Skan error ("invalid initial value for member %qs", 435718334Speter IDENTIFIER_POINTER (DECL_NAME (field))); 435818334Speter else 435918334Speter { 436018334Speter /* Element that is a bit-field. */ 436118334Speter 436290075Sobrien HOST_WIDE_INT next_offset = int_bit_position (field); 436390075Sobrien HOST_WIDE_INT end_offset 436490075Sobrien = (next_offset + tree_low_cst (DECL_SIZE (field), 1)); 436518334Speter 436618334Speter if (val == 0) 436718334Speter val = integer_zero_node; 436818334Speter 436918334Speter /* If this field does not start in this (or, next) byte, 437018334Speter skip some bytes. */ 437118334Speter if (next_offset / BITS_PER_UNIT != total_bytes) 437218334Speter { 437318334Speter /* Output remnant of any bit field in previous bytes. */ 437418334Speter if (byte_buffer_in_use) 437518334Speter { 437690075Sobrien assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); 437718334Speter total_bytes++; 437818334Speter byte_buffer_in_use = 0; 437918334Speter } 438018334Speter 438118334Speter /* If still not at proper byte, advance to there. */ 438218334Speter if (next_offset / BITS_PER_UNIT != total_bytes) 438318334Speter { 4384169689Skan gcc_assert (next_offset / BITS_PER_UNIT >= total_bytes); 438518334Speter assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes); 438618334Speter total_bytes = next_offset / BITS_PER_UNIT; 438718334Speter } 438818334Speter } 438918334Speter 439018334Speter if (! byte_buffer_in_use) 439118334Speter byte = 0; 439218334Speter 439318334Speter /* We must split the element into pieces that fall within 439418334Speter separate bytes, and combine each byte with previous or 439518334Speter following bit-fields. */ 439618334Speter 439718334Speter /* next_offset is the offset n fbits from the beginning of 439818334Speter the structure to the next bit of this element to be processed. 439918334Speter end_offset is the offset of the first bit past the end of 440018334Speter this element. */ 440118334Speter while (next_offset < end_offset) 440218334Speter { 440318334Speter int this_time; 440418334Speter int shift; 440518334Speter HOST_WIDE_INT value; 440690075Sobrien HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT; 440790075Sobrien HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT; 440818334Speter 440918334Speter /* Advance from byte to byte 441018334Speter within this element when necessary. */ 441118334Speter while (next_byte != total_bytes) 441218334Speter { 441390075Sobrien assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); 441418334Speter total_bytes++; 441518334Speter byte = 0; 441618334Speter } 441718334Speter 441818334Speter /* Number of bits we can process at once 441918334Speter (all part of the same byte). */ 442018334Speter this_time = MIN (end_offset - next_offset, 442118334Speter BITS_PER_UNIT - next_bit); 442218334Speter if (BYTES_BIG_ENDIAN) 442318334Speter { 442418334Speter /* On big-endian machine, take the most significant bits 442518334Speter first (of the bits that are significant) 442618334Speter and put them into bytes from the most significant end. */ 442718334Speter shift = end_offset - next_offset - this_time; 442890075Sobrien 442918334Speter /* Don't try to take a bunch of bits that cross 443090075Sobrien the word boundary in the INTEGER_CST. We can 443190075Sobrien only select bits from the LOW or HIGH part 443290075Sobrien not from both. */ 443318334Speter if (shift < HOST_BITS_PER_WIDE_INT 443418334Speter && shift + this_time > HOST_BITS_PER_WIDE_INT) 443518334Speter { 443690075Sobrien this_time = shift + this_time - HOST_BITS_PER_WIDE_INT; 443718334Speter shift = HOST_BITS_PER_WIDE_INT; 443818334Speter } 443918334Speter 444018334Speter /* Now get the bits from the appropriate constant word. */ 444118334Speter if (shift < HOST_BITS_PER_WIDE_INT) 444290075Sobrien value = TREE_INT_CST_LOW (val); 4443169689Skan else 444418334Speter { 4445169689Skan gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT); 444618334Speter value = TREE_INT_CST_HIGH (val); 444718334Speter shift -= HOST_BITS_PER_WIDE_INT; 444818334Speter } 444990075Sobrien 445090075Sobrien /* Get the result. This works only when: 445190075Sobrien 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */ 445218334Speter byte |= (((value >> shift) 445390075Sobrien & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1)) 445418334Speter << (BITS_PER_UNIT - this_time - next_bit)); 445518334Speter } 445618334Speter else 445718334Speter { 445818334Speter /* On little-endian machines, 445918334Speter take first the least significant bits of the value 446018334Speter and pack them starting at the least significant 446118334Speter bits of the bytes. */ 446290075Sobrien shift = next_offset - int_bit_position (field); 446390075Sobrien 446418334Speter /* Don't try to take a bunch of bits that cross 446590075Sobrien the word boundary in the INTEGER_CST. We can 446690075Sobrien only select bits from the LOW or HIGH part 446790075Sobrien not from both. */ 446818334Speter if (shift < HOST_BITS_PER_WIDE_INT 446918334Speter && shift + this_time > HOST_BITS_PER_WIDE_INT) 447090075Sobrien this_time = (HOST_BITS_PER_WIDE_INT - shift); 447118334Speter 447218334Speter /* Now get the bits from the appropriate constant word. */ 447350397Sobrien if (shift < HOST_BITS_PER_WIDE_INT) 447418334Speter value = TREE_INT_CST_LOW (val); 4475169689Skan else 447618334Speter { 4477169689Skan gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT); 447818334Speter value = TREE_INT_CST_HIGH (val); 447918334Speter shift -= HOST_BITS_PER_WIDE_INT; 448018334Speter } 448190075Sobrien 448290075Sobrien /* Get the result. This works only when: 448390075Sobrien 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */ 448418334Speter byte |= (((value >> shift) 448590075Sobrien & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1)) 448618334Speter << next_bit); 448718334Speter } 448890075Sobrien 448918334Speter next_offset += this_time; 449018334Speter byte_buffer_in_use = 1; 449118334Speter } 449218334Speter } 449318334Speter } 449490075Sobrien 449518334Speter if (byte_buffer_in_use) 449618334Speter { 449790075Sobrien assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); 449818334Speter total_bytes++; 449918334Speter } 450090075Sobrien 4501132718Skan if ((unsigned HOST_WIDE_INT)total_bytes < size) 450218334Speter assemble_zeros (size - total_bytes); 450318334Speter} 450418334Speter 450596263Sobrien/* This TREE_LIST contains any weak symbol declarations waiting 450696263Sobrien to be emitted. */ 4507117395Skanstatic GTY(()) tree weak_decls; 450890075Sobrien 450996263Sobrien/* Mark DECL as weak. */ 451096263Sobrien 451196263Sobrienstatic void 4512132718Skanmark_weak (tree decl) 451390075Sobrien{ 451496263Sobrien DECL_WEAK (decl) = 1; 451590075Sobrien 451696263Sobrien if (DECL_RTL_SET_P (decl) 4517169689Skan && MEM_P (DECL_RTL (decl)) 451896263Sobrien && XEXP (DECL_RTL (decl), 0) 451996263Sobrien && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF) 452096263Sobrien SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1; 452196263Sobrien} 4522117395Skan 452396263Sobrien/* Merge weak status between NEWDECL and OLDDECL. */ 452490075Sobrien 452596263Sobrienvoid 4526132718Skanmerge_weak (tree newdecl, tree olddecl) 452718334Speter{ 452896263Sobrien if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl)) 4529169689Skan { 4530169689Skan if (DECL_WEAK (newdecl) && SUPPORTS_WEAK) 4531169689Skan { 4532169689Skan tree *pwd; 4533169689Skan /* We put the NEWDECL on the weak_decls list at some point 4534169689Skan and OLDDECL as well. Keep just OLDDECL on the list. */ 4535169689Skan for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd)) 4536169689Skan if (TREE_VALUE (*pwd) == newdecl) 4537169689Skan { 4538169689Skan *pwd = TREE_CHAIN (*pwd); 4539169689Skan break; 4540169689Skan } 4541169689Skan } 4542169689Skan return; 4543169689Skan } 454418334Speter 454596263Sobrien if (DECL_WEAK (newdecl)) 454696263Sobrien { 454796263Sobrien tree wd; 4548117395Skan 454996263Sobrien /* NEWDECL is weak, but OLDDECL is not. */ 455018334Speter 455196263Sobrien /* If we already output the OLDDECL, we're in trouble; we can't 455296263Sobrien go back and make it weak. This error cannot caught in 455396263Sobrien declare_weak because the NEWDECL and OLDDECL was not yet 455496263Sobrien been merged; therefore, TREE_ASM_WRITTEN was not set. */ 4555102780Skan if (TREE_ASM_WRITTEN (olddecl)) 4556169689Skan error ("weak declaration of %q+D must precede definition", 4557169689Skan newdecl); 4558102780Skan 4559102780Skan /* If we've already generated rtl referencing OLDDECL, we may 4560102780Skan have done so in a way that will not function properly with 4561102780Skan a weak symbol. */ 4562102780Skan else if (TREE_USED (olddecl) 4563102780Skan && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl))) 4564169689Skan warning (0, "weak declaration of %q+D after first use results " 4565169689Skan "in unspecified behavior", newdecl); 4566102780Skan 456796263Sobrien if (SUPPORTS_WEAK) 456896263Sobrien { 456996263Sobrien /* We put the NEWDECL on the weak_decls list at some point. 457096263Sobrien Replace it with the OLDDECL. */ 457196263Sobrien for (wd = weak_decls; wd; wd = TREE_CHAIN (wd)) 457296263Sobrien if (TREE_VALUE (wd) == newdecl) 457396263Sobrien { 457496263Sobrien TREE_VALUE (wd) = olddecl; 457596263Sobrien break; 457696263Sobrien } 457796263Sobrien /* We may not find the entry on the list. If NEWDECL is a 457896263Sobrien weak alias, then we will have already called 457996263Sobrien globalize_decl to remove the entry; in that case, we do 458096263Sobrien not need to do anything. */ 458196263Sobrien } 458252284Sobrien 458396263Sobrien /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */ 458496263Sobrien mark_weak (olddecl); 458596263Sobrien } 458696263Sobrien else 458796263Sobrien /* OLDDECL was weak, but NEWDECL was not explicitly marked as 458896263Sobrien weak. Just update NEWDECL to indicate that it's weak too. */ 458996263Sobrien mark_weak (newdecl); 459052284Sobrien} 459118334Speter 459218334Speter/* Declare DECL to be a weak symbol. */ 459318334Speter 459418334Spetervoid 4595132718Skandeclare_weak (tree decl) 459618334Speter{ 459718334Speter if (! TREE_PUBLIC (decl)) 4598169689Skan error ("weak declaration of %q+D must be public", decl); 459996263Sobrien else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl)) 4600169689Skan error ("weak declaration of %q+D must precede definition", decl); 460118334Speter else if (SUPPORTS_WEAK) 460296263Sobrien { 460396263Sobrien if (! DECL_WEAK (decl)) 460496263Sobrien weak_decls = tree_cons (NULL, decl, weak_decls); 460596263Sobrien } 460690075Sobrien else 4607169689Skan warning (0, "weak declaration of %q+D not supported", decl); 460890075Sobrien 460996263Sobrien mark_weak (decl); 461018334Speter} 461118334Speter 4612169689Skanstatic void 4613169689Skanweak_finish_1 (tree decl) 461418334Speter{ 4615132718Skan#if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL) 4616169689Skan const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); 4617132718Skan#endif 461896263Sobrien 4619169689Skan if (! TREE_USED (decl)) 4620169689Skan return; 462196263Sobrien 462296263Sobrien#ifdef ASM_WEAKEN_DECL 4623169689Skan ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL); 462490075Sobrien#else 462590075Sobrien#ifdef ASM_WEAKEN_LABEL 4626169689Skan ASM_WEAKEN_LABEL (asm_out_file, name); 462796263Sobrien#else 462896263Sobrien#ifdef ASM_OUTPUT_WEAK_ALIAS 4629169689Skan { 4630169689Skan static bool warn_once = 0; 4631169689Skan if (! warn_once) 4632169689Skan { 4633169689Skan warning (0, "only weak aliases are supported in this configuration"); 4634169689Skan warn_once = 1; 4635169689Skan } 4636169689Skan return; 4637169689Skan } 463890075Sobrien#endif 463990075Sobrien#endif 464096263Sobrien#endif 4641169689Skan} 4642169689Skan 4643169689Skan/* This TREE_LIST contains weakref targets. */ 4644169689Skan 4645169689Skanstatic GTY(()) tree weakref_targets; 4646169689Skan 4647169689Skan/* Forward declaration. */ 4648169689Skanstatic tree find_decl_and_mark_needed (tree decl, tree target); 4649169689Skan 4650169689Skan/* Emit any pending weak declarations. */ 4651169689Skan 4652169689Skanvoid 4653169689Skanweak_finish (void) 4654169689Skan{ 4655169689Skan tree t; 4656169689Skan 4657169689Skan for (t = weakref_targets; t; t = TREE_CHAIN (t)) 4658169689Skan { 4659169689Skan tree alias_decl = TREE_PURPOSE (t); 4660169689Skan tree target = ultimate_transparent_alias_target (&TREE_VALUE (t)); 4661169689Skan 4662169689Skan if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl))) 4663169689Skan /* Remove alias_decl from the weak list, but leave entries for 4664169689Skan the target alone. */ 4665169689Skan target = NULL_TREE; 4666169689Skan#ifndef ASM_OUTPUT_WEAKREF 4667169689Skan else if (! TREE_SYMBOL_REFERENCED (target)) 4668169689Skan { 4669169689Skan /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not 4670169689Skan defined, otherwise we and weak_finish_1 would use a 4671169689Skan different macros. */ 4672169689Skan# if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL 4673169689Skan ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target)); 4674169689Skan# else 4675169689Skan tree decl = find_decl_and_mark_needed (alias_decl, target); 4676169689Skan 4677169689Skan if (! decl) 4678169689Skan { 4679169689Skan decl = build_decl (TREE_CODE (alias_decl), target, 4680169689Skan TREE_TYPE (alias_decl)); 4681169689Skan 4682169689Skan DECL_EXTERNAL (decl) = 1; 4683169689Skan TREE_PUBLIC (decl) = 1; 4684169689Skan DECL_ARTIFICIAL (decl) = 1; 4685169689Skan TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl); 4686169689Skan TREE_USED (decl) = 1; 4687169689Skan } 4688169689Skan 4689169689Skan weak_finish_1 (decl); 4690169689Skan# endif 4691169689Skan } 4692169689Skan#endif 4693169689Skan 4694169689Skan { 4695169689Skan tree *p; 4696169689Skan tree t2; 4697169689Skan 4698169689Skan /* Remove the alias and the target from the pending weak list 4699169689Skan so that we do not emit any .weak directives for the former, 4700169689Skan nor multiple .weak directives for the latter. */ 4701169689Skan for (p = &weak_decls; (t2 = *p) ; ) 4702169689Skan { 4703169689Skan if (TREE_VALUE (t2) == alias_decl 4704169689Skan || target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2))) 4705169689Skan *p = TREE_CHAIN (t2); 4706169689Skan else 4707169689Skan p = &TREE_CHAIN (t2); 4708169689Skan } 4709169689Skan 4710169689Skan /* Remove other weakrefs to the same target, to speed things up. */ 4711169689Skan for (p = &TREE_CHAIN (t); (t2 = *p) ; ) 4712169689Skan { 4713169689Skan if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2))) 4714169689Skan *p = TREE_CHAIN (t2); 4715169689Skan else 4716169689Skan p = &TREE_CHAIN (t2); 4717169689Skan } 4718169689Skan } 471918334Speter } 4720169689Skan 4721169689Skan for (t = weak_decls; t; t = TREE_CHAIN (t)) 4722169689Skan { 4723169689Skan tree decl = TREE_VALUE (t); 4724169689Skan 4725169689Skan weak_finish_1 (decl); 4726169689Skan } 472718334Speter} 472818334Speter 472996263Sobrien/* Emit the assembly bits to indicate that DECL is globally visible. */ 473096263Sobrien 473152284Sobrienstatic void 4732132718Skanglobalize_decl (tree decl) 473352284Sobrien{ 473496263Sobrien const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0); 473590075Sobrien 473696263Sobrien#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL) 473796263Sobrien if (DECL_WEAK (decl)) 473852284Sobrien { 473996263Sobrien tree *p, t; 474096263Sobrien 474196263Sobrien#ifdef ASM_WEAKEN_DECL 474296263Sobrien ASM_WEAKEN_DECL (asm_out_file, decl, name, 0); 474396263Sobrien#else 474496263Sobrien ASM_WEAKEN_LABEL (asm_out_file, name); 474596263Sobrien#endif 474696263Sobrien 474796263Sobrien /* Remove this function from the pending weak list so that 474896263Sobrien we do not emit multiple .weak directives for it. */ 474996263Sobrien for (p = &weak_decls; (t = *p) ; ) 475096263Sobrien { 475196263Sobrien if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t))) 475296263Sobrien *p = TREE_CHAIN (t); 475396263Sobrien else 475496263Sobrien p = &TREE_CHAIN (t); 475596263Sobrien } 4756169689Skan 4757169689Skan /* Remove weakrefs to the same target from the pending weakref 4758169689Skan list, for the same reason. */ 4759169689Skan for (p = &weakref_targets; (t = *p) ; ) 4760169689Skan { 4761169689Skan if (DECL_ASSEMBLER_NAME (decl) 4762169689Skan == ultimate_transparent_alias_target (&TREE_VALUE (t))) 4763169689Skan *p = TREE_CHAIN (t); 4764169689Skan else 4765169689Skan p = &TREE_CHAIN (t); 4766169689Skan } 4767169689Skan 476896263Sobrien return; 476952284Sobrien } 4770169689Skan#elif defined(ASM_MAKE_LABEL_LINKONCE) 4771169689Skan if (DECL_ONE_ONLY (decl)) 4772169689Skan ASM_MAKE_LABEL_LINKONCE (asm_out_file, name); 477396263Sobrien#endif 477496263Sobrien 4775169689Skan targetm.asm_out.globalize_label (asm_out_file, name); 477652284Sobrien} 477752284Sobrien 4778169689Skan/* We have to be able to tell cgraph about the needed-ness of the target 4779169689Skan of an alias. This requires that the decl have been defined. Aliases 4780169689Skan that precede their definition have to be queued for later processing. */ 4781169689Skan 4782169689Skantypedef struct alias_pair GTY(()) 4783146895Skan{ 4784146895Skan tree decl; 4785146895Skan tree target; 4786169689Skan} alias_pair; 4787146895Skan 4788169689Skan/* Define gc'd vector type. */ 4789169689SkanDEF_VEC_O(alias_pair); 4790169689SkanDEF_VEC_ALLOC_O(alias_pair,gc); 4791146895Skan 4792169689Skanstatic GTY(()) VEC(alias_pair,gc) *alias_pairs; 4793169689Skan 4794169689Skan/* Given an assembly name, find the decl it is associated with. At the 4795169689Skan same time, mark it needed for cgraph. */ 4796169689Skan 4797169689Skanstatic tree 4798169689Skanfind_decl_and_mark_needed (tree decl, tree target) 4799169689Skan{ 4800169689Skan struct cgraph_node *fnode = NULL; 4801169689Skan struct cgraph_varpool_node *vnode = NULL; 4802169689Skan 4803169689Skan if (TREE_CODE (decl) == FUNCTION_DECL) 4804169689Skan { 4805169689Skan fnode = cgraph_node_for_asm (target); 4806169689Skan if (fnode == NULL) 4807169689Skan vnode = cgraph_varpool_node_for_asm (target); 4808169689Skan } 4809169689Skan else 4810169689Skan { 4811169689Skan vnode = cgraph_varpool_node_for_asm (target); 4812169689Skan if (vnode == NULL) 4813169689Skan fnode = cgraph_node_for_asm (target); 4814169689Skan } 4815169689Skan 4816169689Skan if (fnode) 4817169689Skan { 4818169689Skan /* We can't mark function nodes as used after cgraph global info 4819169689Skan is finished. This wouldn't generally be necessary, but C++ 4820169689Skan virtual table thunks are introduced late in the game and 4821169689Skan might seem like they need marking, although in fact they 4822169689Skan don't. */ 4823169689Skan if (! cgraph_global_info_ready) 4824169689Skan cgraph_mark_needed_node (fnode); 4825169689Skan return fnode->decl; 4826169689Skan } 4827169689Skan else if (vnode) 4828169689Skan { 4829169689Skan cgraph_varpool_mark_needed_node (vnode); 4830169689Skan return vnode->decl; 4831169689Skan } 4832169689Skan else 4833169689Skan return NULL_TREE; 4834169689Skan} 4835169689Skan 4836146895Skan/* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF 4837146895Skan or ASM_OUTPUT_DEF_FROM_DECLS. The function defines the symbol whose 4838146895Skan tree node is DECL to have the value of the tree node TARGET. */ 4839146895Skan 4840146895Skanstatic void 4841169689Skando_assemble_alias (tree decl, tree target) 4842146895Skan{ 4843169689Skan if (TREE_ASM_WRITTEN (decl)) 4844169689Skan return; 4845169689Skan 4846169689Skan TREE_ASM_WRITTEN (decl) = 1; 4847169689Skan TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1; 4848169689Skan 4849169689Skan if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) 4850169689Skan { 4851169689Skan ultimate_transparent_alias_target (&target); 4852169689Skan 4853169689Skan if (!TREE_SYMBOL_REFERENCED (target)) 4854169689Skan weakref_targets = tree_cons (decl, target, weakref_targets); 4855169689Skan 4856169689Skan#ifdef ASM_OUTPUT_WEAKREF 4857169689Skan ASM_OUTPUT_WEAKREF (asm_out_file, decl, 4858169689Skan IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), 4859169689Skan IDENTIFIER_POINTER (target)); 4860169689Skan#else 4861169689Skan if (!SUPPORTS_WEAK) 4862169689Skan { 4863169689Skan error ("%Jweakref is not supported in this configuration", decl); 4864169689Skan return; 4865169689Skan } 4866169689Skan#endif 4867169689Skan return; 4868169689Skan } 4869169689Skan 4870169689Skan#ifdef ASM_OUTPUT_DEF 4871169689Skan /* Make name accessible from other files, if appropriate. */ 4872169689Skan 4873169689Skan if (TREE_PUBLIC (decl)) 4874169689Skan { 4875169689Skan globalize_decl (decl); 4876169689Skan maybe_assemble_visibility (decl); 4877169689Skan } 4878169689Skan 4879169689Skan# ifdef ASM_OUTPUT_DEF_FROM_DECLS 4880146895Skan ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target); 4881169689Skan# else 4882146895Skan ASM_OUTPUT_DEF (asm_out_file, 4883146895Skan IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), 4884146895Skan IDENTIFIER_POINTER (target)); 4885169689Skan# endif 4886169689Skan#elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL) 4887169689Skan { 4888169689Skan const char *name; 4889169689Skan tree *p, t; 4890169689Skan 4891169689Skan name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); 4892169689Skan# ifdef ASM_WEAKEN_DECL 4893169689Skan ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target)); 4894169689Skan# else 4895169689Skan ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target)); 4896169689Skan# endif 4897169689Skan /* Remove this function from the pending weak list so that 4898169689Skan we do not emit multiple .weak directives for it. */ 4899169689Skan for (p = &weak_decls; (t = *p) ; ) 4900169689Skan if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t))) 4901169689Skan *p = TREE_CHAIN (t); 4902169689Skan else 4903169689Skan p = &TREE_CHAIN (t); 4904169689Skan 4905169689Skan /* Remove weakrefs to the same target from the pending weakref 4906169689Skan list, for the same reason. */ 4907169689Skan for (p = &weakref_targets; (t = *p) ; ) 4908169689Skan { 4909169689Skan if (DECL_ASSEMBLER_NAME (decl) 4910169689Skan == ultimate_transparent_alias_target (&TREE_VALUE (t))) 4911169689Skan *p = TREE_CHAIN (t); 4912169689Skan else 4913169689Skan p = &TREE_CHAIN (t); 4914169689Skan } 4915169689Skan } 4916146895Skan#endif 4917146895Skan} 4918146895Skan 4919169689Skan/* First pass of completing pending aliases. Make sure that cgraph knows 4920169689Skan which symbols will be required. */ 4921146895Skan 4922146895Skanvoid 4923169689Skanfinish_aliases_1 (void) 4924146895Skan{ 4925169689Skan unsigned i; 4926169689Skan alias_pair *p; 4927146895Skan 4928169689Skan for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++) 4929169689Skan { 4930169689Skan tree target_decl; 4931146895Skan 4932169689Skan target_decl = find_decl_and_mark_needed (p->decl, p->target); 4933169689Skan if (target_decl == NULL) 4934169689Skan { 4935169689Skan if (! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))) 4936169689Skan error ("%q+D aliased to undefined symbol %qs", 4937169689Skan p->decl, IDENTIFIER_POINTER (p->target)); 4938169689Skan } 4939169689Skan else if (DECL_EXTERNAL (target_decl) 4940169689Skan && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))) 4941169689Skan error ("%q+D aliased to external symbol %qs", 4942169689Skan p->decl, IDENTIFIER_POINTER (p->target)); 4943146895Skan } 4944169689Skan} 4945146895Skan 4946169689Skan/* Second pass of completing pending aliases. Emit the actual assembly. 4947169689Skan This happens at the end of compilation and thus it is assured that the 4948169689Skan target symbol has been emitted. */ 4949169689Skan 4950169689Skanvoid 4951169689Skanfinish_aliases_2 (void) 4952169689Skan{ 4953169689Skan unsigned i; 4954169689Skan alias_pair *p; 4955169689Skan 4956169689Skan for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++) 4957169689Skan do_assemble_alias (p->decl, p->target); 4958169689Skan 4959169689Skan VEC_truncate (alias_pair, alias_pairs, 0); 4960146895Skan} 4961146895Skan 496290075Sobrien/* Emit an assembler directive to make the symbol for DECL an alias to 496390075Sobrien the symbol for TARGET. */ 496490075Sobrien 496518334Spetervoid 4966169689Skanassemble_alias (tree decl, tree target) 496718334Speter{ 4968169689Skan tree target_decl; 4969169689Skan bool is_weakref = false; 497018334Speter 4971169689Skan if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) 4972117395Skan { 4973169689Skan tree alias = DECL_ASSEMBLER_NAME (decl); 497418334Speter 4975169689Skan is_weakref = true; 4976146895Skan 4977169689Skan ultimate_transparent_alias_target (&target); 4978169689Skan 4979169689Skan if (alias == target) 4980169689Skan error ("weakref %q+D ultimately targets itself", decl); 4981169689Skan else 4982169689Skan { 4983169689Skan#ifndef ASM_OUTPUT_WEAKREF 4984169689Skan IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1; 4985169689Skan TREE_CHAIN (alias) = target; 4986169689Skan#endif 4987169689Skan } 4988169689Skan if (TREE_PUBLIC (decl)) 4989169689Skan error ("weakref %q+D must have static linkage", decl); 4990146895Skan } 4991146895Skan else 4992132718Skan { 4993169689Skan#if !defined (ASM_OUTPUT_DEF) 4994169689Skan# if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL) 4995169689Skan error ("%Jalias definitions not supported in this configuration", decl); 4996169689Skan return; 4997169689Skan# else 4998169689Skan if (!DECL_WEAK (decl)) 4999169689Skan { 5000169689Skan error ("%Jonly weak aliases are supported in this configuration", decl); 5001169689Skan return; 5002169689Skan } 5003169689Skan# endif 500496263Sobrien#endif 5005132718Skan } 5006169689Skan 5007169689Skan /* We must force creation of DECL_RTL for debug info generation, even though 5008169689Skan we don't use it here. */ 5009169689Skan make_decl_rtl (decl); 5010169689Skan TREE_USED (decl) = 1; 5011169689Skan 5012169689Skan /* A quirk of the initial implementation of aliases required that the user 5013169689Skan add "extern" to all of them. Which is silly, but now historical. Do 5014169689Skan note that the symbol is in fact locally defined. */ 5015169689Skan if (! is_weakref) 5016169689Skan DECL_EXTERNAL (decl) = 0; 5017169689Skan 5018169689Skan /* Allow aliases to aliases. */ 5019169689Skan if (TREE_CODE (decl) == FUNCTION_DECL) 5020169689Skan cgraph_node (decl)->alias = true; 5021132718Skan else 5022169689Skan cgraph_varpool_node (decl)->alias = true; 5023132718Skan 5024169689Skan /* If the target has already been emitted, we don't have to queue the 5025169689Skan alias. This saves a tad o memory. */ 5026169689Skan target_decl = find_decl_and_mark_needed (decl, target); 5027169689Skan if (target_decl && TREE_ASM_WRITTEN (target_decl)) 5028169689Skan do_assemble_alias (decl, target); 5029169689Skan else 5030169689Skan { 5031169689Skan alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL); 5032169689Skan p->decl = decl; 5033169689Skan p->target = target; 5034169689Skan } 503518334Speter} 503650397Sobrien 5037117395Skan/* Emit an assembler directive to set symbol for DECL visibility to 5038117395Skan the visibility type VIS, which must not be VISIBILITY_DEFAULT. */ 5039117395Skan 5040117395Skanvoid 5041132718Skandefault_assemble_visibility (tree decl, int vis) 5042117395Skan{ 5043117395Skan static const char * const visibility_types[] = { 5044169689Skan NULL, "protected", "hidden", "internal" 5045117395Skan }; 5046117395Skan 5047117395Skan const char *name, *type; 5048117395Skan 5049169689Skan name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); 5050117395Skan type = visibility_types[vis]; 5051117395Skan 5052117395Skan#ifdef HAVE_GAS_HIDDEN 5053117395Skan fprintf (asm_out_file, "\t.%s\t", type); 5054117395Skan assemble_name (asm_out_file, name); 5055117395Skan fprintf (asm_out_file, "\n"); 5056117395Skan#else 5057169689Skan warning (OPT_Wattributes, "visibility attribute not supported " 5058169689Skan "in this configuration; ignored"); 5059117395Skan#endif 5060117395Skan} 5061117395Skan 5062117395Skan/* A helper function to call assemble_visibility when needed for a decl. */ 5063117395Skan 5064215840Sdimint 5065132718Skanmaybe_assemble_visibility (tree decl) 5066117395Skan{ 5067132718Skan enum symbol_visibility vis = DECL_VISIBILITY (decl); 5068117395Skan 5069117395Skan if (vis != VISIBILITY_DEFAULT) 5070215840Sdim { 5071215840Sdim targetm.asm_out.visibility (decl, vis); 5072215840Sdim return 1; 5073215840Sdim } 5074215840Sdim else 5075215840Sdim return 0; 5076117395Skan} 5077117395Skan 507850397Sobrien/* Returns 1 if the target configuration supports defining public symbols 507950397Sobrien so that one of them will be chosen at link time instead of generating a 508050397Sobrien multiply-defined symbol error, whether through the use of weak symbols or 508150397Sobrien a target-specific mechanism for having duplicates discarded. */ 508250397Sobrien 508350397Sobrienint 5084132718Skansupports_one_only (void) 508550397Sobrien{ 508650397Sobrien if (SUPPORTS_ONE_ONLY) 508750397Sobrien return 1; 508850397Sobrien return SUPPORTS_WEAK; 508950397Sobrien} 509050397Sobrien 509150397Sobrien/* Set up DECL as a public symbol that can be defined in multiple 509250397Sobrien translation units without generating a linker error. */ 509350397Sobrien 509450397Sobrienvoid 5095132718Skanmake_decl_one_only (tree decl) 509650397Sobrien{ 5097169689Skan gcc_assert (TREE_CODE (decl) == VAR_DECL 5098169689Skan || TREE_CODE (decl) == FUNCTION_DECL); 509950397Sobrien 510050397Sobrien TREE_PUBLIC (decl) = 1; 510150397Sobrien 5102132718Skan if (SUPPORTS_ONE_ONLY) 510350397Sobrien { 510450397Sobrien#ifdef MAKE_DECL_ONE_ONLY 510550397Sobrien MAKE_DECL_ONE_ONLY (decl); 510650397Sobrien#endif 510750397Sobrien DECL_ONE_ONLY (decl) = 1; 510850397Sobrien } 5109132718Skan else if (TREE_CODE (decl) == VAR_DECL 5110132718Skan && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node)) 5111132718Skan DECL_COMMON (decl) = 1; 511250397Sobrien else 5113169689Skan { 5114169689Skan gcc_assert (SUPPORTS_WEAK); 5115169689Skan DECL_WEAK (decl) = 1; 5116169689Skan } 511750397Sobrien} 511890075Sobrien 511990075Sobrienvoid 5120132718Skaninit_varasm_once (void) 512190075Sobrien{ 5122169689Skan section_htab = htab_create_ggc (31, section_entry_hash, 5123169689Skan section_entry_eq, NULL); 5124169689Skan object_block_htab = htab_create_ggc (31, object_block_entry_hash, 5125169689Skan object_block_entry_eq, NULL); 5126132718Skan const_desc_htab = htab_create_ggc (1009, const_desc_hash, 5127132718Skan const_desc_eq, NULL); 512890075Sobrien 512990075Sobrien const_alias_set = new_alias_set (); 5130169689Skan shared_constant_pool = create_constant_pool (); 5131169689Skan 5132169689Skan#ifdef TEXT_SECTION_ASM_OP 5133169689Skan text_section = get_unnamed_section (SECTION_CODE, output_section_asm_op, 5134169689Skan TEXT_SECTION_ASM_OP); 5135169689Skan#endif 5136169689Skan 5137169689Skan#ifdef DATA_SECTION_ASM_OP 5138169689Skan data_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op, 5139169689Skan DATA_SECTION_ASM_OP); 5140169689Skan#endif 5141169689Skan 5142169689Skan#ifdef SDATA_SECTION_ASM_OP 5143169689Skan sdata_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op, 5144169689Skan SDATA_SECTION_ASM_OP); 5145169689Skan#endif 5146169689Skan 5147169689Skan#ifdef READONLY_DATA_SECTION_ASM_OP 5148169689Skan readonly_data_section = get_unnamed_section (0, output_section_asm_op, 5149169689Skan READONLY_DATA_SECTION_ASM_OP); 5150169689Skan#endif 5151169689Skan 5152169689Skan#ifdef CTORS_SECTION_ASM_OP 5153169689Skan ctors_section = get_unnamed_section (0, output_section_asm_op, 5154169689Skan CTORS_SECTION_ASM_OP); 5155169689Skan#endif 5156169689Skan 5157169689Skan#ifdef DTORS_SECTION_ASM_OP 5158169689Skan dtors_section = get_unnamed_section (0, output_section_asm_op, 5159169689Skan DTORS_SECTION_ASM_OP); 5160169689Skan#endif 5161169689Skan 5162169689Skan#ifdef BSS_SECTION_ASM_OP 5163169689Skan bss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS, 5164169689Skan output_section_asm_op, 5165169689Skan BSS_SECTION_ASM_OP); 5166169689Skan#endif 5167169689Skan 5168169689Skan#ifdef SBSS_SECTION_ASM_OP 5169169689Skan sbss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS, 5170169689Skan output_section_asm_op, 5171169689Skan SBSS_SECTION_ASM_OP); 5172169689Skan#endif 5173169689Skan 5174169689Skan tls_comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS 5175169689Skan | SECTION_COMMON, emit_tls_common); 5176169689Skan lcomm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS 5177169689Skan | SECTION_COMMON, emit_local); 5178169689Skan comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS 5179169689Skan | SECTION_COMMON, emit_common); 5180169689Skan 5181169689Skan#if defined ASM_OUTPUT_ALIGNED_BSS || defined ASM_OUTPUT_BSS 5182169689Skan bss_noswitch_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS, 5183169689Skan emit_bss); 5184169689Skan#endif 5185169689Skan 5186169689Skan targetm.asm_out.init_sections (); 5187169689Skan 5188169689Skan if (readonly_data_section == NULL) 5189169689Skan readonly_data_section = text_section; 519090075Sobrien} 519190075Sobrien 5192117395Skanenum tls_model 5193169689Skandecl_default_tls_model (tree decl) 5194117395Skan{ 5195117395Skan enum tls_model kind; 5196117395Skan bool is_local; 5197117395Skan 5198169689Skan is_local = targetm.binds_local_p (decl); 5199169689Skan if (!flag_shlib) 5200117395Skan { 5201117395Skan if (is_local) 5202117395Skan kind = TLS_MODEL_LOCAL_EXEC; 5203117395Skan else 5204117395Skan kind = TLS_MODEL_INITIAL_EXEC; 5205117395Skan } 5206169689Skan 5207117395Skan /* Local dynamic is inefficient when we're not combining the 5208117395Skan parts of the address. */ 5209117395Skan else if (optimize && is_local) 5210117395Skan kind = TLS_MODEL_LOCAL_DYNAMIC; 5211117395Skan else 5212117395Skan kind = TLS_MODEL_GLOBAL_DYNAMIC; 5213117395Skan if (kind < flag_tls_default) 5214117395Skan kind = flag_tls_default; 5215117395Skan 5216117395Skan return kind; 5217117395Skan} 5218117395Skan 521990075Sobrien/* Select a set of attributes for section NAME based on the properties 522090075Sobrien of DECL and whether or not RELOC indicates that DECL's initializer 522190075Sobrien might contain runtime relocations. 522290075Sobrien 522390075Sobrien We make the section read-only and executable for a function decl, 522490075Sobrien read-only for a const data decl, and writable for a non-const data decl. */ 522590075Sobrien 522690075Sobrienunsigned int 5227132718Skandefault_section_type_flags (tree decl, const char *name, int reloc) 522890075Sobrien{ 522990075Sobrien unsigned int flags; 523090075Sobrien 523190075Sobrien if (decl && TREE_CODE (decl) == FUNCTION_DECL) 523290075Sobrien flags = SECTION_CODE; 5233169689Skan else if (decl && decl_readonly_section (decl, reloc)) 523490075Sobrien flags = 0; 5235169689Skan else if (current_function_decl 5236169689Skan && cfun 5237169689Skan && cfun->unlikely_text_section_name 5238169689Skan && strcmp (name, cfun->unlikely_text_section_name) == 0) 5239169689Skan flags = SECTION_CODE; 5240169689Skan else if (!decl 5241169689Skan && (!current_function_decl || !cfun) 5242169689Skan && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0) 5243169689Skan flags = SECTION_CODE; 524490075Sobrien else 524590075Sobrien flags = SECTION_WRITE; 524690075Sobrien 524790075Sobrien if (decl && DECL_ONE_ONLY (decl)) 524890075Sobrien flags |= SECTION_LINKONCE; 524990075Sobrien 5250169689Skan if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl)) 5251117395Skan flags |= SECTION_TLS | SECTION_WRITE; 5252117395Skan 525390075Sobrien if (strcmp (name, ".bss") == 0 525490075Sobrien || strncmp (name, ".bss.", 5) == 0 525590075Sobrien || strncmp (name, ".gnu.linkonce.b.", 16) == 0 525690075Sobrien || strcmp (name, ".sbss") == 0 525790075Sobrien || strncmp (name, ".sbss.", 6) == 0 5258169689Skan || strncmp (name, ".gnu.linkonce.sb.", 17) == 0) 525990075Sobrien flags |= SECTION_BSS; 526090075Sobrien 5261117395Skan if (strcmp (name, ".tdata") == 0 5262169689Skan || strncmp (name, ".tdata.", 7) == 0 5263169689Skan || strncmp (name, ".gnu.linkonce.td.", 17) == 0) 5264117395Skan flags |= SECTION_TLS; 5265117395Skan 5266169689Skan if (strcmp (name, ".tbss") == 0 5267169689Skan || strncmp (name, ".tbss.", 6) == 0 5268169689Skan || strncmp (name, ".gnu.linkonce.tb.", 17) == 0) 5269169689Skan flags |= SECTION_TLS | SECTION_BSS; 5270169689Skan 5271117395Skan /* These three sections have special ELF types. They are neither 5272117395Skan SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't 5273117395Skan want to print a section type (@progbits or @nobits). If someone 5274117395Skan is silly enough to emit code or TLS variables to one of these 5275117395Skan sections, then don't handle them specially. */ 5276117395Skan if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS)) 5277117395Skan && (strcmp (name, ".init_array") == 0 5278117395Skan || strcmp (name, ".fini_array") == 0 5279117395Skan || strcmp (name, ".preinit_array") == 0)) 5280117395Skan flags |= SECTION_NOTYPE; 5281117395Skan 528290075Sobrien return flags; 528390075Sobrien} 528490075Sobrien 5285169689Skan/* Return true if the target supports some form of global BSS, 5286169689Skan either through bss_noswitch_section, or by selecting a BSS 5287169689Skan section in TARGET_ASM_SELECT_SECTION. */ 5288169689Skan 5289169689Skanbool 5290169689Skanhave_global_bss_p (void) 5291169689Skan{ 5292169689Skan return bss_noswitch_section || targetm.have_switchable_bss_sections; 5293169689Skan} 5294169689Skan 529590075Sobrien/* Output assembly to switch to section NAME with attribute FLAGS. 529690075Sobrien Four variants for common object file formats. */ 529790075Sobrien 529890075Sobrienvoid 5299132718Skandefault_no_named_section (const char *name ATTRIBUTE_UNUSED, 5300169689Skan unsigned int flags ATTRIBUTE_UNUSED, 5301169689Skan tree decl ATTRIBUTE_UNUSED) 530290075Sobrien{ 530390075Sobrien /* Some object formats don't support named sections at all. The 530490075Sobrien front-end should already have flagged this as an error. */ 5305169689Skan gcc_unreachable (); 530690075Sobrien} 530790075Sobrien 530890075Sobrienvoid 5309169689Skandefault_elf_asm_named_section (const char *name, unsigned int flags, 5310169689Skan tree decl ATTRIBUTE_UNUSED) 531190075Sobrien{ 531290075Sobrien char flagchars[10], *f = flagchars; 531390075Sobrien 5314169689Skan /* If we have already declared this section, we can use an 5315169689Skan abbreviated form to switch back to it -- unless this section is 5316169689Skan part of a COMDAT groups, in which case GAS requires the full 5317169689Skan declaration every time. */ 5318169689Skan if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)) 5319169689Skan && (flags & SECTION_DECLARED)) 532090075Sobrien { 532190075Sobrien fprintf (asm_out_file, "\t.section\t%s\n", name); 532290075Sobrien return; 532390075Sobrien } 532490075Sobrien 532590075Sobrien if (!(flags & SECTION_DEBUG)) 532690075Sobrien *f++ = 'a'; 532790075Sobrien if (flags & SECTION_WRITE) 532890075Sobrien *f++ = 'w'; 532990075Sobrien if (flags & SECTION_CODE) 533090075Sobrien *f++ = 'x'; 533190075Sobrien if (flags & SECTION_SMALL) 533290075Sobrien *f++ = 's'; 533390075Sobrien if (flags & SECTION_MERGE) 533490075Sobrien *f++ = 'M'; 533590075Sobrien if (flags & SECTION_STRINGS) 533690075Sobrien *f++ = 'S'; 5337117395Skan if (flags & SECTION_TLS) 5338117395Skan *f++ = 'T'; 5339169689Skan if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)) 5340169689Skan *f++ = 'G'; 534190075Sobrien *f = '\0'; 534290075Sobrien 5343117395Skan fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars); 534490075Sobrien 5345117395Skan if (!(flags & SECTION_NOTYPE)) 5346117395Skan { 5347117395Skan const char *type; 5348169689Skan const char *format; 5349117395Skan 5350117395Skan if (flags & SECTION_BSS) 5351117395Skan type = "nobits"; 5352117395Skan else 5353117395Skan type = "progbits"; 5354117395Skan 5355169689Skan format = ",@%s"; 5356169689Skan#ifdef ASM_COMMENT_START 5357169689Skan /* On platforms that use "@" as the assembly comment character, 5358169689Skan use "%" instead. */ 5359169689Skan if (strcmp (ASM_COMMENT_START, "@") == 0) 5360169689Skan format = ",%%%s"; 5361169689Skan#endif 5362169689Skan fprintf (asm_out_file, format, type); 5363117395Skan 5364117395Skan if (flags & SECTION_ENTSIZE) 5365117395Skan fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE); 5366169689Skan if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)) 5367169689Skan fprintf (asm_out_file, ",%s,comdat", 5368169689Skan lang_hooks.decls.comdat_group (decl)); 5369117395Skan } 5370117395Skan 5371117395Skan putc ('\n', asm_out_file); 537290075Sobrien} 537390075Sobrien 537490075Sobrienvoid 5375169689Skandefault_coff_asm_named_section (const char *name, unsigned int flags, 5376169689Skan tree decl ATTRIBUTE_UNUSED) 537790075Sobrien{ 537890075Sobrien char flagchars[8], *f = flagchars; 537990075Sobrien 538090075Sobrien if (flags & SECTION_WRITE) 538190075Sobrien *f++ = 'w'; 538290075Sobrien if (flags & SECTION_CODE) 538390075Sobrien *f++ = 'x'; 538490075Sobrien *f = '\0'; 538590075Sobrien 538690075Sobrien fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars); 538790075Sobrien} 538890075Sobrien 538990075Sobrienvoid 5390169689Skandefault_pe_asm_named_section (const char *name, unsigned int flags, 5391169689Skan tree decl) 539290075Sobrien{ 5393169689Skan default_coff_asm_named_section (name, flags, decl); 539490075Sobrien 539590075Sobrien if (flags & SECTION_LINKONCE) 539690075Sobrien { 539790075Sobrien /* Functions may have been compiled at various levels of 539890075Sobrien optimization so we can't use `same_size' here. 539990075Sobrien Instead, have the linker pick one. */ 540090075Sobrien fprintf (asm_out_file, "\t.linkonce %s\n", 540190075Sobrien (flags & SECTION_CODE ? "discard" : "same_size")); 540290075Sobrien } 540390075Sobrien} 540490075Sobrien 5405117395Skan/* The lame default section selector. */ 5406117395Skan 5407169689Skansection * 5408132718Skandefault_select_section (tree decl, int reloc, 5409132718Skan unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED) 5410117395Skan{ 5411117395Skan if (DECL_P (decl)) 5412117395Skan { 5413117395Skan if (decl_readonly_section (decl, reloc)) 5414169689Skan return readonly_data_section; 5415117395Skan } 5416117395Skan else if (TREE_CODE (decl) == CONSTRUCTOR) 5417117395Skan { 5418117395Skan if (! ((flag_pic && reloc) 5419117395Skan || !TREE_READONLY (decl) 5420117395Skan || TREE_SIDE_EFFECTS (decl) 5421117395Skan || !TREE_CONSTANT (decl))) 5422169689Skan return readonly_data_section; 5423117395Skan } 5424117395Skan else if (TREE_CODE (decl) == STRING_CST) 5425169689Skan return readonly_data_section; 5426117395Skan else if (! (flag_pic && reloc)) 5427169689Skan return readonly_data_section; 5428117395Skan 5429169689Skan return data_section; 5430117395Skan} 5431117395Skan 5432117395Skanenum section_category 5433169689Skancategorize_decl_for_section (tree decl, int reloc) 5434117395Skan{ 5435117395Skan enum section_category ret; 5436117395Skan 5437117395Skan if (TREE_CODE (decl) == FUNCTION_DECL) 5438117395Skan return SECCAT_TEXT; 5439117395Skan else if (TREE_CODE (decl) == STRING_CST) 5440117395Skan { 5441169689Skan if (flag_mudflap) /* or !flag_merge_constants */ 5442169689Skan return SECCAT_RODATA; 5443117395Skan else 5444117395Skan return SECCAT_RODATA_MERGE_STR; 5445117395Skan } 5446117395Skan else if (TREE_CODE (decl) == VAR_DECL) 5447117395Skan { 5448169689Skan if (bss_initializer_p (decl)) 5449117395Skan ret = SECCAT_BSS; 5450117395Skan else if (! TREE_READONLY (decl) 5451117395Skan || TREE_SIDE_EFFECTS (decl) 5452117395Skan || ! TREE_CONSTANT (DECL_INITIAL (decl))) 5453117395Skan { 5454169689Skan /* Here the reloc_rw_mask is not testing whether the section should 5455169689Skan be read-only or not, but whether the dynamic link will have to 5456169689Skan do something. If so, we wish to segregate the data in order to 5457169689Skan minimize cache misses inside the dynamic linker. */ 5458169689Skan if (reloc & targetm.asm_out.reloc_rw_mask ()) 5459169689Skan ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL; 5460117395Skan else 5461117395Skan ret = SECCAT_DATA; 5462117395Skan } 5463169689Skan else if (reloc & targetm.asm_out.reloc_rw_mask ()) 5464169689Skan ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO; 5465117395Skan else if (reloc || flag_merge_constants < 2) 5466117395Skan /* C and C++ don't allow different variables to share the same 5467117395Skan location. -fmerge-all-constants allows even that (at the 5468117395Skan expense of not conforming). */ 5469117395Skan ret = SECCAT_RODATA; 5470117395Skan else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST) 5471117395Skan ret = SECCAT_RODATA_MERGE_STR_INIT; 5472117395Skan else 5473117395Skan ret = SECCAT_RODATA_MERGE_CONST; 5474117395Skan } 5475117395Skan else if (TREE_CODE (decl) == CONSTRUCTOR) 5476117395Skan { 5477169689Skan if ((reloc & targetm.asm_out.reloc_rw_mask ()) 5478117395Skan || TREE_SIDE_EFFECTS (decl) 5479117395Skan || ! TREE_CONSTANT (decl)) 5480117395Skan ret = SECCAT_DATA; 5481117395Skan else 5482117395Skan ret = SECCAT_RODATA; 5483117395Skan } 5484117395Skan else 5485117395Skan ret = SECCAT_RODATA; 5486117395Skan 5487117395Skan /* There are no read-only thread-local sections. */ 5488169689Skan if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl)) 5489117395Skan { 5490169689Skan /* Note that this would be *just* SECCAT_BSS, except that there's 5491169689Skan no concept of a read-only thread-local-data section. */ 5492169689Skan if (ret == SECCAT_BSS 5493169689Skan || (flag_zero_initialized_in_bss 5494169689Skan && initializer_zerop (DECL_INITIAL (decl)))) 5495117395Skan ret = SECCAT_TBSS; 5496117395Skan else 5497117395Skan ret = SECCAT_TDATA; 5498117395Skan } 5499117395Skan 5500117395Skan /* If the target uses small data sections, select it. */ 5501169689Skan else if (targetm.in_small_data_p (decl)) 5502117395Skan { 5503117395Skan if (ret == SECCAT_BSS) 5504117395Skan ret = SECCAT_SBSS; 5505117395Skan else if (targetm.have_srodata_section && ret == SECCAT_RODATA) 5506117395Skan ret = SECCAT_SRODATA; 5507117395Skan else 5508117395Skan ret = SECCAT_SDATA; 5509117395Skan } 5510117395Skan 5511117395Skan return ret; 5512117395Skan} 5513117395Skan 5514117395Skanbool 5515132718Skandecl_readonly_section (tree decl, int reloc) 5516117395Skan{ 5517169689Skan switch (categorize_decl_for_section (decl, reloc)) 5518117395Skan { 5519117395Skan case SECCAT_RODATA: 5520117395Skan case SECCAT_RODATA_MERGE_STR: 5521117395Skan case SECCAT_RODATA_MERGE_STR_INIT: 5522117395Skan case SECCAT_RODATA_MERGE_CONST: 5523117395Skan case SECCAT_SRODATA: 5524117395Skan return true; 5525117395Skan break; 5526117395Skan default: 5527117395Skan return false; 5528117395Skan break; 5529117395Skan } 5530117395Skan} 5531117395Skan 5532117395Skan/* Select a section based on the above categorization. */ 5533117395Skan 5534169689Skansection * 5535132718Skandefault_elf_select_section (tree decl, int reloc, 5536132718Skan unsigned HOST_WIDE_INT align) 5537117395Skan{ 5538169689Skan const char *sname; 5539169689Skan switch (categorize_decl_for_section (decl, reloc)) 5540117395Skan { 5541117395Skan case SECCAT_TEXT: 5542117395Skan /* We're not supposed to be called on FUNCTION_DECLs. */ 5543169689Skan gcc_unreachable (); 5544117395Skan case SECCAT_RODATA: 5545169689Skan return readonly_data_section; 5546117395Skan case SECCAT_RODATA_MERGE_STR: 5547169689Skan return mergeable_string_section (decl, align, 0); 5548117395Skan case SECCAT_RODATA_MERGE_STR_INIT: 5549169689Skan return mergeable_string_section (DECL_INITIAL (decl), align, 0); 5550117395Skan case SECCAT_RODATA_MERGE_CONST: 5551169689Skan return mergeable_constant_section (DECL_MODE (decl), align, 0); 5552117395Skan case SECCAT_SRODATA: 5553169689Skan sname = ".sdata2"; 5554117395Skan break; 5555117395Skan case SECCAT_DATA: 5556169689Skan return data_section; 5557117395Skan case SECCAT_DATA_REL: 5558169689Skan sname = ".data.rel"; 5559117395Skan break; 5560117395Skan case SECCAT_DATA_REL_LOCAL: 5561169689Skan sname = ".data.rel.local"; 5562117395Skan break; 5563117395Skan case SECCAT_DATA_REL_RO: 5564169689Skan sname = ".data.rel.ro"; 5565117395Skan break; 5566117395Skan case SECCAT_DATA_REL_RO_LOCAL: 5567169689Skan sname = ".data.rel.ro.local"; 5568117395Skan break; 5569117395Skan case SECCAT_SDATA: 5570169689Skan sname = ".sdata"; 5571117395Skan break; 5572117395Skan case SECCAT_TDATA: 5573169689Skan sname = ".tdata"; 5574117395Skan break; 5575117395Skan case SECCAT_BSS: 5576169689Skan if (bss_section) 5577169689Skan return bss_section; 5578169689Skan sname = ".bss"; 5579117395Skan break; 5580117395Skan case SECCAT_SBSS: 5581169689Skan sname = ".sbss"; 5582117395Skan break; 5583117395Skan case SECCAT_TBSS: 5584169689Skan sname = ".tbss"; 5585117395Skan break; 5586117395Skan default: 5587169689Skan gcc_unreachable (); 5588117395Skan } 5589169689Skan 5590169689Skan if (!DECL_P (decl)) 5591169689Skan decl = NULL_TREE; 5592169689Skan return get_named_section (decl, sname, reloc); 5593117395Skan} 5594117395Skan 5595117395Skan/* Construct a unique section name based on the decl name and the 5596117395Skan categorization performed above. */ 5597117395Skan 5598117395Skanvoid 5599132718Skandefault_unique_section (tree decl, int reloc) 5600117395Skan{ 5601169689Skan /* We only need to use .gnu.linkonce if we don't have COMDAT groups. */ 5602169689Skan bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP; 5603117395Skan const char *prefix, *name; 5604117395Skan size_t nlen, plen; 5605117395Skan char *string; 5606117395Skan 5607169689Skan switch (categorize_decl_for_section (decl, reloc)) 5608117395Skan { 5609117395Skan case SECCAT_TEXT: 5610117395Skan prefix = one_only ? ".gnu.linkonce.t." : ".text."; 5611117395Skan break; 5612117395Skan case SECCAT_RODATA: 5613117395Skan case SECCAT_RODATA_MERGE_STR: 5614117395Skan case SECCAT_RODATA_MERGE_STR_INIT: 5615117395Skan case SECCAT_RODATA_MERGE_CONST: 5616117395Skan prefix = one_only ? ".gnu.linkonce.r." : ".rodata."; 5617117395Skan break; 5618117395Skan case SECCAT_SRODATA: 5619117395Skan prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2."; 5620117395Skan break; 5621117395Skan case SECCAT_DATA: 5622169689Skan prefix = one_only ? ".gnu.linkonce.d." : ".data."; 5623169689Skan break; 5624117395Skan case SECCAT_DATA_REL: 5625169689Skan prefix = one_only ? ".gnu.linkonce.d.rel." : ".data.rel."; 5626169689Skan break; 5627117395Skan case SECCAT_DATA_REL_LOCAL: 5628169689Skan prefix = one_only ? ".gnu.linkonce.d.rel.local." : ".data.rel.local."; 5629169689Skan break; 5630117395Skan case SECCAT_DATA_REL_RO: 5631169689Skan prefix = one_only ? ".gnu.linkonce.d.rel.ro." : ".data.rel.ro."; 5632169689Skan break; 5633117395Skan case SECCAT_DATA_REL_RO_LOCAL: 5634169689Skan prefix = one_only ? ".gnu.linkonce.d.rel.ro.local." 5635169689Skan : ".data.rel.ro.local."; 5636117395Skan break; 5637117395Skan case SECCAT_SDATA: 5638117395Skan prefix = one_only ? ".gnu.linkonce.s." : ".sdata."; 5639117395Skan break; 5640117395Skan case SECCAT_BSS: 5641117395Skan prefix = one_only ? ".gnu.linkonce.b." : ".bss."; 5642117395Skan break; 5643117395Skan case SECCAT_SBSS: 5644117395Skan prefix = one_only ? ".gnu.linkonce.sb." : ".sbss."; 5645117395Skan break; 5646117395Skan case SECCAT_TDATA: 5647117395Skan prefix = one_only ? ".gnu.linkonce.td." : ".tdata."; 5648117395Skan break; 5649117395Skan case SECCAT_TBSS: 5650117395Skan prefix = one_only ? ".gnu.linkonce.tb." : ".tbss."; 5651117395Skan break; 5652117395Skan default: 5653169689Skan gcc_unreachable (); 5654117395Skan } 5655117395Skan plen = strlen (prefix); 5656117395Skan 5657117395Skan name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); 5658169689Skan name = targetm.strip_name_encoding (name); 5659117395Skan nlen = strlen (name); 5660117395Skan 5661117395Skan string = alloca (nlen + plen + 1); 5662117395Skan memcpy (string, prefix, plen); 5663117395Skan memcpy (string + plen, name, nlen + 1); 5664117395Skan 5665117395Skan DECL_SECTION_NAME (decl) = build_string (nlen + plen, string); 5666117395Skan} 5667117395Skan 5668169689Skan/* Like compute_reloc_for_constant, except for an RTX. The return value 5669169689Skan is a mask for which bit 1 indicates a global relocation, and bit 0 5670169689Skan indicates a local relocation. */ 5671169689Skan 5672169689Skanstatic int 5673169689Skancompute_reloc_for_rtx_1 (rtx *xp, void *data) 5674169689Skan{ 5675169689Skan int *preloc = data; 5676169689Skan rtx x = *xp; 5677169689Skan 5678169689Skan switch (GET_CODE (x)) 5679169689Skan { 5680169689Skan case SYMBOL_REF: 5681169689Skan *preloc |= SYMBOL_REF_LOCAL_P (x) ? 1 : 2; 5682169689Skan break; 5683169689Skan case LABEL_REF: 5684169689Skan *preloc |= 1; 5685169689Skan break; 5686169689Skan default: 5687169689Skan break; 5688169689Skan } 5689169689Skan 5690169689Skan return 0; 5691169689Skan} 5692169689Skan 5693169689Skanstatic int 5694169689Skancompute_reloc_for_rtx (rtx x) 5695169689Skan{ 5696169689Skan int reloc; 5697169689Skan 5698169689Skan switch (GET_CODE (x)) 5699169689Skan { 5700169689Skan case CONST: 5701169689Skan case SYMBOL_REF: 5702169689Skan case LABEL_REF: 5703169689Skan reloc = 0; 5704169689Skan for_each_rtx (&x, compute_reloc_for_rtx_1, &reloc); 5705169689Skan return reloc; 5706169689Skan 5707169689Skan default: 5708169689Skan return 0; 5709169689Skan } 5710169689Skan} 5711169689Skan 5712169689Skansection * 5713132718Skandefault_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED, 5714132718Skan rtx x, 5715132718Skan unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED) 5716117395Skan{ 5717169689Skan if (compute_reloc_for_rtx (x) & targetm.asm_out.reloc_rw_mask ()) 5718169689Skan return data_section; 5719169689Skan else 5720169689Skan return readonly_data_section; 5721117395Skan} 5722117395Skan 5723169689Skansection * 5724132718Skandefault_elf_select_rtx_section (enum machine_mode mode, rtx x, 5725132718Skan unsigned HOST_WIDE_INT align) 5726117395Skan{ 5727169689Skan int reloc = compute_reloc_for_rtx (x); 5728169689Skan 5729117395Skan /* ??? Handle small data here somehow. */ 5730117395Skan 5731169689Skan if (reloc & targetm.asm_out.reloc_rw_mask ()) 5732169689Skan { 5733169689Skan if (reloc == 1) 5734169689Skan return get_named_section (NULL, ".data.rel.ro.local", 1); 5735169689Skan else 5736169689Skan return get_named_section (NULL, ".data.rel.ro", 3); 5737169689Skan } 5738117395Skan 5739169689Skan return mergeable_constant_section (mode, align, 0); 5740117395Skan} 5741117395Skan 5742132718Skan/* Set the generally applicable flags on the SYMBOL_REF for EXP. */ 5743132718Skan 5744132718Skanvoid 5745132718Skandefault_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED) 5746132718Skan{ 5747132718Skan rtx symbol; 5748132718Skan int flags; 5749132718Skan 5750132718Skan /* Careful not to prod global register variables. */ 5751169689Skan if (!MEM_P (rtl)) 5752132718Skan return; 5753132718Skan symbol = XEXP (rtl, 0); 5754132718Skan if (GET_CODE (symbol) != SYMBOL_REF) 5755132718Skan return; 5756132718Skan 5757169689Skan flags = SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_HAS_BLOCK_INFO; 5758132718Skan if (TREE_CODE (decl) == FUNCTION_DECL) 5759132718Skan flags |= SYMBOL_FLAG_FUNCTION; 5760169689Skan if (targetm.binds_local_p (decl)) 5761132718Skan flags |= SYMBOL_FLAG_LOCAL; 5762169689Skan if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl)) 5763169689Skan flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT; 5764169689Skan else if (targetm.in_small_data_p (decl)) 5765132718Skan flags |= SYMBOL_FLAG_SMALL; 5766132718Skan /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without 5767132718Skan being PUBLIC, the thing *must* be defined in this translation unit. 5768132718Skan Prevent this buglet from being propagated into rtl code as well. */ 5769132718Skan if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)) 5770132718Skan flags |= SYMBOL_FLAG_EXTERNAL; 5771132718Skan 5772132718Skan SYMBOL_REF_FLAGS (symbol) = flags; 5773132718Skan} 5774132718Skan 5775117395Skan/* By default, we do nothing for encode_section_info, so we need not 5776117395Skan do anything but discard the '*' marker. */ 5777117395Skan 5778117395Skanconst char * 5779132718Skandefault_strip_name_encoding (const char *str) 5780117395Skan{ 5781117395Skan return str + (*str == '*'); 5782117395Skan} 5783117395Skan 5784169689Skan#ifdef ASM_OUTPUT_DEF 5785169689Skan/* The default implementation of TARGET_ASM_OUTPUT_ANCHOR. Define the 5786169689Skan anchor relative to ".", the current section position. */ 5787169689Skan 5788169689Skanvoid 5789169689Skandefault_asm_output_anchor (rtx symbol) 5790169689Skan{ 5791169689Skan char buffer[100]; 5792169689Skan 5793169689Skan sprintf (buffer, ". + " HOST_WIDE_INT_PRINT_DEC, 5794169689Skan SYMBOL_REF_BLOCK_OFFSET (symbol)); 5795169689Skan ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer); 5796169689Skan} 5797169689Skan#endif 5798169689Skan 5799169689Skan/* The default implementation of TARGET_USE_ANCHORS_FOR_SYMBOL_P. */ 5800169689Skan 5801169689Skanbool 5802169689Skandefault_use_anchors_for_symbol_p (rtx symbol) 5803169689Skan{ 5804169689Skan section *sect; 5805169689Skan tree decl; 5806169689Skan 5807169689Skan /* Don't use anchors for mergeable sections. The linker might move 5808169689Skan the objects around. */ 5809169689Skan sect = SYMBOL_REF_BLOCK (symbol)->sect; 5810169689Skan if (sect->common.flags & SECTION_MERGE) 5811169689Skan return false; 5812169689Skan 5813169689Skan /* Don't use anchors for small data sections. The small data register 5814169689Skan acts as an anchor for such sections. */ 5815169689Skan if (sect->common.flags & SECTION_SMALL) 5816169689Skan return false; 5817169689Skan 5818169689Skan decl = SYMBOL_REF_DECL (symbol); 5819169689Skan if (decl && DECL_P (decl)) 5820169689Skan { 5821169689Skan /* Don't use section anchors for decls that might be defined by 5822169689Skan other modules. */ 5823169689Skan if (!targetm.binds_local_p (decl)) 5824169689Skan return false; 5825169689Skan 5826169689Skan /* Don't use section anchors for decls that will be placed in a 5827169689Skan small data section. */ 5828169689Skan /* ??? Ideally, this check would be redundant with the SECTION_SMALL 5829169689Skan one above. The problem is that we only use SECTION_SMALL for 5830169689Skan sections that should be marked as small in the section directive. */ 5831169689Skan if (targetm.in_small_data_p (decl)) 5832169689Skan return false; 5833169689Skan } 5834169689Skan return true; 5835169689Skan} 5836169689Skan 5837117395Skan/* Assume ELF-ish defaults, since that's pretty much the most liberal 5838117395Skan wrt cross-module name binding. */ 5839117395Skan 5840117395Skanbool 5841132718Skandefault_binds_local_p (tree exp) 5842117395Skan{ 5843132718Skan return default_binds_local_p_1 (exp, flag_shlib); 5844117395Skan} 5845117395Skan 5846117395Skanbool 5847132718Skandefault_binds_local_p_1 (tree exp, int shlib) 5848117395Skan{ 5849117395Skan bool local_p; 5850117395Skan 5851117395Skan /* A non-decl is an entry in the constant pool. */ 5852117395Skan if (!DECL_P (exp)) 5853117395Skan local_p = true; 5854169689Skan /* Weakrefs may not bind locally, even though the weakref itself is 5855169689Skan always static and therefore local. */ 5856169689Skan else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp))) 5857169689Skan local_p = false; 5858117395Skan /* Static variables are always local. */ 5859117395Skan else if (! TREE_PUBLIC (exp)) 5860117395Skan local_p = true; 5861169689Skan /* A variable is local if the user has said explicitly that it will 5862169689Skan be. */ 5863169689Skan else if (DECL_VISIBILITY_SPECIFIED (exp) 5864169689Skan && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) 5865117395Skan local_p = true; 5866169689Skan /* Variables defined outside this object might not be local. */ 5867117395Skan else if (DECL_EXTERNAL (exp)) 5868117395Skan local_p = false; 5869169689Skan /* If defined in this object and visibility is not default, must be 5870169689Skan local. */ 5871169689Skan else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) 5872169689Skan local_p = true; 5873169689Skan /* Default visibility weak data can be overridden by a strong symbol 5874169689Skan in another module and so are not local. */ 5875169689Skan else if (DECL_WEAK (exp)) 5876117395Skan local_p = false; 5877117395Skan /* If PIC, then assume that any global name can be overridden by 5878235623Spfg symbols resolved from other modules, unless we are compiling with 5879235623Spfg -fwhole-program, which assumes that names are local. */ 5880117395Skan else if (shlib) 5881235623Spfg local_p = flag_whole_program; 5882117395Skan /* Uninitialized COMMON variable may be unified with symbols 5883117395Skan resolved from other modules. */ 5884117395Skan else if (DECL_COMMON (exp) 5885117395Skan && (DECL_INITIAL (exp) == NULL 5886117395Skan || DECL_INITIAL (exp) == error_mark_node)) 5887117395Skan local_p = false; 5888117395Skan /* Otherwise we're left with initialized (or non-common) global data 5889117395Skan which is of necessity defined locally. */ 5890117395Skan else 5891117395Skan local_p = true; 5892117395Skan 5893117395Skan return local_p; 5894117395Skan} 5895117395Skan 5896132718Skan/* Determine whether or not a pointer mode is valid. Assume defaults 5897132718Skan of ptr_mode or Pmode - can be overridden. */ 5898132718Skanbool 5899132718Skandefault_valid_pointer_mode (enum machine_mode mode) 5900132718Skan{ 5901132718Skan return (mode == ptr_mode || mode == Pmode); 5902132718Skan} 5903132718Skan 5904117395Skan/* Default function to output code that will globalize a label. A 5905169689Skan target must define GLOBAL_ASM_OP or provide its own function to 5906117395Skan globalize a label. */ 5907117395Skan#ifdef GLOBAL_ASM_OP 5908117395Skanvoid 5909132718Skandefault_globalize_label (FILE * stream, const char *name) 5910117395Skan{ 5911117395Skan fputs (GLOBAL_ASM_OP, stream); 5912117395Skan assemble_name (stream, name); 5913117395Skan putc ('\n', stream); 5914117395Skan} 5915117395Skan#endif /* GLOBAL_ASM_OP */ 5916132718Skan 5917169689Skan/* Default function to output a label for unwind information. The 5918169689Skan default is to do nothing. A target that needs nonlocal labels for 5919169689Skan unwind information must provide its own function to do this. */ 5920169689Skanvoid 5921169689Skandefault_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED, 5922169689Skan tree decl ATTRIBUTE_UNUSED, 5923169689Skan int for_eh ATTRIBUTE_UNUSED, 5924169689Skan int empty ATTRIBUTE_UNUSED) 5925169689Skan{ 5926169689Skan} 5927169689Skan 5928169689Skan/* Default function to output a label to divide up the exception table. 5929169689Skan The default is to do nothing. A target that needs/wants to divide 5930169689Skan up the table must provide it's own function to do this. */ 5931169689Skanvoid 5932169689Skandefault_emit_except_table_label (FILE * stream ATTRIBUTE_UNUSED) 5933169689Skan{ 5934169689Skan} 5935169689Skan 5936132718Skan/* This is how to output an internal numbered label where PREFIX is 5937132718Skan the class of label and LABELNO is the number within the class. */ 5938132718Skan 5939132718Skanvoid 5940132718Skandefault_internal_label (FILE *stream, const char *prefix, 5941132718Skan unsigned long labelno) 5942132718Skan{ 5943132718Skan char *const buf = alloca (40 + strlen (prefix)); 5944132718Skan ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno); 5945169689Skan ASM_OUTPUT_INTERNAL_LABEL (stream, buf); 5946132718Skan} 5947132718Skan 5948132718Skan/* This is the default behavior at the beginning of a file. It's 5949132718Skan controlled by two other target-hook toggles. */ 5950132718Skanvoid 5951132718Skandefault_file_start (void) 5952132718Skan{ 5953132718Skan if (targetm.file_start_app_off && !flag_verbose_asm) 5954132718Skan fputs (ASM_APP_OFF, asm_out_file); 5955132718Skan 5956132718Skan if (targetm.file_start_file_directive) 5957132718Skan output_file_directive (asm_out_file, main_input_filename); 5958132718Skan} 5959132718Skan 5960132718Skan/* This is a generic routine suitable for use as TARGET_ASM_FILE_END 5961132718Skan which emits a special section directive used to indicate whether or 5962132718Skan not this object file needs an executable stack. This is primarily 5963132718Skan a GNU extension to ELF but could be used on other targets. */ 5964169689Skan 5965169689Skanint trampolines_created; 5966169689Skan 5967132718Skanvoid 5968132718Skanfile_end_indicate_exec_stack (void) 5969132718Skan{ 5970132718Skan unsigned int flags = SECTION_DEBUG; 5971132718Skan if (trampolines_created) 5972132718Skan flags |= SECTION_CODE; 5973132718Skan 5974169689Skan switch_to_section (get_section (".note.GNU-stack", flags, NULL)); 5975132718Skan} 5976132718Skan 5977169689Skan/* Output DIRECTIVE (a C string) followed by a newline. This is used as 5978169689Skan a get_unnamed_section callback. */ 5979169689Skan 5980169689Skanvoid 5981169689Skanoutput_section_asm_op (const void *directive) 5982169689Skan{ 5983169689Skan fprintf (asm_out_file, "%s\n", (const char *) directive); 5984169689Skan} 5985169689Skan 5986169689Skan/* Emit assembly code to switch to section NEW_SECTION. Do nothing if 5987169689Skan the current section is NEW_SECTION. */ 5988169689Skan 5989169689Skanvoid 5990169689Skanswitch_to_section (section *new_section) 5991169689Skan{ 5992169689Skan if (in_section == new_section) 5993169689Skan return; 5994169689Skan 5995169689Skan if (new_section->common.flags & SECTION_FORGET) 5996169689Skan in_section = NULL; 5997169689Skan else 5998169689Skan in_section = new_section; 5999169689Skan 6000169689Skan switch (SECTION_STYLE (new_section)) 6001169689Skan { 6002169689Skan case SECTION_NAMED: 6003169689Skan if (cfun 6004169689Skan && !cfun->unlikely_text_section_name 6005169689Skan && strcmp (new_section->named.name, 6006169689Skan UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0) 6007169689Skan cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME; 6008169689Skan 6009169689Skan targetm.asm_out.named_section (new_section->named.name, 6010169689Skan new_section->named.common.flags, 6011169689Skan new_section->named.decl); 6012169689Skan break; 6013169689Skan 6014169689Skan case SECTION_UNNAMED: 6015169689Skan new_section->unnamed.callback (new_section->unnamed.data); 6016169689Skan break; 6017169689Skan 6018169689Skan case SECTION_NOSWITCH: 6019169689Skan gcc_unreachable (); 6020169689Skan break; 6021169689Skan } 6022169689Skan 6023169689Skan new_section->common.flags |= SECTION_DECLARED; 6024169689Skan} 6025169689Skan 6026169689Skan/* If block symbol SYMBOL has not yet been assigned an offset, place 6027169689Skan it at the end of its block. */ 6028169689Skan 6029169689Skanvoid 6030169689Skanplace_block_symbol (rtx symbol) 6031169689Skan{ 6032169689Skan unsigned HOST_WIDE_INT size, mask, offset; 6033169689Skan struct constant_descriptor_rtx *desc; 6034169689Skan unsigned int alignment; 6035169689Skan struct object_block *block; 6036169689Skan tree decl; 6037169689Skan 6038169689Skan gcc_assert (SYMBOL_REF_BLOCK (symbol)); 6039169689Skan if (SYMBOL_REF_BLOCK_OFFSET (symbol) >= 0) 6040169689Skan return; 6041169689Skan 6042169689Skan /* Work out the symbol's size and alignment. */ 6043169689Skan if (CONSTANT_POOL_ADDRESS_P (symbol)) 6044169689Skan { 6045169689Skan desc = SYMBOL_REF_CONSTANT (symbol); 6046169689Skan alignment = desc->align; 6047169689Skan size = GET_MODE_SIZE (desc->mode); 6048169689Skan } 6049169689Skan else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol)) 6050169689Skan { 6051169689Skan decl = SYMBOL_REF_DECL (symbol); 6052169689Skan alignment = get_constant_alignment (decl); 6053169689Skan size = get_constant_size (decl); 6054169689Skan } 6055169689Skan else 6056169689Skan { 6057169689Skan decl = SYMBOL_REF_DECL (symbol); 6058169689Skan alignment = DECL_ALIGN (decl); 6059169689Skan size = tree_low_cst (DECL_SIZE_UNIT (decl), 1); 6060169689Skan } 6061169689Skan 6062169689Skan /* Calculate the object's offset from the start of the block. */ 6063169689Skan block = SYMBOL_REF_BLOCK (symbol); 6064169689Skan mask = alignment / BITS_PER_UNIT - 1; 6065169689Skan offset = (block->size + mask) & ~mask; 6066169689Skan SYMBOL_REF_BLOCK_OFFSET (symbol) = offset; 6067169689Skan 6068169689Skan /* Record the block's new alignment and size. */ 6069169689Skan block->alignment = MAX (block->alignment, alignment); 6070169689Skan block->size = offset + size; 6071169689Skan 6072169689Skan VEC_safe_push (rtx, gc, block->objects, symbol); 6073169689Skan} 6074169689Skan 6075169689Skan/* Return the anchor that should be used to address byte offset OFFSET 6076169689Skan from the first object in BLOCK. MODEL is the TLS model used 6077169689Skan to access it. */ 6078169689Skan 6079169689Skanrtx 6080169689Skanget_section_anchor (struct object_block *block, HOST_WIDE_INT offset, 6081169689Skan enum tls_model model) 6082169689Skan{ 6083169689Skan char label[100]; 6084169689Skan unsigned int begin, middle, end; 6085169689Skan unsigned HOST_WIDE_INT min_offset, max_offset, range, bias, delta; 6086169689Skan rtx anchor; 6087169689Skan 6088169689Skan /* Work out the anchor's offset. Use an offset of 0 for the first 6089169689Skan anchor so that we don't pessimize the case where we take the address 6090169689Skan of a variable at the beginning of the block. This is particularly 6091169689Skan useful when a block has only one variable assigned to it. 6092169689Skan 6093169689Skan We try to place anchors RANGE bytes apart, so there can then be 6094169689Skan anchors at +/-RANGE, +/-2 * RANGE, and so on, up to the limits of 6095169689Skan a ptr_mode offset. With some target settings, the lowest such 6096169689Skan anchor might be out of range for the lowest ptr_mode offset; 6097169689Skan likewise the highest anchor for the highest offset. Use anchors 6098169689Skan at the extreme ends of the ptr_mode range in such cases. 6099169689Skan 6100169689Skan All arithmetic uses unsigned integers in order to avoid 6101169689Skan signed overflow. */ 6102169689Skan max_offset = (unsigned HOST_WIDE_INT) targetm.max_anchor_offset; 6103169689Skan min_offset = (unsigned HOST_WIDE_INT) targetm.min_anchor_offset; 6104169689Skan range = max_offset - min_offset + 1; 6105169689Skan if (range == 0) 6106169689Skan offset = 0; 6107169689Skan else 6108169689Skan { 6109169689Skan bias = 1 << (GET_MODE_BITSIZE (ptr_mode) - 1); 6110169689Skan if (offset < 0) 6111169689Skan { 6112169689Skan delta = -(unsigned HOST_WIDE_INT) offset + max_offset; 6113169689Skan delta -= delta % range; 6114169689Skan if (delta > bias) 6115169689Skan delta = bias; 6116169689Skan offset = (HOST_WIDE_INT) (-delta); 6117169689Skan } 6118169689Skan else 6119169689Skan { 6120169689Skan delta = (unsigned HOST_WIDE_INT) offset - min_offset; 6121169689Skan delta -= delta % range; 6122169689Skan if (delta > bias - 1) 6123169689Skan delta = bias - 1; 6124169689Skan offset = (HOST_WIDE_INT) delta; 6125169689Skan } 6126169689Skan } 6127169689Skan 6128169689Skan /* Do a binary search to see if there's already an anchor we can use. 6129169689Skan Set BEGIN to the new anchor's index if not. */ 6130169689Skan begin = 0; 6131169689Skan end = VEC_length (rtx, block->anchors); 6132169689Skan while (begin != end) 6133169689Skan { 6134169689Skan middle = (end + begin) / 2; 6135169689Skan anchor = VEC_index (rtx, block->anchors, middle); 6136169689Skan if (SYMBOL_REF_BLOCK_OFFSET (anchor) > offset) 6137169689Skan end = middle; 6138169689Skan else if (SYMBOL_REF_BLOCK_OFFSET (anchor) < offset) 6139169689Skan begin = middle + 1; 6140169689Skan else if (SYMBOL_REF_TLS_MODEL (anchor) > model) 6141169689Skan end = middle; 6142169689Skan else if (SYMBOL_REF_TLS_MODEL (anchor) < model) 6143169689Skan begin = middle + 1; 6144169689Skan else 6145169689Skan return anchor; 6146169689Skan } 6147169689Skan 6148169689Skan /* Create a new anchor with a unique label. */ 6149169689Skan ASM_GENERATE_INTERNAL_LABEL (label, "LANCHOR", anchor_labelno++); 6150169689Skan anchor = create_block_symbol (ggc_strdup (label), block, offset); 6151169689Skan SYMBOL_REF_FLAGS (anchor) |= SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_ANCHOR; 6152169689Skan SYMBOL_REF_FLAGS (anchor) |= model << SYMBOL_FLAG_TLS_SHIFT; 6153169689Skan 6154169689Skan /* Insert it at index BEGIN. */ 6155169689Skan VEC_safe_insert (rtx, gc, block->anchors, begin, anchor); 6156169689Skan return anchor; 6157169689Skan} 6158169689Skan 6159169689Skan/* Output the objects in BLOCK. */ 6160169689Skan 6161169689Skanstatic void 6162169689Skanoutput_object_block (struct object_block *block) 6163169689Skan{ 6164169689Skan struct constant_descriptor_rtx *desc; 6165169689Skan unsigned int i; 6166169689Skan HOST_WIDE_INT offset; 6167169689Skan tree decl; 6168169689Skan rtx symbol; 6169169689Skan 6170169689Skan if (block->objects == NULL) 6171169689Skan return; 6172169689Skan 6173169689Skan /* Switch to the section and make sure that the first byte is 6174169689Skan suitably aligned. */ 6175169689Skan switch_to_section (block->sect); 6176169689Skan assemble_align (block->alignment); 6177169689Skan 6178169689Skan /* Define the values of all anchors relative to the current section 6179169689Skan position. */ 6180169689Skan for (i = 0; VEC_iterate (rtx, block->anchors, i, symbol); i++) 6181169689Skan targetm.asm_out.output_anchor (symbol); 6182169689Skan 6183169689Skan /* Output the objects themselves. */ 6184169689Skan offset = 0; 6185169689Skan for (i = 0; VEC_iterate (rtx, block->objects, i, symbol); i++) 6186169689Skan { 6187169689Skan /* Move to the object's offset, padding with zeros if necessary. */ 6188169689Skan assemble_zeros (SYMBOL_REF_BLOCK_OFFSET (symbol) - offset); 6189169689Skan offset = SYMBOL_REF_BLOCK_OFFSET (symbol); 6190169689Skan if (CONSTANT_POOL_ADDRESS_P (symbol)) 6191169689Skan { 6192169689Skan desc = SYMBOL_REF_CONSTANT (symbol); 6193169689Skan output_constant_pool_1 (desc, 1); 6194169689Skan offset += GET_MODE_SIZE (desc->mode); 6195169689Skan } 6196169689Skan else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol)) 6197169689Skan { 6198169689Skan decl = SYMBOL_REF_DECL (symbol); 6199169689Skan assemble_constant_contents (decl, XSTR (symbol, 0), 6200169689Skan get_constant_alignment (decl)); 6201169689Skan offset += get_constant_size (decl); 6202169689Skan } 6203169689Skan else 6204169689Skan { 6205169689Skan decl = SYMBOL_REF_DECL (symbol); 6206169689Skan assemble_variable_contents (decl, XSTR (symbol, 0), false); 6207169689Skan offset += tree_low_cst (DECL_SIZE_UNIT (decl), 1); 6208169689Skan } 6209169689Skan } 6210169689Skan} 6211169689Skan 6212169689Skan/* A htab_traverse callback used to call output_object_block for 6213169689Skan each member of object_block_htab. */ 6214169689Skan 6215169689Skanstatic int 6216169689Skanoutput_object_block_htab (void **slot, void *data ATTRIBUTE_UNUSED) 6217169689Skan{ 6218169689Skan output_object_block ((struct object_block *) (*slot)); 6219169689Skan return 1; 6220169689Skan} 6221169689Skan 6222169689Skan/* Output the definitions of all object_blocks. */ 6223169689Skan 6224169689Skanvoid 6225169689Skanoutput_object_blocks (void) 6226169689Skan{ 6227169689Skan htab_traverse (object_block_htab, output_object_block_htab, NULL); 6228169689Skan} 6229169689Skan 6230215840Sdim/* Emit text to declare externally defined symbols. It is needed to 6231215840Sdim properly support non-default visibility. */ 6232215840Sdimvoid 6233215840Sdimdefault_elf_asm_output_external (FILE *file ATTRIBUTE_UNUSED, 6234215840Sdim tree decl, 6235215840Sdim const char *name ATTRIBUTE_UNUSED) 6236215840Sdim{ 6237215840Sdim /* We output the name if and only if TREE_SYMBOL_REFERENCED is 6238215840Sdim set in order to avoid putting out names that are never really 6239215840Sdim used. */ 6240215840Sdim if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) 6241215840Sdim && targetm.binds_local_p (decl)) 6242215840Sdim maybe_assemble_visibility (decl); 6243215840Sdim} 6244215840Sdim 6245117395Skan#include "gt-varasm.h" 6246