OSDN Git Service

* g++.dg/cdce3.C: Skip on alpha*-dec-osf5*.
[pf3gnuchains/gcc-fork.git] / gcc / output.h
index 7a87b82..5d771d7 100644 (file)
@@ -1,13 +1,13 @@
 /* Declarations for insn-output.c.  These functions are defined in recog.c,
    final.c, and varasm.c.
-   Copyright (C) 1987, 1991, 1994, 1997, 1998,
-   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
+   2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -16,228 +16,153 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
-/* Compute branch alignments based on frequency information in the CFG.  */
-extern void compute_alignments  PARAMS ((void));
+#ifndef GCC_OUTPUT_H
+#define GCC_OUTPUT_H
 
 /* Initialize data in final at the beginning of a compilation.  */
-extern void init_final         PARAMS ((const char *));
-
-/* Called at end of source file,
-   to output the block-profiling table for this entire compilation.  */
-extern void end_final          PARAMS ((const char *));
+extern void init_final (const char *);
 
 /* Enable APP processing of subsequent output.
    Used before the output from an `asm' statement.  */
-extern void app_enable         PARAMS ((void));
+extern void app_enable (void);
 
 /* Disable APP processing of subsequent output.
    Called from varasm.c before most kinds of output.  */
-extern void app_disable                PARAMS ((void));
+extern void app_disable (void);
 
 /* Return the number of slots filled in the current
    delayed branch sequence (we don't count the insn needing the
    delay slot).   Zero if not in a delayed branch sequence.  */
-extern int dbr_sequence_length PARAMS ((void));
+extern int dbr_sequence_length (void);
 
 /* Indicate that branch shortening hasn't yet been done.  */
-extern void init_insn_lengths  PARAMS ((void));
+extern void init_insn_lengths (void);
 
-#ifdef RTX_CODE
 /* Obtain the current length of an insn.  If branch shortening has been done,
    get its actual length.  Otherwise, get its maximum length.  */
-extern int get_attr_length     PARAMS ((rtx));
+extern int get_attr_length (rtx);
+
+/* Obtain the current length of an insn.  If branch shortening has been done,
+   get its actual length.  Otherwise, get its minimum length.  */
+extern int get_attr_min_length (rtx);
 
 /* Make a pass over all insns and compute their actual lengths by shortening
    any branches of variable length if possible.  */
-extern void shorten_branches   PARAMS ((rtx));
+extern void shorten_branches (rtx);
 
 /* Output assembler code for the start of a function,
    and initialize some of the variables in this file
    for the new function.  The label for the function and associated
    assembler pseudo-ops have already been output in
    `assemble_start_function'.  */
-extern void final_start_function  PARAMS ((rtx, FILE *, int));
+extern void final_start_function (rtx, FILE *, int);
 
 /* Output assembler code for the end of a function.
    For clarity, args are same as those of `final_start_function'
    even though not all of them are needed.  */
-extern void final_end_function  PARAMS ((void));
+extern void final_end_function (void);
 
 /* Output assembler code for some insns: all or part of a function.  */
-extern void final              PARAMS ((rtx, FILE *, int, int));
+extern void final (rtx, FILE *, int);
 
 /* The final scan for one insn, INSN.  Args are same as in `final', except
    that INSN is the insn being scanned.  Value returned is the next insn to
    be scanned.  */
-extern rtx final_scan_insn     PARAMS ((rtx, FILE *, int, int, int));
+extern rtx final_scan_insn (rtx, FILE *, int, int, int *);
 
 /* Replace a SUBREG with a REG or a MEM, based on the thing it is a
    subreg of.  */
-extern rtx alter_subreg PARAMS ((rtx *));
+extern rtx alter_subreg (rtx *);
 
 /* Report inconsistency between the assembler template and the operands.
    In an `asm', it's the user's fault; otherwise, the compiler's fault.  */
-extern void output_operand_lossage  PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1;
+extern void output_operand_lossage (const char *, ...) ATTRIBUTE_PRINTF_1;
 
 /* Output a string of assembler code, substituting insn operands.
    Defined in final.c.  */
-extern void output_asm_insn    PARAMS ((const char *, rtx *));
+extern void output_asm_insn (const char *, rtx *);
 
 /* Compute a worst-case reference address of a branch so that it
    can be safely used in the presence of aligned labels.
    Defined in final.c.  */
-extern int insn_current_reference_address      PARAMS ((rtx));
+extern int insn_current_reference_address (rtx);
 
 /* Find the alignment associated with a CODE_LABEL.
    Defined in final.c.  */
-extern int label_to_alignment  PARAMS ((rtx));
+extern int label_to_alignment (rtx);
+
+/* Find the alignment maximum skip associated with a CODE_LABEL.
+   Defined in final.c.  */
+extern int label_to_max_skip (rtx);
 
 /* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.  */
