1 /* Infrastructure for tracking user variable locations and values 2 throughout compilation. 3 Copyright (C) 2010-2018 Free Software Foundation, Inc. 4 Contributed by Alexandre Oliva <aoliva@redhat.com>. 5 6 This file is part of GCC. 7 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 11 version. 12 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 16 for more details. 17 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/>. */ 21 22 #ifndef GCC_VALTRACK_H 23 #define GCC_VALTRACK_H 24 25 /* Debug uses of dead regs. */ 26 27 /* Entry that maps a dead pseudo (REG) used in a debug insns that dies 28 at different blocks to the debug temp (DTEMP) it was replaced 29 with. */ 30 31 struct dead_debug_global_entry 32 { 33 rtx reg; 34 rtx dtemp; 35 }; 36 37 /* Descriptor for hash_table to hash by dead_debug_global_entry's REG 38 and map to DTEMP. */ 39 40 struct dead_debug_hash_descr : free_ptr_hash <dead_debug_global_entry> 41 { 42 /* Hash on the pseudo number. */ 43 static inline hashval_t hash (const dead_debug_global_entry *my); 44 /* Entries are identical if they refer to the same pseudo. */ 45 static inline bool equal (const dead_debug_global_entry *my, 46 const dead_debug_global_entry *other); 47 }; 48 49 /* Hash on the pseudo number. */ 50 inline hashval_t 51 dead_debug_hash_descr::hash (const dead_debug_global_entry *my) 52 { 53 return REGNO (my->reg); 54 } 55 56 /* Entries are identical if they refer to the same pseudo. */ 57 inline bool 58 dead_debug_hash_descr::equal (const dead_debug_global_entry *my, 59 const dead_debug_global_entry *other) 60 { 61 return my->reg == other->reg; 62 } 63 64 /* Maintain a global table of pseudos used in debug insns after their 65 deaths in other blocks, and debug temps their deathpoint values are 66 to be bound to. */ 67 68 struct dead_debug_global 69 { 70 /* This hash table that maps pseudos to debug temps. */ 71 hash_table<dead_debug_hash_descr> *htab; 72 /* For each entry in htab, the bit corresponding to its REGNO will 73 be set. */ 74 bitmap used; 75 }; 76 77 /* Node of a linked list of uses of dead REGs in debug insns. */ 78 79 struct dead_debug_use 80 { 81 df_ref use; 82 struct dead_debug_use *next; 83 }; 84 85 /* Linked list of the above, with a bitmap of the REGs in the 86 list. */ 87 88 struct dead_debug_local 89 { 90 /* The first dead_debug_use entry in the list. */ 91 struct dead_debug_use *head; 92 /* A pointer to the global tracking data structure. */ 93 struct dead_debug_global *global; 94 /* A bitmap that has bits set for each REG used in the 95 dead_debug_use list, and for each entry in the global hash 96 table. */ 97 bitmap used; 98 /* A bitmap that has bits set for each INSN that is to be 99 rescanned. */ 100 bitmap to_rescan; 101 }; 102 103 /* This type controls the behavior of dead_debug_insert_temp WRT 104 UREGNO and INSN. */ 105 106 enum debug_temp_where 107 { 108 /* Bind a newly-created debug temporary to a REG for UREGNO, and 109 insert the debug insn before INSN. REG is expected to die at 110 INSN. */ 111 DEBUG_TEMP_BEFORE_WITH_REG = -1, 112 /* Bind a newly-created debug temporary to the value INSN stores 113 in REG, and insert the debug insn before INSN. */ 114 DEBUG_TEMP_BEFORE_WITH_VALUE = 0, 115 /* Bind a newly-created debug temporary to a REG for UREGNO, and 116 insert the debug insn after INSN. REG is expected to be set at 117 INSN. */ 118 DEBUG_TEMP_AFTER_WITH_REG = 1, 119 /* Like DEBUG_TEMP_AFTER_WITH_REG, but force addition of a debug 120 temporary even if there is just a single debug use. This is used 121 on regs that are becoming REG_DEAD on INSN and so uses of the 122 reg later on are invalid. */ 123 DEBUG_TEMP_AFTER_WITH_REG_FORCE = 2 124 }; 125 126 extern void dead_debug_global_init (struct dead_debug_global *, bitmap); 127 extern void dead_debug_global_finish (struct dead_debug_global *, bitmap); 128 extern void dead_debug_local_init (struct dead_debug_local *, bitmap, 129 struct dead_debug_global *); 130 extern void dead_debug_local_finish (struct dead_debug_local *, bitmap); 131 extern void dead_debug_add (struct dead_debug_local *, df_ref, unsigned int); 132 extern int dead_debug_insert_temp (struct dead_debug_local *, 133 unsigned int uregno, rtx_insn *insn, 134 enum debug_temp_where); 135 136 extern void propagate_for_debug (rtx_insn *, rtx_insn *, rtx, rtx, basic_block); 137 138 139 #endif /* GCC_VALTRACK_H */ 140