GCC Middle and Back End API Reference
final.c File Reference

Data Structures

struct  label_alignment
struct  debug_prefix_map

Typedefs

typedef struct debug_prefix_map debug_prefix_map

Functions

static int asm_insn_count (rtx)
static void profile_function (FILE *)
static void profile_after_prologue (FILE *)
static bool notice_source_line (rtx, bool *)
static rtx walk_alter_subreg (rtx *, bool *)
static void output_asm_name (void)
static void output_alternate_entry_point (FILE *, rtx)
static tree get_mem_expr_from_op (rtx, int *)
static void output_asm_operand_names (rtx *, int *, int)
static void leaf_renumber_regs (rtx)
static int alter_cond (rtx)
static int final_addr_vec_align (rtx)
static int align_fuzz (rtx, rtx, int, unsigned)
void init_final ()
void default_function_pro_epilogue (FILE *file, HOST_WIDE_INT size)
void default_function_switched_text_sections (FILE *file, tree decl, bool new_is_cold)
void no_asm_to_stream ()
void app_enable ()
void app_disable ()
int dbr_sequence_length ()
void init_insn_lengths ()
static int get_attr_length_1 (rtx insn, int(*fallback_fn)(rtx))
int get_attr_length ()
int get_attr_min_length ()
int default_label_align_after_barrier_max_skip ()
int default_loop_align_max_skip ()
int default_label_align_max_skip ()
int default_jump_align_max_skip ()
static int final_addr_vec_align ()
int label_to_alignment ()
int label_to_max_skip ()
static int align_fuzz ()
int insn_current_reference_address ()
unsigned int compute_alignments ()
static void grow_label_align ()
void update_alignments ()
rtl_opt_passmake_pass_compute_alignments ()
void shorten_branches ()
static int asm_insn_count ()
int asm_str_count ()
void add_debug_prefix_map ()
const char * remap_debug_filename ()
static bool dwarf2_debug_info_emitted_p ()
static tree choose_inner_scope ()
static void change_scope ()
static void reemit_insn_block_notes ()
void final_start_function (rtx first, FILE *file, int optimize_p)
static void profile_after_prologue ()
static void profile_function ()
void final_end_function ()
static void dump_basic_block_info (FILE *file, rtx insn, basic_block *start_to_bb, basic_block *end_to_bb, int bb_map_size, int *bb_seqn)
void final ()
const char * get_insn_template ()
static void output_alternate_entry_point ()
static rtx call_from_call_insn ()
rtx final_scan_insn (rtx insn, FILE *file, int optimize_p, int nopeepholes, int *seen)
static bool notice_source_line ()
void cleanup_subreg_operands ()
rtx alter_subreg ()
static rtx walk_alter_subreg ()
static int alter_cond ()
void output_operand_lossage ()
static tree get_mem_expr_from_op ()
static void output_asm_operand_names ()
static const char * do_assembler_dialects ()
void output_asm_insn ()
void output_asm_label ()
static int mark_symbol_ref_as_used ()
void mark_symbol_refs_as_used ()
void output_operand ()
void output_address ()
void output_addr_const ()
void output_quoted_string ()
void fprint_whex ()
static int sprint_ul_rev ()
void fprint_ul ()
int sprint_ul ()
void asm_fprintf ()
int leaf_function_p ()
int final_forward_branch_p ()
int only_leaf_regs_used ()
static void leaf_renumber_regs ()
void leaf_renumber_regs_insn ()
static unsigned int rest_of_handle_final ()
rtl_opt_passmake_pass_final ()
static unsigned int rest_of_handle_shorten_branches ()
rtl_opt_passmake_pass_shorten_branches ()
static unsigned int rest_of_clean_state ()
rtl_opt_passmake_pass_clean_state ()

Variables