-extern void output_asm_label   PARAMS ((rtx));
+extern void output_asm_label (rtx);
+
+/* Marks SYMBOL_REFs in x as referenced through use of assemble_external.  */
+extern void mark_symbol_refs_as_used (rtx);
 
 /* Print a memory reference operand for address X
    using machine-dependent assembler syntax.  */
-extern void output_address     PARAMS ((rtx));
+extern void output_address (rtx);
 
 /* Print an integer constant expression in assembler syntax.
    Addition and subtraction are the only arithmetic
    that may appear in these expressions.  */
-extern void output_addr_const PARAMS ((FILE *, rtx));
+extern void output_addr_const (FILE *, rtx);
 
 /* Output a string of assembler code, substituting numbers, strings
    and fixed syntactic prefixes.  */
-extern void asm_fprintf                PARAMS ((FILE *file, const char *p, ...));
+#if GCC_VERSION >= 3004
+#define ATTRIBUTE_ASM_FPRINTF(m, n) __attribute__ ((__format__ (__asm_fprintf__, m, n))) ATTRIBUTE_NONNULL(m)
+/* This is a magic identifier which allows GCC to figure out the type
+   of HOST_WIDE_INT for %wd specifier checks.  You must issue this
+   typedef before using the __asm_fprintf__ format attribute.  */
+typedef HOST_WIDE_INT __gcc_host_wide_int__;
+#else
+#define ATTRIBUTE_ASM_FPRINTF(m, n) ATTRIBUTE_NONNULL(m)
+#endif
+
+extern void asm_fprintf (FILE *file, const char *p, ...)
+     ATTRIBUTE_ASM_FPRINTF(2, 3);
 
 /* Split up a CONST_DOUBLE or integer constant rtx into two rtx's for single
    words.  */
-extern void split_double       PARAMS ((rtx, rtx *, rtx *));
+extern void split_double (rtx, rtx *, rtx *);
 
 /* Return nonzero if this function has no function calls.  */
-extern int leaf_function_p     PARAMS ((void));
+extern int leaf_function_p (void);
 
-/* Return 1 if branch is an forward branch.
+/* Return 1 if branch is a forward branch.
    Uses insn_shuid array, so it works only in the final pass.  May be used by
    output templates to add branch prediction hints, for example.  */
-extern int final_forward_branch_p PARAMS ((rtx));
+extern int final_forward_branch_p (rtx);
 
 /* Return 1 if this function uses only the registers that can be
    safely renumbered.  */
-extern int only_leaf_regs_used PARAMS ((void));
+extern int only_leaf_regs_used (void);
 
 /* Scan IN_RTX and its subexpressions, and renumber all regs into those
    available in leaf functions.  */
-extern void leaf_renumber_regs_insn PARAMS ((rtx));
+extern void leaf_renumber_regs_insn (rtx);
 
 /* Locate the proper template for the given insn-code.  */
-extern const char *get_insn_template PARAMS ((int, rtx));
-
-/* Add function NAME to the weak symbols list.  VALUE is a weak alias
-   associated with NAME.  */
-extern int add_weak PARAMS ((tree, const char *, const char *));
-
-/* Functions in flow.c */
-extern void allocate_for_life_analysis PARAMS ((void));
-extern int regno_uninitialized         PARAMS ((unsigned int));
-extern int regno_clobbered_at_setjmp   PARAMS ((int));
-extern void find_basic_blocks          PARAMS ((rtx, int, FILE *));
-extern bool cleanup_cfg                        PARAMS ((int));
-extern bool delete_unreachable_blocks  PARAMS ((void));
-extern void check_function_return_warnings PARAMS ((void));
-#endif
+extern const char *get_insn_template (int, rtx);
 
 /* Functions in varasm.c.  */
 
