1 /* Dwarf2 Call Frame Information helper routines.
2 Copyright (C) 1992-2013 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
28 #include "basic-block.h"
30 #include "dwarf2out.h"
31 #include "dwarf2asm.h"
33 #include "hash-table.h"
36 #include "common/common-target.h"
37 #include "tree-pass.h"
39 #include "except.h" /* expand_builtin_dwarf_sp_column */
40 #include "expr.h" /* init_return_column_size */
41 #include "regs.h" /* expand_builtin_init_dwarf_reg_sizes */
42 #include "output.h" /* asm_out_file */
43 #include "debug.h" /* dwarf2out_do_frame, dwarf2out_do_cfi_asm */
46 /* ??? Poison these here until it can be done generically. They've been
47 totally replaced in this file; make sure it stays that way. */
48 #undef DWARF2_UNWIND_INFO
49 #undef DWARF2_FRAME_INFO
50 #if (GCC_VERSION >= 3000)
51 #pragma GCC poison DWARF2_UNWIND_INFO DWARF2_FRAME_INFO
54 #ifndef INCOMING_RETURN_ADDR_RTX
55 #define INCOMING_RETURN_ADDR_RTX (gcc_unreachable (), NULL_RTX)
58 /* Maximum size (in bytes) of an artificially generated label. */
59 #define MAX_ARTIFICIAL_LABEL_BYTES 30
61 /* A collected description of an entire row of the abstract CFI table. */
62 typedef struct GTY(()) dw_cfi_row_struct
64 /* The expression that computes the CFA, expressed in two different ways.
65 The CFA member for the simple cases, and the full CFI expression for
66 the complex cases. The later will be a DW_CFA_cfa_expression. */
70 /* The expressions for any register column that is saved. */
74 /* The caller's ORIG_REG is saved in SAVED_IN_REG. */
75 typedef struct GTY(()) reg_saved_in_data_struct
{
81 /* Since we no longer have a proper CFG, we're going to create a facsimile
82 of one on the fly while processing the frame-related insns.
84 We create dw_trace_info structures for each extended basic block beginning
85 and ending at a "save point". Save points are labels, barriers, certain
86 notes, and of course the beginning and end of the function.
88 As we encounter control transfer insns, we propagate the "current"
89 row state across the edges to the starts of traces. When checking is
90 enabled, we validate that we propagate the same data from all sources.
92 All traces are members of the TRACE_INFO array, in the order in which
93 they appear in the instruction stream.
95 All save points are present in the TRACE_INDEX hash, mapping the insn
96 starting a trace to the dw_trace_info describing the trace. */
100 /* The insn that begins the trace. */
103 /* The row state at the beginning and end of the trace. */
104 dw_cfi_row
*beg_row
, *end_row
;
106 /* Tracking for DW_CFA_GNU_args_size. The "true" sizes are those we find
107 while scanning insns. However, the args_size value is irrelevant at
108 any point except can_throw_internal_p insns. Therefore the "delay"
109 sizes the values that must actually be emitted for this trace. */
110 HOST_WIDE_INT beg_true_args_size
, end_true_args_size
;
111 HOST_WIDE_INT beg_delay_args_size
, end_delay_args_size
;
113 /* The first EH insn in the trace, where beg_delay_args_size must be set. */
116 /* The following variables contain data used in interpreting frame related
117 expressions. These are not part of the "real" row state as defined by
118 Dwarf, but it seems like they need to be propagated into a trace in case
119 frame related expressions have been sunk. */
120 /* ??? This seems fragile. These variables are fragments of a larger
121 expression. If we do not keep the entire expression together, we risk
122 not being able to put it together properly. Consider forcing targets
123 to generate self-contained expressions and dropping all of the magic
124 interpretation code in this file. Or at least refusing to shrink wrap
125 any frame related insn that doesn't contain a complete expression. */
127 /* The register used for saving registers to the stack, and its offset
129 dw_cfa_location cfa_store
;
131 /* A temporary register holding an integral value used in adjusting SP
132 or setting up the store_reg. The "offset" field holds the integer
133 value, not an offset. */
134 dw_cfa_location cfa_temp
;
136 /* A set of registers saved in other registers. This is the inverse of
137 the row->reg_save info, if the entry is a DW_CFA_register. This is
138 implemented as a flat array because it normally contains zero or 1
139 entry, depending on the target. IA-64 is the big spender here, using
140 a maximum of 5 entries. */
141 vec
<reg_saved_in_data
> regs_saved_in_regs
;
143 /* An identifier for this trace. Used only for debugging dumps. */
146 /* True if this trace immediately follows NOTE_INSN_SWITCH_TEXT_SECTIONS. */
147 bool switch_sections
;
149 /* True if we've seen different values incoming to beg_true_args_size. */
150 bool args_size_undefined
;
154 typedef dw_trace_info
*dw_trace_info_ref
;
157 /* Hashtable helpers. */
159 struct trace_info_hasher
: typed_noop_remove
<dw_trace_info
>
161 typedef dw_trace_info value_type
;
162 typedef dw_trace_info compare_type
;
163 static inline hashval_t
hash (const value_type
*);
164 static inline bool equal (const value_type
*, const compare_type
*);
168 trace_info_hasher::hash (const value_type
*ti
)
170 return INSN_UID (ti
->head
);
174 trace_info_hasher::equal (const value_type
*a
, const compare_type
*b
)
176 return a
->head
== b
->head
;
180 /* The variables making up the pseudo-cfg, as described above. */
181 static vec
<dw_trace_info
> trace_info
;
182 static vec
<dw_trace_info_ref
> trace_work_list
;
183 static hash_table
<trace_info_hasher
> trace_index
;
185 /* A vector of call frame insns for the CIE. */
188 /* The state of the first row of the FDE table, which includes the
189 state provided by the CIE. */
190 static GTY(()) dw_cfi_row
*cie_cfi_row
;
192 static GTY(()) reg_saved_in_data
*cie_return_save
;
194 static GTY(()) unsigned long dwarf2out_cfi_label_num
;
196 /* The insn after which a new CFI note should be emitted. */
197 static rtx add_cfi_insn
;
199 /* When non-null, add_cfi will add the CFI to this vector. */
200 static cfi_vec
*add_cfi_vec
;
202 /* The current instruction trace. */
203 static dw_trace_info
*cur_trace
;
205 /* The current, i.e. most recently generated, row of the CFI table. */
206 static dw_cfi_row
*cur_row
;
208 /* A copy of the current CFA, for use during the processing of a
210 static dw_cfa_location
*cur_cfa
;
212 /* We delay emitting a register save until either (a) we reach the end
213 of the prologue or (b) the register is clobbered. This clusters
214 register saves so that there are fewer pc advances. */
219 HOST_WIDE_INT cfa_offset
;
223 static vec
<queued_reg_save
> queued_reg_saves
;
225 /* True if any CFI directives were emitted at the current insn. */
226 static bool any_cfis_emitted
;
228 /* Short-hand for commonly used register numbers. */
229 static unsigned dw_stack_pointer_regnum
;
230 static unsigned dw_frame_pointer_regnum
;
232 /* Hook used by __throw. */
235 expand_builtin_dwarf_sp_column (void)
237 unsigned int dwarf_regnum
= DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM
);
238 return GEN_INT (DWARF2_FRAME_REG_OUT (dwarf_regnum
, 1));
241 /* MEM is a memory reference for the register size table, each element of
242 which has mode MODE. Initialize column C as a return address column. */
245 init_return_column_size (enum machine_mode mode
, rtx mem
, unsigned int c
)
247 HOST_WIDE_INT offset
= c
* GET_MODE_SIZE (mode
);
248 HOST_WIDE_INT size
= GET_MODE_SIZE (Pmode
);
249 emit_move_insn (adjust_address (mem
, mode
, offset
),
250 gen_int_mode (size
, mode
));
253 /* Generate code to initialize the register size table. */
256 expand_builtin_init_dwarf_reg_sizes (tree address
)
259 enum machine_mode mode
= TYPE_MODE (char_type_node
);
260 rtx addr
= expand_normal (address
);
261 rtx mem
= gen_rtx_MEM (BLKmode
, addr
);
262 bool wrote_return_column
= false;
264 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
266 unsigned int dnum
= DWARF_FRAME_REGNUM (i
);
267 unsigned int rnum
= DWARF2_FRAME_REG_OUT (dnum
, 1);
269 if (rnum
< DWARF_FRAME_REGISTERS
)
271 HOST_WIDE_INT offset
= rnum
* GET_MODE_SIZE (mode
);
272 enum machine_mode save_mode
= reg_raw_mode
[i
];
275 if (HARD_REGNO_CALL_PART_CLOBBERED (i
, save_mode
))
276 save_mode
= choose_hard_reg_mode (i
, 1, true);
277 if (dnum
== DWARF_FRAME_RETURN_COLUMN
)
279 if (save_mode
== VOIDmode
)
281 wrote_return_column
= true;
283 size
= GET_MODE_SIZE (save_mode
);
287 emit_move_insn (adjust_address (mem
, mode
, offset
),
288 gen_int_mode (size
, mode
));
292 if (!wrote_return_column
)
293 init_return_column_size (mode
, mem
, DWARF_FRAME_RETURN_COLUMN
);
295 #ifdef DWARF_ALT_FRAME_RETURN_COLUMN
296 init_return_column_size (mode
, mem
, DWARF_ALT_FRAME_RETURN_COLUMN
);
299 targetm
.init_dwarf_reg_sizes_extra (address
);
303 static dw_trace_info
*
304 get_trace_info (rtx insn
)
308 return trace_index
.find_with_hash (&dummy
, INSN_UID (insn
));
312 save_point_p (rtx insn
)
314 /* Labels, except those that are really jump tables. */
316 return inside_basic_block_p (insn
);
318 /* We split traces at the prologue/epilogue notes because those
319 are points at which the unwind info is usually stable. This
320 makes it easier to find spots with identical unwind info so
321 that we can use remember/restore_state opcodes. */
323 switch (NOTE_KIND (insn
))
325 case NOTE_INSN_PROLOGUE_END
:
326 case NOTE_INSN_EPILOGUE_BEG
:
333 /* Divide OFF by DWARF_CIE_DATA_ALIGNMENT, asserting no remainder. */
335 static inline HOST_WIDE_INT
336 div_data_align (HOST_WIDE_INT off
)
338 HOST_WIDE_INT r
= off
/ DWARF_CIE_DATA_ALIGNMENT
;
339 gcc_assert (r
* DWARF_CIE_DATA_ALIGNMENT
== off
);
343 /* Return true if we need a signed version of a given opcode
344 (e.g. DW_CFA_offset_extended_sf vs DW_CFA_offset_extended). */
347 need_data_align_sf_opcode (HOST_WIDE_INT off
)
349 return DWARF_CIE_DATA_ALIGNMENT
< 0 ? off
> 0 : off
< 0;
352 /* Return a pointer to a newly allocated Call Frame Instruction. */
354 static inline dw_cfi_ref
357 dw_cfi_ref cfi
= ggc_alloc_dw_cfi_node ();
359 cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
= 0;
360 cfi
->dw_cfi_oprnd2
.dw_cfi_reg_num
= 0;
365 /* Return a newly allocated CFI row, with no defined data. */
370 dw_cfi_row
*row
= ggc_alloc_cleared_dw_cfi_row ();
372 row
->cfa
.reg
= INVALID_REGNUM
;
377 /* Return a copy of an existing CFI row. */
380 copy_cfi_row (dw_cfi_row
*src
)
382 dw_cfi_row
*dst
= ggc_alloc_dw_cfi_row ();
385 dst
->reg_save
= vec_safe_copy (src
->reg_save
);
390 /* Generate a new label for the CFI info to refer to. */
393 dwarf2out_cfi_label (void)
395 int num
= dwarf2out_cfi_label_num
++;
398 ASM_GENERATE_INTERNAL_LABEL (label
, "LCFI", num
);
400 return xstrdup (label
);
403 /* Add CFI either to the current insn stream or to a vector, or both. */
406 add_cfi (dw_cfi_ref cfi
)
408 any_cfis_emitted
= true;
410 if (add_cfi_insn
!= NULL
)
412 add_cfi_insn
= emit_note_after (NOTE_INSN_CFI
, add_cfi_insn
);
413 NOTE_CFI (add_cfi_insn
) = cfi
;
416 if (add_cfi_vec
!= NULL
)
417 vec_safe_push (*add_cfi_vec
, cfi
);
421 add_cfi_args_size (HOST_WIDE_INT size
)
423 dw_cfi_ref cfi
= new_cfi ();
425 /* While we can occasionally have args_size < 0 internally, this state
426 should not persist at a point we actually need an opcode. */
427 gcc_assert (size
>= 0);
429 cfi
->dw_cfi_opc
= DW_CFA_GNU_args_size
;
430 cfi
->dw_cfi_oprnd1
.dw_cfi_offset
= size
;
436 add_cfi_restore (unsigned reg
)
438 dw_cfi_ref cfi
= new_cfi ();
440 cfi
->dw_cfi_opc
= (reg
& ~0x3f ? DW_CFA_restore_extended
: DW_CFA_restore
);
441 cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
= reg
;
446 /* Perform ROW->REG_SAVE[COLUMN] = CFI. CFI may be null, indicating
447 that the register column is no longer saved. */
450 update_row_reg_save (dw_cfi_row
*row
, unsigned column
, dw_cfi_ref cfi
)
452 if (vec_safe_length (row
->reg_save
) <= column
)
453 vec_safe_grow_cleared (row
->reg_save
, column
+ 1);
454 (*row
->reg_save
)[column
] = cfi
;
457 /* This function fills in aa dw_cfa_location structure from a dwarf location
458 descriptor sequence. */
461 get_cfa_from_loc_descr (dw_cfa_location
*cfa
, struct dw_loc_descr_struct
*loc
)
463 struct dw_loc_descr_struct
*ptr
;
465 cfa
->base_offset
= 0;
469 for (ptr
= loc
; ptr
!= NULL
; ptr
= ptr
->dw_loc_next
)
471 enum dwarf_location_atom op
= ptr
->dw_loc_opc
;
507 cfa
->reg
= op
- DW_OP_reg0
;
510 cfa
->reg
= ptr
->dw_loc_oprnd1
.v
.val_int
;
544 cfa
->reg
= op
- DW_OP_breg0
;
545 cfa
->base_offset
= ptr
->dw_loc_oprnd1
.v
.val_int
;
548 cfa
->reg
= ptr
->dw_loc_oprnd1
.v
.val_int
;
549 cfa
->base_offset
= ptr
->dw_loc_oprnd2
.v
.val_int
;
554 case DW_OP_plus_uconst
:
555 cfa
->offset
= ptr
->dw_loc_oprnd1
.v
.val_unsigned
;
563 /* Find the previous value for the CFA, iteratively. CFI is the opcode
564 to interpret, *LOC will be updated as necessary, *REMEMBER is used for
565 one level of remember/restore state processing. */
568 lookup_cfa_1 (dw_cfi_ref cfi
, dw_cfa_location
*loc
, dw_cfa_location
*remember
)
570 switch (cfi
->dw_cfi_opc
)
572 case DW_CFA_def_cfa_offset
:
573 case DW_CFA_def_cfa_offset_sf
:
574 loc
->offset
= cfi
->dw_cfi_oprnd1
.dw_cfi_offset
;
576 case DW_CFA_def_cfa_register
:
577 loc
->reg
= cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
;
580 case DW_CFA_def_cfa_sf
:
581 loc
->reg
= cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
;
582 loc
->offset
= cfi
->dw_cfi_oprnd2
.dw_cfi_offset
;
584 case DW_CFA_def_cfa_expression
:
585 get_cfa_from_loc_descr (loc
, cfi
->dw_cfi_oprnd1
.dw_cfi_loc
);
588 case DW_CFA_remember_state
:
589 gcc_assert (!remember
->in_use
);
591 remember
->in_use
= 1;
593 case DW_CFA_restore_state
:
594 gcc_assert (remember
->in_use
);
596 remember
->in_use
= 0;
604 /* Determine if two dw_cfa_location structures define the same data. */
607 cfa_equal_p (const dw_cfa_location
*loc1
, const dw_cfa_location
*loc2
)
609 return (loc1
->reg
== loc2
->reg
610 && loc1
->offset
== loc2
->offset
611 && loc1
->indirect
== loc2
->indirect
612 && (loc1
->indirect
== 0
613 || loc1
->base_offset
== loc2
->base_offset
));
616 /* Determine if two CFI operands are identical. */
619 cfi_oprnd_equal_p (enum dw_cfi_oprnd_type t
, dw_cfi_oprnd
*a
, dw_cfi_oprnd
*b
)
623 case dw_cfi_oprnd_unused
:
625 case dw_cfi_oprnd_reg_num
:
626 return a
->dw_cfi_reg_num
== b
->dw_cfi_reg_num
;
627 case dw_cfi_oprnd_offset
:
628 return a
->dw_cfi_offset
== b
->dw_cfi_offset
;
629 case dw_cfi_oprnd_addr
:
630 return (a
->dw_cfi_addr
== b
->dw_cfi_addr
631 || strcmp (a
->dw_cfi_addr
, b
->dw_cfi_addr
) == 0);
632 case dw_cfi_oprnd_loc
:
633 return loc_descr_equal_p (a
->dw_cfi_loc
, b
->dw_cfi_loc
);
638 /* Determine if two CFI entries are identical. */
641 cfi_equal_p (dw_cfi_ref a
, dw_cfi_ref b
)
643 enum dwarf_call_frame_info opc
;
645 /* Make things easier for our callers, including missing operands. */
648 if (a
== NULL
|| b
== NULL
)
651 /* Obviously, the opcodes must match. */
653 if (opc
!= b
->dw_cfi_opc
)
656 /* Compare the two operands, re-using the type of the operands as
657 already exposed elsewhere. */
658 return (cfi_oprnd_equal_p (dw_cfi_oprnd1_desc (opc
),
659 &a
->dw_cfi_oprnd1
, &b
->dw_cfi_oprnd1
)
660 && cfi_oprnd_equal_p (dw_cfi_oprnd2_desc (opc
),
661 &a
->dw_cfi_oprnd2
, &b
->dw_cfi_oprnd2
));
664 /* Determine if two CFI_ROW structures are identical. */
667 cfi_row_equal_p (dw_cfi_row
*a
, dw_cfi_row
*b
)
669 size_t i
, n_a
, n_b
, n_max
;
673 if (!cfi_equal_p (a
->cfa_cfi
, b
->cfa_cfi
))
676 else if (!cfa_equal_p (&a
->cfa
, &b
->cfa
))
679 n_a
= vec_safe_length (a
->reg_save
);
680 n_b
= vec_safe_length (b
->reg_save
);
681 n_max
= MAX (n_a
, n_b
);
683 for (i
= 0; i
< n_max
; ++i
)
685 dw_cfi_ref r_a
= NULL
, r_b
= NULL
;
688 r_a
= (*a
->reg_save
)[i
];
690 r_b
= (*b
->reg_save
)[i
];
692 if (!cfi_equal_p (r_a
, r_b
))
699 /* The CFA is now calculated from NEW_CFA. Consider OLD_CFA in determining
700 what opcode to emit. Returns the CFI opcode to effect the change, or
701 NULL if NEW_CFA == OLD_CFA. */
704 def_cfa_0 (dw_cfa_location
*old_cfa
, dw_cfa_location
*new_cfa
)
708 /* If nothing changed, no need to issue any call frame instructions. */
709 if (cfa_equal_p (old_cfa
, new_cfa
))
714 if (new_cfa
->reg
== old_cfa
->reg
&& !new_cfa
->indirect
&& !old_cfa
->indirect
)
716 /* Construct a "DW_CFA_def_cfa_offset <offset>" instruction, indicating
717 the CFA register did not change but the offset did. The data
718 factoring for DW_CFA_def_cfa_offset_sf happens in output_cfi, or
719 in the assembler via the .cfi_def_cfa_offset directive. */
720 if (new_cfa
->offset
< 0)
721 cfi
->dw_cfi_opc
= DW_CFA_def_cfa_offset_sf
;
723 cfi
->dw_cfi_opc
= DW_CFA_def_cfa_offset
;
724 cfi
->dw_cfi_oprnd1
.dw_cfi_offset
= new_cfa
->offset
;
726 else if (new_cfa
->offset
== old_cfa
->offset
727 && old_cfa
->reg
!= INVALID_REGNUM
728 && !new_cfa
->indirect
729 && !old_cfa
->indirect
)
731 /* Construct a "DW_CFA_def_cfa_register <register>" instruction,
732 indicating the CFA register has changed to <register> but the
733 offset has not changed. */
734 cfi
->dw_cfi_opc
= DW_CFA_def_cfa_register
;
735 cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
= new_cfa
->reg
;
737 else if (new_cfa
->indirect
== 0)
739 /* Construct a "DW_CFA_def_cfa <register> <offset>" instruction,
740 indicating the CFA register has changed to <register> with
741 the specified offset. The data factoring for DW_CFA_def_cfa_sf
742 happens in output_cfi, or in the assembler via the .cfi_def_cfa
744 if (new_cfa
->offset
< 0)
745 cfi
->dw_cfi_opc
= DW_CFA_def_cfa_sf
;
747 cfi
->dw_cfi_opc
= DW_CFA_def_cfa
;
748 cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
= new_cfa
->reg
;
749 cfi
->dw_cfi_oprnd2
.dw_cfi_offset
= new_cfa
->offset
;
753 /* Construct a DW_CFA_def_cfa_expression instruction to
754 calculate the CFA using a full location expression since no
755 register-offset pair is available. */
756 struct dw_loc_descr_struct
*loc_list
;
758 cfi
->dw_cfi_opc
= DW_CFA_def_cfa_expression
;
759 loc_list
= build_cfa_loc (new_cfa
, 0);
760 cfi
->dw_cfi_oprnd1
.dw_cfi_loc
= loc_list
;
766 /* Similarly, but take OLD_CFA from CUR_ROW, and update it after the fact. */
769 def_cfa_1 (dw_cfa_location
*new_cfa
)
773 if (cur_trace
->cfa_store
.reg
== new_cfa
->reg
&& new_cfa
->indirect
== 0)
774 cur_trace
->cfa_store
.offset
= new_cfa
->offset
;
776 cfi
= def_cfa_0 (&cur_row
->cfa
, new_cfa
);
779 cur_row
->cfa
= *new_cfa
;
780 cur_row
->cfa_cfi
= (cfi
->dw_cfi_opc
== DW_CFA_def_cfa_expression
787 /* Add the CFI for saving a register. REG is the CFA column number.
788 If SREG is -1, the register is saved at OFFSET from the CFA;
789 otherwise it is saved in SREG. */
792 reg_save (unsigned int reg
, unsigned int sreg
, HOST_WIDE_INT offset
)
794 dw_fde_ref fde
= cfun
? cfun
->fde
: NULL
;
795 dw_cfi_ref cfi
= new_cfi ();
797 cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
= reg
;
799 /* When stack is aligned, store REG using DW_CFA_expression with FP. */
801 && fde
->stack_realign
802 && sreg
== INVALID_REGNUM
)
804 cfi
->dw_cfi_opc
= DW_CFA_expression
;
805 cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
= reg
;
806 cfi
->dw_cfi_oprnd2
.dw_cfi_loc
807 = build_cfa_aligned_loc (&cur_row
->cfa
, offset
,
808 fde
->stack_realignment
);
810 else if (sreg
== INVALID_REGNUM
)
812 if (need_data_align_sf_opcode (offset
))
813 cfi
->dw_cfi_opc
= DW_CFA_offset_extended_sf
;
814 else if (reg
& ~0x3f)
815 cfi
->dw_cfi_opc
= DW_CFA_offset_extended
;
817 cfi
->dw_cfi_opc
= DW_CFA_offset
;
818 cfi
->dw_cfi_oprnd2
.dw_cfi_offset
= offset
;
820 else if (sreg
== reg
)
822 /* While we could emit something like DW_CFA_same_value or
823 DW_CFA_restore, we never expect to see something like that
824 in a prologue. This is more likely to be a bug. A backend
825 can always bypass this by using REG_CFA_RESTORE directly. */
830 cfi
->dw_cfi_opc
= DW_CFA_register
;
831 cfi
->dw_cfi_oprnd2
.dw_cfi_reg_num
= sreg
;
835 update_row_reg_save (cur_row
, reg
, cfi
);
838 /* A subroutine of scan_trace. Check INSN for a REG_ARGS_SIZE note
839 and adjust data structures to match. */
842 notice_args_size (rtx insn
)
844 HOST_WIDE_INT args_size
, delta
;
847 note
= find_reg_note (insn
, REG_ARGS_SIZE
, NULL
);
851 args_size
= INTVAL (XEXP (note
, 0));
852 delta
= args_size
- cur_trace
->end_true_args_size
;
856 cur_trace
->end_true_args_size
= args_size
;
858 /* If the CFA is computed off the stack pointer, then we must adjust
859 the computation of the CFA as well. */
860 if (cur_cfa
->reg
== dw_stack_pointer_regnum
)
862 gcc_assert (!cur_cfa
->indirect
);
864 /* Convert a change in args_size (always a positive in the
865 direction of stack growth) to a change in stack pointer. */
866 #ifndef STACK_GROWS_DOWNWARD
869 cur_cfa
->offset
+= delta
;
873 /* A subroutine of scan_trace. INSN is can_throw_internal. Update the
874 data within the trace related to EH insns and args_size. */
877 notice_eh_throw (rtx insn
)
879 HOST_WIDE_INT args_size
;
881 args_size
= cur_trace
->end_true_args_size
;
882 if (cur_trace
->eh_head
== NULL
)
884 cur_trace
->eh_head
= insn
;
885 cur_trace
->beg_delay_args_size
= args_size
;
886 cur_trace
->end_delay_args_size
= args_size
;
888 else if (cur_trace
->end_delay_args_size
!= args_size
)
890 cur_trace
->end_delay_args_size
= args_size
;
892 /* ??? If the CFA is the stack pointer, search backward for the last
893 CFI note and insert there. Given that the stack changed for the
894 args_size change, there *must* be such a note in between here and
896 add_cfi_args_size (args_size
);
900 /* Short-hand inline for the very common D_F_R (REGNO (x)) operation. */
901 /* ??? This ought to go into dwarf2out.h, except that dwarf2out.h is
902 used in places where rtl is prohibited. */
904 static inline unsigned
905 dwf_regno (const_rtx reg
)
907 return DWARF_FRAME_REGNUM (REGNO (reg
));
910 /* Compare X and Y for equivalence. The inputs may be REGs or PC_RTX. */
913 compare_reg_or_pc (rtx x
, rtx y
)
915 if (REG_P (x
) && REG_P (y
))
916 return REGNO (x
) == REGNO (y
);
920 /* Record SRC as being saved in DEST. DEST may be null to delete an
921 existing entry. SRC may be a register or PC_RTX. */
924 record_reg_saved_in_reg (rtx dest
, rtx src
)
926 reg_saved_in_data
*elt
;
929 FOR_EACH_VEC_ELT (cur_trace
->regs_saved_in_regs
, i
, elt
)
930 if (compare_reg_or_pc (elt
->orig_reg
, src
))
933 cur_trace
->regs_saved_in_regs
.unordered_remove (i
);
935 elt
->saved_in_reg
= dest
;
942 reg_saved_in_data e
= {src
, dest
};
943 cur_trace
->regs_saved_in_regs
.safe_push (e
);
946 /* Add an entry to QUEUED_REG_SAVES saying that REG is now saved at
947 SREG, or if SREG is NULL then it is saved at OFFSET to the CFA. */
950 queue_reg_save (rtx reg
, rtx sreg
, HOST_WIDE_INT offset
)
953 queued_reg_save e
= {reg
, sreg
, offset
};
956 /* Duplicates waste space, but it's also necessary to remove them
957 for correctness, since the queue gets output in reverse order. */
958 FOR_EACH_VEC_ELT (queued_reg_saves
, i
, q
)
959 if (compare_reg_or_pc (q
->reg
, reg
))
965 queued_reg_saves
.safe_push (e
);
968 /* Output all the entries in QUEUED_REG_SAVES. */
971 dwarf2out_flush_queued_reg_saves (void)
976 FOR_EACH_VEC_ELT (queued_reg_saves
, i
, q
)
978 unsigned int reg
, sreg
;
980 record_reg_saved_in_reg (q
->saved_reg
, q
->reg
);
982 if (q
->reg
== pc_rtx
)
983 reg
= DWARF_FRAME_RETURN_COLUMN
;
985 reg
= dwf_regno (q
->reg
);
987 sreg
= dwf_regno (q
->saved_reg
);
989 sreg
= INVALID_REGNUM
;
990 reg_save (reg
, sreg
, q
->cfa_offset
);
993 queued_reg_saves
.truncate (0);
996 /* Does INSN clobber any register which QUEUED_REG_SAVES lists a saved
997 location for? Or, does it clobber a register which we've previously
998 said that some other register is saved in, and for which we now
999 have a new location for? */
1002 clobbers_queued_reg_save (const_rtx insn
)
1007 FOR_EACH_VEC_ELT (queued_reg_saves
, iq
, q
)
1010 reg_saved_in_data
*rir
;
1012 if (modified_in_p (q
->reg
, insn
))
1015 FOR_EACH_VEC_ELT (cur_trace
->regs_saved_in_regs
, ir
, rir
)
1016 if (compare_reg_or_pc (q
->reg
, rir
->orig_reg
)
1017 && modified_in_p (rir
->saved_in_reg
, insn
))
1024 /* What register, if any, is currently saved in REG? */
1027 reg_saved_in (rtx reg
)
1029 unsigned int regn
= REGNO (reg
);
1031 reg_saved_in_data
*rir
;
1034 FOR_EACH_VEC_ELT (queued_reg_saves
, i
, q
)
1035 if (q
->saved_reg
&& regn
== REGNO (q
->saved_reg
))
1038 FOR_EACH_VEC_ELT (cur_trace
->regs_saved_in_regs
, i
, rir
)
1039 if (regn
== REGNO (rir
->saved_in_reg
))
1040 return rir
->orig_reg
;
1045 /* A subroutine of dwarf2out_frame_debug, process a REG_DEF_CFA note. */
1048 dwarf2out_frame_debug_def_cfa (rtx pat
)
1050 memset (cur_cfa
, 0, sizeof (*cur_cfa
));
1052 if (GET_CODE (pat
) == PLUS
)
1054 cur_cfa
->offset
= INTVAL (XEXP (pat
, 1));
1055 pat
= XEXP (pat
, 0);
1059 cur_cfa
->indirect
= 1;
1060 pat
= XEXP (pat
, 0);
1061 if (GET_CODE (pat
) == PLUS
)
1063 cur_cfa
->base_offset
= INTVAL (XEXP (pat
, 1));
1064 pat
= XEXP (pat
, 0);
1067 /* ??? If this fails, we could be calling into the _loc functions to
1068 define a full expression. So far no port does that. */
1069 gcc_assert (REG_P (pat
));
1070 cur_cfa
->reg
= dwf_regno (pat
);
1073 /* A subroutine of dwarf2out_frame_debug, process a REG_ADJUST_CFA note. */
1076 dwarf2out_frame_debug_adjust_cfa (rtx pat
)
1080 gcc_assert (GET_CODE (pat
) == SET
);
1081 dest
= XEXP (pat
, 0);
1082 src
= XEXP (pat
, 1);
1084 switch (GET_CODE (src
))
1087 gcc_assert (dwf_regno (XEXP (src
, 0)) == cur_cfa
->reg
);
1088 cur_cfa
->offset
-= INTVAL (XEXP (src
, 1));
1098 cur_cfa
->reg
= dwf_regno (dest
);
1099 gcc_assert (cur_cfa
->indirect
== 0);
1102 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_OFFSET note. */
1105 dwarf2out_frame_debug_cfa_offset (rtx set
)
1107 HOST_WIDE_INT offset
;
1108 rtx src
, addr
, span
;
1109 unsigned int sregno
;
1111 src
= XEXP (set
, 1);
1112 addr
= XEXP (set
, 0);
1113 gcc_assert (MEM_P (addr
));
1114 addr
= XEXP (addr
, 0);
1116 /* As documented, only consider extremely simple addresses. */
1117 switch (GET_CODE (addr
))
1120 gcc_assert (dwf_regno (addr
) == cur_cfa
->reg
);
1121 offset
= -cur_cfa
->offset
;
1124 gcc_assert (dwf_regno (XEXP (addr
, 0)) == cur_cfa
->reg
);
1125 offset
= INTVAL (XEXP (addr
, 1)) - cur_cfa
->offset
;
1134 sregno
= DWARF_FRAME_RETURN_COLUMN
;
1138 span
= targetm
.dwarf_register_span (src
);
1139 sregno
= dwf_regno (src
);
1142 /* ??? We'd like to use queue_reg_save, but we need to come up with
1143 a different flushing heuristic for epilogues. */
1145 reg_save (sregno
, INVALID_REGNUM
, offset
);
1148 /* We have a PARALLEL describing where the contents of SRC live.
1149 Queue register saves for each piece of the PARALLEL. */
1152 HOST_WIDE_INT span_offset
= offset
;
1154 gcc_assert (GET_CODE (span
) == PARALLEL
);
1156 limit
= XVECLEN (span
, 0);
1157 for (par_index
= 0; par_index
< limit
; par_index
++)
1159 rtx elem
= XVECEXP (span
, 0, par_index
);
1161 sregno
= dwf_regno (src
);
1162 reg_save (sregno
, INVALID_REGNUM
, span_offset
);
1163 span_offset
+= GET_MODE_SIZE (GET_MODE (elem
));
1168 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_REGISTER note. */
1171 dwarf2out_frame_debug_cfa_register (rtx set
)
1174 unsigned sregno
, dregno
;
1176 src
= XEXP (set
, 1);
1177 dest
= XEXP (set
, 0);
1179 record_reg_saved_in_reg (dest
, src
);
1181 sregno
= DWARF_FRAME_RETURN_COLUMN
;
1183 sregno
= dwf_regno (src
);
1185 dregno
= dwf_regno (dest
);
1187 /* ??? We'd like to use queue_reg_save, but we need to come up with
1188 a different flushing heuristic for epilogues. */
1189 reg_save (sregno
, dregno
, 0);
1192 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_EXPRESSION note. */
1195 dwarf2out_frame_debug_cfa_expression (rtx set
)
1197 rtx src
, dest
, span
;
1198 dw_cfi_ref cfi
= new_cfi ();
1201 dest
= SET_DEST (set
);
1202 src
= SET_SRC (set
);
1204 gcc_assert (REG_P (src
));
1205 gcc_assert (MEM_P (dest
));
1207 span
= targetm
.dwarf_register_span (src
);
1210 regno
= dwf_regno (src
);
1212 cfi
->dw_cfi_opc
= DW_CFA_expression
;
1213 cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
= regno
;
1214 cfi
->dw_cfi_oprnd2
.dw_cfi_loc
1215 = mem_loc_descriptor (XEXP (dest
, 0), get_address_mode (dest
),
1216 GET_MODE (dest
), VAR_INIT_STATUS_INITIALIZED
);
1218 /* ??? We'd like to use queue_reg_save, were the interface different,
1219 and, as above, we could manage flushing for epilogues. */
1221 update_row_reg_save (cur_row
, regno
, cfi
);
1224 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_RESTORE note. */
1227 dwarf2out_frame_debug_cfa_restore (rtx reg
)
1229 unsigned int regno
= dwf_regno (reg
);
1231 add_cfi_restore (regno
);
1232 update_row_reg_save (cur_row
, regno
, NULL
);
1235 /* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE.
1236 ??? Perhaps we should note in the CIE where windows are saved (instead of
1237 assuming 0(cfa)) and what registers are in the window. */
1240 dwarf2out_frame_debug_cfa_window_save (void)
1242 dw_cfi_ref cfi
= new_cfi ();
1244 cfi
->dw_cfi_opc
= DW_CFA_GNU_window_save
;
1248 /* Record call frame debugging information for an expression EXPR,
1249 which either sets SP or FP (adjusting how we calculate the frame
1250 address) or saves a register to the stack or another register.
1251 LABEL indicates the address of EXPR.
1253 This function encodes a state machine mapping rtxes to actions on
1254 cfa, cfa_store, and cfa_temp.reg. We describe these rules so
1255 users need not read the source code.
1257 The High-Level Picture
1259 Changes in the register we use to calculate the CFA: Currently we
1260 assume that if you copy the CFA register into another register, we
1261 should take the other one as the new CFA register; this seems to
1262 work pretty well. If it's wrong for some target, it's simple
1263 enough not to set RTX_FRAME_RELATED_P on the insn in question.
1265 Changes in the register we use for saving registers to the stack:
1266 This is usually SP, but not always. Again, we deduce that if you
1267 copy SP into another register (and SP is not the CFA register),
1268 then the new register is the one we will be using for register
1269 saves. This also seems to work.
1271 Register saves: There's not much guesswork about this one; if
1272 RTX_FRAME_RELATED_P is set on an insn which modifies memory, it's a
1273 register save, and the register used to calculate the destination
1274 had better be the one we think we're using for this purpose.
1275 It's also assumed that a copy from a call-saved register to another
1276 register is saving that register if RTX_FRAME_RELATED_P is set on
1277 that instruction. If the copy is from a call-saved register to
1278 the *same* register, that means that the register is now the same
1279 value as in the caller.
1281 Except: If the register being saved is the CFA register, and the
1282 offset is nonzero, we are saving the CFA, so we assume we have to
1283 use DW_CFA_def_cfa_expression. If the offset is 0, we assume that
1284 the intent is to save the value of SP from the previous frame.
1286 In addition, if a register has previously been saved to a different
1289 Invariants / Summaries of Rules
1291 cfa current rule for calculating the CFA. It usually
1292 consists of a register and an offset. This is
1293 actually stored in *cur_cfa, but abbreviated
1294 for the purposes of this documentation.
1295 cfa_store register used by prologue code to save things to the stack
1296 cfa_store.offset is the offset from the value of
1297 cfa_store.reg to the actual CFA
1298 cfa_temp register holding an integral value. cfa_temp.offset
1299 stores the value, which will be used to adjust the
1300 stack pointer. cfa_temp is also used like cfa_store,
1301 to track stores to the stack via fp or a temp reg.
1303 Rules 1- 4: Setting a register's value to cfa.reg or an expression
1304 with cfa.reg as the first operand changes the cfa.reg and its
1305 cfa.offset. Rule 1 and 4 also set cfa_temp.reg and
1308 Rules 6- 9: Set a non-cfa.reg register value to a constant or an
1309 expression yielding a constant. This sets cfa_temp.reg
1310 and cfa_temp.offset.
1312 Rule 5: Create a new register cfa_store used to save items to the
1315 Rules 10-14: Save a register to the stack. Define offset as the
1316 difference of the original location and cfa_store's
1317 location (or cfa_temp's location if cfa_temp is used).
1319 Rules 16-20: If AND operation happens on sp in prologue, we assume
1320 stack is realigned. We will use a group of DW_OP_XXX
1321 expressions to represent the location of the stored
1322 register instead of CFA+offset.
1326 "{a,b}" indicates a choice of a xor b.
1327 "<reg>:cfa.reg" indicates that <reg> must equal cfa.reg.
1330 (set <reg1> <reg2>:cfa.reg)
1331 effects: cfa.reg = <reg1>
1332 cfa.offset unchanged
1333 cfa_temp.reg = <reg1>
1334 cfa_temp.offset = cfa.offset
1337 (set sp ({minus,plus,losum} {sp,fp}:cfa.reg
1338 {<const_int>,<reg>:cfa_temp.reg}))
1339 effects: cfa.reg = sp if fp used
1340 cfa.offset += {+/- <const_int>, cfa_temp.offset} if cfa.reg==sp
1341 cfa_store.offset += {+/- <const_int>, cfa_temp.offset}
1342 if cfa_store.reg==sp
1345 (set fp ({minus,plus,losum} <reg>:cfa.reg <const_int>))
1346 effects: cfa.reg = fp
1347 cfa_offset += +/- <const_int>
1350 (set <reg1> ({plus,losum} <reg2>:cfa.reg <const_int>))
1351 constraints: <reg1> != fp
1353 effects: cfa.reg = <reg1>
1354 cfa_temp.reg = <reg1>
1355 cfa_temp.offset = cfa.offset
1358 (set <reg1> (plus <reg2>:cfa_temp.reg sp:cfa.reg))
1359 constraints: <reg1> != fp
1361 effects: cfa_store.reg = <reg1>
1362 cfa_store.offset = cfa.offset - cfa_temp.offset
1365 (set <reg> <const_int>)
1366 effects: cfa_temp.reg = <reg>
1367 cfa_temp.offset = <const_int>
1370 (set <reg1>:cfa_temp.reg (ior <reg2>:cfa_temp.reg <const_int>))
1371 effects: cfa_temp.reg = <reg1>
1372 cfa_temp.offset |= <const_int>
1375 (set <reg> (high <exp>))
1379 (set <reg> (lo_sum <exp> <const_int>))
1380 effects: cfa_temp.reg = <reg>
1381 cfa_temp.offset = <const_int>
1384 (set (mem ({pre,post}_modify sp:cfa_store (???? <reg1> <const_int>))) <reg2>)
1385 effects: cfa_store.offset -= <const_int>
1386 cfa.offset = cfa_store.offset if cfa.reg == sp
1388 cfa.base_offset = -cfa_store.offset
1391 (set (mem ({pre_inc,pre_dec,post_dec} sp:cfa_store.reg)) <reg>)
1392 effects: cfa_store.offset += -/+ mode_size(mem)
1393 cfa.offset = cfa_store.offset if cfa.reg == sp
1395 cfa.base_offset = -cfa_store.offset
1398 (set (mem ({minus,plus,losum} <reg1>:{cfa_store,cfa_temp} <const_int>))
1401 effects: cfa.reg = <reg1>
1402 cfa.base_offset = -/+ <const_int> - {cfa_store,cfa_temp}.offset
1405 (set (mem <reg1>:{cfa_store,cfa_temp}) <reg2>)
1406 effects: cfa.reg = <reg1>
1407 cfa.base_offset = -{cfa_store,cfa_temp}.offset
1410 (set (mem (post_inc <reg1>:cfa_temp <const_int>)) <reg2>)
1411 effects: cfa.reg = <reg1>
1412 cfa.base_offset = -cfa_temp.offset
1413 cfa_temp.offset -= mode_size(mem)
1416 (set <reg> {unspec, unspec_volatile})
1417 effects: target-dependent
1420 (set sp (and: sp <const_int>))
1421 constraints: cfa_store.reg == sp
1422 effects: cfun->fde.stack_realign = 1
1423 cfa_store.offset = 0
1424 fde->drap_reg = cfa.reg if cfa.reg != sp and cfa.reg != fp
1427 (set (mem ({pre_inc, pre_dec} sp)) (mem (plus (cfa.reg) (const_int))))
1428 effects: cfa_store.offset += -/+ mode_size(mem)
1431 (set (mem ({pre_inc, pre_dec} sp)) fp)
1432 constraints: fde->stack_realign == 1
1433 effects: cfa_store.offset = 0
1434 cfa.reg != HARD_FRAME_POINTER_REGNUM
1437 (set (mem ({pre_inc, pre_dec} sp)) cfa.reg)
1438 constraints: fde->stack_realign == 1
1440 && cfa.indirect == 0
1441 && cfa.reg != HARD_FRAME_POINTER_REGNUM
1442 effects: Use DW_CFA_def_cfa_expression to define cfa
1443 cfa.reg == fde->drap_reg */
1446 dwarf2out_frame_debug_expr (rtx expr
)
1448 rtx src
, dest
, span
;
1449 HOST_WIDE_INT offset
;
1452 /* If RTX_FRAME_RELATED_P is set on a PARALLEL, process each member of
1453 the PARALLEL independently. The first element is always processed if
1454 it is a SET. This is for backward compatibility. Other elements
1455 are processed only if they are SETs and the RTX_FRAME_RELATED_P
1456 flag is set in them. */
1457 if (GET_CODE (expr
) == PARALLEL
|| GET_CODE (expr
) == SEQUENCE
)
1460 int limit
= XVECLEN (expr
, 0);
1463 /* PARALLELs have strict read-modify-write semantics, so we
1464 ought to evaluate every rvalue before changing any lvalue.
1465 It's cumbersome to do that in general, but there's an
1466 easy approximation that is enough for all current users:
1467 handle register saves before register assignments. */
1468 if (GET_CODE (expr
) == PARALLEL
)
1469 for (par_index
= 0; par_index
< limit
; par_index
++)
1471 elem
= XVECEXP (expr
, 0, par_index
);
1472 if (GET_CODE (elem
) == SET
1473 && MEM_P (SET_DEST (elem
))
1474 && (RTX_FRAME_RELATED_P (elem
) || par_index
== 0))
1475 dwarf2out_frame_debug_expr (elem
);
1478 for (par_index
= 0; par_index
< limit
; par_index
++)
1480 elem
= XVECEXP (expr
, 0, par_index
);
1481 if (GET_CODE (elem
) == SET
1482 && (!MEM_P (SET_DEST (elem
)) || GET_CODE (expr
) == SEQUENCE
)
1483 && (RTX_FRAME_RELATED_P (elem
) || par_index
== 0))
1484 dwarf2out_frame_debug_expr (elem
);
1489 gcc_assert (GET_CODE (expr
) == SET
);
1491 src
= SET_SRC (expr
);
1492 dest
= SET_DEST (expr
);
1496 rtx rsi
= reg_saved_in (src
);
1503 switch (GET_CODE (dest
))
1506 switch (GET_CODE (src
))
1508 /* Setting FP from SP. */
1510 if (cur_cfa
->reg
== dwf_regno (src
))
1513 /* Update the CFA rule wrt SP or FP. Make sure src is
1514 relative to the current CFA register.
1516 We used to require that dest be either SP or FP, but the
1517 ARM copies SP to a temporary register, and from there to
1518 FP. So we just rely on the backends to only set
1519 RTX_FRAME_RELATED_P on appropriate insns. */
1520 cur_cfa
->reg
= dwf_regno (dest
);
1521 cur_trace
->cfa_temp
.reg
= cur_cfa
->reg
;
1522 cur_trace
->cfa_temp
.offset
= cur_cfa
->offset
;
1526 /* Saving a register in a register. */
1527 gcc_assert (!fixed_regs
[REGNO (dest
)]
1528 /* For the SPARC and its register window. */
1529 || (dwf_regno (src
) == DWARF_FRAME_RETURN_COLUMN
));
1531 /* After stack is aligned, we can only save SP in FP
1532 if drap register is used. In this case, we have
1533 to restore stack pointer with the CFA value and we
1534 don't generate this DWARF information. */
1536 && fde
->stack_realign
1537 && REGNO (src
) == STACK_POINTER_REGNUM
)
1538 gcc_assert (REGNO (dest
) == HARD_FRAME_POINTER_REGNUM
1539 && fde
->drap_reg
!= INVALID_REGNUM
1540 && cur_cfa
->reg
!= dwf_regno (src
));
1542 queue_reg_save (src
, dest
, 0);
1549 if (dest
== stack_pointer_rtx
)
1553 switch (GET_CODE (XEXP (src
, 1)))
1556 offset
= INTVAL (XEXP (src
, 1));
1559 gcc_assert (dwf_regno (XEXP (src
, 1))
1560 == cur_trace
->cfa_temp
.reg
);
1561 offset
= cur_trace
->cfa_temp
.offset
;
1567 if (XEXP (src
, 0) == hard_frame_pointer_rtx
)
1569 /* Restoring SP from FP in the epilogue. */
1570 gcc_assert (cur_cfa
->reg
== dw_frame_pointer_regnum
);
1571 cur_cfa
->reg
= dw_stack_pointer_regnum
;
1573 else if (GET_CODE (src
) == LO_SUM
)
1574 /* Assume we've set the source reg of the LO_SUM from sp. */
1577 gcc_assert (XEXP (src
, 0) == stack_pointer_rtx
);
1579 if (GET_CODE (src
) != MINUS
)
1581 if (cur_cfa
->reg
== dw_stack_pointer_regnum
)
1582 cur_cfa
->offset
+= offset
;
1583 if (cur_trace
->cfa_store
.reg
== dw_stack_pointer_regnum
)
1584 cur_trace
->cfa_store
.offset
+= offset
;
1586 else if (dest
== hard_frame_pointer_rtx
)
1589 /* Either setting the FP from an offset of the SP,
1590 or adjusting the FP */
1591 gcc_assert (frame_pointer_needed
);
1593 gcc_assert (REG_P (XEXP (src
, 0))
1594 && dwf_regno (XEXP (src
, 0)) == cur_cfa
->reg
1595 && CONST_INT_P (XEXP (src
, 1)));
1596 offset
= INTVAL (XEXP (src
, 1));
1597 if (GET_CODE (src
) != MINUS
)
1599 cur_cfa
->offset
+= offset
;
1600 cur_cfa
->reg
= dw_frame_pointer_regnum
;
1604 gcc_assert (GET_CODE (src
) != MINUS
);
1607 if (REG_P (XEXP (src
, 0))
1608 && dwf_regno (XEXP (src
, 0)) == cur_cfa
->reg
1609 && CONST_INT_P (XEXP (src
, 1)))
1611 /* Setting a temporary CFA register that will be copied
1612 into the FP later on. */
1613 offset
= - INTVAL (XEXP (src
, 1));
1614 cur_cfa
->offset
+= offset
;
1615 cur_cfa
->reg
= dwf_regno (dest
);
1616 /* Or used to save regs to the stack. */
1617 cur_trace
->cfa_temp
.reg
= cur_cfa
->reg
;
1618 cur_trace
->cfa_temp
.offset
= cur_cfa
->offset
;
1622 else if (REG_P (XEXP (src
, 0))
1623 && dwf_regno (XEXP (src
, 0)) == cur_trace
->cfa_temp
.reg
1624 && XEXP (src
, 1) == stack_pointer_rtx
)
1626 /* Setting a scratch register that we will use instead
1627 of SP for saving registers to the stack. */
1628 gcc_assert (cur_cfa
->reg
== dw_stack_pointer_regnum
);
1629 cur_trace
->cfa_store
.reg
= dwf_regno (dest
);
1630 cur_trace
->cfa_store
.offset
1631 = cur_cfa
->offset
- cur_trace
->cfa_temp
.offset
;
1635 else if (GET_CODE (src
) == LO_SUM
1636 && CONST_INT_P (XEXP (src
, 1)))
1638 cur_trace
->cfa_temp
.reg
= dwf_regno (dest
);
1639 cur_trace
->cfa_temp
.offset
= INTVAL (XEXP (src
, 1));
1648 cur_trace
->cfa_temp
.reg
= dwf_regno (dest
);
1649 cur_trace
->cfa_temp
.offset
= INTVAL (src
);
1654 gcc_assert (REG_P (XEXP (src
, 0))
1655 && dwf_regno (XEXP (src
, 0)) == cur_trace
->cfa_temp
.reg
1656 && CONST_INT_P (XEXP (src
, 1)));
1658 cur_trace
->cfa_temp
.reg
= dwf_regno (dest
);
1659 cur_trace
->cfa_temp
.offset
|= INTVAL (XEXP (src
, 1));
1662 /* Skip over HIGH, assuming it will be followed by a LO_SUM,
1663 which will fill in all of the bits. */
1670 case UNSPEC_VOLATILE
:
1671 /* All unspecs should be represented by REG_CFA_* notes. */
1677 /* If this AND operation happens on stack pointer in prologue,
1678 we assume the stack is realigned and we extract the
1680 if (fde
&& XEXP (src
, 0) == stack_pointer_rtx
)
1682 /* We interpret reg_save differently with stack_realign set.
1683 Thus we must flush whatever we have queued first. */
1684 dwarf2out_flush_queued_reg_saves ();
1686 gcc_assert (cur_trace
->cfa_store
.reg
1687 == dwf_regno (XEXP (src
, 0)));
1688 fde
->stack_realign
= 1;
1689 fde
->stack_realignment
= INTVAL (XEXP (src
, 1));
1690 cur_trace
->cfa_store
.offset
= 0;
1692 if (cur_cfa
->reg
!= dw_stack_pointer_regnum
1693 && cur_cfa
->reg
!= dw_frame_pointer_regnum
)
1694 fde
->drap_reg
= cur_cfa
->reg
;
1705 /* Saving a register to the stack. Make sure dest is relative to the
1707 switch (GET_CODE (XEXP (dest
, 0)))
1713 /* We can't handle variable size modifications. */
1714 gcc_assert (GET_CODE (XEXP (XEXP (XEXP (dest
, 0), 1), 1))
1716 offset
= -INTVAL (XEXP (XEXP (XEXP (dest
, 0), 1), 1));
1718 gcc_assert (REGNO (XEXP (XEXP (dest
, 0), 0)) == STACK_POINTER_REGNUM
1719 && cur_trace
->cfa_store
.reg
== dw_stack_pointer_regnum
);
1721 cur_trace
->cfa_store
.offset
+= offset
;
1722 if (cur_cfa
->reg
== dw_stack_pointer_regnum
)
1723 cur_cfa
->offset
= cur_trace
->cfa_store
.offset
;
1725 if (GET_CODE (XEXP (dest
, 0)) == POST_MODIFY
)
1726 offset
-= cur_trace
->cfa_store
.offset
;
1728 offset
= -cur_trace
->cfa_store
.offset
;
1735 offset
= GET_MODE_SIZE (GET_MODE (dest
));
1736 if (GET_CODE (XEXP (dest
, 0)) == PRE_INC
)
1739 gcc_assert ((REGNO (XEXP (XEXP (dest
, 0), 0))
1740 == STACK_POINTER_REGNUM
)
1741 && cur_trace
->cfa_store
.reg
== dw_stack_pointer_regnum
);
1743 cur_trace
->cfa_store
.offset
+= offset
;
1745 /* Rule 18: If stack is aligned, we will use FP as a
1746 reference to represent the address of the stored
1749 && fde
->stack_realign
1751 && REGNO (src
) == HARD_FRAME_POINTER_REGNUM
)
1753 gcc_assert (cur_cfa
->reg
!= dw_frame_pointer_regnum
);
1754 cur_trace
->cfa_store
.offset
= 0;
1757 if (cur_cfa
->reg
== dw_stack_pointer_regnum
)
1758 cur_cfa
->offset
= cur_trace
->cfa_store
.offset
;
1760 if (GET_CODE (XEXP (dest
, 0)) == POST_DEC
)
1761 offset
+= -cur_trace
->cfa_store
.offset
;
1763 offset
= -cur_trace
->cfa_store
.offset
;
1767 /* With an offset. */
1774 gcc_assert (CONST_INT_P (XEXP (XEXP (dest
, 0), 1))
1775 && REG_P (XEXP (XEXP (dest
, 0), 0)));
1776 offset
= INTVAL (XEXP (XEXP (dest
, 0), 1));
1777 if (GET_CODE (XEXP (dest
, 0)) == MINUS
)
1780 regno
= dwf_regno (XEXP (XEXP (dest
, 0), 0));
1782 if (cur_cfa
->reg
== regno
)
1783 offset
-= cur_cfa
->offset
;
1784 else if (cur_trace
->cfa_store
.reg
== regno
)
1785 offset
-= cur_trace
->cfa_store
.offset
;
1788 gcc_assert (cur_trace
->cfa_temp
.reg
== regno
);
1789 offset
-= cur_trace
->cfa_temp
.offset
;
1795 /* Without an offset. */
1798 unsigned int regno
= dwf_regno (XEXP (dest
, 0));
1800 if (cur_cfa
->reg
== regno
)
1801 offset
= -cur_cfa
->offset
;
1802 else if (cur_trace
->cfa_store
.reg
== regno
)
1803 offset
= -cur_trace
->cfa_store
.offset
;
1806 gcc_assert (cur_trace
->cfa_temp
.reg
== regno
);
1807 offset
= -cur_trace
->cfa_temp
.offset
;
1814 gcc_assert (cur_trace
->cfa_temp
.reg
1815 == dwf_regno (XEXP (XEXP (dest
, 0), 0)));
1816 offset
= -cur_trace
->cfa_temp
.offset
;
1817 cur_trace
->cfa_temp
.offset
-= GET_MODE_SIZE (GET_MODE (dest
));
1825 /* If the source operand of this MEM operation is a memory,
1826 we only care how much stack grew. */
1831 && REGNO (src
) != STACK_POINTER_REGNUM
1832 && REGNO (src
) != HARD_FRAME_POINTER_REGNUM
1833 && dwf_regno (src
) == cur_cfa
->reg
)
1835 /* We're storing the current CFA reg into the stack. */
1837 if (cur_cfa
->offset
== 0)
1840 /* If stack is aligned, putting CFA reg into stack means
1841 we can no longer use reg + offset to represent CFA.
1842 Here we use DW_CFA_def_cfa_expression instead. The
1843 result of this expression equals to the original CFA
1846 && fde
->stack_realign
1847 && cur_cfa
->indirect
== 0
1848 && cur_cfa
->reg
!= dw_frame_pointer_regnum
)
1850 gcc_assert (fde
->drap_reg
== cur_cfa
->reg
);
1852 cur_cfa
->indirect
= 1;
1853 cur_cfa
->reg
= dw_frame_pointer_regnum
;
1854 cur_cfa
->base_offset
= offset
;
1855 cur_cfa
->offset
= 0;
1857 fde
->drap_reg_saved
= 1;
1861 /* If the source register is exactly the CFA, assume
1862 we're saving SP like any other register; this happens
1864 queue_reg_save (stack_pointer_rtx
, NULL_RTX
, offset
);
1869 /* Otherwise, we'll need to look in the stack to
1870 calculate the CFA. */
1871 rtx x
= XEXP (dest
, 0);
1875 gcc_assert (REG_P (x
));
1877 cur_cfa
->reg
= dwf_regno (x
);
1878 cur_cfa
->base_offset
= offset
;
1879 cur_cfa
->indirect
= 1;
1886 span
= targetm
.dwarf_register_span (src
);
1888 queue_reg_save (src
, NULL_RTX
, offset
);
1891 /* We have a PARALLEL describing where the contents of SRC live.
1892 Queue register saves for each piece of the PARALLEL. */
1895 HOST_WIDE_INT span_offset
= offset
;
1897 gcc_assert (GET_CODE (span
) == PARALLEL
);
1899 limit
= XVECLEN (span
, 0);
1900 for (par_index
= 0; par_index
< limit
; par_index
++)
1902 rtx elem
= XVECEXP (span
, 0, par_index
);
1903 queue_reg_save (elem
, NULL_RTX
, span_offset
);
1904 span_offset
+= GET_MODE_SIZE (GET_MODE (elem
));
1914 /* Record call frame debugging information for INSN, which either sets
1915 SP or FP (adjusting how we calculate the frame address) or saves a
1916 register to the stack. */
1919 dwarf2out_frame_debug (rtx insn
)
1922 bool handled_one
= false;
1924 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1925 switch (REG_NOTE_KIND (note
))
1927 case REG_FRAME_RELATED_EXPR
:
1928 insn
= XEXP (note
, 0);
1931 case REG_CFA_DEF_CFA
:
1932 dwarf2out_frame_debug_def_cfa (XEXP (note
, 0));
1936 case REG_CFA_ADJUST_CFA
:
1941 if (GET_CODE (n
) == PARALLEL
)
1942 n
= XVECEXP (n
, 0, 0);
1944 dwarf2out_frame_debug_adjust_cfa (n
);
1948 case REG_CFA_OFFSET
:
1951 n
= single_set (insn
);
1952 dwarf2out_frame_debug_cfa_offset (n
);
1956 case REG_CFA_REGISTER
:
1961 if (GET_CODE (n
) == PARALLEL
)
1962 n
= XVECEXP (n
, 0, 0);
1964 dwarf2out_frame_debug_cfa_register (n
);
1968 case REG_CFA_EXPRESSION
:
1971 n
= single_set (insn
);
1972 dwarf2out_frame_debug_cfa_expression (n
);
1976 case REG_CFA_RESTORE
:
1981 if (GET_CODE (n
) == PARALLEL
)
1982 n
= XVECEXP (n
, 0, 0);
1985 dwarf2out_frame_debug_cfa_restore (n
);
1989 case REG_CFA_SET_VDRAP
:
1993 dw_fde_ref fde
= cfun
->fde
;
1996 gcc_assert (fde
->vdrap_reg
== INVALID_REGNUM
);
1998 fde
->vdrap_reg
= dwf_regno (n
);
2004 case REG_CFA_WINDOW_SAVE
:
2005 dwarf2out_frame_debug_cfa_window_save ();
2009 case REG_CFA_FLUSH_QUEUE
:
2010 /* The actual flush happens elsewhere. */
2020 insn
= PATTERN (insn
);
2022 dwarf2out_frame_debug_expr (insn
);
2024 /* Check again. A parallel can save and update the same register.
2025 We could probably check just once, here, but this is safer than
2026 removing the check at the start of the function. */
2027 if (clobbers_queued_reg_save (insn
))
2028 dwarf2out_flush_queued_reg_saves ();
2032 /* Emit CFI info to change the state from OLD_ROW to NEW_ROW. */
2035 change_cfi_row (dw_cfi_row
*old_row
, dw_cfi_row
*new_row
)
2037 size_t i
, n_old
, n_new
, n_max
;
2040 if (new_row
->cfa_cfi
&& !cfi_equal_p (old_row
->cfa_cfi
, new_row
->cfa_cfi
))
2041 add_cfi (new_row
->cfa_cfi
);
2044 cfi
= def_cfa_0 (&old_row
->cfa
, &new_row
->cfa
);
2049 n_old
= vec_safe_length (old_row
->reg_save
);
2050 n_new
= vec_safe_length (new_row
->reg_save
);
2051 n_max
= MAX (n_old
, n_new
);
2053 for (i
= 0; i
< n_max
; ++i
)
2055 dw_cfi_ref r_old
= NULL
, r_new
= NULL
;
2058 r_old
= (*old_row
->reg_save
)[i
];
2060 r_new
= (*new_row
->reg_save
)[i
];
2064 else if (r_new
== NULL
)
2065 add_cfi_restore (i
);
2066 else if (!cfi_equal_p (r_old
, r_new
))
2071 /* Examine CFI and return true if a cfi label and set_loc is needed
2072 beforehand. Even when generating CFI assembler instructions, we
2073 still have to add the cfi to the list so that lookup_cfa_1 works
2074 later on. When -g2 and above we even need to force emitting of
2075 CFI labels and add to list a DW_CFA_set_loc for convert_cfa_to_fb_loc_list
2076 purposes. If we're generating DWARF3 output we use DW_OP_call_frame_cfa
2077 and so don't use convert_cfa_to_fb_loc_list. */
2080 cfi_label_required_p (dw_cfi_ref cfi
)
2082 if (!dwarf2out_do_cfi_asm ())
2085 if (dwarf_version
== 2
2086 && debug_info_level
> DINFO_LEVEL_TERSE
2087 && (write_symbols
== DWARF2_DEBUG
2088 || write_symbols
== VMS_AND_DWARF2_DEBUG
))
2090 switch (cfi
->dw_cfi_opc
)
2092 case DW_CFA_def_cfa_offset
:
2093 case DW_CFA_def_cfa_offset_sf
:
2094 case DW_CFA_def_cfa_register
:
2095 case DW_CFA_def_cfa
:
2096 case DW_CFA_def_cfa_sf
:
2097 case DW_CFA_def_cfa_expression
:
2098 case DW_CFA_restore_state
:
2107 /* Walk the function, looking for NOTE_INSN_CFI notes. Add the CFIs to the
2108 function's FDE, adding CFI labels and set_loc/advance_loc opcodes as
2111 add_cfis_to_fde (void)
2113 dw_fde_ref fde
= cfun
->fde
;
2115 /* We always start with a function_begin label. */
2118 for (insn
= get_insns (); insn
; insn
= next
)
2120 next
= NEXT_INSN (insn
);
2122 if (NOTE_P (insn
) && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
)
2124 fde
->dw_fde_switch_cfi_index
= vec_safe_length (fde
->dw_fde_cfi
);
2125 /* Don't attempt to advance_loc4 between labels
2126 in different sections. */
2130 if (NOTE_P (insn
) && NOTE_KIND (insn
) == NOTE_INSN_CFI
)
2132 bool required
= cfi_label_required_p (NOTE_CFI (insn
));
2134 if (NOTE_P (next
) && NOTE_KIND (next
) == NOTE_INSN_CFI
)
2136 required
|= cfi_label_required_p (NOTE_CFI (next
));
2137 next
= NEXT_INSN (next
);
2139 else if (active_insn_p (next
)
2140 || (NOTE_P (next
) && (NOTE_KIND (next
)
2141 == NOTE_INSN_SWITCH_TEXT_SECTIONS
)))
2144 next
= NEXT_INSN (next
);
2147 int num
= dwarf2out_cfi_label_num
;
2148 const char *label
= dwarf2out_cfi_label ();
2152 /* Set the location counter to the new label. */
2154 xcfi
->dw_cfi_opc
= (first
? DW_CFA_set_loc
2155 : DW_CFA_advance_loc4
);
2156 xcfi
->dw_cfi_oprnd1
.dw_cfi_addr
= label
;
2157 vec_safe_push (fde
->dw_fde_cfi
, xcfi
);
2159 tmp
= emit_note_before (NOTE_INSN_CFI_LABEL
, insn
);
2160 NOTE_LABEL_NUMBER (tmp
) = num
;
2165 if (NOTE_P (insn
) && NOTE_KIND (insn
) == NOTE_INSN_CFI
)
2166 vec_safe_push (fde
->dw_fde_cfi
, NOTE_CFI (insn
));
2167 insn
= NEXT_INSN (insn
);
2169 while (insn
!= next
);
2175 /* If LABEL is the start of a trace, then initialize the state of that
2176 trace from CUR_TRACE and CUR_ROW. */
2179 maybe_record_trace_start (rtx start
, rtx origin
)
2182 HOST_WIDE_INT args_size
;
2184 ti
= get_trace_info (start
);
2185 gcc_assert (ti
!= NULL
);
2189 fprintf (dump_file
, " saw edge from trace %u to %u (via %s %d)\n",
2190 cur_trace
->id
, ti
->id
,
2191 (origin
? rtx_name
[(int) GET_CODE (origin
)] : "fallthru"),
2192 (origin
? INSN_UID (origin
) : 0));
2195 args_size
= cur_trace
->end_true_args_size
;
2196 if (ti
->beg_row
== NULL
)
2198 /* This is the first time we've encountered this trace. Propagate
2199 state across the edge and push the trace onto the work list. */
2200 ti
->beg_row
= copy_cfi_row (cur_row
);
2201 ti
->beg_true_args_size
= args_size
;
2203 ti
->cfa_store
= cur_trace
->cfa_store
;
2204 ti
->cfa_temp
= cur_trace
->cfa_temp
;
2205 ti
->regs_saved_in_regs
= cur_trace
->regs_saved_in_regs
.copy ();
2207 trace_work_list
.safe_push (ti
);
2210 fprintf (dump_file
, "\tpush trace %u to worklist\n", ti
->id
);
2215 /* We ought to have the same state incoming to a given trace no
2216 matter how we arrive at the trace. Anything else means we've
2217 got some kind of optimization error. */
2218 gcc_checking_assert (cfi_row_equal_p (cur_row
, ti
->beg_row
));
2220 /* The args_size is allowed to conflict if it isn't actually used. */
2221 if (ti
->beg_true_args_size
!= args_size
)
2222 ti
->args_size_undefined
= true;
2226 /* Similarly, but handle the args_size and CFA reset across EH
2227 and non-local goto edges. */
2230 maybe_record_trace_start_abnormal (rtx start
, rtx origin
)
2232 HOST_WIDE_INT save_args_size
, delta
;
2233 dw_cfa_location save_cfa
;
2235 save_args_size
= cur_trace
->end_true_args_size
;
2236 if (save_args_size
== 0)
2238 maybe_record_trace_start (start
, origin
);
2242 delta
= -save_args_size
;
2243 cur_trace
->end_true_args_size
= 0;
2245 save_cfa
= cur_row
->cfa
;
2246 if (cur_row
->cfa
.reg
== dw_stack_pointer_regnum
)
2248 /* Convert a change in args_size (always a positive in the
2249 direction of stack growth) to a change in stack pointer. */
2250 #ifndef STACK_GROWS_DOWNWARD
2253 cur_row
->cfa
.offset
+= delta
;
2256 maybe_record_trace_start (start
, origin
);
2258 cur_trace
->end_true_args_size
= save_args_size
;
2259 cur_row
->cfa
= save_cfa
;
2262 /* Propagate CUR_TRACE state to the destinations implied by INSN. */
2263 /* ??? Sadly, this is in large part a duplicate of make_edges. */
2266 create_trace_edges (rtx insn
)
2273 if (find_reg_note (insn
, REG_NON_LOCAL_GOTO
, NULL_RTX
))
2276 if (tablejump_p (insn
, NULL
, &tmp
))
2280 tmp
= PATTERN (tmp
);
2281 vec
= XVEC (tmp
, GET_CODE (tmp
) == ADDR_DIFF_VEC
);
2283 n
= GET_NUM_ELEM (vec
);
2284 for (i
= 0; i
< n
; ++i
)
2286 lab
= XEXP (RTVEC_ELT (vec
, i
), 0);
2287 maybe_record_trace_start (lab
, insn
);
2290 else if (computed_jump_p (insn
))
2292 for (lab
= forced_labels
; lab
; lab
= XEXP (lab
, 1))
2293 maybe_record_trace_start (XEXP (lab
, 0), insn
);
2295 else if (returnjump_p (insn
))
2297 else if ((tmp
= extract_asm_operands (PATTERN (insn
))) != NULL
)
2299 n
= ASM_OPERANDS_LABEL_LENGTH (tmp
);
2300 for (i
= 0; i
< n
; ++i
)
2302 lab
= XEXP (ASM_OPERANDS_LABEL (tmp
, i
), 0);
2303 maybe_record_trace_start (lab
, insn
);
2308 lab
= JUMP_LABEL (insn
);
2309 gcc_assert (lab
!= NULL
);
2310 maybe_record_trace_start (lab
, insn
);
2313 else if (CALL_P (insn
))
2315 /* Sibling calls don't have edges inside this function. */
2316 if (SIBLING_CALL_P (insn
))
2319 /* Process non-local goto edges. */
2320 if (can_nonlocal_goto (insn
))
2321 for (lab
= nonlocal_goto_handler_labels
; lab
; lab
= XEXP (lab
, 1))
2322 maybe_record_trace_start_abnormal (XEXP (lab
, 0), insn
);
2324 else if (GET_CODE (PATTERN (insn
)) == SEQUENCE
)
2326 rtx seq
= PATTERN (insn
);
2327 int i
, n
= XVECLEN (seq
, 0);
2328 for (i
= 0; i
< n
; ++i
)
2329 create_trace_edges (XVECEXP (seq
, 0, i
));
2333 /* Process EH edges. */
2334 if (CALL_P (insn
) || cfun
->can_throw_non_call_exceptions
)
2336 eh_landing_pad lp
= get_eh_landing_pad_from_rtx (insn
);
2338 maybe_record_trace_start_abnormal (lp
->landing_pad
, insn
);
2342 /* A subroutine of scan_trace. Do what needs to be done "after" INSN. */
2345 scan_insn_after (rtx insn
)
2347 if (RTX_FRAME_RELATED_P (insn
))
2348 dwarf2out_frame_debug (insn
);
2349 notice_args_size (insn
);
2352 /* Scan the trace beginning at INSN and create the CFI notes for the
2353 instructions therein. */
2356 scan_trace (dw_trace_info
*trace
)
2358 rtx prev
, insn
= trace
->head
;
2359 dw_cfa_location this_cfa
;
2362 fprintf (dump_file
, "Processing trace %u : start at %s %d\n",
2363 trace
->id
, rtx_name
[(int) GET_CODE (insn
)],
2366 trace
->end_row
= copy_cfi_row (trace
->beg_row
);
2367 trace
->end_true_args_size
= trace
->beg_true_args_size
;
2370 cur_row
= trace
->end_row
;
2372 this_cfa
= cur_row
->cfa
;
2373 cur_cfa
= &this_cfa
;
2375 for (prev
= insn
, insn
= NEXT_INSN (insn
);
2377 prev
= insn
, insn
= NEXT_INSN (insn
))
2381 /* Do everything that happens "before" the insn. */
2382 add_cfi_insn
= prev
;
2384 /* Notice the end of a trace. */
2385 if (BARRIER_P (insn
))
2387 /* Don't bother saving the unneeded queued registers at all. */
2388 queued_reg_saves
.truncate (0);
2391 if (save_point_p (insn
))
2393 /* Propagate across fallthru edges. */
2394 dwarf2out_flush_queued_reg_saves ();
2395 maybe_record_trace_start (insn
, NULL
);
2399 if (DEBUG_INSN_P (insn
) || !inside_basic_block_p (insn
))
2402 /* Handle all changes to the row state. Sequences require special
2403 handling for the positioning of the notes. */
2404 if (GET_CODE (PATTERN (insn
)) == SEQUENCE
)
2406 rtx elt
, pat
= PATTERN (insn
);
2407 int i
, n
= XVECLEN (pat
, 0);
2409 control
= XVECEXP (pat
, 0, 0);
2410 if (can_throw_internal (control
))
2411 notice_eh_throw (control
);
2412 dwarf2out_flush_queued_reg_saves ();
2414 if (JUMP_P (control
) && INSN_ANNULLED_BRANCH_P (control
))
2416 /* ??? Hopefully multiple delay slots are not annulled. */
2417 gcc_assert (n
== 2);
2418 gcc_assert (!RTX_FRAME_RELATED_P (control
));
2419 gcc_assert (!find_reg_note (control
, REG_ARGS_SIZE
, NULL
));
2421 elt
= XVECEXP (pat
, 0, 1);
2423 if (INSN_FROM_TARGET_P (elt
))
2425 HOST_WIDE_INT restore_args_size
;
2426 cfi_vec save_row_reg_save
;
2428 /* If ELT is an instruction from target of an annulled
2429 branch, the effects are for the target only and so
2430 the args_size and CFA along the current path
2431 shouldn't change. */
2432 add_cfi_insn
= NULL
;
2433 restore_args_size
= cur_trace
->end_true_args_size
;
2434 cur_cfa
= &cur_row
->cfa
;
2435 save_row_reg_save
= vec_safe_copy (cur_row
->reg_save
);
2437 scan_insn_after (elt
);
2439 /* ??? Should we instead save the entire row state? */
2440 gcc_assert (!queued_reg_saves
.length ());
2442 create_trace_edges (control
);
2444 cur_trace
->end_true_args_size
= restore_args_size
;
2445 cur_row
->cfa
= this_cfa
;
2446 cur_row
->reg_save
= save_row_reg_save
;
2447 cur_cfa
= &this_cfa
;
2451 /* If ELT is a annulled branch-taken instruction (i.e.
2452 executed only when branch is not taken), the args_size
2453 and CFA should not change through the jump. */
2454 create_trace_edges (control
);
2456 /* Update and continue with the trace. */
2457 add_cfi_insn
= insn
;
2458 scan_insn_after (elt
);
2459 def_cfa_1 (&this_cfa
);
2464 /* The insns in the delay slot should all be considered to happen
2465 "before" a call insn. Consider a call with a stack pointer
2466 adjustment in the delay slot. The backtrace from the callee
2467 should include the sp adjustment. Unfortunately, that leaves
2468 us with an unavoidable unwinding error exactly at the call insn
2469 itself. For jump insns we'd prefer to avoid this error by
2470 placing the notes after the sequence. */
2471 if (JUMP_P (control
))
2472 add_cfi_insn
= insn
;
2474 for (i
= 1; i
< n
; ++i
)
2476 elt
= XVECEXP (pat
, 0, i
);
2477 scan_insn_after (elt
);
2480 /* Make sure any register saves are visible at the jump target. */
2481 dwarf2out_flush_queued_reg_saves ();
2482 any_cfis_emitted
= false;
2484 /* However, if there is some adjustment on the call itself, e.g.
2485 a call_pop, that action should be considered to happen after
2486 the call returns. */
2487 add_cfi_insn
= insn
;
2488 scan_insn_after (control
);
2492 /* Flush data before calls and jumps, and of course if necessary. */
2493 if (can_throw_internal (insn
))
2495 notice_eh_throw (insn
);
2496 dwarf2out_flush_queued_reg_saves ();
2498 else if (!NONJUMP_INSN_P (insn
)
2499 || clobbers_queued_reg_save (insn
)
2500 || find_reg_note (insn
, REG_CFA_FLUSH_QUEUE
, NULL
))
2501 dwarf2out_flush_queued_reg_saves ();
2502 any_cfis_emitted
= false;
2504 add_cfi_insn
= insn
;
2505 scan_insn_after (insn
);
2509 /* Between frame-related-p and args_size we might have otherwise
2510 emitted two cfa adjustments. Do it now. */
2511 def_cfa_1 (&this_cfa
);
2513 /* Minimize the number of advances by emitting the entire queue
2514 once anything is emitted. */
2515 if (any_cfis_emitted
2516 || find_reg_note (insn
, REG_CFA_FLUSH_QUEUE
, NULL
))
2517 dwarf2out_flush_queued_reg_saves ();
2519 /* Note that a test for control_flow_insn_p does exactly the
2520 same tests as are done to actually create the edges. So
2521 always call the routine and let it not create edges for
2522 non-control-flow insns. */
2523 create_trace_edges (control
);
2526 add_cfi_insn
= NULL
;
2532 /* Scan the function and create the initial set of CFI notes. */
2535 create_cfi_notes (void)
2539 gcc_checking_assert (!queued_reg_saves
.exists ());
2540 gcc_checking_assert (!trace_work_list
.exists ());
2542 /* Always begin at the entry trace. */
2543 ti
= &trace_info
[0];
2546 while (!trace_work_list
.is_empty ())
2548 ti
= trace_work_list
.pop ();
2552 queued_reg_saves
.release ();
2553 trace_work_list
.release ();
2556 /* Return the insn before the first NOTE_INSN_CFI after START. */
2559 before_next_cfi_note (rtx start
)
2564 if (NOTE_P (start
) && NOTE_KIND (start
) == NOTE_INSN_CFI
)
2567 start
= NEXT_INSN (start
);
2572 /* Insert CFI notes between traces to properly change state between them. */
2575 connect_traces (void)
2577 unsigned i
, n
= trace_info
.length ();
2578 dw_trace_info
*prev_ti
, *ti
;
2580 /* ??? Ideally, we should have both queued and processed every trace.
2581 However the current representation of constant pools on various targets
2582 is indistinguishable from unreachable code. Assume for the moment that
2583 we can simply skip over such traces. */
2584 /* ??? Consider creating a DATA_INSN rtx code to indicate that
2585 these are not "real" instructions, and should not be considered.
2586 This could be generically useful for tablejump data as well. */
2587 /* Remove all unprocessed traces from the list. */
2588 for (i
= n
- 1; i
> 0; --i
)
2590 ti
= &trace_info
[i
];
2591 if (ti
->beg_row
== NULL
)
2593 trace_info
.ordered_remove (i
);
2597 gcc_assert (ti
->end_row
!= NULL
);
2600 /* Work from the end back to the beginning. This lets us easily insert
2601 remember/restore_state notes in the correct order wrt other notes. */
2602 prev_ti
= &trace_info
[n
- 1];
2603 for (i
= n
- 1; i
> 0; --i
)
2605 dw_cfi_row
*old_row
;
2608 prev_ti
= &trace_info
[i
- 1];
2610 add_cfi_insn
= ti
->head
;
2612 /* In dwarf2out_switch_text_section, we'll begin a new FDE
2613 for the portion of the function in the alternate text
2614 section. The row state at the very beginning of that
2615 new FDE will be exactly the row state from the CIE. */
2616 if (ti
->switch_sections
)
2617 old_row
= cie_cfi_row
;
2620 old_row
= prev_ti
->end_row
;
2621 /* If there's no change from the previous end state, fine. */
2622 if (cfi_row_equal_p (old_row
, ti
->beg_row
))
2624 /* Otherwise check for the common case of sharing state with
2625 the beginning of an epilogue, but not the end. Insert
2626 remember/restore opcodes in that case. */
2627 else if (cfi_row_equal_p (prev_ti
->beg_row
, ti
->beg_row
))
2631 /* Note that if we blindly insert the remember at the
2632 start of the trace, we can wind up increasing the
2633 size of the unwind info due to extra advance opcodes.
2634 Instead, put the remember immediately before the next
2635 state change. We know there must be one, because the
2636 state at the beginning and head of the trace differ. */
2637 add_cfi_insn
= before_next_cfi_note (prev_ti
->head
);
2639 cfi
->dw_cfi_opc
= DW_CFA_remember_state
;
2642 add_cfi_insn
= ti
->head
;
2644 cfi
->dw_cfi_opc
= DW_CFA_restore_state
;
2647 old_row
= prev_ti
->beg_row
;
2649 /* Otherwise, we'll simply change state from the previous end. */
2652 change_cfi_row (old_row
, ti
->beg_row
);
2654 if (dump_file
&& add_cfi_insn
!= ti
->head
)
2658 fprintf (dump_file
, "Fixup between trace %u and %u:\n",
2659 prev_ti
->id
, ti
->id
);
2664 note
= NEXT_INSN (note
);
2665 gcc_assert (NOTE_P (note
) && NOTE_KIND (note
) == NOTE_INSN_CFI
);
2666 output_cfi_directive (dump_file
, NOTE_CFI (note
));
2668 while (note
!= add_cfi_insn
);
2672 /* Connect args_size between traces that have can_throw_internal insns. */
2673 if (cfun
->eh
->lp_array
)
2675 HOST_WIDE_INT prev_args_size
= 0;
2677 for (i
= 0; i
< n
; ++i
)
2679 ti
= &trace_info
[i
];
2681 if (ti
->switch_sections
)
2683 if (ti
->eh_head
== NULL
)
2685 gcc_assert (!ti
->args_size_undefined
);
2687 if (ti
->beg_delay_args_size
!= prev_args_size
)
2689 /* ??? Search back to previous CFI note. */
2690 add_cfi_insn
= PREV_INSN (ti
->eh_head
);
2691 add_cfi_args_size (ti
->beg_delay_args_size
);
2694 prev_args_size
= ti
->end_delay_args_size
;
2699 /* Set up the pseudo-cfg of instruction traces, as described at the
2700 block comment at the top of the file. */
2703 create_pseudo_cfg (void)
2705 bool saw_barrier
, switch_sections
;
2710 /* The first trace begins at the start of the function,
2711 and begins with the CIE row state. */
2712 trace_info
.create (16);
2713 memset (&ti
, 0, sizeof (ti
));
2714 ti
.head
= get_insns ();
2715 ti
.beg_row
= cie_cfi_row
;
2716 ti
.cfa_store
= cie_cfi_row
->cfa
;
2717 ti
.cfa_temp
.reg
= INVALID_REGNUM
;
2718 trace_info
.quick_push (ti
);
2720 if (cie_return_save
)
2721 ti
.regs_saved_in_regs
.safe_push (*cie_return_save
);
2723 /* Walk all the insns, collecting start of trace locations. */
2724 saw_barrier
= false;
2725 switch_sections
= false;
2726 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
2728 if (BARRIER_P (insn
))
2730 else if (NOTE_P (insn
)
2731 && NOTE_KIND (insn
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
)
2733 /* We should have just seen a barrier. */
2734 gcc_assert (saw_barrier
);
2735 switch_sections
= true;
2737 /* Watch out for save_point notes between basic blocks.
2738 In particular, a note after a barrier. Do not record these,
2739 delaying trace creation until the label. */
2740 else if (save_point_p (insn
)
2741 && (LABEL_P (insn
) || !saw_barrier
))
2743 memset (&ti
, 0, sizeof (ti
));
2745 ti
.switch_sections
= switch_sections
;
2746 ti
.id
= trace_info
.length () - 1;
2747 trace_info
.safe_push (ti
);
2749 saw_barrier
= false;
2750 switch_sections
= false;
2754 /* Create the trace index after we've finished building trace_info,
2755 avoiding stale pointer problems due to reallocation. */
2756 trace_index
.create (trace_info
.length ());
2758 FOR_EACH_VEC_ELT (trace_info
, i
, tp
)
2760 dw_trace_info
**slot
;
2763 fprintf (dump_file
, "Creating trace %u : start at %s %d%s\n", i
,
2764 rtx_name
[(int) GET_CODE (tp
->head
)], INSN_UID (tp
->head
),
2765 tp
->switch_sections
? " (section switch)" : "");
2767 slot
= trace_index
.find_slot_with_hash (tp
, INSN_UID (tp
->head
), INSERT
);
2768 gcc_assert (*slot
== NULL
);
2773 /* Record the initial position of the return address. RTL is
2774 INCOMING_RETURN_ADDR_RTX. */
2777 initial_return_save (rtx rtl
)
2779 unsigned int reg
= INVALID_REGNUM
;
2780 HOST_WIDE_INT offset
= 0;
2782 switch (GET_CODE (rtl
))
2785 /* RA is in a register. */
2786 reg
= dwf_regno (rtl
);
2790 /* RA is on the stack. */
2791 rtl
= XEXP (rtl
, 0);
2792 switch (GET_CODE (rtl
))
2795 gcc_assert (REGNO (rtl
) == STACK_POINTER_REGNUM
);
2800 gcc_assert (REGNO (XEXP (rtl
, 0)) == STACK_POINTER_REGNUM
);
2801 offset
= INTVAL (XEXP (rtl
, 1));
2805 gcc_assert (REGNO (XEXP (rtl
, 0)) == STACK_POINTER_REGNUM
);
2806 offset
= -INTVAL (XEXP (rtl
, 1));
2816 /* The return address is at some offset from any value we can
2817 actually load. For instance, on the SPARC it is in %i7+8. Just
2818 ignore the offset for now; it doesn't matter for unwinding frames. */
2819 gcc_assert (CONST_INT_P (XEXP (rtl
, 1)));
2820 initial_return_save (XEXP (rtl
, 0));
2827 if (reg
!= DWARF_FRAME_RETURN_COLUMN
)
2829 if (reg
!= INVALID_REGNUM
)
2830 record_reg_saved_in_reg (rtl
, pc_rtx
);
2831 reg_save (DWARF_FRAME_RETURN_COLUMN
, reg
, offset
- cur_row
->cfa
.offset
);
2836 create_cie_data (void)
2838 dw_cfa_location loc
;
2839 dw_trace_info cie_trace
;
2841 dw_stack_pointer_regnum
= DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM
);
2842 dw_frame_pointer_regnum
= DWARF_FRAME_REGNUM (HARD_FRAME_POINTER_REGNUM
);
2844 memset (&cie_trace
, 0, sizeof (cie_trace
));
2845 cur_trace
= &cie_trace
;
2847 add_cfi_vec
= &cie_cfi_vec
;
2848 cie_cfi_row
= cur_row
= new_cfi_row ();
2850 /* On entry, the Canonical Frame Address is at SP. */
2851 memset (&loc
, 0, sizeof (loc
));
2852 loc
.reg
= dw_stack_pointer_regnum
;
2853 loc
.offset
= INCOMING_FRAME_SP_OFFSET
;
2856 if (targetm
.debug_unwind_info () == UI_DWARF2
2857 || targetm_common
.except_unwind_info (&global_options
) == UI_DWARF2
)
2859 initial_return_save (INCOMING_RETURN_ADDR_RTX
);
2861 /* For a few targets, we have the return address incoming into a
2862 register, but choose a different return column. This will result
2863 in a DW_CFA_register for the return, and an entry in
2864 regs_saved_in_regs to match. If the target later stores that
2865 return address register to the stack, we want to be able to emit
2866 the DW_CFA_offset against the return column, not the intermediate
2867 save register. Save the contents of regs_saved_in_regs so that
2868 we can re-initialize it at the start of each function. */
2869 switch (cie_trace
.regs_saved_in_regs
.length ())
2874 cie_return_save
= ggc_alloc_reg_saved_in_data ();
2875 *cie_return_save
= cie_trace
.regs_saved_in_regs
[0];
2876 cie_trace
.regs_saved_in_regs
.release ();
2888 /* Annotate the function with NOTE_INSN_CFI notes to record the CFI
2889 state at each location within the function. These notes will be
2890 emitted during pass_final. */
2893 execute_dwarf2_frame (void)
2895 /* The first time we're called, compute the incoming frame state. */
2896 if (cie_cfi_vec
== NULL
)
2899 dwarf2out_alloc_current_fde ();
2901 create_pseudo_cfg ();
2904 create_cfi_notes ();
2908 /* Free all the data we allocated. */
2913 FOR_EACH_VEC_ELT (trace_info
, i
, ti
)
2914 ti
->regs_saved_in_regs
.release ();
2916 trace_info
.release ();
2918 trace_index
.dispose ();
2923 /* Convert a DWARF call frame info. operation to its string name */
2926 dwarf_cfi_name (unsigned int cfi_opc
)
2928 const char *name
= get_DW_CFA_name (cfi_opc
);
2933 return "DW_CFA_<unknown>";
2936 /* This routine will generate the correct assembly data for a location
2937 description based on a cfi entry with a complex address. */
2940 output_cfa_loc (dw_cfi_ref cfi
, int for_eh
)
2942 dw_loc_descr_ref loc
;
2945 if (cfi
->dw_cfi_opc
== DW_CFA_expression
)
2948 DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
2949 dw2_asm_output_data (1, r
, NULL
);
2950 loc
= cfi
->dw_cfi_oprnd2
.dw_cfi_loc
;
2953 loc
= cfi
->dw_cfi_oprnd1
.dw_cfi_loc
;
2955 /* Output the size of the block. */
2956 size
= size_of_locs (loc
);
2957 dw2_asm_output_data_uleb128 (size
, NULL
);
2959 /* Now output the operations themselves. */
2960 output_loc_sequence (loc
, for_eh
);
2963 /* Similar, but used for .cfi_escape. */
2966 output_cfa_loc_raw (dw_cfi_ref cfi
)
2968 dw_loc_descr_ref loc
;
2971 if (cfi
->dw_cfi_opc
== DW_CFA_expression
)
2974 DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
2975 fprintf (asm_out_file
, "%#x,", r
);
2976 loc
= cfi
->dw_cfi_oprnd2
.dw_cfi_loc
;
2979 loc
= cfi
->dw_cfi_oprnd1
.dw_cfi_loc
;
2981 /* Output the size of the block. */
2982 size
= size_of_locs (loc
);
2983 dw2_asm_output_data_uleb128_raw (size
);
2984 fputc (',', asm_out_file
);
2986 /* Now output the operations themselves. */
2987 output_loc_sequence_raw (loc
);
2990 /* Output a Call Frame Information opcode and its operand(s). */
2993 output_cfi (dw_cfi_ref cfi
, dw_fde_ref fde
, int for_eh
)
2998 if (cfi
->dw_cfi_opc
== DW_CFA_advance_loc
)
2999 dw2_asm_output_data (1, (cfi
->dw_cfi_opc
3000 | (cfi
->dw_cfi_oprnd1
.dw_cfi_offset
& 0x3f)),
3001 "DW_CFA_advance_loc " HOST_WIDE_INT_PRINT_HEX
,
3002 ((unsigned HOST_WIDE_INT
)
3003 cfi
->dw_cfi_oprnd1
.dw_cfi_offset
));
3004 else if (cfi
->dw_cfi_opc
== DW_CFA_offset
)
3006 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3007 dw2_asm_output_data (1, (cfi
->dw_cfi_opc
| (r
& 0x3f)),
3008 "DW_CFA_offset, column %#lx", r
);
3009 off
= div_data_align (cfi
->dw_cfi_oprnd2
.dw_cfi_offset
);
3010 dw2_asm_output_data_uleb128 (off
, NULL
);
3012 else if (cfi
->dw_cfi_opc
== DW_CFA_restore
)
3014 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3015 dw2_asm_output_data (1, (cfi
->dw_cfi_opc
| (r
& 0x3f)),
3016 "DW_CFA_restore, column %#lx", r
);
3020 dw2_asm_output_data (1, cfi
->dw_cfi_opc
,
3021 "%s", dwarf_cfi_name (cfi
->dw_cfi_opc
));
3023 switch (cfi
->dw_cfi_opc
)
3025 case DW_CFA_set_loc
:
3027 dw2_asm_output_encoded_addr_rtx (
3028 ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0),
3029 gen_rtx_SYMBOL_REF (Pmode
, cfi
->dw_cfi_oprnd1
.dw_cfi_addr
),
3032 dw2_asm_output_addr (DWARF2_ADDR_SIZE
,
3033 cfi
->dw_cfi_oprnd1
.dw_cfi_addr
, NULL
);
3034 fde
->dw_fde_current_label
= cfi
->dw_cfi_oprnd1
.dw_cfi_addr
;
3037 case DW_CFA_advance_loc1
:
3038 dw2_asm_output_delta (1, cfi
->dw_cfi_oprnd1
.dw_cfi_addr
,
3039 fde
->dw_fde_current_label
, NULL
);
3040 fde
->dw_fde_current_label
= cfi
->dw_cfi_oprnd1
.dw_cfi_addr
;
3043 case DW_CFA_advance_loc2
:
3044 dw2_asm_output_delta (2, cfi
->dw_cfi_oprnd1
.dw_cfi_addr
,
3045 fde
->dw_fde_current_label
, NULL
);
3046 fde
->dw_fde_current_label
= cfi
->dw_cfi_oprnd1
.dw_cfi_addr
;
3049 case DW_CFA_advance_loc4
:
3050 dw2_asm_output_delta (4, cfi
->dw_cfi_oprnd1
.dw_cfi_addr
,
3051 fde
->dw_fde_current_label
, NULL
);
3052 fde
->dw_fde_current_label
= cfi
->dw_cfi_oprnd1
.dw_cfi_addr
;
3055 case DW_CFA_MIPS_advance_loc8
:
3056 dw2_asm_output_delta (8, cfi
->dw_cfi_oprnd1
.dw_cfi_addr
,
3057 fde
->dw_fde_current_label
, NULL
);
3058 fde
->dw_fde_current_label
= cfi
->dw_cfi_oprnd1
.dw_cfi_addr
;
3061 case DW_CFA_offset_extended
:
3062 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3063 dw2_asm_output_data_uleb128 (r
, NULL
);
3064 off
= div_data_align (cfi
->dw_cfi_oprnd2
.dw_cfi_offset
);
3065 dw2_asm_output_data_uleb128 (off
, NULL
);
3068 case DW_CFA_def_cfa
:
3069 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3070 dw2_asm_output_data_uleb128 (r
, NULL
);
3071 dw2_asm_output_data_uleb128 (cfi
->dw_cfi_oprnd2
.dw_cfi_offset
, NULL
);
3074 case DW_CFA_offset_extended_sf
:
3075 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3076 dw2_asm_output_data_uleb128 (r
, NULL
);
3077 off
= div_data_align (cfi
->dw_cfi_oprnd2
.dw_cfi_offset
);
3078 dw2_asm_output_data_sleb128 (off
, NULL
);
3081 case DW_CFA_def_cfa_sf
:
3082 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3083 dw2_asm_output_data_uleb128 (r
, NULL
);
3084 off
= div_data_align (cfi
->dw_cfi_oprnd2
.dw_cfi_offset
);
3085 dw2_asm_output_data_sleb128 (off
, NULL
);
3088 case DW_CFA_restore_extended
:
3089 case DW_CFA_undefined
:
3090 case DW_CFA_same_value
:
3091 case DW_CFA_def_cfa_register
:
3092 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3093 dw2_asm_output_data_uleb128 (r
, NULL
);
3096 case DW_CFA_register
:
3097 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, for_eh
);
3098 dw2_asm_output_data_uleb128 (r
, NULL
);
3099 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd2
.dw_cfi_reg_num
, for_eh
);
3100 dw2_asm_output_data_uleb128 (r
, NULL
);
3103 case DW_CFA_def_cfa_offset
:
3104 case DW_CFA_GNU_args_size
:
3105 dw2_asm_output_data_uleb128 (cfi
->dw_cfi_oprnd1
.dw_cfi_offset
, NULL
);
3108 case DW_CFA_def_cfa_offset_sf
:
3109 off
= div_data_align (cfi
->dw_cfi_oprnd1
.dw_cfi_offset
);
3110 dw2_asm_output_data_sleb128 (off
, NULL
);
3113 case DW_CFA_GNU_window_save
:
3116 case DW_CFA_def_cfa_expression
:
3117 case DW_CFA_expression
:
3118 output_cfa_loc (cfi
, for_eh
);
3121 case DW_CFA_GNU_negative_offset_extended
:
3122 /* Obsoleted by DW_CFA_offset_extended_sf. */
3131 /* Similar, but do it via assembler directives instead. */
3134 output_cfi_directive (FILE *f
, dw_cfi_ref cfi
)
3136 unsigned long r
, r2
;
3138 switch (cfi
->dw_cfi_opc
)
3140 case DW_CFA_advance_loc
:
3141 case DW_CFA_advance_loc1
:
3142 case DW_CFA_advance_loc2
:
3143 case DW_CFA_advance_loc4
:
3144 case DW_CFA_MIPS_advance_loc8
:
3145 case DW_CFA_set_loc
:
3146 /* Should only be created in a code path not followed when emitting
3147 via directives. The assembler is going to take care of this for
3148 us. But this routines is also used for debugging dumps, so
3150 gcc_assert (f
!= asm_out_file
);
3151 fprintf (f
, "\t.cfi_advance_loc\n");
3155 case DW_CFA_offset_extended
:
3156 case DW_CFA_offset_extended_sf
:
3157 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
3158 fprintf (f
, "\t.cfi_offset %lu, "HOST_WIDE_INT_PRINT_DEC
"\n",
3159 r
, cfi
->dw_cfi_oprnd2
.dw_cfi_offset
);
3162 case DW_CFA_restore
:
3163 case DW_CFA_restore_extended
:
3164 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
3165 fprintf (f
, "\t.cfi_restore %lu\n", r
);
3168 case DW_CFA_undefined
:
3169 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
3170 fprintf (f
, "\t.cfi_undefined %lu\n", r
);
3173 case DW_CFA_same_value
:
3174 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
3175 fprintf (f
, "\t.cfi_same_value %lu\n", r
);
3178 case DW_CFA_def_cfa
:
3179 case DW_CFA_def_cfa_sf
:
3180 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
3181 fprintf (f
, "\t.cfi_def_cfa %lu, "HOST_WIDE_INT_PRINT_DEC
"\n",
3182 r
, cfi
->dw_cfi_oprnd2
.dw_cfi_offset
);
3185 case DW_CFA_def_cfa_register
:
3186 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
3187 fprintf (f
, "\t.cfi_def_cfa_register %lu\n", r
);
3190 case DW_CFA_register
:
3191 r
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd1
.dw_cfi_reg_num
, 1);
3192 r2
= DWARF2_FRAME_REG_OUT (cfi
->dw_cfi_oprnd2
.dw_cfi_reg_num
, 1);
3193 fprintf (f
, "\t.cfi_register %lu, %lu\n", r
, r2
);
3196 case DW_CFA_def_cfa_offset
:
3197 case DW_CFA_def_cfa_offset_sf
:
3198 fprintf (f
, "\t.cfi_def_cfa_offset "
3199 HOST_WIDE_INT_PRINT_DEC
"\n",
3200 cfi
->dw_cfi_oprnd1
.dw_cfi_offset
);
3203 case DW_CFA_remember_state
:
3204 fprintf (f
, "\t.cfi_remember_state\n");
3206 case DW_CFA_restore_state
:
3207 fprintf (f
, "\t.cfi_restore_state\n");
3210 case DW_CFA_GNU_args_size
:
3211 if (f
== asm_out_file
)
3213 fprintf (f
, "\t.cfi_escape %#x,", DW_CFA_GNU_args_size
);
3214 dw2_asm_output_data_uleb128_raw (cfi
->dw_cfi_oprnd1
.dw_cfi_offset
);
3216 fprintf (f
, "\t%s args_size "HOST_WIDE_INT_PRINT_DEC
,
3217 ASM_COMMENT_START
, cfi
->dw_cfi_oprnd1
.dw_cfi_offset
);
3222 fprintf (f
, "\t.cfi_GNU_args_size "HOST_WIDE_INT_PRINT_DEC
"\n",
3223 cfi
->dw_cfi_oprnd1
.dw_cfi_offset
);
3227 case DW_CFA_GNU_window_save
:
3228 fprintf (f
, "\t.cfi_window_save\n");
3231 case DW_CFA_def_cfa_expression
:
3232 if (f
!= asm_out_file
)
3234 fprintf (f
, "\t.cfi_def_cfa_expression ...\n");
3238 case DW_CFA_expression
:
3239 if (f
!= asm_out_file
)
3241 fprintf (f
, "\t.cfi_cfa_expression ...\n");
3244 fprintf (f
, "\t.cfi_escape %#x,", cfi
->dw_cfi_opc
);
3245 output_cfa_loc_raw (cfi
);
3255 dwarf2out_emit_cfi (dw_cfi_ref cfi
)
3257 if (dwarf2out_do_cfi_asm ())
3258 output_cfi_directive (asm_out_file
, cfi
);
3262 dump_cfi_row (FILE *f
, dw_cfi_row
*row
)
3270 dw_cfa_location dummy
;
3271 memset (&dummy
, 0, sizeof (dummy
));
3272 dummy
.reg
= INVALID_REGNUM
;
3273 cfi
= def_cfa_0 (&dummy
, &row
->cfa
);
3275 output_cfi_directive (f
, cfi
);
3277 FOR_EACH_VEC_SAFE_ELT (row
->reg_save
, i
, cfi
)
3279 output_cfi_directive (f
, cfi
);
3282 void debug_cfi_row (dw_cfi_row
*row
);
3285 debug_cfi_row (dw_cfi_row
*row
)
3287 dump_cfi_row (stderr
, row
);
3291 /* Save the result of dwarf2out_do_frame across PCH.
3292 This variable is tri-state, with 0 unset, >0 true, <0 false. */
3293 static GTY(()) signed char saved_do_cfi_asm
= 0;
3295 /* Decide whether we want to emit frame unwind information for the current
3296 translation unit. */
3299 dwarf2out_do_frame (void)
3301 /* We want to emit correct CFA location expressions or lists, so we
3302 have to return true if we're going to output debug info, even if
3303 we're not going to output frame or unwind info. */
3304 if (write_symbols
== DWARF2_DEBUG
|| write_symbols
== VMS_AND_DWARF2_DEBUG
)
3307 if (saved_do_cfi_asm
> 0)
3310 if (targetm
.debug_unwind_info () == UI_DWARF2
)
3313 if ((flag_unwind_tables
|| flag_exceptions
)
3314 && targetm_common
.except_unwind_info (&global_options
) == UI_DWARF2
)
3320 /* Decide whether to emit frame unwind via assembler directives. */
3323 dwarf2out_do_cfi_asm (void)
3327 if (saved_do_cfi_asm
!= 0)
3328 return saved_do_cfi_asm
> 0;
3330 /* Assume failure for a moment. */
3331 saved_do_cfi_asm
= -1;
3333 if (!flag_dwarf2_cfi_asm
|| !dwarf2out_do_frame ())
3335 if (!HAVE_GAS_CFI_PERSONALITY_DIRECTIVE
)
3338 /* Make sure the personality encoding is one the assembler can support.
3339 In particular, aligned addresses can't be handled. */
3340 enc
= ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2,/*global=*/1);
3341 if ((enc
& 0x70) != 0 && (enc
& 0x70) != DW_EH_PE_pcrel
)
3343 enc
= ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0,/*global=*/0);
3344 if ((enc
& 0x70) != 0 && (enc
& 0x70) != DW_EH_PE_pcrel
)
3347 /* If we can't get the assembler to emit only .debug_frame, and we don't need
3348 dwarf2 unwind info for exceptions, then emit .debug_frame by hand. */
3349 if (!HAVE_GAS_CFI_SECTIONS_DIRECTIVE
3350 && !flag_unwind_tables
&& !flag_exceptions
3351 && targetm_common
.except_unwind_info (&global_options
) != UI_DWARF2
)
3355 saved_do_cfi_asm
= 1;
3360 gate_dwarf2_frame (void)
3362 #ifndef HAVE_prologue
3363 /* Targets which still implement the prologue in assembler text
3364 cannot use the generic dwarf2 unwinding. */
3368 /* ??? What to do for UI_TARGET unwinding? They might be able to benefit
3369 from the optimized shrink-wrapping annotations that we will compute.
3370 For now, only produce the CFI notes for dwarf2. */
3371 return dwarf2out_do_frame ();
3376 const pass_data pass_data_dwarf2_frame
=
3378 RTL_PASS
, /* type */
3379 "dwarf2", /* name */
3380 OPTGROUP_NONE
, /* optinfo_flags */
3381 true, /* has_gate */
3382 true, /* has_execute */
3383 TV_FINAL
, /* tv_id */
3384 0, /* properties_required */
3385 0, /* properties_provided */
3386 0, /* properties_destroyed */
3387 0, /* todo_flags_start */
3388 0, /* todo_flags_finish */
3391 class pass_dwarf2_frame
: public rtl_opt_pass
3394 pass_dwarf2_frame (gcc::context
*ctxt
)
3395 : rtl_opt_pass (pass_data_dwarf2_frame
, ctxt
)
3398 /* opt_pass methods: */
3399 bool gate () { return gate_dwarf2_frame (); }
3400 unsigned int execute () { return execute_dwarf2_frame (); }
3402 }; // class pass_dwarf2_frame
3407 make_pass_dwarf2_frame (gcc::context
*ctxt
)
3409 return new pass_dwarf2_frame (ctxt
);
3412 #include "gt-dwarf2cfi.h"