118334Speter/* Declarations for insn-output.c. These functions are defined in recog.c, 218334Speter final.c, and varasm.c. 390075Sobrien Copyright (C) 1987, 1991, 1994, 1997, 1998, 4169689Skan 1999, 2000, 2001, 2002, 2003, 2004, 2005 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 23132718Skan#ifndef GCC_OUTPUT_H 24132718Skan#define GCC_OUTPUT_H 25132718Skan 2618334Speter/* Initialize data in final at the beginning of a compilation. */ 27132718Skanextern void init_final (const char *); 2818334Speter 2918334Speter/* Enable APP processing of subsequent output. 3018334Speter Used before the output from an `asm' statement. */ 31132718Skanextern void app_enable (void); 3218334Speter 3318334Speter/* Disable APP processing of subsequent output. 3418334Speter Called from varasm.c before most kinds of output. */ 35132718Skanextern void app_disable (void); 3618334Speter 3790075Sobrien/* Return the number of slots filled in the current 3818334Speter delayed branch sequence (we don't count the insn needing the 3918334Speter delay slot). Zero if not in a delayed branch sequence. */ 40132718Skanextern int dbr_sequence_length (void); 4118334Speter 4218334Speter/* Indicate that branch shortening hasn't yet been done. */ 43132718Skanextern void init_insn_lengths (void); 4418334Speter 4518334Speter/* Obtain the current length of an insn. If branch shortening has been done, 4618334Speter get its actual length. Otherwise, get its maximum length. */ 47132718Skanextern int get_attr_length (rtx); 4818334Speter 49169689Skan/* Obtain the current length of an insn. If branch shortening has been done, 50169689Skan get its actual length. Otherwise, get its minimum length. */ 51169689Skanextern int get_attr_min_length (rtx); 52169689Skan 5318334Speter/* Make a pass over all insns and compute their actual lengths by shortening 5418334Speter any branches of variable length if possible. */ 55132718Skanextern void shorten_branches (rtx); 5618334Speter 5718334Speter/* Output assembler code for the start of a function, 5818334Speter and initialize some of the variables in this file 5918334Speter for the new function. The label for the function and associated 6018334Speter assembler pseudo-ops have already been output in 6118334Speter `assemble_start_function'. */ 62132718Skanextern void final_start_function (rtx, FILE *, int); 6318334Speter 6418334Speter/* Output assembler code for the end of a function. 6518334Speter For clarity, args are same as those of `final_start_function' 6618334Speter even though not all of them are needed. */ 67132718Skanextern void final_end_function (void); 6818334Speter 6918334Speter/* Output assembler code for some insns: all or part of a function. */ 70169689Skanextern void final (rtx, FILE *, int); 7118334Speter 7218334Speter/* The final scan for one insn, INSN. Args are same as in `final', except 7318334Speter that INSN is the insn being scanned. Value returned is the next insn to 7418334Speter be scanned. */ 75169689Skanextern rtx final_scan_insn (rtx, FILE *, int, int, int *); 7618334Speter 7718334Speter/* Replace a SUBREG with a REG or a MEM, based on the thing it is a 7818334Speter subreg of. */ 79132718Skanextern rtx alter_subreg (rtx *); 8018334Speter 8118334Speter/* Report inconsistency between the assembler template and the operands. 8218334Speter In an `asm', it's the user's fault; otherwise, the compiler's fault. */ 83132718Skanextern void output_operand_lossage (const char *, ...) ATTRIBUTE_PRINTF_1; 8418334Speter 8518334Speter/* Output a string of assembler code, substituting insn operands. 8618334Speter Defined in final.c. */ 87132718Skanextern void output_asm_insn (const char *, rtx *); 8818334Speter 8950397Sobrien/* Compute a worst-case reference address of a branch so that it 9050397Sobrien can be safely used in the presence of aligned labels. 9150397Sobrien Defined in final.c. */ 92132718Skanextern int insn_current_reference_address (rtx); 9350397Sobrien 9452284Sobrien/* Find the alignment associated with a CODE_LABEL. 9552284Sobrien Defined in final.c. */ 96132718Skanextern int label_to_alignment (rtx); 9752284Sobrien 9818334Speter/* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol. */ 99132718Skanextern void output_asm_label (rtx); 10018334Speter 10118334Speter/* Print a memory reference operand for address X 10218334Speter using machine-dependent assembler syntax. */ 103132718Skanextern void output_address (rtx); 10418334Speter 10518334Speter/* Print an integer constant expression in assembler syntax. 10618334Speter Addition and subtraction are the only arithmetic 10718334Speter that may appear in these expressions. */ 108132718Skanextern void output_addr_const (FILE *, rtx); 10918334Speter 11018334Speter/* Output a string of assembler code, substituting numbers, strings 11118334Speter and fixed syntactic prefixes. */ 112223262Sbenl#if GCC_VERSION >= 3004 && !defined(__clang__) 113132718Skan#define ATTRIBUTE_ASM_FPRINTF(m, n) __attribute__ ((__format__ (__asm_fprintf__, m, n))) ATTRIBUTE_NONNULL(m) 114132718Skan/* This is a magic identifier which allows GCC to figure out the type 115132718Skan of HOST_WIDE_INT for %wd specifier checks. You must issue this 116132718Skan typedef before using the __asm_fprintf__ format attribute. */ 117132718Skantypedef HOST_WIDE_INT __gcc_host_wide_int__; 118132718Skan#else 119223262Sbenl/* FIXME(benl): what about %wd? */ 120132718Skan#define ATTRIBUTE_ASM_FPRINTF(m, n) ATTRIBUTE_NONNULL(m) 121132718Skan#endif 12218334Speter 123132718Skanextern void asm_fprintf (FILE *file, const char *p, ...) 124132718Skan ATTRIBUTE_ASM_FPRINTF(2, 3); 125132718Skan 12618334Speter/* Split up a CONST_DOUBLE or integer constant rtx into two rtx's for single 12718334Speter words. */ 128132718Skanextern void split_double (rtx, rtx *, rtx *); 12918334Speter 13018334Speter/* Return nonzero if this function has no function calls. */ 131132718Skanextern int leaf_function_p (void); 13218334Speter 133117395Skan/* Return 1 if branch is a forward branch. 13490075Sobrien Uses insn_shuid array, so it works only in the final pass. May be used by 13590075Sobrien output templates to add branch prediction hints, for example. */ 136132718Skanextern int final_forward_branch_p (rtx); 13790075Sobrien 13818334Speter/* Return 1 if this function uses only the registers that can be 13918334Speter safely renumbered. */ 140132718Skanextern int only_leaf_regs_used (void); 14118334Speter 14218334Speter/* Scan IN_RTX and its subexpressions, and renumber all regs into those 14318334Speter available in leaf functions. */ 144132718Skanextern void leaf_renumber_regs_insn (rtx); 14550397Sobrien 14690075Sobrien/* Locate the proper template for the given insn-code. */ 147132718Skanextern const char *get_insn_template (int, rtx); 14890075Sobrien 14950397Sobrien/* Functions in flow.c */ 150132718Skanextern int regno_clobbered_at_setjmp (int); 15118334Speter 15218334Speter/* Functions in varasm.c. */ 15318334Speter 15450397Sobrien/* Declare DECL to be a weak symbol. */ 155132718Skanextern void declare_weak (tree); 15696263Sobrien/* Merge weak status. */ 157132718Skanextern void merge_weak (tree, tree); 15850397Sobrien 15950397Sobrien/* Emit any pending weak declarations. */ 160132718Skanextern void weak_finish (void); 16150397Sobrien 16218334Speter/* Decode an `asm' spec for a declaration as a register name. 16318334Speter Return the register number, or -1 if nothing specified, 16418334Speter or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized, 16518334Speter or -3 if ASMSPEC is `cc' and is not recognized, 16618334Speter or -4 if ASMSPEC is `memory' and is not recognized. 16718334Speter Accept an exact spelling or a decimal number. 16818334Speter Prefixes such as % are optional. */ 169132718Skanextern int decode_reg_name (const char *); 17018334Speter 171132718Skanextern void assemble_alias (tree, tree); 17218334Speter 173132718Skanextern void default_assemble_visibility (tree, int); 17450397Sobrien 17518334Speter/* Output a string of literal assembler code 17618334Speter for an `asm' keyword used between functions. */ 177132718Skanextern void assemble_asm (tree); 17818334Speter 17918334Speter/* Output assembler code for the constant pool of a function and associated 18018334Speter with defining the name of the function. DECL describes the function. 18118334Speter NAME is the function's name. For the constant pool, we use the current 18218334Speter constant pool data. */ 183132718Skanextern void assemble_start_function (tree, const char *); 18418334Speter 18518334Speter/* Output assembler code associated with defining the size of the 18618334Speter function. DECL describes the function. NAME is the function's name. */ 187132718Skanextern void assemble_end_function (tree, const char *); 18818334Speter 18918334Speter/* Assemble everything that is needed for a variable or function declaration. 19018334Speter Not used for automatic variables, and not used for function definitions. 19118334Speter Should not be called for variables of incomplete structure type. 19218334Speter 19318334Speter TOP_LEVEL is nonzero if this variable has file scope. 19418334Speter AT_END is nonzero if this is the special handling, at end of compilation, 19518334Speter to define things that have had only tentative definitions. 19618334Speter DONT_OUTPUT_DATA if nonzero means don't actually output the 19718334Speter initial value (that will be done by the caller). */ 198132718Skanextern void assemble_variable (tree, int, int, int); 19918334Speter 200169689Skan/* Compute the alignment of variable specified by DECL. 201169689Skan DONT_OUTPUT_DATA is from assemble_variable. */ 202169689Skanextern void align_variable (tree decl, bool dont_output_data); 203169689Skan 204215840Sdim/* Queue for outputing something to declare an external symbol to the 205215840Sdim assembler. (Most assemblers don't need this, so we normally output 206215840Sdim nothing.) Do nothing if DECL is not external. */ 207132718Skanextern void assemble_external (tree); 20818334Speter 20990075Sobrien/* Assemble code to leave SIZE bytes of zeros. */ 210132718Skanextern void assemble_zeros (unsigned HOST_WIDE_INT); 21190075Sobrien 21290075Sobrien/* Assemble an alignment pseudo op for an ALIGN-bit boundary. */ 213132718Skanextern void assemble_align (int); 21490075Sobrien 21590075Sobrien/* Assemble a string constant with the specified C string as contents. */ 216132718Skanextern void assemble_string (const char *, int); 21790075Sobrien 21818334Speter/* Similar, for calling a library function FUN. */ 219132718Skanextern void assemble_external_libcall (rtx); 22018334Speter 22118334Speter/* Assemble a label named NAME. */ 222132718Skanextern void assemble_label (const char *); 22318334Speter 224169689Skan/* Output to FILE (an assembly file) a reference to NAME. If NAME 225169689Skan starts with a *, the rest of NAME is output verbatim. Otherwise 226169689Skan NAME is transformed in a target-specific way (usually by the 227169689Skan addition of an underscore). */ 228169689Skanextern void assemble_name_raw (FILE *, const char *); 229169689Skan 230169689Skan/* Like assemble_name_raw, but should be used when NAME might refer to 231169689Skan an entity that is also represented as a tree (like a function or 232169689Skan variable). If NAME does refer to such an entity, that entity will 233169689Skan be marked as referenced. */ 234132718Skanextern void assemble_name (FILE *, const char *); 23518334Speter 23690075Sobrien/* Return the assembler directive for creating a given kind of integer 23790075Sobrien object. SIZE is the number of bytes in the object and ALIGNED_P 23890075Sobrien indicates whether it is known to be aligned. Return NULL if the 23990075Sobrien assembly dialect has no such directive. 24090075Sobrien 24190075Sobrien The returned string should be printed at the start of a new line and 24290075Sobrien be followed immediately by the object's initial value. */ 243132718Skanextern const char *integer_asm_op (int, int); 24490075Sobrien 24590075Sobrien/* Use directive OP to assemble an integer object X. Print OP at the 24690075Sobrien start of the line, followed immediately by the value of X. */ 247132718Skanextern void assemble_integer_with_op (const char *, rtx); 24818334Speter 24990075Sobrien/* The default implementation of the asm_out.integer target hook. */ 250132718Skanextern bool default_assemble_integer (rtx, unsigned int, int); 25118334Speter 25290075Sobrien/* Assemble the integer constant X into an object of SIZE bytes. ALIGN is 25390075Sobrien the alignment of the integer in bits. Return 1 if we were able to output 254169689Skan the constant, otherwise 0. If FORCE is nonzero the constant must 255169689Skan be outputable. */ 256132718Skanextern bool assemble_integer (rtx, unsigned, unsigned, int); 25790075Sobrien 25890075Sobrien/* An interface to assemble_integer for the common case in which a value is 25990075Sobrien fully aligned and must be printed. VALUE is the value of the integer 26090075Sobrien object and SIZE is the number of bytes it contains. */ 26190075Sobrien#define assemble_aligned_integer(SIZE, VALUE) \ 26290075Sobrien assemble_integer (VALUE, SIZE, (SIZE) * BITS_PER_UNIT, 1) 26390075Sobrien 264117395Skan#ifdef REAL_VALUE_TYPE_SIZE 26518334Speter/* Assemble the floating-point constant D into an object of size MODE. */ 266132718Skanextern void assemble_real (REAL_VALUE_TYPE, enum machine_mode, unsigned); 26718334Speter#endif 26818334Speter 26918334Speter/* Return the size of the constant pool. */ 270132718Skanextern int get_pool_size (void); 27118334Speter 27290075Sobrien#ifdef HAVE_peephole 273132718Skanextern rtx peephole (rtx); 27490075Sobrien#endif 27590075Sobrien 276169689Skanextern void output_shared_constant_pool (void); 27718334Speter 278169689Skanextern void output_object_blocks (void); 279169689Skan 280169689Skan/* Whether a constructor CTOR is a valid static constant initializer if all 281169689Skan its elements are. This used to be internal to initializer_constant_valid_p 282169689Skan and has been exposed to let other functions like categorize_ctor_elements 283169689Skan evaluate the property while walking a constructor for other purposes. */ 284169689Skan 285169689Skanextern bool constructor_static_from_elts_p (tree); 286169689Skan 28790075Sobrien/* Return nonzero if VALUE is a valid constant-valued expression 28890075Sobrien for use in initializing a static variable; one that can be an 28990075Sobrien element of a "constant" initializer. 29090075Sobrien 29190075Sobrien Return null_pointer_node if the value is absolute; 29290075Sobrien if it is relocatable, return the variable that determines the relocation. 29390075Sobrien We assume that VALUE has been folded as much as possible; 29490075Sobrien therefore, we do not need to check for such things as 29590075Sobrien arithmetic-combinations of integers. */ 296132718Skanextern tree initializer_constant_valid_p (tree, tree); 29790075Sobrien 29818334Speter/* Output assembler code for constant EXP to FILE, with no label. 29918334Speter This includes the pseudo-op such as ".int" or ".byte", and a newline. 30018334Speter Assumes output_addressed_constants has been done on EXP already. 30118334Speter 30218334Speter Generate exactly SIZE bytes of assembler data, padding at the end 30390075Sobrien with zeros if necessary. SIZE must always be specified. 30490075Sobrien 30590075Sobrien ALIGN is the alignment in bits that may be assumed for the data. */ 306132718Skanextern void output_constant (tree, unsigned HOST_WIDE_INT, unsigned int); 30718334Speter 30818334Speter/* When outputting delayed branch sequences, this rtx holds the 30918334Speter sequence being output. It is null when no delayed branch 31018334Speter sequence is being output, so it can be used as a test in the 31118334Speter insn output code. 31218334Speter 31318334Speter This variable is defined in final.c. */ 31418334Speterextern rtx final_sequence; 31518334Speter 31690075Sobrien/* The line number of the beginning of the current function. Various 31790075Sobrien md code needs this so that it can output relative linenumbers. */ 31818334Speter 31990075Sobrien#ifdef SDB_DEBUGGING_INFO /* Avoid undef sym in certain broken linkers. */ 32090075Sobrienextern int sdb_begin_function_line; 32190075Sobrien#endif 32218334Speter 32390075Sobrien/* File in which assembler code is being written. */ 32418334Speter 32590075Sobrien#ifdef BUFSIZ 32690075Sobrienextern FILE *asm_out_file; 32790075Sobrien#endif 32818334Speter 32990075Sobrien/* The first global object in the file. */ 33090075Sobrienextern const char *first_global_object_name; 33118334Speter 33290075Sobrien/* The first weak object in the file. */ 33390075Sobrienextern const char *weak_global_object_name; 33418334Speter 33552284Sobrien/* Nonzero if function being compiled doesn't contain any calls 33652284Sobrien (ignoring the prologue and epilogue). This is set prior to 33752284Sobrien local register allocation and is valid for the remaining 33890075Sobrien compiler passes. */ 33952284Sobrien 34052284Sobrienextern int current_function_is_leaf; 34152284Sobrien 34252284Sobrien/* Nonzero if function being compiled doesn't modify the stack pointer 34352284Sobrien (ignoring the prologue and epilogue). This is only valid after 34490075Sobrien life_analysis has run. */ 34552284Sobrien 34652284Sobrienextern int current_function_sp_is_unchanging; 34752284Sobrien 34852284Sobrien/* Nonzero if the function being compiled is a leaf function which only 34952284Sobrien uses leaf registers. This is valid after reload (specifically after 35052284Sobrien sched2) and is useful only if the port defines LEAF_REGISTERS. */ 35152284Sobrien 35252284Sobrienextern int current_function_uses_only_leaf_regs; 35352284Sobrien 35452284Sobrien/* Default file in which to dump debug output. */ 35552284Sobrien 35652284Sobrien#ifdef BUFSIZ 357169689Skanextern FILE *dump_file; 35852284Sobrien#endif 35952284Sobrien 36090075Sobrien/* Nonnull if the insn currently being emitted was a COND_EXEC pattern. */ 361132718Skanextern rtx current_insn_predicate; 36290075Sobrien 36390075Sobrien/* Last insn processed by final_scan_insn. */ 364132718Skanextern rtx current_output_insn; 36590075Sobrien 366117395Skan/* Nonzero while outputting an `asm' with operands. 367169689Skan This means that inconsistencies are the user's fault, so don't die. 368117395Skan The precise value is the insn being output, to pass to error_for_asm. */ 369117395Skanextern rtx this_is_asm_operands; 37050397Sobrien 371169689Skan/* Carry information from ASM_DECLARE_OBJECT_NAME 372169689Skan to ASM_FINISH_DECLARE_OBJECT. */ 373169689Skanextern int size_directive_output; 374169689Skanextern tree last_assemble_variable_decl; 375169689Skan 376169689Skanextern bool first_function_block_is_cold; 377169689Skan 378117395Skan/* Decide whether DECL needs to be in a writable section. 379117395Skan RELOC is the same as for SELECT_SECTION. */ 380132718Skanextern bool decl_readonly_section (tree, int); 38152284Sobrien 382132718Skan/* This can be used to compute RELOC for the function above, when 383132718Skan given a constant expression. */ 384132718Skanextern int compute_reloc_for_constant (tree); 385132718Skan 38652284Sobrien/* User label prefix in effect for this compilation. */ 38752284Sobrienextern const char *user_label_prefix; 38852284Sobrien 38990075Sobrien/* Default target function prologue and epilogue assembler output. */ 390132718Skanextern void default_function_pro_epilogue (FILE *, HOST_WIDE_INT); 39190075Sobrien 39290075Sobrien/* Default target hook that outputs nothing to a stream. */ 393132718Skanextern void no_asm_to_stream (FILE *); 39490075Sobrien 395132718Skan/* Flags controlling properties of a section. */ 39690075Sobrien#define SECTION_ENTSIZE 0x000ff /* entity size in section */ 39790075Sobrien#define SECTION_CODE 0x00100 /* contains code */ 39890075Sobrien#define SECTION_WRITE 0x00200 /* data is writable */ 39990075Sobrien#define SECTION_DEBUG 0x00400 /* contains debug data */ 40090075Sobrien#define SECTION_LINKONCE 0x00800 /* is linkonce */ 40190075Sobrien#define SECTION_SMALL 0x01000 /* contains "small data" */ 40290075Sobrien#define SECTION_BSS 0x02000 /* contains zeros only */ 40390075Sobrien#define SECTION_FORGET 0x04000 /* forget that we've entered the section */ 40490075Sobrien#define SECTION_MERGE 0x08000 /* contains mergeable data */ 40590075Sobrien#define SECTION_STRINGS 0x10000 /* contains zero terminated strings without 40690075Sobrien embedded zeros */ 40796263Sobrien#define SECTION_OVERRIDE 0x20000 /* allow override of default flags */ 408117395Skan#define SECTION_TLS 0x40000 /* contains thread-local storage */ 409117395Skan#define SECTION_NOTYPE 0x80000 /* don't output @progbits */ 410169689Skan#define SECTION_DECLARED 0x100000 /* section has been used */ 411169689Skan#define SECTION_STYLE_MASK 0x600000 /* bits used for SECTION_STYLE */ 412169689Skan#define SECTION_COMMON 0x800000 /* contains common data */ 413169689Skan#define SECTION_MACH_DEP 0x1000000 /* subsequent bits reserved for target */ 41490075Sobrien 415169689Skan/* This SECTION_STYLE is used for unnamed sections that we can switch 416169689Skan to using a special assembler directive. */ 417169689Skan#define SECTION_UNNAMED 0x000000 418169689Skan 419169689Skan/* This SECTION_STYLE is used for named sections that we can switch 420169689Skan to using a general section directive. */ 421169689Skan#define SECTION_NAMED 0x200000 422169689Skan 423169689Skan/* This SECTION_STYLE is used for sections that we cannot switch to at 424169689Skan all. The choice of section is implied by the directive that we use 425169689Skan to declare the object. */ 426169689Skan#define SECTION_NOSWITCH 0x400000 427169689Skan 428169689Skan/* A helper function for default_elf_select_section and 429169689Skan default_elf_unique_section. Categorizes the DECL. */ 430169689Skan 431169689Skanenum section_category 432169689Skan{ 433169689Skan SECCAT_TEXT, 434169689Skan 435169689Skan SECCAT_RODATA, 436169689Skan SECCAT_RODATA_MERGE_STR, 437169689Skan SECCAT_RODATA_MERGE_STR_INIT, 438169689Skan SECCAT_RODATA_MERGE_CONST, 439169689Skan SECCAT_SRODATA, 440169689Skan 441169689Skan SECCAT_DATA, 442169689Skan 443169689Skan /* To optimize loading of shared programs, define following subsections 444169689Skan of data section: 445169689Skan _REL Contains data that has relocations, so they get grouped 446169689Skan together and dynamic linker will visit fewer pages in memory. 447169689Skan _RO Contains data that is otherwise read-only. This is useful 448169689Skan with prelinking as most relocations won't be dynamically 449169689Skan linked and thus stay read only. 450169689Skan _LOCAL Marks data containing relocations only to local objects. 451169689Skan These relocations will get fully resolved by prelinking. */ 452169689Skan SECCAT_DATA_REL, 453169689Skan SECCAT_DATA_REL_LOCAL, 454169689Skan SECCAT_DATA_REL_RO, 455169689Skan SECCAT_DATA_REL_RO_LOCAL, 456169689Skan 457169689Skan SECCAT_SDATA, 458169689Skan SECCAT_TDATA, 459169689Skan 460169689Skan SECCAT_BSS, 461169689Skan SECCAT_SBSS, 462169689Skan SECCAT_TBSS 463169689Skan}; 464169689Skan 465169689Skan/* Information that is provided by all instances of the section type. */ 466169689Skanstruct section_common GTY(()) { 467169689Skan /* The set of SECTION_* flags that apply to this section. */ 468169689Skan unsigned int flags; 469169689Skan}; 470169689Skan 471169689Skan/* Information about a SECTION_NAMED section. */ 472169689Skanstruct named_section GTY(()) { 473169689Skan struct section_common common; 474169689Skan 475169689Skan /* The name of the section. */ 476169689Skan const char *name; 477169689Skan 478169689Skan /* If nonnull, the VAR_DECL or FUNCTION_DECL with which the 479169689Skan section is associated. */ 480169689Skan tree decl; 481169689Skan}; 482169689Skan 483169689Skan/* A callback that writes the assembly code for switching to an unnamed 484169689Skan section. The argument provides callback-specific data. */ 485169689Skantypedef void (*unnamed_section_callback) (const void *); 486169689Skan 487169689Skan/* Information about a SECTION_UNNAMED section. */ 488169689Skanstruct unnamed_section GTY(()) { 489169689Skan struct section_common common; 490169689Skan 491169689Skan /* The callback used to switch to the section, and the data that 492169689Skan should be passed to the callback. */ 493169689Skan unnamed_section_callback GTY ((skip)) callback; 494169689Skan const void *GTY ((skip)) data; 495169689Skan 496169689Skan /* The next entry in the chain of unnamed sections. */ 497169689Skan section *next; 498169689Skan}; 499169689Skan 500169689Skan/* A callback that writes the assembly code for a decl in a 501169689Skan SECTION_NOSWITCH section. DECL is the decl that should be assembled 502169689Skan and NAME is the name of its SYMBOL_REF. SIZE is the size of the decl 503169689Skan in bytes and ROUNDED is that size rounded up to the next 504169689Skan BIGGEST_ALIGNMENT / BITS_PER_UNIT boundary. 505169689Skan 506169689Skan Return true if the callback used DECL_ALIGN to set the object's 507169689Skan alignment. A false return value implies that we are relying 508169689Skan on the rounded size to align the decl. */ 509169689Skantypedef bool (*noswitch_section_callback) (tree decl, const char *name, 510169689Skan unsigned HOST_WIDE_INT size, 511169689Skan unsigned HOST_WIDE_INT rounded); 512169689Skan 513169689Skan/* Information about a SECTION_NOSWITCH section. */ 514169689Skanstruct noswitch_section GTY(()) { 515169689Skan struct section_common common; 516169689Skan 517169689Skan /* The callback used to assemble decls in this section. */ 518169689Skan noswitch_section_callback GTY ((skip)) callback; 519169689Skan}; 520169689Skan 521169689Skan/* Information about a section, which may be named or unnamed. */ 522169689Skanunion section GTY ((desc ("SECTION_STYLE (&(%h))"))) 523169689Skan{ 524169689Skan struct section_common GTY ((skip)) common; 525169689Skan struct named_section GTY ((tag ("SECTION_NAMED"))) named; 526169689Skan struct unnamed_section GTY ((tag ("SECTION_UNNAMED"))) unnamed; 527169689Skan struct noswitch_section GTY ((tag ("SECTION_NOSWITCH"))) noswitch; 528169689Skan}; 529169689Skan 530169689Skan/* Return the style of section SECT. */ 531169689Skan#define SECTION_STYLE(SECT) ((SECT)->common.flags & SECTION_STYLE_MASK) 532169689Skan 533169689Skanstruct object_block; 534169689Skan 535169689Skan/* Special well-known sections. */ 536169689Skanextern GTY(()) section *text_section; 537169689Skanextern GTY(()) section *data_section; 538169689Skanextern GTY(()) section *readonly_data_section; 539169689Skanextern GTY(()) section *sdata_section; 540169689Skanextern GTY(()) section *ctors_section; 541169689Skanextern GTY(()) section *dtors_section; 542169689Skanextern GTY(()) section *bss_section; 543169689Skanextern GTY(()) section *sbss_section; 544169689Skanextern GTY(()) section *exception_section; 545169689Skanextern GTY(()) section *eh_frame_section; 546169689Skanextern GTY(()) section *tls_comm_section; 547169689Skanextern GTY(()) section *comm_section; 548169689Skanextern GTY(()) section *lcomm_section; 549169689Skanextern GTY(()) section *bss_noswitch_section; 550169689Skan 551169689Skanextern GTY(()) section *in_section; 552169689Skanextern GTY(()) bool in_cold_section_p; 553169689Skan 554169689Skanextern section *get_unnamed_section (unsigned int, void (*) (const void *), 555169689Skan const void *); 556169689Skanextern section *get_section (const char *, unsigned int, tree); 557169689Skanextern section *get_named_section (tree, const char *, int); 558169689Skanextern void place_block_symbol (rtx); 559169689Skanextern rtx get_section_anchor (struct object_block *, HOST_WIDE_INT, 560169689Skan enum tls_model); 561169689Skanextern section *mergeable_constant_section (enum machine_mode, 562169689Skan unsigned HOST_WIDE_INT, 563169689Skan unsigned int); 564169689Skanextern section *function_section (tree); 565169689Skanextern section *unlikely_text_section (void); 566169689Skanextern section *current_function_section (void); 567169689Skan 568169689Skanextern bool unlikely_text_section_p (section *); 569169689Skanextern void switch_to_section (section *); 570169689Skanextern void output_section_asm_op (const void *); 571169689Skan 572132718Skanextern unsigned int default_section_type_flags (tree, const char *, int); 57390075Sobrien 574169689Skanextern bool have_global_bss_p (void); 575169689Skanextern void default_no_named_section (const char *, unsigned int, tree); 576169689Skanextern void default_elf_asm_named_section (const char *, unsigned int, tree); 577169689Skanextern enum section_category categorize_decl_for_section (tree, int); 578169689Skanextern void default_coff_asm_named_section (const char *, unsigned int, tree); 579169689Skanextern void default_pe_asm_named_section (const char *, unsigned int, tree); 58090075Sobrien 581132718Skanextern void default_stabs_asm_out_destructor (rtx, int); 582132718Skanextern void default_named_section_asm_out_destructor (rtx, int); 583132718Skanextern void default_dtor_section_asm_out_destructor (rtx, int); 584132718Skanextern void default_stabs_asm_out_constructor (rtx, int); 585132718Skanextern void default_named_section_asm_out_constructor (rtx, int); 586132718Skanextern void default_ctor_section_asm_out_constructor (rtx, int); 58790075Sobrien 588169689Skanextern section *default_select_section (tree, int, unsigned HOST_WIDE_INT); 589169689Skanextern section *default_elf_select_section (tree, int, unsigned HOST_WIDE_INT); 590132718Skanextern void default_unique_section (tree, int); 591169689Skanextern section *default_function_rodata_section (tree); 592169689Skanextern section *default_no_function_rodata_section (tree); 593169689Skanextern section *default_select_rtx_section (enum machine_mode, rtx, 594132718Skan unsigned HOST_WIDE_INT); 595169689Skanextern section *default_elf_select_rtx_section (enum machine_mode, rtx, 596169689Skan unsigned HOST_WIDE_INT); 597132718Skanextern void default_encode_section_info (tree, rtx, int); 598132718Skanextern const char *default_strip_name_encoding (const char *); 599169689Skanextern void default_asm_output_anchor (rtx); 600169689Skanextern bool default_use_anchors_for_symbol_p (rtx); 601132718Skanextern bool default_binds_local_p (tree); 602132718Skanextern bool default_binds_local_p_1 (tree, int); 603132718Skanextern void default_globalize_label (FILE *, const char *); 604169689Skanextern void default_emit_unwind_label (FILE *, tree, int, int); 605169689Skanextern void default_emit_except_table_label (FILE *); 606132718Skanextern void default_internal_label (FILE *, const char *, unsigned long); 607132718Skanextern void default_file_start (void); 608132718Skanextern void file_end_indicate_exec_stack (void); 609132718Skanextern bool default_valid_pointer_mode (enum machine_mode); 61090075Sobrien 611215840Sdimextern void default_elf_asm_output_external (FILE *file, tree, 612215840Sdim const char *); 613215840Sdimextern int maybe_assemble_visibility (tree); 614215840Sdim 615132718Skanextern int default_address_cost (rtx); 616117395Skan 617169689Skan/* dbxout helper functions */ 618169689Skan#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO 619169689Skan 620169689Skanextern void dbxout_int (int); 621169689Skanextern void dbxout_stabd (int, int); 622169689Skanextern void dbxout_begin_stabn (int); 623169689Skanextern void dbxout_begin_stabn_sline (int); 624169689Skanextern void dbxout_begin_empty_stabs (int); 625169689Skanextern void dbxout_begin_simple_stabs (const char *, int); 626169689Skanextern void dbxout_begin_simple_stabs_desc (const char *, int, int); 627169689Skan 628169689Skanextern void dbxout_stab_value_zero (void); 629169689Skanextern void dbxout_stab_value_label (const char *); 630169689Skanextern void dbxout_stab_value_label_diff (const char *, const char *); 631169689Skanextern void dbxout_stab_value_internal_label (const char *, int *); 632169689Skanextern void dbxout_stab_value_internal_label_diff (const char *, int *, 633169689Skan const char *); 634169689Skan 635169689Skan#endif 636169689Skan 637132718Skan#endif /* ! GCC_OUTPUT_H */ 638