-/* Tell assembler to switch to text section.  */
-extern void text_section               PARAMS ((void));
-
-/* Tell assembler to switch to data section.  */
-extern void data_section               PARAMS ((void));
-
-/* Tell assembler to make sure its in the data section.  */
-extern void force_data_section         PARAMS ((void));
-
-/* Tell assembler to switch to read-only data section.  This is normally
-   the text section.  */
-extern void readonly_data_section      PARAMS ((void));
-
-/* Determine if we're in the text section.  */
-extern int in_text_section             PARAMS ((void));
-
-#ifdef CTORS_SECTION_ASM_OP
-extern void ctors_section PARAMS ((void));
-#endif
-
-#ifdef DTORS_SECTION_ASM_OP
-extern void dtors_section PARAMS ((void));
-#endif
-
-#ifdef BSS_SECTION_ASM_OP
-extern void bss_section PARAMS ((void));
-#endif
-
-#ifdef CONST_SECTION_ASM_OP
-extern void const_section PARAMS ((void));
-#endif
-
-#ifdef INIT_SECTION_ASM_OP
-extern void init_section PARAMS ((void));
-#endif
-
-#ifdef FINI_SECTION_ASM_OP
-extern void fini_section PARAMS ((void));
-#endif
-
-#ifdef EXPORTS_SECTION_ASM_OP
-extern void exports_section PARAMS ((void));
-#endif
-
-#ifdef TDESC_SECTION_ASM_OP
-extern void tdesc_section PARAMS ((void));
-#endif
-
-#ifdef DRECTVE_SECTION_ASM_OP
-extern void drectve_section PARAMS ((void));
-#endif
-
-#ifdef SDATA_SECTION_ASM_OP
-extern void sdata_section PARAMS ((void));
-#endif
-
-#ifdef RDATA_SECTION_ASM_OP
-extern void rdata_section PARAMS ((void));
-#endif
-
-#ifdef TREE_CODE
-/* Tell assembler to change to section NAME for DECL.
-   If DECL is NULL, just switch to section NAME.
-   If NAME is NULL, get the name from DECL.
-   If RELOC is 1, the initializer for DECL contains relocs.  */
-extern void named_section              PARAMS ((tree, const char *, int));
-
-/* Tell assembler to switch to the section for function DECL.  */
-extern void function_section           PARAMS ((tree));
-
-/* Tell assembler to switch to the section for string merging.  */
-extern void mergeable_string_section   PARAMS ((tree, unsigned HOST_WIDE_INT,
-                                                unsigned int));
-
-/* Tell assembler to switch to the section for constant merging.  */
-extern void mergeable_constant_section PARAMS ((enum machine_mode,
-                                                unsigned HOST_WIDE_INT,
-                                                unsigned int));
-
 /* Declare DECL to be a weak symbol.  */
-extern void declare_weak               PARAMS ((tree));
+extern void declare_weak (tree);
 /* Merge weak status.  */
-extern void merge_weak                 PARAMS ((tree, tree));
-#endif /* TREE_CODE */
+extern void merge_weak (tree, tree);
 
 /* Emit any pending weak declarations.  */
-extern void weak_finish                        PARAMS ((void));
+extern void weak_finish (void);
+
+/* Emit any pending emutls declarations and initializations.  */
+extern void emutls_finish (void);
 
 /* Decode an `asm' spec for a declaration as a register name.
    Return the register number, or -1 if nothing specified,
@@ -246,33 +171,25 @@ extern void weak_finish                   PARAMS ((void));
    or -4 if ASMSPEC is `memory' and is not recognized.
    Accept an exact spelling or a decimal number.
    Prefixes such as % are optional.  */
-extern int decode_reg_name             PARAMS ((const char *));
-
-#ifdef TREE_CODE
-/* Make the rtl for variable VAR be volatile.
-   Use this only for static variables.  */
-extern void make_var_volatile          PARAMS ((tree));
+extern int decode_reg_name (const char *);
 
-/* Output alignment directive to align for constant expression EXP.  */
-extern void assemble_constant_align    PARAMS ((tree));
+extern void assemble_alias (tree, tree);
 
-extern void assemble_alias             PARAMS ((tree, tree));
-
-extern void assemble_visibility                PARAMS ((tree, const char *));
+extern void default_assemble_visibility (tree, int);
 
 /* Output a string of literal assembler code
    for an `asm' keyword used between functions.  */
-extern void assemble_asm               PARAMS ((tree));
+extern void assemble_asm (tree);
 
 /* Output assembler code for the constant pool of a function and associated
    with defining the name of the function.  DECL describes the function.
    NAME is the function's name.  For the constant pool, we use the current
    constant pool data.  */
-extern void assemble_start_function    PARAMS ((tree, const char *));
+extern void assemble_start_function (tree, const char *);
 
 /* Output assembler code associated with defining the size of the
    function.  DECL describes the function.  NAME is the function's name.  */
-extern void assemble_end_function      PARAMS ((tree, const char *));
+extern void assemble_end_function (tree, const char *);
 
 /* Assemble everything that is needed for a variable or function declaration.
    Not used for automatic variables, and not used for function definitions.
@@ -283,42 +200,43 @@ extern void assemble_end_function PARAMS ((tree, const char *));
    to define things that have had only tentative definitions.
    DONT_OUTPUT_DATA if nonzero means don't actually output the
    initial value (that will be done by the caller).  */
-extern void assemble_variable          PARAMS ((tree, int, int, int));
+extern void assemble_variable (tree, int, int, int);
+
+/* Compute the alignment of variable specified by DECL.
+   DONT_OUTPUT_DATA is from assemble_variable.  */
+extern void align_variable (tree decl, bool dont_output_data);
 