static rtx debug_insn
rtx current_output_insn
static int last_linenum
static int last_discriminator
static int discriminator
static int high_block_linenum
static int high_function_linenum
static const char * last_filename
static const char * override_filename
static int override_linenum
static bool force_source_line = false
const int length_unit_log
rtx this_is_asm_operands
static unsigned int insn_noperands
static rtx last_ignored_compare = 0
static int insn_counter = 0
CC_STATUS cc_status
CC_STATUS cc_prev_status
static int block_depth
static int app_on
rtx final_sequence
static int dialect_number
rtx current_insn_predicate
bool final_insns_dump_p
static bool need_profile_function
static int * insn_lengths
vec< int > insn_addresses_
static int insn_lengths_max_uid
int insn_current_address
int insn_last_address
int insn_current_align
static rtxuid_align
static int * uid_shuid
static struct label_alignmentlabel_align
static int min_labelno
static int max_labelno
static debug_prefix_mapdebug_prefix_maps

Typedef Documentation

??? This is probably the wrong place for these.   
Structure recording the mapping from source file and directory
   names at compile time to those to be embedded in debug
   information.   

Function Documentation

void add_debug_prefix_map ( )
Record a debug file prefix mapping.  ARG is the argument to
   -fdebug-prefix-map and must be of the form OLD=NEW.   

References debug_prefix_maps, error(), map, debug_prefix_map::new_len, debug_prefix_map::new_prefix, debug_prefix_map::next, debug_prefix_map::old_len, debug_prefix_map::old_prefix, and strlen().

static int align_fuzz ( rtx  ,
rtx  ,
int  ,
unsigned   
)
static
static int align_fuzz ( )
static
The differences in addresses
   between a branch and its target might grow or shrink depending on
   the alignment the start insn of the range (the branch for a forward
   branch or the label for a backward branch) starts out on; if these
   differences are used naively, they can even oscillate infinitely.
   We therefore want to compute a 'worst case' address difference that
   is independent of the alignment the start insn of the range end
   up on, and that is at least as large as the actual difference.
   The function align_fuzz calculates the amount we have to add to the
   naively computed difference, by traversing the part of the alignment
   chain of the start insn of the range that is in front of the end insn
   of the range, and considering for each alignment the maximum amount
   that it might contribute to a size increase.

   For casesi tables, we also want to know worst case minimum amounts of
   address difference, in case a machine description wants to introduce
   some common offset that is added to all offsets in a table.
   For this purpose, align_fuzz with a growth argument of 0 computes the
   appropriate adjustment.   
Compute the maximum delta by which the difference of the addresses of
   START and END might grow / shrink due to a different address for start
   which changes the size of alignment insns between START and END.
   KNOWN_ALIGN_LOG is the alignment known for START.
   GROWTH should be ~0 if the objective is to compute potential code size
   increase, and 0 if the objective is to compute potential shrink.
   The return value is undefined for any other value of GROWTH.   

References insn_lengths, uid_align, and uid_shuid.

static int alter_cond ( rtx  )
static

Referenced by final_scan_insn().

static int alter_cond ( )
static
Given BODY, the body of a jump instruction, alter the jump condition
   as required by the bits that are set in cc_status.flags.
   Not all of the bits there can be handled at this level in all cases.

   The value is normally 0.
   1 means that the condition has become always true.
   -1 means that the condition has become always false.
   2 means that COND has been altered.   

References CC_STATUS::flags, reverse_condition(), and swap_condition().

rtx alter_subreg ( )
void app_disable ( void  )
Disable APP processing of subsequent output.
   Called from varasm.c before most kinds of output.   

References app_on, and asm_out_file.

Referenced by assemble_start_function(), assemble_variable(), final_end_function(), final_scan_insn(), and output_call_frame_info().

