GCC Middle and Back End API Reference
Main Page
Namespaces
Data Structures
Files
File List
Globals
valtrack.h
Go to the documentation of this file.
1
/* Infrastructure for tracking user variable locations and values
2
throughout compilation.
3
Copyright (C) 2010-2013 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
#include "
bitmap.h
"
26
#include "
df.h
"
27
#include "
rtl.h
"
28
#include "
basic-block.h
"
29
#include "
hash-table.h
"
30
31
/* Debug uses of dead regs. */
32
33
/* Entry that maps a dead pseudo (REG) used in a debug insns that dies
34
at different blocks to the debug temp (DTEMP) it was replaced
35
with. */
36
37
struct
dead_debug_global_entry
38
{
39
rtx
reg
;
40
rtx
dtemp
;
41
};
42
43
/* Descriptor for hash_table to hash by dead_debug_global_entry's REG
44
and map to DTEMP. */
45
46
struct
dead_debug_hash_descr
47
{
48
/* The hash table contains pointers to entries of this type. */
49
typedef
struct
dead_debug_global_entry
value_type
;
50
typedef
struct
dead_debug_global_entry
compare_type
;
51
/* Hash on the pseudo number. */
52
static
inline
hashval_t
hash
(
const
value_type
*my);
53
/* Entries are identical if they refer to the same pseudo. */
54
static
inline
bool
equal
(
const
value_type
*my,
const
compare_type
*other);
55
/* Release entries when they're removed. */
56
static
inline
void
remove
(
value_type
*p);
57
};
58
59
/* Hash on the pseudo number. */
60
inline
hashval_t
61
dead_debug_hash_descr::hash
(
const
value_type
*my)
62
{
63
return
REGNO (my->
reg
);
64
}
65
66
/* Entries are identical if they refer to the same pseudo. */
67
inline
bool
68
dead_debug_hash_descr::equal
(
const
value_type
*my,
const
compare_type
*other)
69
{
70
return
my->
reg
== other->
reg
;
71
}
72
73
/* Release entries when they're removed. */
74
inline
void
75
dead_debug_hash_descr::remove
(
value_type
*p)
76
{
77
XDELETE (p);
78
}
79
80
/* Maintain a global table of pseudos used in debug insns after their
81
deaths in other blocks, and debug temps their deathpoint values are
82
to be bound to. */
83
84
struct
dead_debug_global
85
{
86
/* This hash table that maps pseudos to debug temps. */
87
hash_table <dead_debug_hash_descr>
htab
;
88
/* For each entry in htab, the bit corresponding to its REGNO will
89
be set. */
90
bitmap
used
;
91
};
92
93
/* Node of a linked list of uses of dead REGs in debug insns. */
94
95
struct
dead_debug_use
96
{
97
df_ref
use
;
98
struct
dead_debug_use
*
next
;
99
};
100
101
/* Linked list of the above, with a bitmap of the REGs in the
102
list. */
103
104
struct
dead_debug_local
105
{
106
/* The first dead_debug_use entry in the list. */
107
struct
dead_debug_use
*
head
;
108
/* A pointer to the global tracking data structure. */
109
struct
dead_debug_global
*
global
;
110
/* A bitmap that has bits set for each REG used in the
111
dead_debug_use list, and for each entry in the global hash
112
table. */
113
bitmap
used
;
114
/* A bitmap that has bits set for each INSN that is to be
115
rescanned. */
116
bitmap
to_rescan
;
117
};
118
119
/* This type controls the behavior of dead_debug_insert_temp WRT
120
UREGNO and INSN. */
121
122
enum
debug_temp_where
123
{
124
/* Bind a newly-created debug temporary to a REG for UREGNO, and
125
insert the debug insn before INSN. REG is expected to die at
126
INSN. */
127
DEBUG_TEMP_BEFORE_WITH_REG
= -1,
128
/* Bind a newly-created debug temporary to the value INSN stores
129
in REG, and insert the debug insn before INSN. */
130
DEBUG_TEMP_BEFORE_WITH_VALUE
= 0,
131
/* Bind a newly-created debug temporary to a REG for UREGNO, and
132
insert the debug insn after INSN. REG is expected to be set at
133
INSN. */
134
DEBUG_TEMP_AFTER_WITH_REG
= 1,
135
/* Like DEBUG_TEMP_AFTER_WITH_REG, but force addition of a debug
136
temporary even if there is just a single debug use. This is used
137
on regs that are becoming REG_DEAD on INSN and so uses of the
138
reg later on are invalid. */
139
DEBUG_TEMP_AFTER_WITH_REG_FORCE
= 2
140
};
141
142
extern
void
dead_debug_global_init
(
struct
dead_debug_global
*,
bitmap
);
143
extern
void
dead_debug_global_finish
(
struct
dead_debug_global
*,
bitmap
);
144
extern
void
dead_debug_local_init
(
struct
dead_debug_local
*,
bitmap
,
145
struct
dead_debug_global
*);
146
extern
void
dead_debug_local_finish
(
struct
dead_debug_local
*,
bitmap
);
147
extern
void
dead_debug_add
(
struct
dead_debug_local
*,
df_ref
,
unsigned
int
);
148
extern
int
dead_debug_insert_temp
(
struct
dead_debug_local
*,
149
unsigned
int
uregno,
rtx
insn,
150
enum
debug_temp_where
);
151
152
extern
void
propagate_for_debug
(
rtx
,
rtx
,
rtx
,
rtx
,
basic_block
);
153
154
155
#endif
/* GCC_VALTRACK_H */
gcc
valtrack.h
Generated by
1.8.1.1