-/* Output something to declare an external symbol to the assembler.
-   (Most assemblers don't need this, so we normally output nothing.)
-   Do nothing if DECL is not external.  */
-extern void assemble_external          PARAMS ((tree));
-#endif /* TREE_CODE */
+/* Queue for outputting something to declare an external symbol to the
+   assembler.  (Most assemblers don't need this, so we normally output
+   nothing.)  Do nothing if DECL is not external.  */
+extern void assemble_external (tree);
 
 /* Assemble code to leave SIZE bytes of zeros.  */
-extern void assemble_zeros             PARAMS ((int));
+extern void assemble_zeros (unsigned HOST_WIDE_INT);
 
 /* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
-extern void assemble_align             PARAMS ((int));
-extern void assemble_eh_align          PARAMS ((int));
+extern void assemble_align (int);
 
 /* Assemble a string constant with the specified C string as contents.  */
-extern void assemble_string            PARAMS ((const char *, int));
+extern void assemble_string (const char *, int);
 
-#ifdef RTX_CODE
 /* Similar, for calling a library function FUN.  */
-extern void assemble_external_libcall  PARAMS ((rtx));
-#endif
-
-/* Declare the label NAME global.  */
-extern void assemble_global            PARAMS ((const char *));
+extern void assemble_external_libcall (rtx);
 
 /* Assemble a label named NAME.  */
-extern void assemble_label             PARAMS ((const char *));
-extern void assemble_eh_label          PARAMS ((const char *));
+extern void assemble_label (const char *);
 
-/* Output to FILE a reference to the assembler name of a C-level name NAME.
-   If NAME starts with a *, the rest of NAME is output verbatim.
-   Otherwise NAME is transformed in an implementation-defined way
-   (usually by the addition of an underscore).
-   Many macros in the tm file are defined to call this function.  */
-extern void assemble_name              PARAMS ((FILE *, const char *));
+/* Output to FILE (an assembly file) a reference to NAME.  If NAME
+   starts with a *, the rest of NAME is output verbatim.  Otherwise
+   NAME is transformed in a target-specific way (usually by the
+   addition of an underscore).  */
+extern void assemble_name_raw (FILE *, const char *);
+
+/* Like assemble_name_raw, but should be used when NAME might refer to
+   an entity that is also represented as a tree (like a function or
+   variable).  If NAME does refer to such an entity, that entity will
+   be marked as referenced.  */
+extern void assemble_name (FILE *, const char *);
 
 /* Return the assembler directive for creating a given kind of integer
    object.  SIZE is the number of bytes in the object and ALIGNED_P
@@ -327,21 +245,20 @@ extern void assemble_name         PARAMS ((FILE *, const char *));
 
    The returned string should be printed at the start of a new line and
    be followed immediately by the object's initial value.  */
-extern const char *integer_asm_op      PARAMS ((int, int));
+extern const char *integer_asm_op (int, int);
 
-#ifdef RTX_CODE
 /* Use directive OP to assemble an integer object X.  Print OP at the
    start of the line, followed immediately by the value of X.  */
-extern void assemble_integer_with_op   PARAMS ((const char *, rtx));
+extern void assemble_integer_with_op (const char *, rtx);
 
 /* The default implementation of the asm_out.integer target hook.  */
-extern bool default_assemble_integer   PARAMS ((rtx, unsigned int, int));
+extern bool default_assemble_integer (rtx, unsigned int, int);
 
 /* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
    the alignment of the integer in bits.  Return 1 if we were able to output
-   the constant, otherwise 0.  If FORCE is non-zero, abort if we can't output
-   the constant.  */
-extern bool assemble_integer           PARAMS ((rtx, unsigned, unsigned, int));
+   the constant, otherwise 0.  If FORCE is nonzero the constant must
+   be outputable. */
+extern bool assemble_integer (rtx, unsigned, unsigned, int);
 
 /* An interface to assemble_integer for the common case in which a value is
    fully aligned and must be printed.  VALUE is the value of the integer
@@ -349,31 +266,31 @@ extern bool assemble_integer              PARAMS ((rtx, unsigned, unsigned, int));
 #define assemble_aligned_integer(SIZE, VALUE) \
   assemble_integer (VALUE, SIZE, (SIZE) * BITS_PER_UNIT, 1)
 
-#ifdef REAL_VALUE_TYPE
+#ifdef REAL_VALUE_TYPE_SIZE
 /* Assemble the floating-point constant D into an object of size MODE.  */
-extern void assemble_real              PARAMS ((REAL_VALUE_TYPE,
-                                                enum machine_mode,
-                                                unsigned));
-#endif
+extern void assemble_real (REAL_VALUE_TYPE, enum machine_mode, unsigned);
 #endif
 
-/* Start deferring output of subconstants.  */
-extern void defer_addressed_constants  PARAMS ((void));
-
-/* Stop deferring output of subconstants,
-   and output now all those that have been deferred.  */
-extern void output_deferred_addressed_constants PARAMS ((void));
+/* Write the address of the entity given by SYMBOL to SEC.  */
+extern void assemble_addr_to_section (rtx, section *);
 
 /* Return the size of the constant pool.  */