void app_enable ( void  )
Enable APP processing of subsequent output.
   Used before the output from an `asm' statement.   

References app_on, and asm_out_file.

Referenced by assemble_asm(), final_scan_insn(), and output_call_frame_info().

void asm_fprintf ( )
A poor man's fprintf, with the added features of %I, %R, %L, and %U.
   %R prints the value of REGISTER_PREFIX.
   %L prints the value of LOCAL_LABEL_PREFIX.
   %U prints the value of USER_LABEL_PREFIX.
   %I prints the value of IMMEDIATE_PREFIX.
   %O runs ASM_OUTPUT_OPCODE to transform what follows in the string.
   Also supported are %d, %i, %u, %x, %X, %o, %c, %s and %%.

   We handle alternate assembler dialects here, just like output_asm_insn.   

References asm_out_file, do_assembler_dialects(), HOST_WIDE_INT, HOST_WIDE_INT_PRINT, memcpy(), strlen(), and user_label_prefix.

static int asm_insn_count ( rtx  )
static
static int asm_insn_count ( )
static
Given the body of an INSN known to be generated by an ASM statement, return
   the number of machine instructions likely to be generated for this insn.
   This is used to compute its length.   

References asm_str_count(), and decode_asm_operands().

int asm_str_count ( )
Return the number of machine instructions likely to be generated for the
   inline-asm template.  

References count.

Referenced by asm_insn_count(), and estimate_num_insns().

static rtx call_from_call_insn ( )
static
Given a CALL_INSN, find and return the nested CALL.  

References SET.

Referenced by final_scan_insn().

static void change_scope ( )
static
Emit lexical block notes needed to change scope from S1 to S2.   

References emit_note_before().

Referenced by reemit_insn_block_notes().

static tree choose_inner_scope ( )
static
Return scope resulting from combination of S1 and S2.   

Referenced by reemit_insn_block_notes().

void cleanup_subreg_operands ( )
For each operand in INSN, simplify (subreg (reg)) so that it refers
   directly to the desired hard register.   

References alter_subreg(), changed, df_insn_rescan(), recog_data_d::dup_loc, extract_insn_cached(), recog_data_d::n_dups, recog_data_d::n_operands, recog_data_d::operand, recog_data_d::operand_loc, recog_data, and walk_alter_subreg().

Referenced by final_scan_insn(), reload(), and split_insn().

int dbr_sequence_length ( 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.   

References final_sequence.

void default_function_pro_epilogue ( FILE *  file,
HOST_WIDE_INT  size 
)
Default target function prologue and epilogue assembler output.

   If not overridden for epilogue code, then the function body itself
   contains return instructions wherever needed.   

Referenced by final_start_function().

void default_function_switched_text_sections ( FILE *  ,
tree  ,
bool   
)
Default target function switched text sections.   
int default_jump_align_max_skip ( )
int default_label_align_after_barrier_max_skip ( )
int default_label_align_max_skip ( )
int default_loop_align_max_skip ( )
static const char* do_assembler_dialects ( )
static
Helper function to parse assembler dialects in the asm string.
   This is called from output_asm_insn and asm_fprintf.   

References asm_out_file, dialect_number, and output_operand_lossage().

Referenced by asm_fprintf(), and output_asm_insn().

static void dump_basic_block_info ( FILE *  file,
rtx  insn,
basic_block start_to_bb,
basic_block end_to_bb,
int  bb_map_size,
int *  bb_seqn 
)
static
Dumper helper for basic block information. FILE is the assembly
   output file, and INSN is the instruction being emitted.   

References asm_out_file, basic_block_def::count, dump_edge_info(), basic_block_def::frequency, HOST_WIDEST_INT_PRINT_DEC, basic_block_def::index, basic_block_def::preds, and basic_block_def::succs.

Referenced by final().

static bool dwarf2_debug_info_emitted_p ( )
static
Return true if DWARF2 debug info can be emitted for DECL.   

References DWARF2_DEBUG, and VMS_AND_DWARF2_DEBUG.

Referenced by final_end_function(), and final_start_function().

void final ( )
Output assembler code for some insns: all or part of a function.
   For description of args, see `final_start_function', above.   

References cfun, delete_insn(), dump_basic_block_info(), final_scan_insn(), free(), get_max_uid(), init_recog(), insn_current_address, function::is_thunk, last_ignored_compare, and debug_prefix_map::next.

static int final_addr_vec_align ( rtx  )
static
static int final_addr_vec_align ( )
static

References exact_log2().

void final_end_function ( void  )
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.   

References app_disable(), asm_out_file, current_function_decl, debug_hooks, dwarf2_debug_info_emitted_p(), dwarf2out_do_frame(), dwarf2out_end_epilogue(), gcc_debug_hooks::end_epilogue, gcc_debug_hooks::end_function, get_frame_size(), high_function_linenum, last_filename, last_linenum, and targetm.

Referenced by rest_of_handle_final().

int final_forward_branch_p ( )
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 customary add branch prediction hints.

References uid_shuid.

