1 | /* Infrastructure for tracking user variable locations and values |
2 | throughout compilation. |
3 | Copyright (C) 2010-2023 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 | |