1 /* Infrastructure for tracking user variable locations and values
2 throughout compilation.
3 Copyright (C) 2010-2015 Free Software Foundation, Inc.
4 Contributed by Alexandre Oliva <aoliva@redhat.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
28 #include "basic-block.h"
30 #include "hard-reg-set.h"
36 /* gen_lowpart_no_emit hook implementation for DEBUG_INSNs. In DEBUG_INSNs,
37 all lowpart SUBREGs are valid, despite what the machine requires for
41 gen_lowpart_for_debug (machine_mode mode
, rtx x
)
43 rtx result
= gen_lowpart_if_possible (mode
, x
);
47 if (GET_MODE (x
) != VOIDmode
)
48 return gen_rtx_raw_SUBREG (mode
, x
,
49 subreg_lowpart_offset (mode
, GET_MODE (x
)));
54 /* Replace auto-increment addressing modes with explicit operations to access
55 the same addresses without modifying the corresponding registers. */
58 cleanup_auto_inc_dec (rtx src
, machine_mode mem_mode ATTRIBUTE_UNUSED
)
62 const RTX_CODE code
= GET_CODE (x
);
75 /* SCRATCH must be shared because they represent distinct values. */
78 /* Share clobbers of hard registers (like cc0), but do not share pseudo reg
79 clobbers or clobbers of hard registers that originated as pseudos.
80 This is needed to allow safe register renaming. */
81 if (REG_P (XEXP (x
, 0)) && REGNO (XEXP (x
, 0)) < FIRST_PSEUDO_REGISTER
82 && ORIGINAL_REGNO (XEXP (x
, 0)) == REGNO (XEXP (x
, 0)))
87 if (shared_const_p (x
))
92 mem_mode
= GET_MODE (x
);
97 gcc_assert (mem_mode
!= VOIDmode
&& mem_mode
!= BLKmode
);
98 return gen_rtx_PLUS (GET_MODE (x
),
99 cleanup_auto_inc_dec (XEXP (x
, 0), mem_mode
),
100 gen_int_mode (code
== PRE_INC
101 ? GET_MODE_SIZE (mem_mode
)
102 : -GET_MODE_SIZE (mem_mode
),
109 return cleanup_auto_inc_dec (code
== PRE_MODIFY
110 ? XEXP (x
, 1) : XEXP (x
, 0),
117 /* Copy the various flags, fields, and other information. We assume
118 that all fields need copying, and then clear the fields that should
119 not be copied. That is the sensible default behavior, and forces
120 us to explicitly document why we are *not* copying a flag. */
121 x
= shallow_copy_rtx (x
);
123 /* We do not copy the USED flag, which is used as a mark bit during
124 walks over the RTL. */
125 RTX_FLAG (x
, used
) = 0;
127 /* We do not copy FRAME_RELATED for INSNs. */
129 RTX_FLAG (x
, frame_related
) = 0;
131 fmt
= GET_RTX_FORMAT (code
);
132 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
134 XEXP (x
, i
) = cleanup_auto_inc_dec (XEXP (x
, i
), mem_mode
);
135 else if (fmt
[i
] == 'E' || fmt
[i
] == 'V')
138 XVEC (x
, i
) = rtvec_alloc (XVECLEN (x
, i
));
139 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
141 = cleanup_auto_inc_dec (XVECEXP (src
, i
, j
), mem_mode
);
144 #else /* !AUTO_INC_DEC */
146 #endif /* !AUTO_INC_DEC */
151 /* Auxiliary data structure for propagate_for_debug_stmt. */
153 struct rtx_subst_pair
159 /* DATA points to an rtx_subst_pair. Return the value that should be
163 propagate_for_debug_subst (rtx from
, const_rtx old_rtx
, void *data
)
165 struct rtx_subst_pair
*pair
= (struct rtx_subst_pair
*)data
;
167 if (!rtx_equal_p (from
, old_rtx
))
171 pair
->adjusted
= true;
172 pair
->to
= cleanup_auto_inc_dec (pair
->to
, VOIDmode
);
173 pair
->to
= make_compound_operation (pair
->to
, SET
);
176 return copy_rtx (pair
->to
);
179 /* Replace all the occurrences of DEST with SRC in DEBUG_INSNs between INSN
180 and LAST, not including INSN, but including LAST. Also stop at the end
181 of THIS_BASIC_BLOCK. */
184 propagate_for_debug (rtx_insn
*insn
, rtx_insn
*last
, rtx dest
, rtx src
,
185 basic_block this_basic_block
)
187 rtx_insn
*next
, *end
= NEXT_INSN (BB_END (this_basic_block
));
189 rtx (*saved_rtl_hook_no_emit
) (machine_mode
, rtx
);
191 struct rtx_subst_pair p
;
195 next
= NEXT_INSN (insn
);
196 last
= NEXT_INSN (last
);
197 saved_rtl_hook_no_emit
= rtl_hooks
.gen_lowpart_no_emit
;
198 rtl_hooks
.gen_lowpart_no_emit
= gen_lowpart_for_debug
;
199 while (next
!= last
&& next
!= end
)
202 next
= NEXT_INSN (insn
);
203 if (DEBUG_INSN_P (insn
))
205 loc
= simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn
),
206 dest
, propagate_for_debug_subst
, &p
);
207 if (loc
== INSN_VAR_LOCATION_LOC (insn
))
209 INSN_VAR_LOCATION_LOC (insn
) = loc
;
210 df_insn_rescan (insn
);
213 rtl_hooks
.gen_lowpart_no_emit
= saved_rtl_hook_no_emit
;
216 /* Initialize DEBUG to an empty list, and clear USED, if given. */
219 dead_debug_global_init (struct dead_debug_global
*debug
, bitmap used
)
227 /* Initialize DEBUG to an empty list, and clear USED, if given. Link
228 back to GLOBAL, if given, and bring in used bits from it. */
231 dead_debug_local_init (struct dead_debug_local
*debug
, bitmap used
,
232 struct dead_debug_global
*global
)
234 if (!used
&& global
&& global
->used
)
235 used
= BITMAP_ALLOC (NULL
);
238 debug
->global
= global
;
240 debug
->to_rescan
= NULL
;
244 if (global
&& global
->used
)
245 bitmap_copy (used
, global
->used
);
251 /* Locate the entry for REG in GLOBAL->htab. */
253 static dead_debug_global_entry
*
254 dead_debug_global_find (struct dead_debug_global
*global
, rtx reg
)
256 dead_debug_global_entry temp_entry
;
257 temp_entry
.reg
= reg
;
259 dead_debug_global_entry
*entry
= global
->htab
->find (&temp_entry
);
260 gcc_checking_assert (entry
&& entry
->reg
== temp_entry
.reg
);
265 /* Insert an entry mapping REG to DTEMP in GLOBAL->htab. */
267 static dead_debug_global_entry
*
268 dead_debug_global_insert (struct dead_debug_global
*global
, rtx reg
, rtx dtemp
)
270 dead_debug_global_entry temp_entry
;
271 temp_entry
.reg
= reg
;
272 temp_entry
.dtemp
= dtemp
;
275 global
->htab
= new hash_table
<dead_debug_hash_descr
> (31);
277 dead_debug_global_entry
**slot
= global
->htab
->find_slot (&temp_entry
,
279 gcc_checking_assert (!*slot
);
280 *slot
= XNEW (dead_debug_global_entry
);
285 /* If UREGNO, referenced by USE, is a pseudo marked as used in GLOBAL,
286 replace it with with a USE of the debug temp recorded for it, and
287 return TRUE. Otherwise, just return FALSE.
289 If PTO_RESCAN is given, instead of rescanning modified INSNs right
290 away, add their UIDs to the bitmap, allocating one of *PTO_RESCAN
294 dead_debug_global_replace_temp (struct dead_debug_global
*global
,
295 df_ref use
, unsigned int uregno
,
298 if (!global
|| uregno
< FIRST_PSEUDO_REGISTER
300 || !REG_P (*DF_REF_REAL_LOC (use
))
301 || REGNO (*DF_REF_REAL_LOC (use
)) != uregno
302 || !bitmap_bit_p (global
->used
, uregno
))
305 dead_debug_global_entry
*entry
306 = dead_debug_global_find (global
, *DF_REF_REAL_LOC (use
));
307 gcc_checking_assert (GET_CODE (entry
->reg
) == REG
308 && REGNO (entry
->reg
) == uregno
);
313 *DF_REF_REAL_LOC (use
) = entry
->dtemp
;
315 df_insn_rescan (DF_REF_INSN (use
));
319 *pto_rescan
= BITMAP_ALLOC (NULL
);
320 bitmap_set_bit (*pto_rescan
, INSN_UID (DF_REF_INSN (use
)));
326 /* Reset all debug uses in HEAD, and clear DEBUG->to_rescan bits of
327 each reset insn. DEBUG is not otherwise modified. If HEAD is
328 DEBUG->head, DEBUG->head will be set to NULL at the end.
329 Otherwise, entries from DEBUG->head that pertain to reset insns
330 will be removed, and only then rescanned. */
333 dead_debug_reset_uses (struct dead_debug_local
*debug
,
334 struct dead_debug_use
*head
)
336 bool got_head
= (debug
->head
== head
);
338 struct dead_debug_use
**tailp
= &debug
->head
;
339 struct dead_debug_use
*cur
;
346 rescan
= BITMAP_ALLOC (NULL
);
350 struct dead_debug_use
*next
= head
->next
;
353 insn
= DF_REF_INSN (head
->use
);
354 if (!next
|| DF_REF_INSN (next
->use
) != insn
)
356 INSN_VAR_LOCATION_LOC (insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
358 df_insn_rescan_debug_internal (insn
);
360 bitmap_set_bit (rescan
, INSN_UID (insn
));
361 if (debug
->to_rescan
)
362 bitmap_clear_bit (debug
->to_rescan
, INSN_UID (insn
));
374 while ((cur
= *tailp
))
375 if (bitmap_bit_p (rescan
, INSN_UID (DF_REF_INSN (cur
->use
))))
383 EXECUTE_IF_SET_IN_BITMAP (rescan
, 0, uid
, bi
)
385 struct df_insn_info
*insn_info
= DF_INSN_UID_SAFE_GET (uid
);
387 df_insn_rescan_debug_internal (insn_info
->insn
);
390 BITMAP_FREE (rescan
);
393 /* Promote pending local uses of pseudos in DEBUG to global
394 substitutions. Uses of non-pseudos are left alone for
398 dead_debug_promote_uses (struct dead_debug_local
*debug
)
400 for (struct dead_debug_use
*head
= debug
->head
, **headp
= &debug
->head
;
403 rtx reg
= *DF_REF_REAL_LOC (head
->use
);
405 dead_debug_global_entry
*entry
;
407 if (GET_CODE (reg
) != REG
408 || REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
414 if (!debug
->global
->used
)
415 debug
->global
->used
= BITMAP_ALLOC (NULL
);
417 bool added
= bitmap_set_bit (debug
->global
->used
, REGNO (reg
));
418 gcc_checking_assert (added
);
420 entry
= dead_debug_global_insert (debug
->global
, reg
,
421 make_debug_expr_from_rtl (reg
));
423 gcc_checking_assert (entry
->dtemp
);
425 /* Tentatively remove the USE from the list. */
428 if (!debug
->to_rescan
)
429 debug
->to_rescan
= BITMAP_ALLOC (NULL
);
431 for (ref
= DF_REG_USE_CHAIN (REGNO (reg
)); ref
;
432 ref
= DF_REF_NEXT_REG (ref
))
433 if (DEBUG_INSN_P (DF_REF_INSN (ref
)))
435 if (!dead_debug_global_replace_temp (debug
->global
, ref
,
439 rtx_insn
*insn
= DF_REF_INSN (ref
);
440 INSN_VAR_LOCATION_LOC (insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
441 bitmap_set_bit (debug
->to_rescan
, INSN_UID (insn
));
445 for (ref
= DF_REG_DEF_CHAIN (REGNO (reg
)); ref
;
446 ref
= DF_REF_NEXT_REG (ref
))
447 if (!dead_debug_insert_temp (debug
, REGNO (reg
), DF_REF_INSN (ref
),
448 DEBUG_TEMP_BEFORE_WITH_VALUE
))
451 bind
= gen_rtx_VAR_LOCATION (GET_MODE (reg
),
452 DEBUG_EXPR_TREE_DECL (entry
->dtemp
),
453 gen_rtx_UNKNOWN_VAR_LOC (),
454 VAR_INIT_STATUS_INITIALIZED
);
455 rtx_insn
*insn
= emit_debug_insn_before (bind
, DF_REF_INSN (ref
));
456 bitmap_set_bit (debug
->to_rescan
, INSN_UID (insn
));
464 /* Reset all debug insns with pending uses. Release the bitmap in it,
465 unless it is USED. USED must be the same bitmap passed to
466 dead_debug_local_init. */
469 dead_debug_local_finish (struct dead_debug_local
*debug
, bitmap used
)
472 dead_debug_promote_uses (debug
);
474 if (debug
->used
!= used
)
475 BITMAP_FREE (debug
->used
);
477 dead_debug_reset_uses (debug
, debug
->head
);
479 if (debug
->to_rescan
)
484 EXECUTE_IF_SET_IN_BITMAP (debug
->to_rescan
, 0, uid
, bi
)
486 struct df_insn_info
*insn_info
= DF_INSN_UID_SAFE_GET (uid
);
488 df_insn_rescan (insn_info
->insn
);
490 BITMAP_FREE (debug
->to_rescan
);
494 /* Release GLOBAL->used unless it is the same as USED. Release the
495 mapping hash table if it was initialized. */
498 dead_debug_global_finish (struct dead_debug_global
*global
, bitmap used
)
500 if (global
->used
!= used
)
501 BITMAP_FREE (global
->used
);
507 /* Add USE to DEBUG, or substitute it right away if it's a pseudo in
508 the global substitution list. USE must be a dead reference to
509 UREGNO in a debug insn. Create a bitmap for DEBUG as needed. */
512 dead_debug_add (struct dead_debug_local
*debug
, df_ref use
, unsigned int uregno
)
514 if (dead_debug_global_replace_temp (debug
->global
, use
, uregno
,
518 struct dead_debug_use
*newddu
= XNEW (struct dead_debug_use
);
521 newddu
->next
= debug
->head
;
522 debug
->head
= newddu
;
525 debug
->used
= BITMAP_ALLOC (NULL
);
527 /* ??? If we dealt with split multi-registers below, we should set
528 all registers for the used mode in case of hardware
530 bitmap_set_bit (debug
->used
, uregno
);
533 /* Like lowpart_subreg, but if a subreg is not valid for machine, force
534 it anyway - for use in debug insns. */
537 debug_lowpart_subreg (machine_mode outer_mode
, rtx expr
,
538 machine_mode inner_mode
)
540 if (inner_mode
== VOIDmode
)
541 inner_mode
= GET_MODE (expr
);
542 int offset
= subreg_lowpart_offset (outer_mode
, inner_mode
);
543 rtx ret
= simplify_gen_subreg (outer_mode
, expr
, inner_mode
, offset
);
546 return gen_rtx_raw_SUBREG (outer_mode
, expr
, offset
);
549 /* If UREGNO is referenced by any entry in DEBUG, emit a debug insn
550 before or after INSN (depending on WHERE), that binds a (possibly
551 global) debug temp to the widest-mode use of UREGNO, if WHERE is
552 *_WITH_REG, or the value stored in UREGNO by INSN otherwise, and
553 replace all uses of UREGNO in DEBUG with uses of the debug temp.
554 INSN must be where UREGNO dies, if WHERE is *_BEFORE_*, or where it
555 is set otherwise. Return the number of debug insns emitted. */
558 dead_debug_insert_temp (struct dead_debug_local
*debug
, unsigned int uregno
,
559 rtx_insn
*insn
, enum debug_temp_where where
)
561 struct dead_debug_use
**tailp
= &debug
->head
;
562 struct dead_debug_use
*cur
;
563 struct dead_debug_use
*uses
= NULL
;
564 struct dead_debug_use
**usesp
= &uses
;
574 global
= (debug
->global
&& debug
->global
->used
575 && bitmap_bit_p (debug
->global
->used
, uregno
));
577 if (!global
&& !bitmap_clear_bit (debug
->used
, uregno
))
580 /* Move all uses of uregno from debug->head to uses, setting mode to
581 the widest referenced mode. */
582 while ((cur
= *tailp
))
584 if (DF_REF_REGNO (cur
->use
) == uregno
)
586 /* If this loc has been changed e.g. to debug_expr already
587 as part of a multi-register use, just drop it. */
588 if (!REG_P (*DF_REF_REAL_LOC (cur
->use
)))
599 || (GET_MODE_BITSIZE (GET_MODE (reg
))
600 < GET_MODE_BITSIZE (GET_MODE (*DF_REF_REAL_LOC (cur
->use
)))))
601 reg
= *DF_REF_REAL_LOC (cur
->use
);
604 tailp
= &(*tailp
)->next
;
607 /* We may have dangling bits in debug->used for registers that were part
608 of a multi-register use, one component of which has been reset. */
611 gcc_checking_assert (!uses
);
619 reg
= regno_reg_rtx
[uregno
];
620 dead_debug_global_entry
*entry
621 = dead_debug_global_find (debug
->global
, reg
);
622 gcc_checking_assert (entry
->reg
== reg
);
628 gcc_checking_assert (uses
|| global
);
631 /* Recover the expression INSN stores in REG. */
632 if (where
== DEBUG_TEMP_BEFORE_WITH_VALUE
)
634 rtx set
= single_set (insn
);
639 dest
= SET_DEST (set
);
641 /* Lose if the REG-setting insn is a CALL. */
642 if (GET_CODE (src
) == CALL
)
654 /* ??? Should we try to extract it from a PARALLEL? */
657 /* Cool, it's the same REG, we can use SRC. */
658 else if (dest
== reg
)
659 breg
= cleanup_auto_inc_dec (src
, VOIDmode
);
660 else if (REG_P (dest
))
662 /* Hmm... Something's fishy, we should be setting REG here. */
663 if (REGNO (dest
) != REGNO (reg
))
665 /* If we're not overwriting all the hardware registers that
666 setting REG in its mode would, we won't know what to bind
667 the debug temp to. ??? We could bind the debug_expr to a
668 CONCAT or PARALLEL with the split multi-registers, and
669 replace them as we found the corresponding sets. */
670 else if (REG_NREGS (reg
) != REG_NREGS (dest
))
672 /* Ok, it's the same (hardware) REG, but with a different
673 mode, so SUBREG it. */
675 breg
= debug_lowpart_subreg (GET_MODE (reg
),
676 cleanup_auto_inc_dec (src
, VOIDmode
),
679 else if (GET_CODE (dest
) == SUBREG
)
681 /* We should be setting REG here. Lose. */
682 if (REGNO (SUBREG_REG (dest
)) != REGNO (reg
))
684 /* Lose if we're setting something other than the lowpart of
686 else if (!subreg_lowpart_p (dest
))
688 /* If we're not overwriting all the hardware registers that
689 setting REG in its mode would, we won't know what to bind
690 the debug temp to. */
691 else if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
693 != hard_regno_nregs
[REGNO (reg
)][GET_MODE (dest
)]))
695 /* Yay, we can use SRC, just adjust its mode. */
697 breg
= debug_lowpart_subreg (GET_MODE (reg
),
698 cleanup_auto_inc_dec (src
, VOIDmode
),
701 /* Oh well, we're out of luck. */
705 /* We couldn't figure out the value stored in REG, so reset all
706 of its pending debug uses. */
709 dead_debug_reset_uses (debug
, uses
);
714 /* If there's a single (debug) use of an otherwise unused REG, and
715 the debug use is not part of a larger expression, then it
716 probably doesn't make sense to introduce a new debug temp. */
717 if (where
== DEBUG_TEMP_AFTER_WITH_REG
&& !uses
->next
)
719 rtx_insn
*next
= DF_REF_INSN (uses
->use
);
721 if (DEBUG_INSN_P (next
) && reg
== INSN_VAR_LOCATION_LOC (next
))
729 /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
730 dval
= make_debug_expr_from_rtl (reg
);
732 /* Emit a debug bind insn before the insn in which reg dies. */
733 bind
= gen_rtx_VAR_LOCATION (GET_MODE (reg
),
734 DEBUG_EXPR_TREE_DECL (dval
), breg
,
735 VAR_INIT_STATUS_INITIALIZED
);
737 if (where
== DEBUG_TEMP_AFTER_WITH_REG
738 || where
== DEBUG_TEMP_AFTER_WITH_REG_FORCE
)
739 bind
= emit_debug_insn_after (bind
, insn
);
741 bind
= emit_debug_insn_before (bind
, insn
);
742 if (debug
->to_rescan
== NULL
)
743 debug
->to_rescan
= BITMAP_ALLOC (NULL
);
744 bitmap_set_bit (debug
->to_rescan
, INSN_UID (bind
));
746 /* Adjust all uses. */
749 if (GET_MODE (*DF_REF_REAL_LOC (cur
->use
)) == GET_MODE (reg
))
750 *DF_REF_REAL_LOC (cur
->use
) = dval
;
752 *DF_REF_REAL_LOC (cur
->use
)
753 = debug_lowpart_subreg (GET_MODE (*DF_REF_REAL_LOC (cur
->use
)), dval
,
755 /* ??? Should we simplify subreg of subreg? */
756 bitmap_set_bit (debug
->to_rescan
, INSN_UID (DF_REF_INSN (cur
->use
)));