Update change log
[platform/upstream/gcc48.git] / gcc / valtrack.h
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 */