rtx final_scan_insn ( rtx  insn,
FILE *  file,
int  optimize_p,
int  nopeepholes,
int *  seen 
)
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.

   NOPEEPHOLES is the flag to disallow peephole processing (currently
   used for within delayed branch sequence output).

   SEEN is used to track the end of the prologue, for emitting
   debug information.  We force the emission of a line note after
   both NOTE_INSN_PROLOGUE_END and NOTE_INSN_FUNCTION_BEG, or
   at the beginning of the second basic block, whichever comes
   first.   

References alter_cond(), alter_subreg(), app_disable(), app_enable(), asm_noperands(), asm_out_file, assemble_external(), gcc_debug_hooks::begin_block, gcc_debug_hooks::begin_epilogue, block_depth, block_nonartificial_location(), call_from_call_insn(), cc0_rtx, cc_status, cleanup_subreg_operands(), const_true_rtx, constrain_operands_cached(), current_function_decl, current_function_section(), current_insn_predicate, current_output_insn, DBX_DEBUG, debug_hooks, debug_insn, decode_asm_operands(), delete_insn(), DINFO_LEVEL_NORMAL, DINFO_LEVEL_VERBOSE, discriminator, dump_flags, dump_insn_slim(), DWARF2_DEBUG, dwarf2out_do_frame(), dwarf2out_emit_cfi(), dwarf2out_switch_text_section(), gcc_debug_hooks::end_block, gcc_debug_hooks::end_prologue, exact_log2(), expand_location(), final_scan_insn(), final_sequence, find_reg_note(), CC_STATUS::flags, force_source_line, get_insn_template(), high_block_linenum, in_cold_section_p, insn_code_number, insn_counter, insn_noperands, gcc_debug_hooks::label, last_discriminator, last_filename, last_ignored_compare, last_linenum, recog_data_d::n_operands, need_profile_function, debug_prefix_map::next, next_nonnote_insn(), notice_source_line(), recog_data_d::operand, output_alternate_entry_point(), output_asm_insn(), override_filename, override_linenum, pc_rtx, peephole(), prev_nonnote_insn(), print_rtl_single(), print_rtx_head, profile_after_prologue(), profile_function(), recog_data, recog_memoized(), rtx_equal_p(), SDB_DEBUG, SET, gcc_debug_hooks::source_line, gcc_debug_hooks::switch_text_section, switch_to_section(), targetm, this_is_asm_operands, try_split(), validate_change(), CC_STATUS::value1, CC_STATUS::value2, gcc_debug_hooks::var_location, VMS_AND_DWARF2_DEBUG, VMS_DEBUG, and volatile_refs_p().

Referenced by final(), and final_scan_insn().

void final_start_function ( rtx  first,
FILE *  file,
int  optimize_p 
)
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'.

   FIRST is the first insn of the rtl for the function being compiled.
   FILE is the file to write assembler code to.
   OPTIMIZE_P is nonzero if we should eliminate redundant
     test and compare insns.   

References gcc_debug_hooks::begin_prologue, block_depth, current_function_decl, debug_hooks, default_function_pro_epilogue(), discriminator, dwarf2_debug_info_emitted_p(), dwarf2out_begin_prologue(), get_frame_size(), HAVE_prologue, high_block_linenum, high_function_linenum, last_discriminator, last_filename, last_linenum, leaf_renumber_regs(), need_profile_function, number_blocks(), profile_after_prologue(), profile_function(), prologue_location, reemit_insn_block_notes(), targetm, this_is_asm_operands, and warning().

Referenced by rest_of_handle_final().

void fprint_ul ( )
Write an unsigned long as decimal to a file, fast.  

References sprint_ul_rev().

Referenced by dwarf2out_source_line().

void fprint_whex ( )
Write a HOST_WIDE_INT number in hex form 0x1234, fast.  

Referenced by dw2_asm_output_data(), dw2_asm_output_data_uleb128(), and dw2_assemble_integer().

int get_attr_length ( )
Obtain the current length of an insn.  If branch shortening has been done,
   get its actual length.  Otherwise, get its maximum length.   

References get_attr_length_1().

Referenced by output_asm_name().