-extern int get_pool_size               PARAMS ((void));
+extern int get_pool_size (void);
 
 #ifdef HAVE_peephole
-extern rtx peephole                    PARAMS ((rtx));
+extern rtx peephole (rtx);
 #endif
 
-#ifdef TREE_CODE
-/* Write all the constants in the constant pool.  */
-extern void output_constant_pool       PARAMS ((const char *, tree));
+extern void output_shared_constant_pool (void);
+
+extern void output_object_blocks (void);
+
+/* Whether a constructor CTOR is a valid static constant initializer if all
+   its elements are.  This used to be internal to initializer_constant_valid_p
+   and has been exposed to let other functions like categorize_ctor_elements
+   evaluate the property while walking a constructor for other purposes.  */
+
+extern bool constructor_static_from_elts_p (const_tree);
 
 /* Return nonzero if VALUE is a valid constant-valued expression
    for use in initializing a static variable; one that can be an
@@ -384,7 +301,12 @@ extern void output_constant_pool   PARAMS ((const char *, tree));
    We assume that VALUE has been folded as much as possible;
    therefore, we do not need to check for such things as
    arithmetic-combinations of integers.  */
-extern tree initializer_constant_valid_p       PARAMS ((tree, tree));
+extern tree initializer_constant_valid_p (tree, tree);
+
+/* Return true if VALUE is a valid constant-valued expression
+   for use in initializing a static bit-field; one that can be
+   an element of a "constant" initializer.  */
+extern bool initializer_constant_valid_for_bitfield_p (tree);
 
 /* Output assembler code for constant EXP to FILE, with no label.
    This includes the pseudo-op such as ".int" or ".byte", and a newline.
@@ -394,11 +316,8 @@ extern tree initializer_constant_valid_p   PARAMS ((tree, tree));
    with zeros if necessary.  SIZE must always be specified.
 
    ALIGN is the alignment in bits that may be assumed for the data.  */
-extern void output_constant            PARAMS ((tree, HOST_WIDE_INT,
-                                                unsigned int));
-#endif
+extern void output_constant (tree, unsigned HOST_WIDE_INT, unsigned int);
 
-#ifdef RTX_CODE
 /* When outputting delayed branch sequences, this rtx holds the
    sequence being output.  It is null when no delayed branch
    sequence is being output, so it can be used as a test in the
@@ -406,7 +325,6 @@ extern void output_constant         PARAMS ((tree, HOST_WIDE_INT,
 
    This variable is defined  in final.c.  */
 extern rtx final_sequence;
-#endif
 
 /* The line number of the beginning of the current function.  Various
    md code needs this so that it can output relative linenumbers.  */
@@ -434,14 +352,9 @@ extern const char *weak_global_object_name;
 
 extern int current_function_is_leaf;
 
-/* Nonzero if function being compiled doesn't contain any instructions
-   that can throw an exception.  This is set prior to final.  */
-
-extern int current_function_nothrow;
-
 /* Nonzero if function being compiled doesn't modify the stack pointer
    (ignoring the prologue and epilogue).  This is only valid after
-   life_analysis has run.  */
+   pass_stack_ptr_mod has run.  */
 
 extern int current_function_sp_is_unchanging;
 
@@ -454,47 +367,45 @@ extern int current_function_uses_only_leaf_regs;
 /* Default file in which to dump debug output.  */
 
 #ifdef BUFSIZ
-extern FILE *rtl_dump_file;
+extern FILE *dump_file;
 #endif
 
 /* Nonnull if the insn currently being emitted was a COND_EXEC pattern.  */
-extern struct rtx_def *current_insn_predicate;
+extern rtx current_insn_predicate;
 
 /* Last insn processed by final_scan_insn.  */
-extern struct rtx_def *current_output_insn;
+extern rtx current_output_insn;
 
 /* Nonzero while outputting an `asm' with operands.
-   This means that inconsistencies are the user's fault, so don't abort.
+   This means that inconsistencies are the user's fault, so don't die.
    The precise value is the insn being output, to pass to error_for_asm.  */
 extern rtx this_is_asm_operands;
 
-/* Decide whether DECL needs to be in a writable section.  RELOC is the same
-   as for SELECT_SECTION.  */
+/* Carry information from ASM_DECLARE_OBJECT_NAME
+   to ASM_FINISH_DECLARE_OBJECT.  */
+extern int size_directive_output;
+extern tree last_assemble_variable_decl;
+
+extern bool first_function_block_is_cold;
 
