2010-05-23 00:24:53 +02:00
|
|
|
/* Define regsets.
|
2017-01-01 13:07:43 +01:00
|
|
|
Copyright (C) 1987-2017 Free Software Foundation, Inc.
|
2010-05-23 00:24:53 +02:00
|
|
|
|
|
|
|
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_REGSET_H
|
|
|
|
#define GCC_REGSET_H
|
|
|
|
|
|
|
|
/* TODO: regset is just a bitmap in its implementation. The compiler does
|
|
|
|
not consistently use one or the other, i.e. sometimes variables are
|
|
|
|
declared as bitmap but they are actually regsets and regset accessors
|
|
|
|
are used, and vice versa, or mixed (see e.g. spilled_regs in IRA).
|
|
|
|
|
|
|
|
This should be cleaned up, either by just dropping the regset type, or
|
|
|
|
by changing all bitmaps that are really regsets to the regset type. For
|
|
|
|
the latter option, a good start would be to change everything allocated
|
|
|
|
on the reg_obstack to regset. */
|
|
|
|
|
|
|
|
|
|
|
|
/* Head of register set linked list. */
|
|
|
|
typedef bitmap_head regset_head;
|
|
|
|
|
|
|
|
/* A pointer to a regset_head. */
|
|
|
|
typedef bitmap regset;
|
|
|
|
|
|
|
|
/* Allocate a register set with oballoc. */
|
|
|
|
#define ALLOC_REG_SET(OBSTACK) BITMAP_ALLOC (OBSTACK)
|
|
|
|
|
|
|
|
/* Do any cleanup needed on a regset when it is no longer used. */
|
|
|
|
#define FREE_REG_SET(REGSET) BITMAP_FREE (REGSET)
|
|
|
|
|
|
|
|
/* Initialize a new regset. */
|
|
|
|
#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, ®_obstack)
|
|
|
|
|
|
|
|
/* Clear a register set by freeing up the linked list. */
|
|
|
|
#define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD)
|
|
|
|
|
|
|
|
/* Copy a register set to another register set. */
|
|
|
|
#define COPY_REG_SET(TO, FROM) bitmap_copy (TO, FROM)
|
|
|
|
|
|
|
|
/* Compare two register sets. */
|
|
|
|
#define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B)
|
|
|
|
|
|
|
|
/* `and' a register set with a second register set. */
|
|
|
|
#define AND_REG_SET(TO, FROM) bitmap_and_into (TO, FROM)
|
|
|
|
|
|
|
|
/* `and' the complement of a register set with a register set. */
|
|
|
|
#define AND_COMPL_REG_SET(TO, FROM) bitmap_and_compl_into (TO, FROM)
|
|
|
|
|
|
|
|
/* Inclusive or a register set with a second register set. */
|
|
|
|
#define IOR_REG_SET(TO, FROM) bitmap_ior_into (TO, FROM)
|
|
|
|
|
|
|
|
/* Exclusive or a register set with a second register set. */
|
|
|
|
#define XOR_REG_SET(TO, FROM) bitmap_xor_into (TO, FROM)
|
|
|
|
|
|
|
|
/* Or into TO the register set FROM1 `and'ed with the complement of FROM2. */
|
|
|
|
#define IOR_AND_COMPL_REG_SET(TO, FROM1, FROM2) \
|
|
|
|
bitmap_ior_and_compl_into (TO, FROM1, FROM2)
|
|
|
|
|
|
|
|
/* Clear a single register in a register set. */
|
|
|
|
#define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG)
|
|
|
|
|
|
|
|
/* Set a single register in a register set. */
|
|
|
|
#define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG)
|
|
|
|
|
|
|
|
/* Return true if a register is set in a register set. */
|
|
|
|
#define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG)
|
|
|
|
|
|
|
|
/* Copy the hard registers in a register set to the hard register set. */
|
|
|
|
extern void reg_set_to_hard_reg_set (HARD_REG_SET *, const_bitmap);
|
|
|
|
#define REG_SET_TO_HARD_REG_SET(TO, FROM) \
|
|
|
|
do { \
|
|
|
|
CLEAR_HARD_REG_SET (TO); \
|
|
|
|
reg_set_to_hard_reg_set (&TO, FROM); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
typedef bitmap_iterator reg_set_iterator;
|
|
|
|
|
|
|
|
/* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the
|
|
|
|
register number and executing CODE for all registers that are set. */
|
|
|
|
#define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, RSI) \
|
|
|
|
EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, RSI)
|
|
|
|
|
|
|
|
/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
|
|
|
|
REGNUM to the register number and executing CODE for all registers that are
|
|
|
|
set in the first regset and not set in the second. */
|
|
|
|
#define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \
|
|
|
|
EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI)
|
|
|
|
|
|
|
|
/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
|
|
|
|
REGNUM to the register number and executing CODE for all registers that are
|
|
|
|
set in both regsets. */
|
|
|
|
#define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \
|
|
|
|
EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI) \
|
|
|
|
|
|
|
|
/* Same information as REGS_INVALIDATED_BY_CALL but in regset form to be used
|
|
|
|
in dataflow more conveniently. */
|
|
|
|
|
|
|
|
extern regset regs_invalidated_by_call_regset;
|
|
|
|
|
2011-11-06 23:58:54 +01:00
|
|
|
/* Same information as FIXED_REG_SET but in regset form. */
|
|
|
|
extern regset fixed_reg_set_regset;
|
|
|
|
|
2010-05-23 00:24:53 +02:00
|
|
|
/* An obstack for regsets. */
|
|
|
|
extern bitmap_obstack reg_obstack;
|
|
|
|
|
basic-block.h: Re-group most prototypes per file.
gcc/
* basic-block.h: Re-group most prototypes per file.
(struct edge_list): Remove num_blocks field.
(dump_bb_info): Adjust prototypes.
(dump_reg_info): Move prototype to regs.h.
* function.h: Do not include tree.h.
Include vec.h, vecir.h, input.h and machmode.h to compensate.
(function_name): New prototype.
* gimple.h: Include tree.h to compensate for basic-block.h change.
* langhooks.h: Note that tree.h is only necessary for enum tree_code.
* regs.h (dump_reg_info): Prototype here.
* regset.h: Adjust file reference in comment.
(debug_regset): Remove prototype.
* rtl.h: Include flags.h for flag_var_tracking_assignments.
(MAY_HAVE_DEBUG_INSNS): Define as flag_var_tracking_assignments
instead of no-longer-available tree.h's MAY_HAVE_DEBUG_STMTS.
(dump_reg_info, dump_flow_info): Remove prototypes.
* bb-reorder.c (set_edge_can_fallthru_flag): Move from cfganal.c
to here, the only user. Make static.
(reorder_basic_blocks): Call dump_reg_info before dump_flow_info.
* cfg.c: Do not include tm.h, tree.h, rtl.h, hard-reg-set.h, regs.h,
flags.h, function.h, except.h, diagnostic-core.h, tm_p.h, timevar.h,
tree-pass.h, cfgloop.h, and tree-flow.h.
Include basic-block.h, the first header I'd expect to be included.
(reg_obstack): Move to df-core.c.
(free_edge): Remove bogus ATTRIBUTE_UNUSED.
(remove_edge_raw): Do not call tree-ssa's redirect_edge_var_map_clear.
(redirect_edge_succ_nodup): Move to cfghooks.c.
(dump_regset, debug_regset): Move to df-core.c.
(dump_bb_info): Move to cfgrtl.c.
(dump_reg_info): Move to regstat.c.
(dump_flow_info): Move to cfgrtl.c.
(debug_flow_info): Likewise.
(dump_edge_info): Do not look at cfun, a CFG without cfun is nonsense.
* cfganal.c: Do not include tm.h, rtl.h, obstack.h, hard-reg-set.h,
insn-config.h, recog.h, diagnostic-core.h, tm_p.h, and cfgloop.h.
(flow_active_insn_p, forwarder_block_p, can_fallthru,
could_fall_through): Move to cfgrtl.c.
(set_edge_can_fallthru_flag): Moved to bb-reorder.c.
(create_edge_list): Do not set edge_list's removed num_blocks.
(print_edge_list): Look at n_basic_blocks instead of num_blocks.
(flow_nodes_print): Remove.
(flow_edge_list_print): Remove.
(inverted_post_order_compute): Use FOR_ALL_BB.
*cfgrtl.c (dump_flow_info): Moved from cfg.c.
Do not call dump_reg_info.
(debug_flow_info): Moved from cfg.c
(dump_bb_info): Moved from cfg.c. Take 'verbose' argument
to avoid looking at TDF_* flags from tree-pass.h.
(flow_active_insn_p, forwarder_block_p, can_fallthru,
could_fall_through): Moved from cfganal.c.
(print_rtl_with_bb): Adjust dump_bb_info calls.
* cfghooks.c (redirect_edge_succ_nodup): Moved from cfg.c.
(remove_edge): Call redirect_edge_var_map_clear if IR_GIMPLE.
(cfgcleanup.c): Look at MAY_HAVE_DEBUG_INSNS, not MAY_HAVE_DEBUG_STMTS.
* cselib.c: Include tree.h with a FIXME.
* df-core.c (reg_obstack): Moved from cfg.c.
(dump_regset): Likewise.
(debug_regset): Likewise. Make a DEBUG_FUNCTION.
* final.c (compute_alignments): Call dump_reg_info before
dump_flow_info.
* function.c (function_name): New function.
(current_function_name): Use it.
* ifcvt.c (rest_of_handle_if_conversion): Call dump_reg_info before
dump_flow_info.
* ira-conflicts.c: Include tree.h with a note.
* regstat.c (dump_reg_info): Moved here from cfg.c.
* loop-init.c: Include regs.h instead of hard-reg-set.h.
(rtl_loop_init): Call dump_reg_info before dump_flow_info.
(rtl_loop_done): Likewise.
* mcf.c: Include tree.h before langhooks.h.
* predict.c (maybe_hot_count_p): Assert we have cfun.
(probably_never_executed_bb_p): Likewise.
* profile.c (compute_branch_probabilities): Use gimple_dump_cfg
instead of dump_flow_info.
* sched-deps.c: Include tree.h with a FIXME.
(call_may_noreturn_p): Add FIXME note why this function has to
look at function decls instead of function decl flags.
* sched-vis.c: Include tree.h with a FIXME.
(print_rtl_slim): Adjust dump_bb_info uses.
* statistics.c (statistics_fini_pass_2): Use current_function_name
to avoid including tree.h.
(statistics_counter_event): Use function_name for the same reason.
(statistics_histogram_event): Likewise.
* tracer.c (tracer): Remove bogus gcc_assert. Use brief_dump_cfg
instead of dump_flow_info.
* var-tracking.c (variable_tracking_main_1): Call dump_reg_info
before dump_flow_info.
* doc/cfg.texi: Update CFG documentation.
* Makefile.in (RTL_H): Depend on FLAGS_H.
(GIMPLE_H): Depend on TREE_H.
(FUNCTION_H): Depend on VEC_H, vecir.h, INPUT_H and MACHMODE_H,
but no longer on TREE_H.
(C_COMMON_H): Depend on TREE_H.
(cselib.o, cse.o, cfganal.o, loop-init.o, ira-conflicts.o,
sched-deps.o, sched-vis.o): Fixup dependencies.
c-family/
* c-common.h: Include tree.h.
cp/
* decl.c (cp_finish_decl): Add FIXME at add_local_decl call site.
From-SVN: r189359
2012-07-08 12:06:14 +02:00
|
|
|
/* In df-core.c (which should use regset consistently instead of bitmap...) */
|
2010-05-23 00:24:53 +02:00
|
|
|
extern void dump_regset (regset, FILE *);
|
|
|
|
|
|
|
|
#endif /* GCC_REGSET_H */
|