GCC Middle and Back End API Reference
|
Since we no longer have a proper CFG, we're going to create a facsimile of one on the fly while processing the frame-related insns.
We create dw_trace_info structures for each extended basic block beginning and ending at a "save point". Save points are labels, barriers, certain notes, and of course the beginning and end of the function.
As we encounter control transfer insns, we propagate the "current" row state across the edges to the starts of traces. When checking is enabled, we validate that we propagate the same data from all sources.
All traces are members of the TRACE_INFO array, in the order in which they appear in the instruction stream.
All save points are present in the TRACE_INDEX hash, mapping the insn starting a trace to the dw_trace_info describing the trace.
bool dw_trace_info::args_size_undefined |
True if we've seen different values incoming to beg_true_args_size.
Referenced by change_cfi_row().
HOST_WIDE_INT dw_trace_info::beg_delay_args_size |
dw_cfi_row* dw_trace_info::beg_row |
The row state at the beginning and end of the trace.
Referenced by change_cfi_row().
HOST_WIDE_INT dw_trace_info::beg_true_args_size |
Tracking for DW_CFA_GNU_args_size. The "true" sizes are those we find while scanning insns. However, the args_size value is irrelevant at any point except can_throw_internal_p insns. Therefore the "delay" sizes the values that must actually be emitted for this trace.
Referenced by change_cfi_row().
dw_cfa_location dw_trace_info::cfa_store |
The following variables contain data used in interpreting frame related expressions. These are not part of the "real" row state as defined by Dwarf, but it seems like they need to be propagated into a trace in case frame related expressions have been sunk. ??? This seems fragile. These variables are fragments of a larger expression. If we do not keep the entire expression together, we risk not being able to put it together properly. Consider forcing targets to generate self-contained expressions and dropping all of the magic interpretation code in this file. Or at least refusing to shrink wrap any frame related insn that doesn't contain a complete expression. The register used for saving registers to the stack, and its offset from the CFA.
Referenced by change_cfi_row().
dw_cfa_location dw_trace_info::cfa_temp |
A temporary register holding an integral value used in adjusting SP or setting up the store_reg. The "offset" field holds the integer value, not an offset.
Referenced by change_cfi_row(), and dwarf2out_frame_debug_cfa_window_save().
rtx dw_trace_info::eh_head |
The first EH insn in the trace, where beg_delay_args_size must be set.
HOST_WIDE_INT dw_trace_info::end_delay_args_size |
dw_cfi_row * dw_trace_info::end_row |
HOST_WIDE_INT dw_trace_info::end_true_args_size |
Referenced by cfi_label_required_p(), change_cfi_row(), and create_trace_edges().
rtx dw_trace_info::head |
The insn that begins the trace.
Referenced by before_next_cfi_note(), and connect_traces().
unsigned dw_trace_info::id |
An identifier for this trace. Used only for debugging dumps.
Referenced by before_next_cfi_note(), and change_cfi_row().
vec<reg_saved_in_data> dw_trace_info::regs_saved_in_regs |
A set of registers saved in other registers. This is the inverse of the row->reg_save info, if the entry is a DW_CFA_register. This is implemented as a flat array because it normally contains zero or 1 entry, depending on the target. IA-64 is the big spender here, using a maximum of 5 entries.
Referenced by change_cfi_row(), queue_reg_save(), and record_reg_saved_in_reg().
bool dw_trace_info::switch_sections |
True if this trace immediately follows NOTE_INSN_SWITCH_TEXT_SECTIONS.
Referenced by before_next_cfi_note(), and connect_traces().