-#define DECL_READONLY_SECTION(DECL,RELOC)              \
-  (TREE_READONLY (DECL)                                        \
-   && ! TREE_THIS_VOLATILE (DECL)                      \
-   && DECL_INITIAL (DECL)                              \
-   && (DECL_INITIAL (DECL) == error_mark_node          \
-       || TREE_CONSTANT (DECL_INITIAL (DECL)))         \
-   && ! (RELOC && (flag_pic || DECL_ONE_ONLY (DECL))))
+/* Decide whether DECL needs to be in a writable section.
+   RELOC is the same as for SELECT_SECTION.  */
+extern bool decl_readonly_section (const_tree, int);
+
+/* This can be used to compute RELOC for the function above, when
+   given a constant expression.  */
+extern int compute_reloc_for_constant (tree);
 
 /* User label prefix in effect for this compilation.  */
 extern const char *user_label_prefix;
 
 /* Default target function prologue and epilogue assembler output.  */
-extern void default_function_pro_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
-
-/* Tell assembler to switch to the section for the exception table.  */
-extern void default_exception_section  PARAMS ((void));
-
-/* Tell assembler to switch to the section for the EH frames.  */
-extern void default_eh_frame_section   PARAMS ((void));
+extern void default_function_pro_epilogue (FILE *, HOST_WIDE_INT);
 
 /* Default target hook that outputs nothing to a stream.  */
-extern void no_asm_to_stream PARAMS ((FILE *));
+extern void no_asm_to_stream (FILE *);
 
-/* Flags controling properties of a section.  */
+/* Flags controlling properties of a section.  */
 #define SECTION_ENTSIZE         0x000ff        /* entity size in section */
 #define SECTION_CODE    0x00100        /* contains code */
 #define SECTION_WRITE   0x00200        /* data is writable */
@@ -507,47 +418,239 @@ extern void no_asm_to_stream PARAMS ((FILE *));
 #define SECTION_STRINGS  0x10000       /* contains zero terminated strings without
                                           embedded zeros */
 #define SECTION_OVERRIDE 0x20000       /* allow override of default flags */
