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