]>
Commit | Line | Data |
---|---|---|
e6637753 | 1 | /* Infrastructure for tracking user variable locations and values |
2 | throughout compilation. | |
d353bf18 | 3 | Copyright (C) 2010-2015 Free Software Foundation, Inc. |
e6637753 | 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 | ||
e6637753 | 25 | /* Debug uses of dead regs. */ |
26 | ||
dcd028e1 | 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 | ||
576d4555 | 40 | struct dead_debug_hash_descr : free_ptr_hash <dead_debug_global_entry> |
dcd028e1 | 41 | { |
dcd028e1 | 42 | /* Hash on the pseudo number. */ |
9969c043 | 43 | static inline hashval_t hash (const dead_debug_global_entry *my); |
dcd028e1 | 44 | /* Entries are identical if they refer to the same pseudo. */ |
9969c043 | 45 | static inline bool equal (const dead_debug_global_entry *my, |
46 | const dead_debug_global_entry *other); | |
dcd028e1 | 47 | }; |
48 | ||
49 | /* Hash on the pseudo number. */ | |
50 | inline hashval_t | |
9969c043 | 51 | dead_debug_hash_descr::hash (const dead_debug_global_entry *my) |
dcd028e1 | 52 | { |
53 | return REGNO (my->reg); | |
54 | } | |
55 | ||
56 | /* Entries are identical if they refer to the same pseudo. */ | |
57 | inline bool | |
9969c043 | 58 | dead_debug_hash_descr::equal (const dead_debug_global_entry *my, |
59 | const dead_debug_global_entry *other) | |
dcd028e1 | 60 | { |
61 | return my->reg == other->reg; | |
62 | } | |
63 | ||
dcd028e1 | 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. */ | |
c1f445d2 | 71 | hash_table<dead_debug_hash_descr> *htab; |
dcd028e1 | 72 | /* For each entry in htab, the bit corresponding to its REGNO will |
73 | be set. */ | |
74 | bitmap used; | |
75 | }; | |
76 | ||
e6637753 | 77 | /* Node of a linked list of uses of dead REGs in debug insns. */ |
dcd028e1 | 78 | |
e6637753 | 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. */ | |
dcd028e1 | 87 | |
88 | struct dead_debug_local | |
e6637753 | 89 | { |
dcd028e1 | 90 | /* The first dead_debug_use entry in the list. */ |
e6637753 | 91 | struct dead_debug_use *head; |
dcd028e1 | 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. */ | |
e6637753 | 97 | bitmap used; |
dcd028e1 | 98 | /* A bitmap that has bits set for each INSN that is to be |
99 | rescanned. */ | |
e6637753 | 100 | bitmap to_rescan; |
101 | }; | |
102 | ||
103 | /* This type controls the behavior of dead_debug_insert_temp WRT | |
104 | UREGNO and INSN. */ | |
dcd028e1 | 105 | |
e6637753 | 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. */ | |
6baa953c | 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 | |
e6637753 | 124 | }; |
125 | ||
dcd028e1 | 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 *, | |
25bf5e12 | 133 | unsigned int uregno, rtx_insn *insn, |
e6637753 | 134 | enum debug_temp_where); |
135 | ||
4cd001d5 | 136 | extern void propagate_for_debug (rtx_insn *, rtx_insn *, rtx, rtx, basic_block); |
e6637753 | 137 | |
138 | ||
139 | #endif /* GCC_VALTRACK_H */ |