-#define SECTION_MACH_DEP 0x40000       /* subsequent bits reserved for target */
-
-extern unsigned int get_named_section_flags PARAMS ((const char *));
-extern bool set_named_section_flags    PARAMS ((const char *, unsigned int));
-extern void named_section_flags                PARAMS ((const char *, unsigned int));
-extern bool named_section_first_declaration PARAMS((const char *));
-
-union tree_node;
-extern unsigned int default_section_type_flags PARAMS ((union tree_node *,
-                                                       const char *, int));
-
-extern void default_no_named_section PARAMS ((const char *, unsigned int));
-extern void default_elf_asm_named_section PARAMS ((const char *, unsigned int));
-extern void default_coff_asm_named_section PARAMS ((const char *,
-                                                   unsigned int));
-extern void default_pe_asm_named_section PARAMS ((const char *, unsigned int));
-
-extern void default_stabs_asm_out_destructor PARAMS ((struct rtx_def *, int));
-extern void default_named_section_asm_out_destructor PARAMS ((struct rtx_def *,
-                                                             int));
-extern void default_dtor_section_asm_out_destructor PARAMS ((struct rtx_def *,
-                                                            int));
-extern void default_stabs_asm_out_constructor PARAMS ((struct rtx_def *, int));
-extern void default_named_section_asm_out_constructor PARAMS ((struct rtx_def *,
-                                                              int));
-extern void default_ctor_section_asm_out_constructor PARAMS ((struct rtx_def *,
-                                                             int));
-
-extern void default_select_section PARAMS ((tree, int,
-                                           unsigned HOST_WIDE_INT));
-extern void default_elf_select_section PARAMS ((tree, int,
-                                               unsigned HOST_WIDE_INT));
-extern void default_unique_section PARAMS ((tree, int));
-extern void default_select_rtx_section PARAMS ((enum machine_mode, rtx,
-                                               unsigned HOST_WIDE_INT));
-extern void default_elf_select_rtx_section PARAMS ((enum machine_mode, rtx,
-                                                   unsigned HOST_WIDE_INT));
-extern const char *default_strip_name_encoding PARAMS ((const char *));
-extern bool default_binds_local_p PARAMS ((tree));
-
-/* Emit data for vtable gc for GNU binutils.  */
-extern void assemble_vtable_entry PARAMS ((struct rtx_def *, HOST_WIDE_INT));
-extern void assemble_vtable_inherit PARAMS ((struct rtx_def *,
-                                            struct rtx_def *));
+#define SECTION_TLS     0x40000        /* contains thread-local storage */
+#define SECTION_NOTYPE  0x80000        /* don't output @progbits */
+#define SECTION_DECLARED 0x100000      /* section has been used */
+#define SECTION_STYLE_MASK 0x600000    /* bits used for SECTION_STYLE */
+#define SECTION_COMMON   0x800000      /* contains common data */
+#define SECTION_MACH_DEP 0x1000000     /* subsequent bits reserved for target */
+
+/* This SECTION_STYLE is used for unnamed sections that we can switch
+   to using a special assembler directive.  */
+#define SECTION_UNNAMED         0x000000
+
+/* This SECTION_STYLE is used for named sections that we can switch
+   to using a general section directive.  */
+#define SECTION_NAMED   0x200000
+
+/* This SECTION_STYLE is used for sections that we cannot switch to at
+   all.  The choice of section is implied by the directive that we use
+   to declare the object.  */
+#define SECTION_NOSWITCH 0x400000
+
+/* A helper function for default_elf_select_section and
+   default_elf_unique_section.  Categorizes the DECL.  */
+
+enum section_category
+{
+  SECCAT_TEXT,
+
+  SECCAT_RODATA,
+  SECCAT_RODATA_MERGE_STR,
+  SECCAT_RODATA_MERGE_STR_INIT,
+  SECCAT_RODATA_MERGE_CONST,
+  SECCAT_SRODATA,
+
+  SECCAT_DATA,
+
+  /* To optimize loading of shared programs, define following subsections
+     of data section:
+       _REL    Contains data that has relocations, so they get grouped
+               together and dynamic linker will visit fewer pages in memory.
+       _RO     Contains data that is otherwise read-only.  This is useful
+               with prelinking as most relocations won't be dynamically
+               linked and thus stay read only.
+       _LOCAL  Marks data containing relocations only to local objects.
+               These relocations will get fully resolved by prelinking.  */
+  SECCAT_DATA_REL,
+  SECCAT_DATA_REL_LOCAL,
+  SECCAT_DATA_REL_RO,
+  SECCAT_DATA_REL_RO_LOCAL,
+
+  SECCAT_SDATA,
+  SECCAT_TDATA,
+
+  SECCAT_BSS,
+  SECCAT_SBSS,
+  SECCAT_TBSS,
+
+  SECCAT_EMUTLS_VAR,
+  SECCAT_EMUTLS_TMPL
+};
+
+/* Information that is provided by all instances of the section type.  */
+struct GTY(()) section_common {
+  /* The set of SECTION_* flags that apply to this section.  */
+  unsigned int flags;
+};
+
+/* Information about a SECTION_NAMED section.  */
+struct GTY(()) named_section {
+  struct section_common common;
+
+  /* The name of the section.  */
+  const char *name;
+
+  /* If nonnull, the VAR_DECL or FUNCTION_DECL with which the
+     section is associated.  */
+  tree decl;
+};
+
+/* A callback that writes the assembly code for switching to an unnamed
+   section.  The argument provides callback-specific data.  */
+typedef void (*unnamed_section_callback) (const void *);
+
+/* Information about a SECTION_UNNAMED section.  */
+struct GTY(()) unnamed_section {
+  struct section_common common;
+
+  /* The callback used to switch to the section, and the data that
+     should be passed to the callback.  */
+  unnamed_section_callback GTY ((skip)) callback;
+  const void *GTY ((skip)) data;
+
+  /* The next entry in the chain of unnamed sections.  */
+  section *next;
+};
+
+/* A callback that writes the assembly code for a decl in a
+   SECTION_NOSWITCH section.  DECL is the decl that should be assembled
+   and NAME is the name of its SYMBOL_REF.  SIZE is the size of the decl
+   in bytes and ROUNDED is that size rounded up to the next
+   BIGGEST_ALIGNMENT / BITS_PER_UNIT boundary.
+
+   Return true if the callback used DECL_ALIGN to set the object's
+   alignment.  A false return value implies that we are relying
+   on the rounded size to align the decl.  */
+typedef bool (*noswitch_section_callback) (tree decl, const char *name,
+                                          unsigned HOST_WIDE_INT size,
+                                          unsigned HOST_WIDE_INT rounded);
+
+/* Information about a SECTION_NOSWITCH section.  */
+struct GTY(()) noswitch_section {
+  struct section_common common;
+
+  /* The callback used to assemble decls in this section.  */
+  noswitch_section_callback GTY ((skip)) callback;
+};
+
+/* Information about a section, which may be named or unnamed.  */
+union GTY ((desc ("SECTION_STYLE (&(%h))"))) section {
+  struct section_common GTY ((skip)) common;
+  struct named_section GTY ((tag ("SECTION_NAMED"))) named;
+  struct unnamed_section GTY ((tag ("SECTION_UNNAMED"))) unnamed;
+  struct noswitch_section GTY ((tag ("SECTION_NOSWITCH"))) noswitch;
+};
+
+/* Return the style of section SECT.  */
+#define SECTION_STYLE(SECT) ((SECT)->common.flags & SECTION_STYLE_MASK)
+
+struct object_block;
+
+/* Special well-known sections.  */
+extern GTY(()) section *text_section;
+extern GTY(()) section *data_section;
+extern GTY(()) section *readonly_data_section;
+extern GTY(()) section *sdata_section;
+extern GTY(()) section *ctors_section;
+extern GTY(()) section *dtors_section;
+extern GTY(()) section *bss_section;
+extern GTY(()) section *sbss_section;
+extern GTY(()) section *exception_section;
+extern GTY(()) section *eh_frame_section;
+extern GTY(()) section *tls_comm_section;
+extern GTY(()) section *comm_section;
+extern GTY(()) section *lcomm_section;
+extern GTY(()) section *bss_noswitch_section;
+
+extern GTY(()) section *in_section;
+extern GTY(()) bool in_cold_section_p;
+
+extern section *get_unnamed_section (unsigned int, void (*) (const void *),
+                                    const void *);
+extern section *get_section (const char *, unsigned int, tree);
+extern section *get_named_section (tree, const char *, int);
+extern void place_block_symbol (rtx);
+extern rtx get_section_anchor (struct object_block *, HOST_WIDE_INT,
+                              enum tls_model);
+extern section *mergeable_constant_section (enum machine_mode,
+                                           unsigned HOST_WIDE_INT,
+                                           unsigned int);
+extern section *function_section (tree);
+extern section *unlikely_text_section (void);
+extern section *current_function_section (void);
+
+/* Return the numbered .ctors.N (if CONSTRUCTOR_P) or .dtors.N (if
+   not) section for PRIORITY.  */
+extern section *get_cdtor_priority_section (int, bool);
+
+extern bool unlikely_text_section_p (section *);
+extern void switch_to_section (section *);
+extern void output_section_asm_op (const void *);
+
+extern unsigned int default_section_type_flags (tree, const char *, int);
+
+extern bool have_global_bss_p (void);
+extern void default_no_named_section (const char *, unsigned int, tree);
+extern void default_elf_asm_named_section (const char *, unsigned int, tree);
+extern enum section_category categorize_decl_for_section (const_tree, int);
+extern void default_coff_asm_named_section (const char *, unsigned int, tree);
+extern void default_pe_asm_named_section (const char *, unsigned int, tree);
+
+extern void default_stabs_asm_out_destructor (rtx, int);
+extern void default_named_section_asm_out_destructor (rtx, int);
+extern void default_dtor_section_asm_out_destructor (rtx, int);
+extern void default_stabs_asm_out_constructor (rtx, int);
+extern void default_named_section_asm_out_constructor (rtx, int);
+extern void default_ctor_section_asm_out_constructor (rtx, int);
+
+extern section *default_select_section (tree, int, unsigned HOST_WIDE_INT);
+extern section *default_elf_select_section (tree, int, unsigned HOST_WIDE_INT);
+extern void default_unique_section (tree, int);
+extern section *default_function_rodata_section (tree);
+extern section *default_no_function_rodata_section (tree);
+extern section *default_select_rtx_section (enum machine_mode, rtx,
+                                           unsigned HOST_WIDE_INT);
+extern section *default_elf_select_rtx_section (enum machine_mode, rtx,
+                                               unsigned HOST_WIDE_INT);
+extern void default_encode_section_info (tree, rtx, int);
+extern const char *default_strip_name_encoding (const char *);
+extern void default_asm_output_anchor (rtx);
+extern bool default_use_anchors_for_symbol_p (const_rtx);
+extern bool default_binds_local_p (const_tree);
+extern bool default_binds_local_p_1 (const_tree, int);
+extern void default_globalize_label (FILE *, const char *);
+extern void default_globalize_decl_name (FILE *, tree);
+extern void default_emit_unwind_label (FILE *, tree, int, int);
+extern void default_emit_except_table_label (FILE *);
+extern void default_internal_label (FILE *, const char *, unsigned long);
+extern void default_file_start (void);
+extern void file_end_indicate_exec_stack (void);
+
+extern void default_elf_asm_output_external (FILE *file, tree,
+                                            const char *);
+extern int maybe_assemble_visibility (tree);
+
+extern int default_address_cost (rtx, bool);
+
+/* dbxout helper functions */
+#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
+
+extern void dbxout_int (int);
+extern void dbxout_stabd (int, int);
+extern void dbxout_begin_stabn (int);
+extern void dbxout_begin_stabn_sline (int);
+extern void dbxout_begin_empty_stabs (int);
+extern void dbxout_begin_simple_stabs (const char *, int);
+extern void dbxout_begin_simple_stabs_desc (const char *, int, int);
+
+extern void dbxout_stab_value_zero (void);
+extern void dbxout_stab_value_label (const char *);
+extern void dbxout_stab_value_label_diff (const char *, const char *);
+extern void dbxout_stab_value_internal_label (const char *, int *);
+extern void dbxout_stab_value_internal_label_diff (const char *, int *,
+                                                  const char *);
+
+#endif
+
+#endif /* ! GCC_OUTPUT_H */