static int get_attr_length_1 ( rtx  insn,
int(*)(rtx fallback_fn 
)
inlinestatic
Obtain the current length of an insn.  If branch shortening has been done,
   get its actual length.  Otherwise, use FALLBACK_FN to calculate the
   length.   

References asm_insn_count(), asm_noperands(), insn_lengths, and insn_lengths_max_uid.

Referenced by get_attr_length(), and get_attr_min_length().

int get_attr_min_length ( )
Obtain the current length of an insn.  If branch shortening has been done,
   get its actual length.  Otherwise, get its minimum length.   

References get_attr_length_1().

Referenced by copy_bb_p(), duplicate_computed_gotos(), dwarf2out_var_location(), get_uncond_jump_length(), and thread_prologue_and_epilogue_insns().

static tree get_mem_expr_from_op ( rtx  ,
int *   
)
static
static tree get_mem_expr_from_op ( )
static
If OP is a REG or MEM and we can find a MEM_EXPR corresponding to it
   or its address, return that expr .  Set *PADDRESSP to 1 if the expr
   corresponds to the address of the object and 0 if to the object.   

References get_mem_expr_from_op(), and RTX_BIN_ARITH.

static void grow_label_align ( )
static
Grow the LABEL_ALIGN array after new labels are created.   

References max_label_num(), max_labelno, and memset().

Referenced by shorten_branches(), and update_alignments().

void init_final ( )
Initialize data in final at the beginning of a compilation.   

References app_on, dialect_number, and final_sequence.

Referenced by do_compile().

void init_insn_lengths ( void  )
Indicate that branch shortening hasn't yet been done.   

References free(), insn_lengths, insn_lengths_max_uid, uid_align, and uid_shuid.

Referenced by expand_thunk(), and rest_of_clean_state().

int insn_current_reference_address ( )
Compute a worst-case reference address of a branch so that it
   can be safely used in the presence of aligned labels.  Since the
   size of the branch itself is unknown, the size of the branch is
   not included in the range.  I.e. for a forward branch, the reference
   address is the end address of the branch as known from the previous
   branch shortening pass, minus a value to account for possible size
   increase due to alignment.  For a backward branch, it is the start
   address of the branch as known from the current pass, plus a value
   to account for possible size increase due to alignment.
   NB.: Therefore, the maximum offset allowed for backward branches needs
   to exclude the branch size.   

References align_fuzz(), insn_current_address, insn_last_address, insn_lengths, and length_unit_log.

int label_to_alignment ( )
For the benefit of port specific code do this also as a function.   
int label_to_max_skip ( )
int leaf_function_p ( void  )
Return nonzero if this function has no function calls.   

References get_insns().

Referenced by ira(), and rest_of_handle_check_leaf_regs().

static void leaf_renumber_regs ( rtx  )
static

Referenced by final_start_function().

static void leaf_renumber_regs ( )
static
Scan all instructions and renumber all registers into those
   available in leaf functions.   

References leaf_renumber_regs_insn().

void leaf_renumber_regs_insn ( )
Scan IN_RTX and its subexpressions, and renumber all regs into those
   available in leaf functions.   

References df_set_regs_ever_live().

Referenced by dbxout_parms(), dbxout_symbol(), leaf_renumber_regs(), and sdbout_symbol().

rtl_opt_pass* make_pass_clean_state ( )
rtl_opt_pass* make_pass_compute_alignments ( )
rtl_opt_pass* make_pass_final ( )
rtl_opt_pass* make_pass_shorten_branches ( )
static int mark_symbol_ref_as_used ( )
static
Helper rtx-iteration-function for mark_symbol_refs_as_used and
   output_operand.  Marks SYMBOL_REFs as referenced through use of
   assemble_external.   

References assemble_external().

Referenced by mark_symbol_refs_as_used(), and output_operand().

void mark_symbol_refs_as_used ( )
Marks SYMBOL_REFs in x as referenced through use of assemble_external.   

References for_each_rtx(), and mark_symbol_ref_as_used().

void no_asm_to_stream ( )
Default target hook that outputs nothing to a stream.   
static bool notice_source_line ( rtx  ,
bool *   
)
static

Referenced by final_scan_insn().

static bool notice_source_line ( )
static
Return whether a source line note needs to be emitted before INSN.
   Sets IS_STMT to TRUE if the line should be marked as a possible
   breakpoint location.   

References discriminator, force_source_line, high_block_linenum, high_function_linenum, insn_file(), insn_line(), last_discriminator, last_filename, last_linenum, override_filename, and override_linenum.

int only_leaf_regs_used ( void  )
On some machines, a function with no call insns
   can run faster if it doesn't create its own register window.
   When output, the leaf function should use only the "output"
   registers.  Ordinarily, the function would be compiled to use
   the "input" registers to find its arguments; it is a candidate
   for leaf treatment if it uses only the "input" registers.
   Leaf function treatment means renumbering so the function
   uses the "output" registers instead.   
Return 1 if this function uses only the registers that can be
   safely renumbered.   

References df_regs_ever_live_p(), and global_regs.

Referenced by rest_of_handle_check_leaf_regs().

void output_addr_const ( )
Print an integer constant expression in assembler syntax.
   Addition and subtraction are the only arithmetic
   that may appear in these expressions.   

References assemble_external(), assemble_name(), HOST_WIDE_INT, HOST_WIDE_INT_PRINT_DEC, HOST_WIDE_INT_PRINT_DOUBLE_HEX, HOST_WIDE_INT_PRINT_HEX, output_operand_lossage(), simplify_subtraction(), and targetm.

Referenced by assemble_integer_with_op(), dw2_assemble_integer(), dwarf2out_do_cfi_startproc(), and output_asm_insn().

void output_address ( )
Print a memory reference operand for address X using
   machine-dependent assembler syntax.   

References asm_out_file, changed, targetm, and walk_alter_subreg().

Referenced by output_asm_insn().

static void output_alternate_entry_point ( FILE *  ,
rtx   
)
static

Referenced by final_scan_insn().

static void output_alternate_entry_point ( )
static
Emit the appropriate declaration for an alternate-entry-point
   symbol represented by INSN, to FILE.  INSN is a CODE_LABEL with
   LABEL_KIND != LABEL_NORMAL.

   The case fall-through in this function is intentional.   

References LABEL_GLOBAL_ENTRY, LABEL_NORMAL, LABEL_STATIC_ENTRY, LABEL_WEAK_ENTRY, and targetm.

void output_asm_insn ( )
Output text from TEMPLATE to the assembler output file,
   obeying %-directions to substitute operands taken from
   the vector OPERANDS.

   %N (for N a digit) means print operand N in usual manner.
   %lN means require operand N to be a CODE_LABEL or LABEL_REF
      and print the label name with no punctuation.
   %cN means require operand N to be a constant
      and print the constant expression with no punctuation.
   %aN means expect operand N to be a memory address
      (not a memory reference!) and print a reference
      to that address.
   %nN means expect operand N to be a constant
      and print a constant expression for minus the value
      of the operand, with no other punctuation.   

References asm_out_file, do_assembler_dialects(), HOST_WIDE_INT_PRINT_DEC, insn_counter, insn_noperands, memset(), output_addr_const(), output_address(), output_asm_label(), output_asm_name(), output_asm_operand_names(), output_operand(), output_operand_lossage(), targetm, and this_is_asm_operands.

Referenced by final_scan_insn().

void output_asm_label ( )
Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.   

References asm_out_file, assemble_name(), and output_operand_lossage().

Referenced by output_asm_insn().

static void output_asm_name ( )
static
Output of assembler code from a template, and its subroutines.   
Annotate the assembly with a comment describing the pattern and
   alternative used.   

References asm_out_file, debug_insn, get_attr_length(), insn_data, n_alternatives(), and which_alternative.

Referenced by output_asm_insn().

static void output_asm_operand_names ( rtx ,
int *  ,
int   
)
static

Referenced by output_asm_insn().

static void output_asm_operand_names ( )
static
Output operand names for assembler instructions.  OPERANDS is the
   operand vector, OPORDER is the order to write the operands, and NOPS
   is the number of operands to write.   

References asm_out_file, get_mem_expr_from_op(), and print_mem_expr().

void output_operand ( )
Print operand X using machine-dependent assembler syntax.
   CODE is a non-digit that preceded the operand-number in the % spec,
   such as 'z' if the spec was `%z3'.  CODE is 0 if there was no char
   between the % and the digits.
   When CODE is a non-letter, X is 0.

   The meanings of the letters are machine-dependent and controlled
   by TARGET_PRINT_OPERAND.   

References alter_subreg(), asm_out_file, for_each_rtx(), mark_symbol_ref_as_used(), and targetm.

Referenced by output_asm_insn().

void output_operand_lossage ( )
Report inconsistency between the assembler template and the operands.
   In an `asm', it's the user's fault; otherwise, the compiler's fault.   

References error_for_asm(), free(), internal_error(), and this_is_asm_operands.

Referenced by crash_signal(), do_assembler_dialects(), output_addr_const(), output_asm_insn(), and output_asm_label().

static void profile_after_prologue ( FILE *  )
static
static void profile_after_prologue ( )
static

References profile_function(), and targetm.

static void profile_function ( FILE *  )
static
static void reemit_insn_block_notes ( )
static
Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based
   on the scope tree and the newly reordered instructions.   

References active_insn_p(), cfun, change_scope(), choose_inner_scope(), function::decl, delete_insn(), emit_note(), emit_note_after(), emit_note_before(), get_insns(), insn_scope(), and reorder_blocks().

Referenced by final_start_function().

const char* remap_debug_filename ( )
Perform user-specified mapping of debug filename prefixes.  Return
   the new name corresponding to FILENAME.   

References map, memcpy(), debug_prefix_map::new_len, debug_prefix_map::new_prefix, debug_prefix_map::next, debug_prefix_map::old_len, debug_prefix_map::old_prefix, and strlen().

static unsigned int rest_of_handle_shorten_branches ( )
static

References get_insns(), and shorten_branches().

void shorten_branches ( )
Make a pass over all insns and compute their actual lengths by shortening
   any branches of variable length if possible.   
shorten_branches might be called multiple times:  for example, the SH
   port splits out-of-range conditional branches in MACHINE_DEPENDENT_REORG.
   In order to do this, it needs proper length information, which it obtains
   by calling shorten_branches.  This cannot be collapsed with
   shorten_branches itself into a single pass unless we also want to integrate
   reorg.c, since the branch splitting exposes new instructions with delay
   slots.   

References align_fuzz(), asm_insn_count(), asm_noperands(), addr_diff_vec_flags::base_after_vec, free(), get_insns(), get_last_insn(), get_max_uid(), grow_label_align(), insn_current_address, insn_current_align, insn_last_address, insn_lengths, insn_lengths_max_uid, len, log(), addr_diff_vec_flags::max_after_base, addr_diff_vec_flags::max_after_vec, max_label_num(), max_uid, memset(), addr_diff_vec_flags::min_after_base, addr_diff_vec_flags::min_after_vec, min_align(), addr_diff_vec_flags::min_align, next_nonnote_insn(), readonly_data_section, targetm, text_section, uid_align, and uid_shuid.

Referenced by rest_of_handle_shorten_branches().

int sprint_ul ( )
Write an unsigned long as decimal to a string, fast.
   s must be wide enough to not overflow, at least 21 chars.
   Returns the length of the string (without terminating '\0').  

References len, and sprint_ul_rev().

static int sprint_ul_rev ( )
static
Internal function that prints an unsigned long in decimal in reverse.
   The output string IS NOT null-terminated.  

Referenced by fprint_ul(), and sprint_ul().

void update_alignments ( )
Update the already computed alignment information.  LABEL_PAIRS is a vector
   made up of pairs of labels for which the alignment information of the first
   element will be copied from that of the second element.   

References grow_label_align(), and max_label_num().

Referenced by dbr_schedule().

static rtx walk_alter_subreg ( rtx ,
bool *   
)
static
static rtx walk_alter_subreg ( )
static
Do alter_subreg on all the SUBREGs contained in X.   

References alter_subreg(), and walk_alter_subreg().


Variable Documentation

int app_on
static
Nonzero if have enabled APP processing of our assembler output.   

Referenced by app_disable(), app_enable(), and init_final().

int block_depth
static
Number of unmatched NOTE_INSN_BLOCK_BEG notes we have seen.   

Referenced by final_scan_insn(), and final_start_function().

CC_STATUS cc_prev_status
During output of an insn, this contains a copy of cc_status
   from before the insn.   
CC_STATUS cc_status
This variable contains machine-dependent flags (defined in tm.h)
   set and examined by output routines
   that describe how to interpret the condition codes properly.   

Referenced by final_scan_insn().

rtx current_insn_predicate
Nonnull if the insn currently being emitted was a COND_EXEC pattern.   

Referenced by final_scan_insn().

rtx current_output_insn
Last insn processed by final_scan_insn.   

Referenced by final_scan_insn().

rtx debug_insn
static
Last insn processed by final_scan_insn.   

Referenced by df_note_bb_compute(), final_scan_insn(), and output_asm_name().

debug_prefix_map* debug_prefix_maps
static
Linked list of such structures.   

Referenced by add_debug_prefix_map().

int dialect_number
static
Number of the assembler dialect to use, starting at 0.   

Referenced by do_assembler_dialects(), and init_final().

int discriminator
static
Discriminator of current block.   

Referenced by dwarf2out_source_line(), final_scan_insn(), final_start_function(), and notice_source_line().

bool final_insns_dump_p
True if printing into -fdump-final-insns= dump.   

Referenced by print_rtx(), and rest_of_clean_state().

rtx final_sequence
If we are outputting an insn sequence, this contains the sequence rtx.
   Zero otherwise.   

Referenced by dbr_sequence_length(), final_scan_insn(), and init_final().

bool force_source_line = false
static
Whether to force emission of a line note before the next insn.   

Referenced by final_scan_insn(), and notice_source_line().

int high_block_linenum
static
Highest line number in current block.   

Referenced by final_scan_insn(), final_start_function(), and notice_source_line().

int high_function_linenum
static
Likewise for function.   

Referenced by final_end_function(), final_start_function(), and notice_source_line().

vec<int> insn_addresses_
int insn_counter = 0
static
Assign a unique number to each insn that is output.
   This can be used to generate unique local labels.   

Referenced by final_scan_insn(), and output_asm_insn().

int insn_current_address
Address of insn being processed.  Used by `insn_current_length'.   

Referenced by final(), insn_current_reference_address(), and shorten_branches().

int insn_current_align
known invariant alignment of insn being processed.   

Referenced by shorten_branches().

int insn_last_address
Address of insn being processed in previous iteration.   

Referenced by insn_current_reference_address(), and shorten_branches().

int* insn_lengths
static
The next two pages contain routines used to compute the length of an insn
   and to shorten branches.   
Arrays for insn lengths, and addresses.  The latter is referenced by
   `insn_current_length'.   

Referenced by align_fuzz(), get_attr_length_1(), init_insn_lengths(), insn_current_reference_address(), and shorten_branches().

int insn_lengths_max_uid
static
Max uid for which the above arrays are valid.   

Referenced by get_attr_length_1(), init_insn_lengths(), and shorten_branches().

unsigned int insn_noperands
static
Number of operands of this insn, for an `asm' with operands.   

Referenced by final_scan_insn(), and output_asm_insn().

struct label_alignment* label_align
static
int last_discriminator
static
Last discriminator written to assembly.   

Referenced by final_scan_insn(), final_start_function(), and notice_source_line().

const char* last_filename
static
rtx last_ignored_compare = 0
static
Compare optimization flag.   

Referenced by final(), and final_scan_insn().

int last_linenum
static
Line number of last NOTE.   

Referenced by final_end_function(), final_scan_insn(), final_start_function(), and notice_source_line().

const int length_unit_log
int max_labelno
static

Referenced by grow_label_align().

int min_labelno
static

Referenced by reload_combine().

bool need_profile_function
static
True if profile_function should be called, but hasn't been called yet.   

Referenced by final_scan_insn(), and final_start_function().

const char* override_filename
static
Override filename and line number.   

Referenced by final_scan_insn(), and notice_source_line().

int override_linenum
static
rtx this_is_asm_operands
Nonzero while outputting an `asm' with operands.
   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.   

Referenced by crash_signal(), final_scan_insn(), final_start_function(), output_asm_insn(), and output_operand_lossage().

rtx* uid_align
static
int* uid_shuid
static