Branch data Line data Source code
1 : : /* Infrastructure for tracking user variable locations and values
2 : : throughout compilation.
3 : : Copyright (C) 2010-2025 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 : 2548263 : dead_debug_hash_descr::hash (const dead_debug_global_entry *my)
52 : : {
53 : 2548263 : return REGNO (my->reg);
54 : : }
55 : :
56 : : /* Entries are identical if they refer to the same pseudo. */
57 : : inline bool
58 : 2070046 : dead_debug_hash_descr::equal (const dead_debug_global_entry *my,
59 : : const dead_debug_global_entry *other)
60 : : {
61 : 2070046 : 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 */
|