123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /* Infrastructure for tracking user variable locations and values
- throughout compilation.
- Copyright (C) 2010-2015 Free Software Foundation, Inc.
- Contributed by Alexandre Oliva <aoliva@redhat.com>.
- This file is part of GCC.
- GCC is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 3, or (at your option) any later
- version.
- GCC is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>. */
- #ifndef GCC_VALTRACK_H
- #define GCC_VALTRACK_H
- #include "bitmap.h"
- #include "df.h"
- #include "rtl.h"
- #include "hash-table.h"
- /* Debug uses of dead regs. */
- /* Entry that maps a dead pseudo (REG) used in a debug insns that dies
- at different blocks to the debug temp (DTEMP) it was replaced
- with. */
- struct dead_debug_global_entry
- {
- rtx reg;
- rtx dtemp;
- };
- /* Descriptor for hash_table to hash by dead_debug_global_entry's REG
- and map to DTEMP. */
- struct dead_debug_hash_descr
- {
- /* The hash table contains pointers to entries of this type. */
- typedef struct dead_debug_global_entry value_type;
- typedef struct dead_debug_global_entry compare_type;
- /* Hash on the pseudo number. */
- static inline hashval_t hash (const value_type *my);
- /* Entries are identical if they refer to the same pseudo. */
- static inline bool equal (const value_type *my, const compare_type *other);
- /* Release entries when they're removed. */
- static inline void remove (value_type *p);
- };
- /* Hash on the pseudo number. */
- inline hashval_t
- dead_debug_hash_descr::hash (const value_type *my)
- {
- return REGNO (my->reg);
- }
- /* Entries are identical if they refer to the same pseudo. */
- inline bool
- dead_debug_hash_descr::equal (const value_type *my, const compare_type *other)
- {
- return my->reg == other->reg;
- }
- /* Release entries when they're removed. */
- inline void
- dead_debug_hash_descr::remove (value_type *p)
- {
- XDELETE (p);
- }
- /* Maintain a global table of pseudos used in debug insns after their
- deaths in other blocks, and debug temps their deathpoint values are
- to be bound to. */
- struct dead_debug_global
- {
- /* This hash table that maps pseudos to debug temps. */
- hash_table<dead_debug_hash_descr> *htab;
- /* For each entry in htab, the bit corresponding to its REGNO will
- be set. */
- bitmap used;
- };
- /* Node of a linked list of uses of dead REGs in debug insns. */
- struct dead_debug_use
- {
- df_ref use;
- struct dead_debug_use *next;
- };
- /* Linked list of the above, with a bitmap of the REGs in the
- list. */
- struct dead_debug_local
- {
- /* The first dead_debug_use entry in the list. */
- struct dead_debug_use *head;
- /* A pointer to the global tracking data structure. */
- struct dead_debug_global *global;
- /* A bitmap that has bits set for each REG used in the
- dead_debug_use list, and for each entry in the global hash
- table. */
- bitmap used;
- /* A bitmap that has bits set for each INSN that is to be
- rescanned. */
- bitmap to_rescan;
- };
- /* This type controls the behavior of dead_debug_insert_temp WRT
- UREGNO and INSN. */
- enum debug_temp_where
- {
- /* Bind a newly-created debug temporary to a REG for UREGNO, and
- insert the debug insn before INSN. REG is expected to die at
- INSN. */
- DEBUG_TEMP_BEFORE_WITH_REG = -1,
- /* Bind a newly-created debug temporary to the value INSN stores
- in REG, and insert the debug insn before INSN. */
- DEBUG_TEMP_BEFORE_WITH_VALUE = 0,
- /* Bind a newly-created debug temporary to a REG for UREGNO, and
- insert the debug insn after INSN. REG is expected to be set at
- INSN. */
- DEBUG_TEMP_AFTER_WITH_REG = 1,
- /* Like DEBUG_TEMP_AFTER_WITH_REG, but force addition of a debug
- temporary even if there is just a single debug use. This is used
- on regs that are becoming REG_DEAD on INSN and so uses of the
- reg later on are invalid. */
- DEBUG_TEMP_AFTER_WITH_REG_FORCE = 2
- };
- extern void dead_debug_global_init (struct dead_debug_global *, bitmap);
- extern void dead_debug_global_finish (struct dead_debug_global *, bitmap);
- extern void dead_debug_local_init (struct dead_debug_local *, bitmap,
- struct dead_debug_global *);
- extern void dead_debug_local_finish (struct dead_debug_local *, bitmap);
- extern void dead_debug_add (struct dead_debug_local *, df_ref, unsigned int);
- extern int dead_debug_insert_temp (struct dead_debug_local *,
- unsigned int uregno, rtx_insn *insn,
- enum debug_temp_where);
- extern void propagate_for_debug (rtx_insn *, rtx_insn *, rtx, rtx, basic_block);
- #endif /* GCC_VALTRACK_H */
|