cse.c: Convert prototypes to ISO C90.
* cse.c: Convert prototypes to ISO C90. * cselib.c: Likewise. * cselib.h: Likewise. * dbxout.c: Likewise. * debug.c: Likewise. * df.c: Likewise. * df.h: Likewise. * dojump.c: Likewise. * doloop.c: Likewise. * dominance.c: Likewise. * dwarf2asm.c: Likewise. * dwarf2out.c: Likewise. * dwarf2out.h: Likewise. * dwarfout.c: Likewise. From-SVN: r68673
This commit is contained in:
parent
f9da506452
commit
7080f73594
|
@ -1,3 +1,20 @@
|
||||||
|
2003-06-29 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
* cse.c: Convert prototypes to ISO C90.
|
||||||
|
* cselib.c: Likewise.
|
||||||
|
* cselib.h: Likewise.
|
||||||
|
* dbxout.c: Likewise.
|
||||||
|
* debug.c: Likewise.
|
||||||
|
* df.c: Likewise.
|
||||||
|
* df.h: Likewise.
|
||||||
|
* dojump.c: Likewise.
|
||||||
|
* doloop.c: Likewise.
|
||||||
|
* dominance.c: Likewise.
|
||||||
|
* dwarf2asm.c: Likewise.
|
||||||
|
* dwarf2out.c: Likewise.
|
||||||
|
* dwarf2out.h: Likewise.
|
||||||
|
* dwarfout.c: Likewise.
|
||||||
|
|
||||||
2003-06-29 Kazu Hirata <kazu@cs.umass.edu>
|
2003-06-29 Kazu Hirata <kazu@cs.umass.edu>
|
||||||
|
|
||||||
* alloc-pool.c: Fix comment formatting.
|
* alloc-pool.c: Fix comment formatting.
|
||||||
|
|
370
gcc/cse.c
370
gcc/cse.c
|
@ -596,76 +596,74 @@ struct cse_basic_block_data
|
||||||
} *path;
|
} *path;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool fixed_base_plus_p PARAMS ((rtx x));
|
static bool fixed_base_plus_p (rtx x);
|
||||||
static int notreg_cost PARAMS ((rtx, enum rtx_code));
|
static int notreg_cost (rtx, enum rtx_code);
|
||||||
static int approx_reg_cost_1 PARAMS ((rtx *, void *));
|
static int approx_reg_cost_1 (rtx *, void *);
|
||||||
static int approx_reg_cost PARAMS ((rtx));
|
static int approx_reg_cost (rtx);
|
||||||
static int preferrable PARAMS ((int, int, int, int));
|
static int preferrable (int, int, int, int);
|
||||||
static void new_basic_block PARAMS ((void));
|
static void new_basic_block (void);
|
||||||
static void make_new_qty PARAMS ((unsigned int, enum machine_mode));
|
static void make_new_qty (unsigned int, enum machine_mode);
|
||||||
static void make_regs_eqv PARAMS ((unsigned int, unsigned int));
|
static void make_regs_eqv (unsigned int, unsigned int);
|
||||||
static void delete_reg_equiv PARAMS ((unsigned int));
|
static void delete_reg_equiv (unsigned int);
|
||||||
static int mention_regs PARAMS ((rtx));
|
static int mention_regs (rtx);
|
||||||
static int insert_regs PARAMS ((rtx, struct table_elt *, int));
|
static int insert_regs (rtx, struct table_elt *, int);
|
||||||
static void remove_from_table PARAMS ((struct table_elt *, unsigned));
|
static void remove_from_table (struct table_elt *, unsigned);
|
||||||
static struct table_elt *lookup PARAMS ((rtx, unsigned, enum machine_mode)),
|
static struct table_elt *lookup (rtx, unsigned, enum machine_mode);
|
||||||
*lookup_for_remove PARAMS ((rtx, unsigned, enum machine_mode));
|
static struct table_elt *lookup_for_remove (rtx, unsigned, enum machine_mode);
|
||||||
static rtx lookup_as_function PARAMS ((rtx, enum rtx_code));
|
static rtx lookup_as_function (rtx, enum rtx_code);
|
||||||
static struct table_elt *insert PARAMS ((rtx, struct table_elt *, unsigned,
|
static struct table_elt *insert (rtx, struct table_elt *, unsigned,
|
||||||
enum machine_mode));
|
enum machine_mode);
|
||||||
static void merge_equiv_classes PARAMS ((struct table_elt *,
|
static void merge_equiv_classes (struct table_elt *, struct table_elt *);
|
||||||
struct table_elt *));
|
static void invalidate (rtx, enum machine_mode);
|
||||||
static void invalidate PARAMS ((rtx, enum machine_mode));
|
static int cse_rtx_varies_p (rtx, int);
|
||||||
static int cse_rtx_varies_p PARAMS ((rtx, int));
|
static void remove_invalid_refs (unsigned int);
|
||||||
static void remove_invalid_refs PARAMS ((unsigned int));
|
static void remove_invalid_subreg_refs (unsigned int, unsigned int,
|
||||||
static void remove_invalid_subreg_refs PARAMS ((unsigned int, unsigned int,
|
enum machine_mode);
|
||||||
enum machine_mode));
|
static void rehash_using_reg (rtx);
|
||||||
static void rehash_using_reg PARAMS ((rtx));
|
static void invalidate_memory (void);
|
||||||
static void invalidate_memory PARAMS ((void));
|
static void invalidate_for_call (void);
|
||||||
static void invalidate_for_call PARAMS ((void));
|
static rtx use_related_value (rtx, struct table_elt *);
|
||||||
static rtx use_related_value PARAMS ((rtx, struct table_elt *));
|
static unsigned canon_hash (rtx, enum machine_mode);
|
||||||
static unsigned canon_hash PARAMS ((rtx, enum machine_mode));
|
static unsigned canon_hash_string (const char *);
|
||||||
static unsigned canon_hash_string PARAMS ((const char *));
|
static unsigned safe_hash (rtx, enum machine_mode);
|
||||||
static unsigned safe_hash PARAMS ((rtx, enum machine_mode));
|
static int exp_equiv_p (rtx, rtx, int, int);
|
||||||
static int exp_equiv_p PARAMS ((rtx, rtx, int, int));
|
static rtx canon_reg (rtx, rtx);
|
||||||
static rtx canon_reg PARAMS ((rtx, rtx));
|
static void find_best_addr (rtx, rtx *, enum machine_mode);
|
||||||
static void find_best_addr PARAMS ((rtx, rtx *, enum machine_mode));
|
static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *,
|
||||||
static enum rtx_code find_comparison_args PARAMS ((enum rtx_code, rtx *, rtx *,
|
|
||||||
enum machine_mode *,
|
enum machine_mode *,
|
||||||
enum machine_mode *));
|
enum machine_mode *);
|
||||||
static rtx fold_rtx PARAMS ((rtx, rtx));
|
static rtx fold_rtx (rtx, rtx);
|
||||||
static rtx equiv_constant PARAMS ((rtx));
|
static rtx equiv_constant (rtx);
|
||||||
static void record_jump_equiv PARAMS ((rtx, int));
|
static void record_jump_equiv (rtx, int);
|
||||||
static void record_jump_cond PARAMS ((enum rtx_code, enum machine_mode,
|
static void record_jump_cond (enum rtx_code, enum machine_mode, rtx, rtx,
|
||||||
rtx, rtx, int));
|
int);
|
||||||
static void cse_insn PARAMS ((rtx, rtx));
|
static void cse_insn (rtx, rtx);
|
||||||
static int addr_affects_sp_p PARAMS ((rtx));
|
static int addr_affects_sp_p (rtx);
|
||||||
static void invalidate_from_clobbers PARAMS ((rtx));
|
static void invalidate_from_clobbers (rtx);
|
||||||
static rtx cse_process_notes PARAMS ((rtx, rtx));
|
static rtx cse_process_notes (rtx, rtx);
|
||||||
static void cse_around_loop PARAMS ((rtx));
|
static void cse_around_loop (rtx);
|
||||||
static void invalidate_skipped_set PARAMS ((rtx, rtx, void *));
|
static void invalidate_skipped_set (rtx, rtx, void *);
|
||||||
static void invalidate_skipped_block PARAMS ((rtx));
|
static void invalidate_skipped_block (rtx);
|
||||||
static void cse_check_loop_start PARAMS ((rtx, rtx, void *));
|
static void cse_check_loop_start (rtx, rtx, void *);
|
||||||
static void cse_set_around_loop PARAMS ((rtx, rtx, rtx));
|
static void cse_set_around_loop (rtx, rtx, rtx);
|
||||||
static rtx cse_basic_block PARAMS ((rtx, rtx, struct branch_path *, int));
|
static rtx cse_basic_block (rtx, rtx, struct branch_path *, int);
|
||||||
static void count_reg_usage PARAMS ((rtx, int *, rtx, int));
|
static void count_reg_usage (rtx, int *, rtx, int);
|
||||||
static int check_for_label_ref PARAMS ((rtx *, void *));
|
static int check_for_label_ref (rtx *, void *);
|
||||||
extern void dump_class PARAMS ((struct table_elt*));
|
extern void dump_class (struct table_elt*);
|
||||||
static struct cse_reg_info * get_cse_reg_info PARAMS ((unsigned int));
|
static struct cse_reg_info * get_cse_reg_info (unsigned int);
|
||||||
static int check_dependence PARAMS ((rtx *, void *));
|
static int check_dependence (rtx *, void *);
|
||||||
|
|
||||||
static void flush_hash_table PARAMS ((void));
|
static void flush_hash_table (void);
|
||||||
static bool insn_live_p PARAMS ((rtx, int *));
|
static bool insn_live_p (rtx, int *);
|
||||||
static bool set_live_p PARAMS ((rtx, rtx, int *));
|
static bool set_live_p (rtx, rtx, int *);
|
||||||
static bool dead_libcall_p PARAMS ((rtx, int *));
|
static bool dead_libcall_p (rtx, int *);
|
||||||
|
|
||||||
/* Nonzero if X has the form (PLUS frame-pointer integer). We check for
|
/* Nonzero if X has the form (PLUS frame-pointer integer). We check for
|
||||||
virtual regs here because the simplify_*_operation routines are called
|
virtual regs here because the simplify_*_operation routines are called
|
||||||
by integrate.c, which is called before virtual register instantiation. */
|
by integrate.c, which is called before virtual register instantiation. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
fixed_base_plus_p (x)
|
fixed_base_plus_p (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
switch (GET_CODE (x))
|
switch (GET_CODE (x))
|
||||||
{
|
{
|
||||||
|
@ -695,8 +693,7 @@ fixed_base_plus_p (x)
|
||||||
/* Dump the expressions in the equivalence class indicated by CLASSP.
|
/* Dump the expressions in the equivalence class indicated by CLASSP.
|
||||||
This function is used only for debugging. */
|
This function is used only for debugging. */
|
||||||
void
|
void
|
||||||
dump_class (classp)
|
dump_class (struct table_elt *classp)
|
||||||
struct table_elt *classp;
|
|
||||||
{
|
{
|
||||||
struct table_elt *elt;
|
struct table_elt *elt;
|
||||||
|
|
||||||
|
@ -714,9 +711,7 @@ dump_class (classp)
|
||||||
/* Subroutine of approx_reg_cost; called through for_each_rtx. */
|
/* Subroutine of approx_reg_cost; called through for_each_rtx. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
approx_reg_cost_1 (xp, data)
|
approx_reg_cost_1 (rtx *xp, void *data)
|
||||||
rtx *xp;
|
|
||||||
void *data;
|
|
||||||
{
|
{
|
||||||
rtx x = *xp;
|
rtx x = *xp;
|
||||||
int *cost_p = data;
|
int *cost_p = data;
|
||||||
|
@ -747,8 +742,7 @@ approx_reg_cost_1 (xp, data)
|
||||||
0. If any other hard register reference occurs, return MAX_COST. */
|
0. If any other hard register reference occurs, return MAX_COST. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
approx_reg_cost (x)
|
approx_reg_cost (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
int cost = 0;
|
int cost = 0;
|
||||||
|
|
||||||
|
@ -763,8 +757,7 @@ approx_reg_cost (x)
|
||||||
Return a positive value if A is less desirable, or 0 if the two are
|
Return a positive value if A is less desirable, or 0 if the two are
|
||||||
equally good. */
|
equally good. */
|
||||||
static int
|
static int
|
||||||
preferrable (cost_a, regcost_a, cost_b, regcost_b)
|
preferrable (int cost_a, int regcost_a, int cost_b, int regcost_b)
|
||||||
int cost_a, regcost_a, cost_b, regcost_b;
|
|
||||||
{
|
{
|
||||||
/* First, get rid of cases involving expressions that are entirely
|
/* First, get rid of cases involving expressions that are entirely
|
||||||
unwanted. */
|
unwanted. */
|
||||||
|
@ -798,9 +791,7 @@ preferrable (cost_a, regcost_a, cost_b, regcost_b)
|
||||||
from COST macro to keep it simple. */
|
from COST macro to keep it simple. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
notreg_cost (x, outer)
|
notreg_cost (rtx x, enum rtx_code outer)
|
||||||
rtx x;
|
|
||||||
enum rtx_code outer;
|
|
||||||
{
|
{
|
||||||
return ((GET_CODE (x) == SUBREG
|
return ((GET_CODE (x) == SUBREG
|
||||||
&& GET_CODE (SUBREG_REG (x)) == REG
|
&& GET_CODE (SUBREG_REG (x)) == REG
|
||||||
|
@ -821,9 +812,7 @@ notreg_cost (x, outer)
|
||||||
Other uses like the latter are expected in the future. */
|
Other uses like the latter are expected in the future. */
|
||||||
|
|
||||||
int
|
int
|
||||||
rtx_cost (x, outer_code)
|
rtx_cost (rtx x, enum rtx_code outer_code ATTRIBUTE_UNUSED)
|
||||||
rtx x;
|
|
||||||
enum rtx_code outer_code ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
|
@ -893,9 +882,7 @@ rtx_cost (x, outer_code)
|
||||||
Expect that X is properly formed address reference. */
|
Expect that X is properly formed address reference. */
|
||||||
|
|
||||||
int
|
int
|
||||||
address_cost (x, mode)
|
address_cost (rtx x, enum machine_mode mode)
|
||||||
rtx x;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
/* The address_cost target hook does not deal with ADDRESSOF nodes. But,
|
/* The address_cost target hook does not deal with ADDRESSOF nodes. But,
|
||||||
during CSE, such nodes are present. Using an ADDRESSOF node which
|
during CSE, such nodes are present. Using an ADDRESSOF node which
|
||||||
|
@ -918,15 +905,13 @@ address_cost (x, mode)
|
||||||
/* If the target doesn't override, compute the cost as with arithmetic. */
|
/* If the target doesn't override, compute the cost as with arithmetic. */
|
||||||
|
|
||||||
int
|
int
|
||||||
default_address_cost (x)
|
default_address_cost (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
return rtx_cost (x, MEM);
|
return rtx_cost (x, MEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cse_reg_info *
|
static struct cse_reg_info *
|
||||||
get_cse_reg_info (regno)
|
get_cse_reg_info (unsigned int regno)
|
||||||
unsigned int regno;
|
|
||||||
{
|
{
|
||||||
struct cse_reg_info **hash_head = ®_hash[REGHASH_FN (regno)];
|
struct cse_reg_info **hash_head = ®_hash[REGHASH_FN (regno)];
|
||||||
struct cse_reg_info *p;
|
struct cse_reg_info *p;
|
||||||
|
@ -974,7 +959,7 @@ get_cse_reg_info (regno)
|
||||||
for a new basic block. */
|
for a new basic block. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
new_basic_block ()
|
new_basic_block (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1029,9 +1014,7 @@ new_basic_block ()
|
||||||
register before and initialize that quantity. */
|
register before and initialize that quantity. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
make_new_qty (reg, mode)
|
make_new_qty (unsigned int reg, enum machine_mode mode)
|
||||||
unsigned int reg;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
int q;
|
int q;
|
||||||
struct qty_table_elem *ent;
|
struct qty_table_elem *ent;
|
||||||
|
@ -1056,8 +1039,7 @@ make_new_qty (reg, mode)
|
||||||
OLD is not changing; NEW is. */
|
OLD is not changing; NEW is. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
make_regs_eqv (new, old)
|
make_regs_eqv (unsigned int new, unsigned int old)
|
||||||
unsigned int new, old;
|
|
||||||
{
|
{
|
||||||
unsigned int lastr, firstr;
|
unsigned int lastr, firstr;
|
||||||
int q = REG_QTY (old);
|
int q = REG_QTY (old);
|
||||||
|
@ -1120,8 +1102,7 @@ make_regs_eqv (new, old)
|
||||||
/* Remove REG from its equivalence class. */
|
/* Remove REG from its equivalence class. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
delete_reg_equiv (reg)
|
delete_reg_equiv (unsigned int reg)
|
||||||
unsigned int reg;
|
|
||||||
{
|
{
|
||||||
struct qty_table_elem *ent;
|
struct qty_table_elem *ent;
|
||||||
int q = REG_QTY (reg);
|
int q = REG_QTY (reg);
|
||||||
|
@ -1161,8 +1142,7 @@ delete_reg_equiv (reg)
|
||||||
of X. */
|
of X. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mention_regs (x)
|
mention_regs (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
@ -1271,10 +1251,7 @@ mention_regs (x)
|
||||||
so X's hash code may be different. */
|
so X's hash code may be different. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
insert_regs (x, classp, modified)
|
insert_regs (rtx x, struct table_elt *classp, int modified)
|
||||||
rtx x;
|
|
||||||
struct table_elt *classp;
|
|
||||||
int modified;
|
|
||||||
{
|
{
|
||||||
if (GET_CODE (x) == REG)
|
if (GET_CODE (x) == REG)
|
||||||
{
|
{
|
||||||
|
@ -1351,9 +1328,7 @@ insert_regs (x, classp, modified)
|
||||||
and we save much time not recomputing it. */
|
and we save much time not recomputing it. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_from_table (elt, hash)
|
remove_from_table (struct table_elt *elt, unsigned int hash)
|
||||||
struct table_elt *elt;
|
|
||||||
unsigned hash;
|
|
||||||
{
|
{
|
||||||
if (elt == 0)
|
if (elt == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -1436,10 +1411,7 @@ remove_from_table (elt, hash)
|
||||||
looks like X. */
|
looks like X. */
|
||||||
|
|
||||||
static struct table_elt *
|
static struct table_elt *
|
||||||
lookup (x, hash, mode)
|
lookup (rtx x, unsigned int hash, enum machine_mode mode)
|
||||||
rtx x;
|
|
||||||
unsigned hash;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
struct table_elt *p;
|
struct table_elt *p;
|
||||||
|
|
||||||
|
@ -1455,10 +1427,7 @@ lookup (x, hash, mode)
|
||||||
Also ignore discrepancies in the machine mode of a register. */
|
Also ignore discrepancies in the machine mode of a register. */
|
||||||
|
|
||||||
static struct table_elt *
|
static struct table_elt *
|
||||||
lookup_for_remove (x, hash, mode)
|
lookup_for_remove (rtx x, unsigned int hash, enum machine_mode mode)
|
||||||
rtx x;
|
|
||||||
unsigned hash;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
struct table_elt *p;
|
struct table_elt *p;
|
||||||
|
|
||||||
|
@ -1487,9 +1456,7 @@ lookup_for_remove (x, hash, mode)
|
||||||
If one is found, return that expression. */
|
If one is found, return that expression. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
lookup_as_function (x, code)
|
lookup_as_function (rtx x, enum rtx_code code)
|
||||||
rtx x;
|
|
||||||
enum rtx_code code;
|
|
||||||
{
|
{
|
||||||
struct table_elt *p
|
struct table_elt *p
|
||||||
= lookup (x, safe_hash (x, VOIDmode) & HASH_MASK, GET_MODE (x));
|
= lookup (x, safe_hash (x, VOIDmode) & HASH_MASK, GET_MODE (x));
|
||||||
|
@ -1545,11 +1512,7 @@ lookup_as_function (x, code)
|
||||||
(preferrable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
|
(preferrable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
|
||||||
|
|
||||||
static struct table_elt *
|
static struct table_elt *
|
||||||
insert (x, classp, hash, mode)
|
insert (rtx x, struct table_elt *classp, unsigned int hash, enum machine_mode mode)
|
||||||
rtx x;
|
|
||||||
struct table_elt *classp;
|
|
||||||
unsigned hash;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
struct table_elt *elt;
|
struct table_elt *elt;
|
||||||
|
|
||||||
|
@ -1735,8 +1698,7 @@ insert (x, classp, hash, mode)
|
||||||
Any invalid entries in CLASS2 will not be copied. */
|
Any invalid entries in CLASS2 will not be copied. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
merge_equiv_classes (class1, class2)
|
merge_equiv_classes (struct table_elt *class1, struct table_elt *class2)
|
||||||
struct table_elt *class1, *class2;
|
|
||||||
{
|
{
|
||||||
struct table_elt *elt, *next, *new;
|
struct table_elt *elt, *next, *new;
|
||||||
|
|
||||||
|
@ -1783,7 +1745,7 @@ merge_equiv_classes (class1, class2)
|
||||||
/* Flush the entire hash table. */
|
/* Flush the entire hash table. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
flush_hash_table ()
|
flush_hash_table (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct table_elt *p;
|
struct table_elt *p;
|
||||||
|
@ -1808,9 +1770,7 @@ struct check_dependence_data
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
check_dependence (x, data)
|
check_dependence (rtx *x, void *data)
|
||||||
rtx *x;
|
|
||||||
void *data;
|
|
||||||
{
|
{
|
||||||
struct check_dependence_data *d = (struct check_dependence_data *) data;
|
struct check_dependence_data *d = (struct check_dependence_data *) data;
|
||||||
if (*x && GET_CODE (*x) == MEM)
|
if (*x && GET_CODE (*x) == MEM)
|
||||||
|
@ -1832,9 +1792,7 @@ check_dependence (x, data)
|
||||||
or it may be either of those plus a numeric offset. */
|
or it may be either of those plus a numeric offset. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
invalidate (x, full_mode)
|
invalidate (rtx x, enum machine_mode full_mode)
|
||||||
rtx x;
|
|
||||||
enum machine_mode full_mode;
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct table_elt *p;
|
struct table_elt *p;
|
||||||
|
@ -1974,8 +1932,7 @@ invalidate (x, full_mode)
|
||||||
expressions to reappear as valid. */
|
expressions to reappear as valid. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_invalid_refs (regno)
|
remove_invalid_refs (unsigned int regno)
|
||||||
unsigned int regno;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct table_elt *p, *next;
|
struct table_elt *p, *next;
|
||||||
|
@ -1993,10 +1950,8 @@ remove_invalid_refs (regno)
|
||||||
/* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
|
/* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
|
||||||
and mode MODE. */
|
and mode MODE. */
|
||||||
static void
|
static void
|
||||||
remove_invalid_subreg_refs (regno, offset, mode)
|
remove_invalid_subreg_refs (unsigned int regno, unsigned int offset,
|
||||||
unsigned int regno;
|
enum machine_mode mode)
|
||||||
unsigned int offset;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct table_elt *p, *next;
|
struct table_elt *p, *next;
|
||||||
|
@ -2026,8 +1981,7 @@ remove_invalid_subreg_refs (regno, offset, mode)
|
||||||
This is called when we make a jump equivalence. */
|
This is called when we make a jump equivalence. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rehash_using_reg (x)
|
rehash_using_reg (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct table_elt *p, *next;
|
struct table_elt *p, *next;
|
||||||
|
@ -2077,7 +2031,7 @@ rehash_using_reg (x)
|
||||||
register. Also update their TICK values. */
|
register. Also update their TICK values. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
invalidate_for_call ()
|
invalidate_for_call (void)
|
||||||
{
|
{
|
||||||
unsigned int regno, endregno;
|
unsigned int regno, endregno;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -2136,9 +2090,7 @@ invalidate_for_call ()
|
||||||
If none can be found, return 0. */
|
If none can be found, return 0. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
use_related_value (x, elt)
|
use_related_value (rtx x, struct table_elt *elt)
|
||||||
rtx x;
|
|
||||||
struct table_elt *elt;
|
|
||||||
{
|
{
|
||||||
struct table_elt *relt = 0;
|
struct table_elt *relt = 0;
|
||||||
struct table_elt *p, *q;
|
struct table_elt *p, *q;
|
||||||
|
@ -2206,8 +2158,7 @@ use_related_value (x, elt)
|
||||||
|
|
||||||
/* Hash a string. Just add its bytes up. */
|
/* Hash a string. Just add its bytes up. */
|
||||||
static inline unsigned
|
static inline unsigned
|
||||||
canon_hash_string (ps)
|
canon_hash_string (const char *ps)
|
||||||
const char *ps;
|
|
||||||
{
|
{
|
||||||
unsigned hash = 0;
|
unsigned hash = 0;
|
||||||
const unsigned char *p = (const unsigned char *) ps;
|
const unsigned char *p = (const unsigned char *) ps;
|
||||||
|
@ -2233,9 +2184,7 @@ canon_hash_string (ps)
|
||||||
is just (int) MEM plus the hash code of the address. */
|
is just (int) MEM plus the hash code of the address. */
|
||||||
|
|
||||||
static unsigned
|
static unsigned
|
||||||
canon_hash (x, mode)
|
canon_hash (rtx x, enum machine_mode mode)
|
||||||
rtx x;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
unsigned hash = 0;
|
unsigned hash = 0;
|
||||||
|
@ -2487,9 +2436,7 @@ canon_hash (x, mode)
|
||||||
/* Like canon_hash but with no side effects. */
|
/* Like canon_hash but with no side effects. */
|
||||||
|
|
||||||
static unsigned
|
static unsigned
|
||||||
safe_hash (x, mode)
|
safe_hash (rtx x, enum machine_mode mode)
|
||||||
rtx x;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
int save_do_not_record = do_not_record;
|
int save_do_not_record = do_not_record;
|
||||||
int save_hash_arg_in_memory = hash_arg_in_memory;
|
int save_hash_arg_in_memory = hash_arg_in_memory;
|
||||||
|
@ -2515,10 +2462,7 @@ safe_hash (x, mode)
|
||||||
is the same as that of the given value is pure luck. */
|
is the same as that of the given value is pure luck. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
exp_equiv_p (x, y, validate, equal_values)
|
exp_equiv_p (rtx x, rtx y, int validate, int equal_values)
|
||||||
rtx x, y;
|
|
||||||
int validate;
|
|
||||||
int equal_values;
|
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
|
@ -2710,9 +2654,7 @@ exp_equiv_p (x, y, validate, equal_values)
|
||||||
against certain constants or near-constants. */
|
against certain constants or near-constants. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cse_rtx_varies_p (x, from_alias)
|
cse_rtx_varies_p (rtx x, int from_alias)
|
||||||
rtx x;
|
|
||||||
int from_alias;
|
|
||||||
{
|
{
|
||||||
/* We need not check for X and the equivalence class being of the same
|
/* We need not check for X and the equivalence class being of the same
|
||||||
mode because if X is equivalent to a constant in some mode, it
|
mode because if X is equivalent to a constant in some mode, it
|
||||||
|
@ -2780,9 +2722,7 @@ cse_rtx_varies_p (x, from_alias)
|
||||||
generally be discarded since the changes we are making are optional. */
|
generally be discarded since the changes we are making are optional. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
canon_reg (x, insn)
|
canon_reg (rtx x, rtx insn)
|
||||||
rtx x;
|
|
||||||
rtx insn;
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
|
@ -2879,10 +2819,7 @@ canon_reg (x, insn)
|
||||||
hard registers here because we would also prefer the pseudo registers. */
|
hard registers here because we would also prefer the pseudo registers. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
find_best_addr (insn, loc, mode)
|
find_best_addr (rtx insn, rtx *loc, enum machine_mode mode)
|
||||||
rtx insn;
|
|
||||||
rtx *loc;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
struct table_elt *elt;
|
struct table_elt *elt;
|
||||||
rtx addr = *loc;
|
rtx addr = *loc;
|
||||||
|
@ -3095,10 +3032,8 @@ find_best_addr (insn, loc, mode)
|
||||||
A or the code corresponding to the inverse of the comparison. */
|
A or the code corresponding to the inverse of the comparison. */
|
||||||
|
|
||||||
static enum rtx_code
|
static enum rtx_code
|
||||||
find_comparison_args (code, parg1, parg2, pmode1, pmode2)
|
find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2,
|
||||||
enum rtx_code code;
|
enum machine_mode *pmode1, enum machine_mode *pmode2)
|
||||||
rtx *parg1, *parg2;
|
|
||||||
enum machine_mode *pmode1, *pmode2;
|
|
||||||
{
|
{
|
||||||
rtx arg1, arg2;
|
rtx arg1, arg2;
|
||||||
|
|
||||||
|
@ -3293,9 +3228,7 @@ find_comparison_args (code, parg1, parg2, pmode1, pmode2)
|
||||||
of X before modifying it. */
|
of X before modifying it. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
fold_rtx (x, insn)
|
fold_rtx (rtx x, rtx insn)
|
||||||
rtx x;
|
|
||||||
rtx insn;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
@ -4323,8 +4256,7 @@ fold_rtx (x, insn)
|
||||||
Return 0 if we don't know one. */
|
Return 0 if we don't know one. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
equiv_constant (x)
|
equiv_constant (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
if (GET_CODE (x) == REG
|
if (GET_CODE (x) == REG
|
||||||
&& REGNO_QTY_VALID_P (REGNO (x)))
|
&& REGNO_QTY_VALID_P (REGNO (x)))
|
||||||
|
@ -4374,9 +4306,7 @@ equiv_constant (x)
|
||||||
This is similar to gen_lowpart in emit-rtl.c. */
|
This is similar to gen_lowpart in emit-rtl.c. */
|
||||||
|
|
||||||
rtx
|
rtx
|
||||||
gen_lowpart_if_possible (mode, x)
|
gen_lowpart_if_possible (enum machine_mode mode, rtx x)
|
||||||
enum machine_mode mode;
|
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
rtx result = gen_lowpart_common (mode, x);
|
rtx result = gen_lowpart_common (mode, x);
|
||||||
|
|
||||||
|
@ -4419,9 +4349,7 @@ gen_lowpart_if_possible (mode, x)
|
||||||
comparison is seen later, we will know its value. */
|
comparison is seen later, we will know its value. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
record_jump_equiv (insn, taken)
|
record_jump_equiv (rtx insn, int taken)
|
||||||
rtx insn;
|
|
||||||
int taken;
|
|
||||||
{
|
{
|
||||||
int cond_known_true;
|
int cond_known_true;
|
||||||
rtx op0, op1;
|
rtx op0, op1;
|
||||||
|
@ -4472,11 +4400,8 @@ record_jump_equiv (insn, taken)
|
||||||
above function and called recursively. */
|
above function and called recursively. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
record_jump_cond (code, mode, op0, op1, reversed_nonequality)
|
record_jump_cond (enum rtx_code code, enum machine_mode mode, rtx op0,
|
||||||
enum rtx_code code;
|
rtx op1, int reversed_nonequality)
|
||||||
enum machine_mode mode;
|
|
||||||
rtx op0, op1;
|
|
||||||
int reversed_nonequality;
|
|
||||||
{
|
{
|
||||||
unsigned op0_hash, op1_hash;
|
unsigned op0_hash, op1_hash;
|
||||||
int op0_in_memory, op1_in_memory;
|
int op0_in_memory, op1_in_memory;
|
||||||
|
@ -4727,9 +4652,7 @@ struct set
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cse_insn (insn, libcall_insn)
|
cse_insn (rtx insn, rtx libcall_insn)
|
||||||
rtx insn;
|
|
||||||
rtx libcall_insn;
|
|
||||||
{
|
{
|
||||||
rtx x = PATTERN (insn);
|
rtx x = PATTERN (insn);
|
||||||
int i;
|
int i;
|
||||||
|
@ -6370,7 +6293,7 @@ cse_insn (insn, libcall_insn)
|
||||||
/* Remove from the hash table all expressions that reference memory. */
|
/* Remove from the hash table all expressions that reference memory. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
invalidate_memory ()
|
invalidate_memory (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct table_elt *p, *next;
|
struct table_elt *p, *next;
|
||||||
|
@ -6388,8 +6311,7 @@ invalidate_memory ()
|
||||||
1 and update the register tables to show the effect. Else, return 0. */
|
1 and update the register tables to show the effect. Else, return 0. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
addr_affects_sp_p (addr)
|
addr_affects_sp_p (rtx addr)
|
||||||
rtx addr;
|
|
||||||
{
|
{
|
||||||
if (GET_RTX_CLASS (GET_CODE (addr)) == 'a'
|
if (GET_RTX_CLASS (GET_CODE (addr)) == 'a'
|
||||||
&& GET_CODE (XEXP (addr, 0)) == REG
|
&& GET_CODE (XEXP (addr, 0)) == REG
|
||||||
|
@ -6420,8 +6342,7 @@ addr_affects_sp_p (addr)
|
||||||
X is the pattern of the insn. */
|
X is the pattern of the insn. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
invalidate_from_clobbers (x)
|
invalidate_from_clobbers (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
if (GET_CODE (x) == CLOBBER)
|
if (GET_CODE (x) == CLOBBER)
|
||||||
{
|
{
|
||||||
|
@ -6466,9 +6387,7 @@ invalidate_from_clobbers (x)
|
||||||
Return the replacement for X. */
|
Return the replacement for X. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
cse_process_notes (x, object)
|
cse_process_notes (rtx x, rtx object)
|
||||||
rtx x;
|
|
||||||
rtx object;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code = GET_CODE (x);
|
enum rtx_code code = GET_CODE (x);
|
||||||
const char *fmt = GET_RTX_FORMAT (code);
|
const char *fmt = GET_RTX_FORMAT (code);
|
||||||
|
@ -6560,8 +6479,7 @@ cse_process_notes (x, object)
|
||||||
jumps to a label used only once. */
|
jumps to a label used only once. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cse_around_loop (loop_start)
|
cse_around_loop (rtx loop_start)
|
||||||
rtx loop_start;
|
|
||||||
{
|
{
|
||||||
rtx insn;
|
rtx insn;
|
||||||
int i;
|
int i;
|
||||||
|
@ -6632,10 +6550,7 @@ cse_around_loop (loop_start)
|
||||||
since they are done elsewhere. This function is called via note_stores. */
|
since they are done elsewhere. This function is called via note_stores. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
invalidate_skipped_set (dest, set, data)
|
invalidate_skipped_set (rtx dest, rtx set, void *data ATTRIBUTE_UNUSED)
|
||||||
rtx set;
|
|
||||||
rtx dest;
|
|
||||||
void *data ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code = GET_CODE (dest);
|
enum rtx_code code = GET_CODE (dest);
|
||||||
|
|
||||||
|
@ -6669,8 +6584,7 @@ invalidate_skipped_set (dest, set, data)
|
||||||
conditionally executed. */
|
conditionally executed. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
invalidate_skipped_block (start)
|
invalidate_skipped_block (rtx start)
|
||||||
rtx start;
|
|
||||||
{
|
{
|
||||||
rtx insn;
|
rtx insn;
|
||||||
|
|
||||||
|
@ -6697,10 +6611,7 @@ invalidate_skipped_block (start)
|
||||||
NULL_RTX. */
|
NULL_RTX. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cse_check_loop_start (x, set, data)
|
cse_check_loop_start (rtx x, rtx set ATTRIBUTE_UNUSED, void *data)
|
||||||
rtx x;
|
|
||||||
rtx set ATTRIBUTE_UNUSED;
|
|
||||||
void *data;
|
|
||||||
{
|
{
|
||||||
rtx *cse_check_loop_start_value = (rtx *) data;
|
rtx *cse_check_loop_start_value = (rtx *) data;
|
||||||
|
|
||||||
|
@ -6731,10 +6642,7 @@ cse_check_loop_start (x, set, data)
|
||||||
In any event, we invalidate whatever this SET or CLOBBER modifies. */
|
In any event, we invalidate whatever this SET or CLOBBER modifies. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cse_set_around_loop (x, insn, loop_start)
|
cse_set_around_loop (rtx x, rtx insn, rtx loop_start)
|
||||||
rtx x;
|
|
||||||
rtx insn;
|
|
||||||
rtx loop_start;
|
|
||||||
{
|
{
|
||||||
struct table_elt *src_elt;
|
struct table_elt *src_elt;
|
||||||
|
|
||||||
|
@ -6841,12 +6749,8 @@ cse_set_around_loop (x, insn, loop_start)
|
||||||
to construct the output branch path. */
|
to construct the output branch path. */
|
||||||
|
|
||||||
void
|
void
|
||||||
cse_end_of_basic_block (insn, data, follow_jumps, after_loop, skip_blocks)
|
cse_end_of_basic_block (rtx insn, struct cse_basic_block_data *data,
|
||||||
rtx insn;
|
int follow_jumps, int after_loop, int skip_blocks)
|
||||||
struct cse_basic_block_data *data;
|
|
||||||
int follow_jumps;
|
|
||||||
int after_loop;
|
|
||||||
int skip_blocks;
|
|
||||||
{
|
{
|
||||||
rtx p = insn, q;
|
rtx p = insn, q;
|
||||||
int nsets = 0;
|
int nsets = 0;
|
||||||
|
@ -7063,11 +6967,7 @@ cse_end_of_basic_block (insn, data, follow_jumps, after_loop, skip_blocks)
|
||||||
in conditional jump instructions. */
|
in conditional jump instructions. */
|
||||||
|
|
||||||
int
|
int
|
||||||
cse_main (f, nregs, after_loop, file)
|
cse_main (rtx f, int nregs, int after_loop, FILE *file)
|
||||||
rtx f;
|
|
||||||
int nregs;
|
|
||||||
int after_loop;
|
|
||||||
FILE *file;
|
|
||||||
{
|
{
|
||||||
struct cse_basic_block_data val;
|
struct cse_basic_block_data val;
|
||||||
rtx insn = f;
|
rtx insn = f;
|
||||||
|
@ -7213,10 +7113,8 @@ cse_main (f, nregs, after_loop, file)
|
||||||
block and this CSE pass is before loop.c. */
|
block and this CSE pass is before loop.c. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
cse_basic_block (from, to, next_branch, around_loop)
|
cse_basic_block (rtx from, rtx to, struct branch_path *next_branch,
|
||||||
rtx from, to;
|
int around_loop)
|
||||||
struct branch_path *next_branch;
|
|
||||||
int around_loop;
|
|
||||||
{
|
{
|
||||||
rtx insn;
|
rtx insn;
|
||||||
int to_usage = 0;
|
int to_usage = 0;
|
||||||
|
@ -7429,9 +7327,7 @@ cse_basic_block (from, to, next_branch, around_loop)
|
||||||
there isn't a REG_LABEL note. Return one if so. DATA is the insn. */
|
there isn't a REG_LABEL note. Return one if so. DATA is the insn. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
check_for_label_ref (rtl, data)
|
check_for_label_ref (rtx *rtl, void *data)
|
||||||
rtx *rtl;
|
|
||||||
void *data;
|
|
||||||
{
|
{
|
||||||
rtx insn = (rtx) data;
|
rtx insn = (rtx) data;
|
||||||
|
|
||||||
|
@ -7455,11 +7351,7 @@ check_for_label_ref (rtl, data)
|
||||||
modify the liveness of DEST. */
|
modify the liveness of DEST. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
count_reg_usage (x, counts, dest, incr)
|
count_reg_usage (rtx x, int *counts, rtx dest, int incr)
|
||||||
rtx x;
|
|
||||||
int *counts;
|
|
||||||
rtx dest;
|
|
||||||
int incr;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
rtx note;
|
rtx note;
|
||||||
|
@ -7563,10 +7455,8 @@ count_reg_usage (x, counts, dest, incr)
|
||||||
|
|
||||||
/* Return true if set is live. */
|
/* Return true if set is live. */
|
||||||
static bool
|
static bool
|
||||||
set_live_p (set, insn, counts)
|
set_live_p (rtx set, rtx insn ATTRIBUTE_UNUSED, /* Only used with HAVE_cc0. */
|
||||||
rtx set;
|
int *counts)
|
||||||
rtx insn ATTRIBUTE_UNUSED; /* Only used with HAVE_cc0. */
|
|
||||||
int *counts;
|
|
||||||
{
|
{
|
||||||
#ifdef HAVE_cc0
|
#ifdef HAVE_cc0
|
||||||
rtx tem;
|
rtx tem;
|
||||||
|
@ -7599,9 +7489,7 @@ set_live_p (set, insn, counts)
|
||||||
/* Return true if insn is live. */
|
/* Return true if insn is live. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
insn_live_p (insn, counts)
|
insn_live_p (rtx insn, int *counts)
|
||||||
rtx insn;
|
|
||||||
int *counts;
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if (flag_non_call_exceptions && may_trap_p (PATTERN (insn)))
|
if (flag_non_call_exceptions && may_trap_p (PATTERN (insn)))
|
||||||
|
@ -7631,9 +7519,7 @@ insn_live_p (insn, counts)
|
||||||
/* Return true if libcall is dead as a whole. */
|
/* Return true if libcall is dead as a whole. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
dead_libcall_p (insn, counts)
|
dead_libcall_p (rtx insn, int *counts)
|
||||||
rtx insn;
|
|
||||||
int *counts;
|
|
||||||
{
|
{
|
||||||
rtx note, set, new;
|
rtx note, set, new;
|
||||||
|
|
||||||
|
@ -7690,9 +7576,7 @@ dead_libcall_p (insn, counts)
|
||||||
remaining passes of the compilation are also sped up. */
|
remaining passes of the compilation are also sped up. */
|
||||||
|
|
||||||
int
|
int
|
||||||
delete_trivially_dead_insns (insns, nreg)
|
delete_trivially_dead_insns (rtx insns, int nreg)
|
||||||
rtx insns;
|
|
||||||
int nreg;
|
|
||||||
{
|
{
|
||||||
int *counts;
|
int *counts;
|
||||||
rtx insn, prev;
|
rtx insn, prev;
|
||||||
|
|
157
gcc/cselib.c
157
gcc/cselib.c
|
@ -40,34 +40,28 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
#include "hashtab.h"
|
#include "hashtab.h"
|
||||||
#include "cselib.h"
|
#include "cselib.h"
|
||||||
|
|
||||||
static int entry_and_rtx_equal_p PARAMS ((const void *, const void *));
|
static int entry_and_rtx_equal_p (const void *, const void *);
|
||||||
static hashval_t get_value_hash PARAMS ((const void *));
|
static hashval_t get_value_hash (const void *);
|
||||||
static struct elt_list *new_elt_list PARAMS ((struct elt_list *,
|
static struct elt_list *new_elt_list (struct elt_list *, cselib_val *);
|
||||||
cselib_val *));
|
static struct elt_loc_list *new_elt_loc_list (struct elt_loc_list *, rtx);
|
||||||
static struct elt_loc_list *new_elt_loc_list PARAMS ((struct elt_loc_list *,
|
static void unchain_one_value (cselib_val *);
|
||||||
rtx));
|
static void unchain_one_elt_list (struct elt_list **);
|
||||||
static void unchain_one_value PARAMS ((cselib_val *));
|
static void unchain_one_elt_loc_list (struct elt_loc_list **);
|
||||||
static void unchain_one_elt_list PARAMS ((struct elt_list **));
|
static void clear_table (void);
|
||||||
static void unchain_one_elt_loc_list PARAMS ((struct elt_loc_list **));
|
static int discard_useless_locs (void **, void *);
|
||||||
static void clear_table PARAMS ((void));
|
static int discard_useless_values (void **, void *);
|
||||||
static int discard_useless_locs PARAMS ((void **, void *));
|
static void remove_useless_values (void);
|
||||||
static int discard_useless_values PARAMS ((void **, void *));
|
static rtx wrap_constant (enum machine_mode, rtx);
|
||||||
static void remove_useless_values PARAMS ((void));
|
static unsigned int hash_rtx (rtx, enum machine_mode, int);
|
||||||
static rtx wrap_constant PARAMS ((enum machine_mode, rtx));
|
static cselib_val *new_cselib_val (unsigned int, enum machine_mode);
|
||||||
static unsigned int hash_rtx PARAMS ((rtx, enum machine_mode, int));
|
static void add_mem_for_addr (cselib_val *, cselib_val *, rtx);
|
||||||
static cselib_val *new_cselib_val PARAMS ((unsigned int,
|
static cselib_val *cselib_lookup_mem (rtx, int);
|
||||||
enum machine_mode));
|
static void cselib_invalidate_regno (unsigned int, enum machine_mode);
|
||||||
static void add_mem_for_addr PARAMS ((cselib_val *, cselib_val *,
|
static int cselib_mem_conflict_p (rtx, rtx);
|
||||||
rtx));
|
static void cselib_invalidate_mem (rtx);
|
||||||
static cselib_val *cselib_lookup_mem PARAMS ((rtx, int));
|
static void cselib_invalidate_rtx (rtx, rtx, void *);
|
||||||
static void cselib_invalidate_regno PARAMS ((unsigned int,
|
static void cselib_record_set (rtx, cselib_val *, cselib_val *);
|
||||||
enum machine_mode));
|
static void cselib_record_sets (rtx);
|
||||||
static int cselib_mem_conflict_p PARAMS ((rtx, rtx));
|
|
||||||
static void cselib_invalidate_mem PARAMS ((rtx));
|
|
||||||
static void cselib_invalidate_rtx PARAMS ((rtx, rtx, void *));
|
|
||||||
static void cselib_record_set PARAMS ((rtx, cselib_val *,
|
|
||||||
cselib_val *));
|
|
||||||
static void cselib_record_sets PARAMS ((rtx));
|
|
||||||
|
|
||||||
/* There are three ways in which cselib can look up an rtx:
|
/* There are three ways in which cselib can look up an rtx:
|
||||||
- for a REG, the reg_values table (which is indexed by regno) is used
|
- for a REG, the reg_values table (which is indexed by regno) is used
|
||||||
|
@ -146,9 +140,7 @@ static cselib_val *first_containing_mem = &dummy_val;
|
||||||
arguments. */
|
arguments. */
|
||||||
|
|
||||||
static struct elt_list *
|
static struct elt_list *
|
||||||
new_elt_list (next, elt)
|
new_elt_list (struct elt_list *next, cselib_val *elt)
|
||||||
struct elt_list *next;
|
|
||||||
cselib_val *elt;
|
|
||||||
{
|
{
|
||||||
struct elt_list *el = empty_elt_lists;
|
struct elt_list *el = empty_elt_lists;
|
||||||
|
|
||||||
|
@ -165,9 +157,7 @@ new_elt_list (next, elt)
|
||||||
arguments. */
|
arguments. */
|
||||||
|
|
||||||
static struct elt_loc_list *
|
static struct elt_loc_list *
|
||||||
new_elt_loc_list (next, loc)
|
new_elt_loc_list (struct elt_loc_list *next, rtx loc)
|
||||||
struct elt_loc_list *next;
|
|
||||||
rtx loc;
|
|
||||||
{
|
{
|
||||||
struct elt_loc_list *el = empty_elt_loc_lists;
|
struct elt_loc_list *el = empty_elt_loc_lists;
|
||||||
|
|
||||||
|
@ -186,8 +176,7 @@ new_elt_loc_list (next, loc)
|
||||||
storage. */
|
storage. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unchain_one_elt_list (pl)
|
unchain_one_elt_list (struct elt_list **pl)
|
||||||
struct elt_list **pl;
|
|
||||||
{
|
{
|
||||||
struct elt_list *l = *pl;
|
struct elt_list *l = *pl;
|
||||||
|
|
||||||
|
@ -199,8 +188,7 @@ unchain_one_elt_list (pl)
|
||||||
/* Likewise for elt_loc_lists. */
|
/* Likewise for elt_loc_lists. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unchain_one_elt_loc_list (pl)
|
unchain_one_elt_loc_list (struct elt_loc_list **pl)
|
||||||
struct elt_loc_list **pl;
|
|
||||||
{
|
{
|
||||||
struct elt_loc_list *l = *pl;
|
struct elt_loc_list *l = *pl;
|
||||||
|
|
||||||
|
@ -213,8 +201,7 @@ unchain_one_elt_loc_list (pl)
|
||||||
V. */
|
V. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unchain_one_value (v)
|
unchain_one_value (cselib_val *v)
|
||||||
cselib_val *v;
|
|
||||||
{
|
{
|
||||||
while (v->addr_list)
|
while (v->addr_list)
|
||||||
unchain_one_elt_list (&v->addr_list);
|
unchain_one_elt_list (&v->addr_list);
|
||||||
|
@ -228,7 +215,7 @@ unchain_one_value (v)
|
||||||
which are known to have been used. */
|
which are known to have been used. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clear_table ()
|
clear_table (void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -254,8 +241,7 @@ clear_table ()
|
||||||
CONST of an appropriate mode. */
|
CONST of an appropriate mode. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
entry_and_rtx_equal_p (entry, x_arg)
|
entry_and_rtx_equal_p (const void *entry, const void *x_arg)
|
||||||
const void *entry, *x_arg;
|
|
||||||
{
|
{
|
||||||
struct elt_loc_list *l;
|
struct elt_loc_list *l;
|
||||||
const cselib_val *v = (const cselib_val *) entry;
|
const cselib_val *v = (const cselib_val *) entry;
|
||||||
|
@ -288,8 +274,7 @@ entry_and_rtx_equal_p (entry, x_arg)
|
||||||
value from a cselib_val structure. */
|
value from a cselib_val structure. */
|
||||||
|
|
||||||
static hashval_t
|
static hashval_t
|
||||||
get_value_hash (entry)
|
get_value_hash (const void *entry)
|
||||||
const void *entry;
|
|
||||||
{
|
{
|
||||||
const cselib_val *v = (const cselib_val *) entry;
|
const cselib_val *v = (const cselib_val *) entry;
|
||||||
return v->value;
|
return v->value;
|
||||||
|
@ -301,9 +286,7 @@ get_value_hash (entry)
|
||||||
removed. */
|
removed. */
|
||||||
|
|
||||||
int
|
int
|
||||||
references_value_p (x, only_useless)
|
references_value_p (rtx x, int only_useless)
|
||||||
rtx x;
|
|
||||||
int only_useless;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code = GET_CODE (x);
|
enum rtx_code code = GET_CODE (x);
|
||||||
const char *fmt = GET_RTX_FORMAT (code);
|
const char *fmt = GET_RTX_FORMAT (code);
|
||||||
|
@ -331,9 +314,7 @@ references_value_p (x, only_useless)
|
||||||
htab_traverse. */
|
htab_traverse. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
discard_useless_locs (x, info)
|
discard_useless_locs (void **x, void *info ATTRIBUTE_UNUSED)
|
||||||
void **x;
|
|
||||||
void *info ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
cselib_val *v = (cselib_val *)*x;
|
cselib_val *v = (cselib_val *)*x;
|
||||||
struct elt_loc_list **p = &v->locs;
|
struct elt_loc_list **p = &v->locs;
|
||||||
|
@ -358,9 +339,7 @@ discard_useless_locs (x, info)
|
||||||
/* If X is a value with no locations, remove it from the hashtable. */
|
/* If X is a value with no locations, remove it from the hashtable. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
discard_useless_values (x, info)
|
discard_useless_values (void **x, void *info ATTRIBUTE_UNUSED)
|
||||||
void **x;
|
|
||||||
void *info ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
cselib_val *v = (cselib_val *)*x;
|
cselib_val *v = (cselib_val *)*x;
|
||||||
|
|
||||||
|
@ -378,7 +357,7 @@ discard_useless_values (x, info)
|
||||||
associated with them) from the hash table. */
|
associated with them) from the hash table. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_useless_values ()
|
remove_useless_values (void)
|
||||||
{
|
{
|
||||||
cselib_val **p, *v;
|
cselib_val **p, *v;
|
||||||
/* First pass: eliminate locations that reference the value. That in
|
/* First pass: eliminate locations that reference the value. That in
|
||||||
|
@ -412,8 +391,7 @@ remove_useless_values ()
|
||||||
VOIDmode. */
|
VOIDmode. */
|
||||||
|
|
||||||
enum machine_mode
|
enum machine_mode
|
||||||
cselib_reg_set_mode (x)
|
cselib_reg_set_mode (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
if (GET_CODE (x) != REG)
|
if (GET_CODE (x) != REG)
|
||||||
return GET_MODE (x);
|
return GET_MODE (x);
|
||||||
|
@ -429,8 +407,7 @@ cselib_reg_set_mode (x)
|
||||||
our gathered information into account. */
|
our gathered information into account. */
|
||||||
|
|
||||||
int
|
int
|
||||||
rtx_equal_for_cselib_p (x, y)
|
rtx_equal_for_cselib_p (rtx x, rtx y)
|
||||||
rtx x, y;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
const char *fmt;
|
const char *fmt;
|
||||||
|
@ -568,9 +545,7 @@ rtx_equal_for_cselib_p (x, y)
|
||||||
functions. For that purpose, wrap them in a CONST of the appropriate
|
functions. For that purpose, wrap them in a CONST of the appropriate
|
||||||
mode. */
|
mode. */
|
||||||
static rtx
|
static rtx
|
||||||
wrap_constant (mode, x)
|
wrap_constant (enum machine_mode mode, rtx x)
|
||||||
enum machine_mode mode;
|
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
if (GET_CODE (x) != CONST_INT
|
if (GET_CODE (x) != CONST_INT
|
||||||
&& (GET_CODE (x) != CONST_DOUBLE || GET_MODE (x) != VOIDmode))
|
&& (GET_CODE (x) != CONST_DOUBLE || GET_MODE (x) != VOIDmode))
|
||||||
|
@ -590,10 +565,7 @@ wrap_constant (mode, x)
|
||||||
otherwise the mode of X is used. */
|
otherwise the mode of X is used. */
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
hash_rtx (x, mode, create)
|
hash_rtx (rtx x, enum machine_mode mode, int create)
|
||||||
rtx x;
|
|
||||||
enum machine_mode mode;
|
|
||||||
int create;
|
|
||||||
{
|
{
|
||||||
cselib_val *e;
|
cselib_val *e;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
@ -725,9 +697,7 @@ hash_rtx (x, mode, create)
|
||||||
value is MODE. */
|
value is MODE. */
|
||||||
|
|
||||||
static cselib_val *
|
static cselib_val *
|
||||||
new_cselib_val (value, mode)
|
new_cselib_val (unsigned int value, enum machine_mode mode)
|
||||||
unsigned int value;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
cselib_val *e = empty_vals;
|
cselib_val *e = empty_vals;
|
||||||
|
|
||||||
|
@ -753,9 +723,7 @@ new_cselib_val (value, mode)
|
||||||
value. Update the two value structures to represent this situation. */
|
value. Update the two value structures to represent this situation. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_mem_for_addr (addr_elt, mem_elt, x)
|
add_mem_for_addr (cselib_val *addr_elt, cselib_val *mem_elt, rtx x)
|
||||||
cselib_val *addr_elt, *mem_elt;
|
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
struct elt_loc_list *l;
|
struct elt_loc_list *l;
|
||||||
|
|
||||||
|
@ -780,9 +748,7 @@ add_mem_for_addr (addr_elt, mem_elt, x)
|
||||||
If CREATE, make a new one if we haven't seen it before. */
|
If CREATE, make a new one if we haven't seen it before. */
|
||||||
|
|
||||||
static cselib_val *
|
static cselib_val *
|
||||||
cselib_lookup_mem (x, create)
|
cselib_lookup_mem (rtx x, int create)
|
||||||
rtx x;
|
|
||||||
int create;
|
|
||||||
{
|
{
|
||||||
enum machine_mode mode = GET_MODE (x);
|
enum machine_mode mode = GET_MODE (x);
|
||||||
void **slot;
|
void **slot;
|
||||||
|
@ -822,8 +788,7 @@ cselib_lookup_mem (x, create)
|
||||||
allocated. However, the return value can share rtl with X. */
|
allocated. However, the return value can share rtl with X. */
|
||||||
|
|
||||||
rtx
|
rtx
|
||||||
cselib_subst_to_values (x)
|
cselib_subst_to_values (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code = GET_CODE (x);
|
enum rtx_code code = GET_CODE (x);
|
||||||
const char *fmt = GET_RTX_FORMAT (code);
|
const char *fmt = GET_RTX_FORMAT (code);
|
||||||
|
@ -915,10 +880,7 @@ cselib_subst_to_values (x)
|
||||||
(i.e. because it's a constant). */
|
(i.e. because it's a constant). */
|
||||||
|
|
||||||
cselib_val *
|
cselib_val *
|
||||||
cselib_lookup (x, mode, create)
|
cselib_lookup (rtx x, enum machine_mode mode, int create)
|
||||||
rtx x;
|
|
||||||
enum machine_mode mode;
|
|
||||||
int create;
|
|
||||||
{
|
{
|
||||||
void **slot;
|
void **slot;
|
||||||
cselib_val *e;
|
cselib_val *e;
|
||||||
|
@ -1003,9 +965,7 @@ cselib_lookup (x, mode, create)
|
||||||
invalidating call clobbered registers across a call. */
|
invalidating call clobbered registers across a call. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cselib_invalidate_regno (regno, mode)
|
cselib_invalidate_regno (unsigned int regno, enum machine_mode mode)
|
||||||
unsigned int regno;
|
|
||||||
enum machine_mode mode;
|
|
||||||
{
|
{
|
||||||
unsigned int endregno;
|
unsigned int endregno;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -1094,9 +1054,7 @@ cselib_invalidate_regno (regno, mode)
|
||||||
Return whether this change will invalidate VAL. */
|
Return whether this change will invalidate VAL. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cselib_mem_conflict_p (mem_base, val)
|
cselib_mem_conflict_p (rtx mem_base, rtx val)
|
||||||
rtx mem_base;
|
|
||||||
rtx val;
|
|
||||||
{
|
{
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
const char *fmt;
|
const char *fmt;
|
||||||
|
@ -1153,8 +1111,7 @@ cselib_mem_conflict_p (mem_base, val)
|
||||||
instruction, MEM_RTX is (mem:BLK const0_rtx). */
|
instruction, MEM_RTX is (mem:BLK const0_rtx). */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cselib_invalidate_mem (mem_rtx)
|
cselib_invalidate_mem (rtx mem_rtx)
|
||||||
rtx mem_rtx;
|
|
||||||
{
|
{
|
||||||
cselib_val **vp, *v, *next;
|
cselib_val **vp, *v, *next;
|
||||||
|
|
||||||
|
@ -1224,10 +1181,8 @@ cselib_invalidate_mem (mem_rtx)
|
||||||
note_stores; they are ignored. */
|
note_stores; they are ignored. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cselib_invalidate_rtx (dest, ignore, data)
|
cselib_invalidate_rtx (rtx dest, rtx ignore ATTRIBUTE_UNUSED,
|
||||||
rtx dest;
|
void *data ATTRIBUTE_UNUSED)
|
||||||
rtx ignore ATTRIBUTE_UNUSED;
|
|
||||||
void *data ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SIGN_EXTRACT
|
while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SIGN_EXTRACT
|
||||||
|| GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG)
|
|| GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG)
|
||||||
|
@ -1251,9 +1206,7 @@ cselib_invalidate_rtx (dest, ignore, data)
|
||||||
describes its address. */
|
describes its address. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cselib_record_set (dest, src_elt, dest_addr_elt)
|
cselib_record_set (rtx dest, cselib_val *src_elt, cselib_val *dest_addr_elt)
|
||||||
rtx dest;
|
|
||||||
cselib_val *src_elt, *dest_addr_elt;
|
|
||||||
{
|
{
|
||||||
int dreg = GET_CODE (dest) == REG ? (int) REGNO (dest) : -1;
|
int dreg = GET_CODE (dest) == REG ? (int) REGNO (dest) : -1;
|
||||||
|
|
||||||
|
@ -1311,8 +1264,7 @@ struct set
|
||||||
|
|
||||||
/* Record the effects of any sets in INSN. */
|
/* Record the effects of any sets in INSN. */
|
||||||
static void
|
static void
|
||||||
cselib_record_sets (insn)
|
cselib_record_sets (rtx insn)
|
||||||
rtx insn;
|
|
||||||
{
|
{
|
||||||
int n_sets = 0;
|
int n_sets = 0;
|
||||||
int i;
|
int i;
|
||||||
|
@ -1393,8 +1345,7 @@ cselib_record_sets (insn)
|
||||||
/* Record the effects of INSN. */
|
/* Record the effects of INSN. */
|
||||||
|
|
||||||
void
|
void
|
||||||
cselib_process_insn (insn)
|
cselib_process_insn (rtx insn)
|
||||||
rtx insn;
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
rtx x;
|
rtx x;
|
||||||
|
@ -1464,7 +1415,7 @@ cselib_process_insn (insn)
|
||||||
it must be called by the user if it allocated new registers. */
|
it must be called by the user if it allocated new registers. */
|
||||||
|
|
||||||
void
|
void
|
||||||
cselib_update_varray_sizes ()
|
cselib_update_varray_sizes (void)
|
||||||
{
|
{
|
||||||
unsigned int nregs = max_reg_num ();
|
unsigned int nregs = max_reg_num ();
|
||||||
|
|
||||||
|
@ -1480,7 +1431,7 @@ cselib_update_varray_sizes ()
|
||||||
init_alias_analysis. */
|
init_alias_analysis. */
|
||||||
|
|
||||||
void
|
void
|
||||||
cselib_init ()
|
cselib_init (void)
|
||||||
{
|
{
|
||||||
/* This is only created once. */
|
/* This is only created once. */
|
||||||
if (! callmem)
|
if (! callmem)
|
||||||
|
@ -1505,7 +1456,7 @@ cselib_init ()
|
||||||
/* Called when the current user is done with cselib. */
|
/* Called when the current user is done with cselib. */
|
||||||
|
|
||||||
void
|
void
|
||||||
cselib_finish ()
|
cselib_finish (void)
|
||||||
{
|
{
|
||||||
clear_table ();
|
clear_table ();
|
||||||
reg_values_old = reg_values;
|
reg_values_old = reg_values;
|
||||||
|
|
18
gcc/cselib.h
18
gcc/cselib.h
|
@ -62,12 +62,12 @@ struct elt_list GTY(())
|
||||||
cselib_val *elt;
|
cselib_val *elt;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern cselib_val *cselib_lookup PARAMS ((rtx, enum machine_mode, int));
|
extern cselib_val *cselib_lookup (rtx, enum machine_mode, int);
|
||||||
extern void cselib_update_varray_sizes PARAMS ((void));
|
extern void cselib_update_varray_sizes (void);
|
||||||
extern void cselib_init PARAMS ((void));
|
extern void cselib_init (void);
|
||||||
extern void cselib_finish PARAMS ((void));
|
extern void cselib_finish (void);
|
||||||
extern void cselib_process_insn PARAMS ((rtx));
|
extern void cselib_process_insn (rtx);
|
||||||
extern enum machine_mode cselib_reg_set_mode PARAMS ((rtx));
|
extern enum machine_mode cselib_reg_set_mode (rtx);
|
||||||
extern int rtx_equal_for_cselib_p PARAMS ((rtx, rtx));
|
extern int rtx_equal_for_cselib_p (rtx, rtx);
|
||||||
extern int references_value_p PARAMS ((rtx, int));
|
extern int references_value_p (rtx, int);
|
||||||
extern rtx cselib_subst_to_values PARAMS ((rtx));
|
extern rtx cselib_subst_to_values (rtx);
|
||||||
|
|
193
gcc/dbxout.c
193
gcc/dbxout.c
|
@ -307,46 +307,46 @@ static int current_sym_nchars;
|
||||||
#define CONTIN do { } while (0)
|
#define CONTIN do { } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void dbxout_init PARAMS ((const char *));
|
static void dbxout_init (const char *);
|
||||||
static void dbxout_finish PARAMS ((const char *));
|
static void dbxout_finish (const char *);
|
||||||
static void dbxout_start_source_file PARAMS ((unsigned, const char *));
|
static void dbxout_start_source_file (unsigned, const char *);
|
||||||
static void dbxout_end_source_file PARAMS ((unsigned));
|
static void dbxout_end_source_file (unsigned);
|
||||||
static void dbxout_typedefs PARAMS ((tree));
|
static void dbxout_typedefs (tree);
|
||||||
static void dbxout_fptype_value PARAMS ((tree));
|
static void dbxout_fptype_value (tree);
|
||||||
static void dbxout_type_index PARAMS ((tree));
|
static void dbxout_type_index (tree);
|
||||||
#if DBX_CONTIN_LENGTH > 0
|
#if DBX_CONTIN_LENGTH > 0
|
||||||
static void dbxout_continue PARAMS ((void));
|
static void dbxout_continue (void);
|
||||||
#endif
|
#endif
|
||||||
static void dbxout_args PARAMS ((tree));
|
static void dbxout_args (tree);
|
||||||
static void dbxout_type_fields PARAMS ((tree));
|
static void dbxout_type_fields (tree);
|
||||||
static void dbxout_type_method_1 PARAMS ((tree, const char *));
|
static void dbxout_type_method_1 (tree, const char *);
|
||||||
static void dbxout_type_methods PARAMS ((tree));
|
static void dbxout_type_methods (tree);
|
||||||
static void dbxout_range_type PARAMS ((tree));
|
static void dbxout_range_type (tree);
|
||||||
static void dbxout_type PARAMS ((tree, int));
|
static void dbxout_type (tree, int);
|
||||||
static bool print_int_cst_bounds_in_octal_p PARAMS ((tree));
|
static bool print_int_cst_bounds_in_octal_p (tree);
|
||||||
static void print_int_cst_octal PARAMS ((tree));
|
static void print_int_cst_octal (tree);
|
||||||
static void print_octal PARAMS ((unsigned HOST_WIDE_INT, int));
|
static void print_octal (unsigned HOST_WIDE_INT, int);
|
||||||
static void print_wide_int PARAMS ((HOST_WIDE_INT));
|
static void print_wide_int (HOST_WIDE_INT);
|
||||||
static void dbxout_type_name PARAMS ((tree));
|
static void dbxout_type_name (tree);
|
||||||
static void dbxout_class_name_qualifiers PARAMS ((tree));
|
static void dbxout_class_name_qualifiers (tree);
|
||||||
static int dbxout_symbol_location PARAMS ((tree, tree, const char *, rtx));
|
static int dbxout_symbol_location (tree, tree, const char *, rtx);
|
||||||
static void dbxout_symbol_name PARAMS ((tree, const char *, int));
|
static void dbxout_symbol_name (tree, const char *, int);
|
||||||
static void dbxout_prepare_symbol PARAMS ((tree));
|
static void dbxout_prepare_symbol (tree);
|
||||||
static void dbxout_finish_symbol PARAMS ((tree));
|
static void dbxout_finish_symbol (tree);
|
||||||
static void dbxout_block PARAMS ((tree, int, tree));
|
static void dbxout_block (tree, int, tree);
|
||||||
static void dbxout_global_decl PARAMS ((tree));
|
static void dbxout_global_decl (tree);
|
||||||
static void dbxout_handle_pch PARAMS ((unsigned));
|
static void dbxout_handle_pch (unsigned);
|
||||||
|
|
||||||
/* The debug hooks structure. */
|
/* The debug hooks structure. */
|
||||||
#if defined (DBX_DEBUGGING_INFO)
|
#if defined (DBX_DEBUGGING_INFO)
|
||||||
|
|
||||||
static void dbxout_source_line PARAMS ((unsigned int, const char *));
|
static void dbxout_source_line (unsigned int, const char *);
|
||||||
static void dbxout_source_file PARAMS ((FILE *, const char *));
|
static void dbxout_source_file (FILE *, const char *);
|
||||||
static void dbxout_function_end PARAMS ((void));
|
static void dbxout_function_end (void);
|
||||||
static void dbxout_begin_function PARAMS ((tree));
|
static void dbxout_begin_function (tree);
|
||||||
static void dbxout_begin_block PARAMS ((unsigned, unsigned));
|
static void dbxout_begin_block (unsigned, unsigned);
|
||||||
static void dbxout_end_block PARAMS ((unsigned, unsigned));
|
static void dbxout_end_block (unsigned, unsigned);
|
||||||
static void dbxout_function_decl PARAMS ((tree));
|
static void dbxout_function_decl (tree);
|
||||||
|
|
||||||
const struct gcc_debug_hooks dbx_debug_hooks =
|
const struct gcc_debug_hooks dbx_debug_hooks =
|
||||||
{
|
{
|
||||||
|
@ -407,7 +407,7 @@ const struct gcc_debug_hooks xcoff_debug_hooks =
|
||||||
|
|
||||||
#if defined (DBX_DEBUGGING_INFO)
|
#if defined (DBX_DEBUGGING_INFO)
|
||||||
static void
|
static void
|
||||||
dbxout_function_end ()
|
dbxout_function_end (void)
|
||||||
{
|
{
|
||||||
char lscope_label_name[100];
|
char lscope_label_name[100];
|
||||||
/* Convert Ltext into the appropriate format for local labels in case
|
/* Convert Ltext into the appropriate format for local labels in case
|
||||||
|
@ -435,8 +435,7 @@ dbxout_function_end ()
|
||||||
Initialize `typevec' and output the standard data types of C. */
|
Initialize `typevec' and output the standard data types of C. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_init (input_file_name)
|
dbxout_init (const char *input_file_name)
|
||||||
const char *input_file_name;
|
|
||||||
{
|
{
|
||||||
char ltext_label_name[100];
|
char ltext_label_name[100];
|
||||||
tree syms = (*lang_hooks.decls.getdecls) ();
|
tree syms = (*lang_hooks.decls.getdecls) ();
|
||||||
|
@ -526,8 +525,7 @@ dbxout_init (input_file_name)
|
||||||
in the reverse order from that which is found in SYMS. */
|
in the reverse order from that which is found in SYMS. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_typedefs (syms)
|
dbxout_typedefs (tree syms)
|
||||||
tree syms;
|
|
||||||
{
|
{
|
||||||
if (syms)
|
if (syms)
|
||||||
{
|
{
|
||||||
|
@ -547,9 +545,8 @@ dbxout_typedefs (syms)
|
||||||
/* Change to reading from a new source file. Generate a N_BINCL stab. */
|
/* Change to reading from a new source file. Generate a N_BINCL stab. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_start_source_file (line, filename)
|
dbxout_start_source_file (unsigned int line ATTRIBUTE_UNUSED,
|
||||||
unsigned int line ATTRIBUTE_UNUSED;
|
const char *filename ATTRIBUTE_UNUSED)
|
||||||
const char *filename ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
#ifdef DBX_USE_BINCL
|
#ifdef DBX_USE_BINCL
|
||||||
struct dbx_file *n = (struct dbx_file *) ggc_alloc (sizeof *n);
|
struct dbx_file *n = (struct dbx_file *) ggc_alloc (sizeof *n);
|
||||||
|
@ -567,8 +564,7 @@ dbxout_start_source_file (line, filename)
|
||||||
/* Revert to reading a previous source file. Generate a N_EINCL stab. */
|
/* Revert to reading a previous source file. Generate a N_EINCL stab. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_end_source_file (line)
|
dbxout_end_source_file (unsigned int line ATTRIBUTE_UNUSED)
|
||||||
unsigned int line ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
#ifdef DBX_USE_BINCL
|
#ifdef DBX_USE_BINCL
|
||||||
fprintf (asmfile, "%s%d,0,0,0\n", ASM_STABN_OP, N_EINCL);
|
fprintf (asmfile, "%s%d,0,0,0\n", ASM_STABN_OP, N_EINCL);
|
||||||
|
@ -605,9 +601,7 @@ dbxout_handle_pch (unsigned at_end)
|
||||||
/* Output debugging info to FILE to switch to sourcefile FILENAME. */
|
/* Output debugging info to FILE to switch to sourcefile FILENAME. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_source_file (file, filename)
|
dbxout_source_file (FILE *file, const char *filename)
|
||||||
FILE *file;
|
|
||||||
const char *filename;
|
|
||||||
{
|
{
|
||||||
if (lastfile == 0 && lastfile_is_base)
|
if (lastfile == 0 && lastfile_is_base)
|
||||||
{
|
{
|
||||||
|
@ -641,9 +635,7 @@ dbxout_source_file (file, filename)
|
||||||
number LINENO. */
|
number LINENO. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_source_line (lineno, filename)
|
dbxout_source_line (unsigned int lineno, const char *filename)
|
||||||
unsigned int lineno;
|
|
||||||
const char *filename;
|
|
||||||
{
|
{
|
||||||
dbxout_source_file (asmfile, filename);
|
dbxout_source_file (asmfile, filename);
|
||||||
|
|
||||||
|
@ -658,9 +650,7 @@ dbxout_source_line (lineno, filename)
|
||||||
/* Describe the beginning of an internal block within a function. */
|
/* Describe the beginning of an internal block within a function. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_begin_block (line, n)
|
dbxout_begin_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
|
||||||
unsigned int line ATTRIBUTE_UNUSED;
|
|
||||||
unsigned int n;
|
|
||||||
{
|
{
|
||||||
(*targetm.asm_out.internal_label) (asmfile, "LBB", n);
|
(*targetm.asm_out.internal_label) (asmfile, "LBB", n);
|
||||||
}
|
}
|
||||||
|
@ -668,9 +658,7 @@ dbxout_begin_block (line, n)
|
||||||
/* Describe the end line-number of an internal block within a function. */
|
/* Describe the end line-number of an internal block within a function. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_end_block (line, n)
|
dbxout_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
|
||||||
unsigned int line ATTRIBUTE_UNUSED;
|
|
||||||
unsigned int n;
|
|
||||||
{
|
{
|
||||||
(*targetm.asm_out.internal_label) (asmfile, "LBE", n);
|
(*targetm.asm_out.internal_label) (asmfile, "LBE", n);
|
||||||
}
|
}
|
||||||
|
@ -682,8 +670,7 @@ dbxout_end_block (line, n)
|
||||||
(including all the auto variables of the function). */
|
(including all the auto variables of the function). */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_function_decl (decl)
|
dbxout_function_decl (tree decl)
|
||||||
tree decl;
|
|
||||||
{
|
{
|
||||||
#ifndef DBX_FUNCTION_FIRST
|
#ifndef DBX_FUNCTION_FIRST
|
||||||
dbxout_begin_function (decl);
|
dbxout_begin_function (decl);
|
||||||
|
@ -705,8 +692,7 @@ dbxout_function_decl (decl)
|
||||||
/* Debug information for a global DECL. Called from toplev.c after
|
/* Debug information for a global DECL. Called from toplev.c after
|
||||||
compilation proper has finished. */
|
compilation proper has finished. */
|
||||||
static void
|
static void
|
||||||
dbxout_global_decl (decl)
|
dbxout_global_decl (tree decl)
|
||||||
tree decl;
|
|
||||||
{
|
{
|
||||||
if (TREE_CODE (decl) == VAR_DECL
|
if (TREE_CODE (decl) == VAR_DECL
|
||||||
&& ! DECL_EXTERNAL (decl)
|
&& ! DECL_EXTERNAL (decl)
|
||||||
|
@ -724,8 +710,7 @@ dbxout_global_decl (decl)
|
||||||
to do nothing. */
|
to do nothing. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_finish (filename)
|
dbxout_finish (const char *filename ATTRIBUTE_UNUSED)
|
||||||
const char *filename ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
#ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
|
#ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
|
||||||
DBX_OUTPUT_MAIN_SOURCE_FILE_END (asmfile, filename);
|
DBX_OUTPUT_MAIN_SOURCE_FILE_END (asmfile, filename);
|
||||||
|
@ -752,8 +737,7 @@ dbxout_finish (filename)
|
||||||
them. */
|
them. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_fptype_value (type)
|
dbxout_fptype_value (tree type)
|
||||||
tree type;
|
|
||||||
{
|
{
|
||||||
char value = '0';
|
char value = '0';
|
||||||
enum machine_mode mode = TYPE_MODE (type);
|
enum machine_mode mode = TYPE_MODE (type);
|
||||||
|
@ -792,8 +776,7 @@ dbxout_fptype_value (type)
|
||||||
/* Output the index of a type. */
|
/* Output the index of a type. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_type_index (type)
|
dbxout_type_index (tree type)
|
||||||
tree type;
|
|
||||||
{
|
{
|
||||||
#ifndef DBX_USE_BINCL
|
#ifndef DBX_USE_BINCL
|
||||||
fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
|
fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
|
||||||
|
@ -813,7 +796,7 @@ dbxout_type_index (type)
|
||||||
.stabs "...rest",code,0,value */
|
.stabs "...rest",code,0,value */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_continue ()
|
dbxout_continue (void)
|
||||||
{
|
{
|
||||||
#ifdef DBX_CONTIN_CHAR
|
#ifdef DBX_CONTIN_CHAR
|
||||||
fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
|
fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
|
||||||
|
@ -831,8 +814,7 @@ dbxout_continue ()
|
||||||
recursive calls. */
|
recursive calls. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_type_fields (type)
|
dbxout_type_fields (tree type)
|
||||||
tree type;
|
|
||||||
{
|
{
|
||||||
tree tem;
|
tree tem;
|
||||||
|
|
||||||
|
@ -922,9 +904,7 @@ dbxout_type_fields (type)
|
||||||
now. */
|
now. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_type_method_1 (decl, debug_name)
|
dbxout_type_method_1 (tree decl, const char *debug_name)
|
||||||
tree decl;
|
|
||||||
const char *debug_name;
|
|
||||||
{
|
{
|
||||||
char c1 = 'A', c2;
|
char c1 = 'A', c2;
|
||||||
|
|
||||||
|
@ -969,8 +949,7 @@ dbxout_type_method_1 (decl, debug_name)
|
||||||
in TYPE. */
|
in TYPE. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_type_methods (type)
|
dbxout_type_methods (tree type)
|
||||||
tree type;
|
|
||||||
{
|
{
|
||||||
/* C++: put out the method names and their parameter lists */
|
/* C++: put out the method names and their parameter lists */
|
||||||
tree methods = TYPE_METHODS (type);
|
tree methods = TYPE_METHODS (type);
|
||||||
|
@ -1075,8 +1054,7 @@ dbxout_type_methods (type)
|
||||||
TYPE is an INTEGER_TYPE. */
|
TYPE is an INTEGER_TYPE. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_range_type (type)
|
dbxout_range_type (tree type)
|
||||||
tree type;
|
|
||||||
{
|
{
|
||||||
fprintf (asmfile, "r");
|
fprintf (asmfile, "r");
|
||||||
if (TREE_TYPE (type))
|
if (TREE_TYPE (type))
|
||||||
|
@ -1150,9 +1128,7 @@ dbxout_range_type (type)
|
||||||
using the number previously allocated. */
|
using the number previously allocated. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_type (type, full)
|
dbxout_type (tree type, int full)
|
||||||
tree type;
|
|
||||||
int full;
|
|
||||||
{
|
{
|
||||||
tree tem;
|
tree tem;
|
||||||
tree main_variant;
|
tree main_variant;
|
||||||
|
@ -1854,8 +1830,7 @@ dbxout_type (type, full)
|
||||||
should be printed in octal format. */
|
should be printed in octal format. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
print_int_cst_bounds_in_octal_p (type)
|
print_int_cst_bounds_in_octal_p (tree type)
|
||||||
tree type;
|
|
||||||
{
|
{
|
||||||
/* If we can use GDB extensions and the size is wider than a long
|
/* If we can use GDB extensions and the size is wider than a long
|
||||||
(the size used by GDB to read them) or we may have trouble writing
|
(the size used by GDB to read them) or we may have trouble writing
|
||||||
|
@ -1888,8 +1863,7 @@ print_int_cst_bounds_in_octal_p (type)
|
||||||
handling double precision. */
|
handling double precision. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_int_cst_octal (c)
|
print_int_cst_octal (tree c)
|
||||||
tree c;
|
|
||||||
{
|
{
|
||||||
unsigned HOST_WIDE_INT high = TREE_INT_CST_HIGH (c);
|
unsigned HOST_WIDE_INT high = TREE_INT_CST_HIGH (c);
|
||||||
unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (c);
|
unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (c);
|
||||||
|
@ -1934,9 +1908,7 @@ print_int_cst_octal (c)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_octal (value, digits)
|
print_octal (unsigned HOST_WIDE_INT value, int digits)
|
||||||
unsigned HOST_WIDE_INT value;
|
|
||||||
int digits;
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1949,8 +1921,7 @@ print_octal (value, digits)
|
||||||
/* Output C in decimal while adjusting the number of digits written. */
|
/* Output C in decimal while adjusting the number of digits written. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_wide_int (c)
|
print_wide_int (HOST_WIDE_INT c)
|
||||||
HOST_WIDE_INT c;
|
|
||||||
{
|
{
|
||||||
int digs = 0;
|
int digs = 0;
|
||||||
|
|
||||||
|
@ -1970,8 +1941,7 @@ print_wide_int (c)
|
||||||
or by struct, enum and union tags. */
|
or by struct, enum and union tags. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_type_name (type)
|
dbxout_type_name (tree type)
|
||||||
tree type;
|
|
||||||
{
|
{
|
||||||
tree t;
|
tree t;
|
||||||
if (TYPE_NAME (type) == 0)
|
if (TYPE_NAME (type) == 0)
|
||||||
|
@ -1995,8 +1965,7 @@ dbxout_type_name (type)
|
||||||
type whose scope is limited to a struct or class. */
|
type whose scope is limited to a struct or class. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_class_name_qualifiers (decl)
|
dbxout_class_name_qualifiers (tree decl)
|
||||||
tree decl;
|
|
||||||
{
|
{
|
||||||
tree context = decl_type_context (decl);
|
tree context = decl_type_context (decl);
|
||||||
|
|
||||||
|
@ -2025,9 +1994,7 @@ dbxout_class_name_qualifiers (decl)
|
||||||
Return 1 if a stabs might have been emitted. */
|
Return 1 if a stabs might have been emitted. */
|
||||||
|
|
||||||
int
|
int
|
||||||
dbxout_symbol (decl, local)
|
dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED)
|
||||||
tree decl;
|
|
||||||
int local ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
tree type = TREE_TYPE (decl);
|
tree type = TREE_TYPE (decl);
|
||||||
tree context = NULL_TREE;
|
tree context = NULL_TREE;
|
||||||
|
@ -2369,10 +2336,7 @@ dbxout_symbol (decl, local)
|
||||||
Returns 1 if the stab was really emitted. */
|
Returns 1 if the stab was really emitted. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dbxout_symbol_location (decl, type, suffix, home)
|
dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
|
||||||
tree decl, type;
|
|
||||||
const char *suffix;
|
|
||||||
rtx home;
|
|
||||||
{
|
{
|
||||||
int letter = 0;
|
int letter = 0;
|
||||||
int regno = -1;
|
int regno = -1;
|
||||||
|
@ -2605,10 +2569,7 @@ dbxout_symbol_location (decl, type, suffix, home)
|
||||||
Then output LETTER to indicate the kind of location the symbol has. */
|
Then output LETTER to indicate the kind of location the symbol has. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_symbol_name (decl, suffix, letter)
|
dbxout_symbol_name (tree decl, const char *suffix, int letter)
|
||||||
tree decl;
|
|
||||||
const char *suffix;
|
|
||||||
int letter;
|
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
|
@ -2633,8 +2594,7 @@ dbxout_symbol_name (decl, suffix, letter)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_prepare_symbol (decl)
|
dbxout_prepare_symbol (tree decl ATTRIBUTE_UNUSED)
|
||||||
tree decl ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
#ifdef WINNING_GDB
|
#ifdef WINNING_GDB
|
||||||
const char *filename = DECL_SOURCE_FILE (decl);
|
const char *filename = DECL_SOURCE_FILE (decl);
|
||||||
|
@ -2644,8 +2604,7 @@ dbxout_prepare_symbol (decl)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_finish_symbol (sym)
|
dbxout_finish_symbol (tree sym)
|
||||||
tree sym;
|
|
||||||
{
|
{
|
||||||
#ifdef DBX_FINISH_SYMBOL
|
#ifdef DBX_FINISH_SYMBOL
|
||||||
DBX_FINISH_SYMBOL (sym);
|
DBX_FINISH_SYMBOL (sym);
|
||||||
|
@ -2667,8 +2626,7 @@ dbxout_finish_symbol (sym)
|
||||||
anything was output */
|
anything was output */
|
||||||
|
|
||||||
int
|
int
|
||||||
dbxout_syms (syms)
|
dbxout_syms (tree syms)
|
||||||
tree syms;
|
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
while (syms)
|
while (syms)
|
||||||
|
@ -2692,8 +2650,7 @@ dbxout_syms (syms)
|
||||||
of all the parms in PARMS, which is a chain of PARM_DECL nodes. */
|
of all the parms in PARMS, which is a chain of PARM_DECL nodes. */
|
||||||
|
|
||||||
void
|
void
|
||||||
dbxout_parms (parms)
|
dbxout_parms (tree parms)
|
||||||
tree parms;
|
|
||||||
{
|
{
|
||||||
++debug_nesting;
|
++debug_nesting;
|
||||||
|
|
||||||
|
@ -2969,8 +2926,7 @@ dbxout_parms (parms)
|
||||||
PARMS is a chain of PARM_DECL nodes. */
|
PARMS is a chain of PARM_DECL nodes. */
|
||||||
|
|
||||||
void
|
void
|
||||||
dbxout_reg_parms (parms)
|
dbxout_reg_parms (tree parms)
|
||||||
tree parms;
|
|
||||||
{
|
{
|
||||||
++debug_nesting;
|
++debug_nesting;
|
||||||
|
|
||||||
|
@ -3001,8 +2957,7 @@ dbxout_reg_parms (parms)
|
||||||
output definitions of those names, in raw form */
|
output definitions of those names, in raw form */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_args (args)
|
dbxout_args (tree args)
|
||||||
tree args;
|
|
||||||
{
|
{
|
||||||
while (args)
|
while (args)
|
||||||
{
|
{
|
||||||
|
@ -3031,10 +2986,7 @@ dbxout_args (args)
|
||||||
We handle them all in sequence. */
|
We handle them all in sequence. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dbxout_block (block, depth, args)
|
dbxout_block (tree block, int depth, tree args)
|
||||||
tree block;
|
|
||||||
int depth;
|
|
||||||
tree args;
|
|
||||||
{
|
{
|
||||||
int blocknum = -1;
|
int blocknum = -1;
|
||||||
|
|
||||||
|
@ -3129,8 +3081,7 @@ dbxout_block (block, depth, args)
|
||||||
|
|
||||||
#if defined (DBX_DEBUGGING_INFO)
|
#if defined (DBX_DEBUGGING_INFO)
|
||||||
static void
|
static void
|
||||||
dbxout_begin_function (decl)
|
dbxout_begin_function (tree decl)
|
||||||
tree decl;
|
|
||||||
{
|
{
|
||||||
int saved_tree_used1 = TREE_USED (decl);
|
int saved_tree_used1 = TREE_USED (decl);
|
||||||
TREE_USED (decl) = 1;
|
TREE_USED (decl) = 1;
|
||||||
|
|
29
gcc/debug.c
29
gcc/debug.c
|
@ -1,5 +1,5 @@
|
||||||
/* Do-nothing debug hooks for GCC.
|
/* Do-nothing debug hooks for GCC.
|
||||||
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
||||||
under the terms of the GNU General Public License as published by the
|
under the terms of the GNU General Public License as published by the
|
||||||
|
@ -51,51 +51,44 @@ const struct gcc_debug_hooks do_nothing_debug_hooks =
|
||||||
nothing. */
|
nothing. */
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_nothing_void ()
|
debug_nothing_void (void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_nothing_tree (decl)
|
debug_nothing_tree (tree decl ATTRIBUTE_UNUSED)
|
||||||
tree decl ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
debug_true_tree (block)
|
debug_true_tree (tree block ATTRIBUTE_UNUSED)
|
||||||
tree block ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_nothing_rtx (insn)
|
debug_nothing_rtx (rtx insn ATTRIBUTE_UNUSED)
|
||||||
rtx insn ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_nothing_charstar (main_filename)
|
debug_nothing_charstar (const char *main_filename ATTRIBUTE_UNUSED)
|
||||||
const char *main_filename ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_nothing_int_charstar (line, text)
|
debug_nothing_int_charstar (unsigned int line ATTRIBUTE_UNUSED,
|
||||||
unsigned int line ATTRIBUTE_UNUSED;
|
const char *text ATTRIBUTE_UNUSED)
|
||||||
const char *text ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_nothing_int (line)
|
debug_nothing_int (unsigned int line ATTRIBUTE_UNUSED)
|
||||||
unsigned int line ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_nothing_int_int (line, n)
|
debug_nothing_int_int (unsigned int line ATTRIBUTE_UNUSED,
|
||||||
unsigned int line ATTRIBUTE_UNUSED;
|
unsigned int n ATTRIBUTE_UNUSED)
|
||||||
unsigned int n ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
106
gcc/df.h
106
gcc/df.h
|
@ -231,96 +231,87 @@ struct df_map
|
||||||
|
|
||||||
/* Functions to build and analyse dataflow information. */
|
/* Functions to build and analyse dataflow information. */
|
||||||
|
|
||||||
extern struct df *df_init PARAMS ((void));
|
extern struct df *df_init (void);
|
||||||
|
|
||||||
extern int df_analyse PARAMS ((struct df *, bitmap, int));
|
extern int df_analyse (struct df *, bitmap, int);
|
||||||
|
|
||||||
extern void df_finish PARAMS ((struct df *));
|
extern void df_finish (struct df *);
|
||||||
|
|
||||||
extern void df_dump PARAMS ((struct df *, int, FILE *));
|
extern void df_dump (struct df *, int, FILE *);
|
||||||
|
|
||||||
|
|
||||||
/* Functions to modify insns. */
|
/* Functions to modify insns. */
|
||||||
|
|
||||||
extern void df_insn_modify PARAMS ((struct df *, basic_block, rtx));
|
extern void df_insn_modify (struct df *, basic_block, rtx);
|
||||||
|
|
||||||
extern rtx df_insn_delete PARAMS ((struct df *, basic_block, rtx));
|
extern rtx df_insn_delete (struct df *, basic_block, rtx);
|
||||||
|
|
||||||
extern rtx df_pattern_emit_before PARAMS ((struct df *, rtx,
|
extern rtx df_pattern_emit_before (struct df *, rtx, basic_block, rtx);
|
||||||
basic_block, rtx));
|
|
||||||
|
|
||||||
extern rtx df_jump_pattern_emit_after PARAMS ((struct df *, rtx,
|
extern rtx df_jump_pattern_emit_after (struct df *, rtx, basic_block, rtx);
|
||||||
basic_block, rtx));
|
|
||||||
|
|
||||||
extern rtx df_pattern_emit_after PARAMS ((struct df *, rtx,
|
extern rtx df_pattern_emit_after (struct df *, rtx, basic_block, rtx);
|
||||||
basic_block, rtx));
|
|
||||||
|
|
||||||
extern rtx df_insn_move_before PARAMS ((struct df *, basic_block, rtx,
|
extern rtx df_insn_move_before (struct df *, basic_block, rtx, basic_block,
|
||||||
basic_block, rtx));
|
rtx);
|
||||||
|
|
||||||
extern int df_reg_replace PARAMS ((struct df *, bitmap, rtx, rtx));
|
extern int df_reg_replace (struct df *, bitmap, rtx, rtx);
|
||||||
|
|
||||||
extern int df_ref_reg_replace PARAMS ((struct df *, struct ref *, rtx, rtx));
|
extern int df_ref_reg_replace (struct df *, struct ref *, rtx, rtx);
|
||||||
|
|
||||||
extern int df_ref_remove PARAMS ((struct df *, struct ref *));
|
extern int df_ref_remove (struct df *, struct ref *);
|
||||||
|
|
||||||
extern int df_insn_reg_replace PARAMS ((struct df *, basic_block,
|
extern int df_insn_reg_replace (struct df *, basic_block, rtx, rtx, rtx);
|
||||||
rtx, rtx, rtx));
|
|
||||||
|
|
||||||
extern int df_insn_mem_replace PARAMS ((struct df *, basic_block,
|
extern int df_insn_mem_replace (struct df *, basic_block, rtx, rtx, rtx);
|
||||||
rtx, rtx, rtx));
|
|
||||||
|
|
||||||
extern struct ref *df_bb_def_use_swap PARAMS ((struct df *, basic_block,
|
extern struct ref *df_bb_def_use_swap (struct df *, basic_block, rtx, rtx,
|
||||||
rtx, rtx, unsigned int));
|
unsigned int);
|
||||||
|
|
||||||
|
|
||||||
/* Functions to query dataflow information. */
|
/* Functions to query dataflow information. */
|
||||||
|
|
||||||
extern basic_block df_regno_bb PARAMS((struct df *, unsigned int));
|
extern basic_block df_regno_bb (struct df *, unsigned int);
|
||||||
|
|
||||||
extern int df_reg_lifetime PARAMS ((struct df *, rtx));
|
extern int df_reg_lifetime (struct df *, rtx);
|
||||||
|
|
||||||
extern int df_reg_global_p PARAMS ((struct df *, rtx));
|
extern int df_reg_global_p (struct df *, rtx);
|
||||||
|
|
||||||
extern int df_insn_regno_def_p PARAMS ((struct df *,
|
extern int df_insn_regno_def_p (struct df *, basic_block, rtx, unsigned int);
|
||||||
basic_block, rtx, unsigned int));
|
|
||||||
|
|
||||||
extern int df_insn_dominates_all_uses_p PARAMS ((struct df *,
|
extern int df_insn_dominates_all_uses_p (struct df *, basic_block, rtx);
|
||||||
basic_block, rtx));
|
|
||||||
|
|
||||||
extern int df_insn_dominates_uses_p PARAMS ((struct df *, basic_block,
|
extern int df_insn_dominates_uses_p (struct df *, basic_block, rtx, bitmap);
|
||||||
rtx, bitmap));
|
|
||||||
|
|
||||||
extern int df_bb_reg_live_start_p PARAMS ((struct df *, basic_block, rtx));
|
extern int df_bb_reg_live_start_p (struct df *, basic_block, rtx);
|
||||||
|
|
||||||
extern int df_bb_reg_live_end_p PARAMS ((struct df *, basic_block, rtx));
|
extern int df_bb_reg_live_end_p (struct df *, basic_block, rtx);
|
||||||
|
|
||||||
extern int df_bb_regs_lives_compare PARAMS ((struct df *, basic_block,
|
extern int df_bb_regs_lives_compare (struct df *, basic_block, rtx, rtx);
|
||||||
rtx, rtx));
|
|
||||||
|
|
||||||
extern rtx df_bb_single_def_use_insn_find PARAMS((struct df *, basic_block,
|
extern rtx df_bb_single_def_use_insn_find (struct df *, basic_block, rtx,
|
||||||
rtx, rtx));
|
rtx);
|
||||||
|
|
||||||
|
|
||||||
/* Functions for debugging from GDB. */
|
/* Functions for debugging from GDB. */
|
||||||
|
|
||||||
extern void debug_df_insn PARAMS ((rtx));
|
extern void debug_df_insn (rtx);
|
||||||
|
|
||||||
extern void debug_df_regno PARAMS ((unsigned int));
|
extern void debug_df_regno (unsigned int);
|
||||||
|
|
||||||
extern void debug_df_reg PARAMS ((rtx));
|
extern void debug_df_reg (rtx);
|
||||||
|
|
||||||
extern void debug_df_defno PARAMS ((unsigned int));
|
extern void debug_df_defno (unsigned int);
|
||||||
|
|
||||||
extern void debug_df_useno PARAMS ((unsigned int));
|
extern void debug_df_useno (unsigned int);
|
||||||
|
|
||||||
extern void debug_df_ref PARAMS ((struct ref *));
|
extern void debug_df_ref (struct ref *);
|
||||||
|
|
||||||
extern void debug_df_chain PARAMS ((struct df_link *));
|
extern void debug_df_chain (struct df_link *);
|
||||||
|
|
||||||
extern void df_insn_debug PARAMS ((struct df *, rtx, FILE *));
|
extern void df_insn_debug (struct df *, rtx, FILE *);
|
||||||
|
|
||||||
extern void df_insn_debug_regno PARAMS ((struct df *, rtx, FILE *));
|
extern void df_insn_debug_regno (struct df *, rtx, FILE *);
|
||||||
|
|
||||||
|
|
||||||
/* Meet over any path (UNION) or meet over all paths (INTERSECTION). */
|
/* Meet over any path (UNION) or meet over all paths (INTERSECTION). */
|
||||||
|
@ -339,23 +330,22 @@ enum df_flow_dir
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef void (*transfer_function_sbitmap) PARAMS ((int, int *, sbitmap, sbitmap,
|
typedef void (*transfer_function_sbitmap) (int, int *, sbitmap, sbitmap,
|
||||||
sbitmap, sbitmap, void *));
|
sbitmap, sbitmap, void *);
|
||||||
|
|
||||||
typedef void (*transfer_function_bitmap) PARAMS ((int, int *, bitmap, bitmap,
|
typedef void (*transfer_function_bitmap) (int, int *, bitmap, bitmap,
|
||||||
bitmap, bitmap, void *));
|
bitmap, bitmap, void *);
|
||||||
|
|
||||||
extern void iterative_dataflow_sbitmap PARAMS ((sbitmap *, sbitmap *,
|
extern void iterative_dataflow_sbitmap (sbitmap *, sbitmap *, sbitmap *,
|
||||||
sbitmap *, sbitmap *,
|
sbitmap *, bitmap, enum df_flow_dir,
|
||||||
bitmap, enum df_flow_dir,
|
|
||||||
enum df_confluence_op,
|
enum df_confluence_op,
|
||||||
transfer_function_sbitmap,
|
transfer_function_sbitmap,
|
||||||
int *, void *));
|
int *, void *);
|
||||||
|
|
||||||
extern void iterative_dataflow_bitmap PARAMS ((bitmap *, bitmap *, bitmap *,
|
extern void iterative_dataflow_bitmap (bitmap *, bitmap *, bitmap *,
|
||||||
bitmap *, bitmap,
|
bitmap *, bitmap,
|
||||||
enum df_flow_dir,
|
enum df_flow_dir,
|
||||||
enum df_confluence_op,
|
enum df_confluence_op,
|
||||||
transfer_function_bitmap,
|
transfer_function_bitmap,
|
||||||
int *, void *));
|
int *, void *);
|
||||||
extern bool read_modify_subreg_p PARAMS ((rtx));
|
extern bool read_modify_subreg_p (rtx);
|
||||||
|
|
74
gcc/dojump.c
74
gcc/dojump.c
|
@ -34,16 +34,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
#include "optabs.h"
|
#include "optabs.h"
|
||||||
#include "langhooks.h"
|
#include "langhooks.h"
|
||||||
|
|
||||||
static void do_jump_by_parts_greater PARAMS ((tree, int, rtx, rtx));
|
static void do_jump_by_parts_greater (tree, int, rtx, rtx);
|
||||||
static void do_jump_by_parts_equality PARAMS ((tree, rtx, rtx));
|
static void do_jump_by_parts_equality (tree, rtx, rtx);
|
||||||
static void do_compare_and_jump PARAMS ((tree, enum rtx_code, enum rtx_code,
|
static void do_compare_and_jump (tree, enum rtx_code, enum rtx_code, rtx,
|
||||||
rtx, rtx));
|
rtx);
|
||||||
|
|
||||||
/* At the start of a function, record that we have no previously-pushed
|
/* At the start of a function, record that we have no previously-pushed
|
||||||
arguments waiting to be popped. */
|
arguments waiting to be popped. */
|
||||||
|
|
||||||
void
|
void
|
||||||
init_pending_stack_adjust ()
|
init_pending_stack_adjust (void)
|
||||||
{
|
{
|
||||||
pending_stack_adjust = 0;
|
pending_stack_adjust = 0;
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ init_pending_stack_adjust ()
|
||||||
frame pointer regardless of the value of flag_omit_frame_pointer. */
|
frame pointer regardless of the value of flag_omit_frame_pointer. */
|
||||||
|
|
||||||
void
|
void
|
||||||
clear_pending_stack_adjust ()
|
clear_pending_stack_adjust (void)
|
||||||
{
|
{
|
||||||
#ifdef EXIT_IGNORE_STACK
|
#ifdef EXIT_IGNORE_STACK
|
||||||
if (optimize > 0
|
if (optimize > 0
|
||||||
|
@ -73,7 +73,7 @@ clear_pending_stack_adjust ()
|
||||||
/* Pop any previously-pushed arguments that have not been popped yet. */
|
/* Pop any previously-pushed arguments that have not been popped yet. */
|
||||||
|
|
||||||
void
|
void
|
||||||
do_pending_stack_adjust ()
|
do_pending_stack_adjust (void)
|
||||||
{
|
{
|
||||||
if (inhibit_defer_pop == 0)
|
if (inhibit_defer_pop == 0)
|
||||||
{
|
{
|
||||||
|
@ -90,9 +90,7 @@ do_pending_stack_adjust ()
|
||||||
functions here. */
|
functions here. */
|
||||||
|
|
||||||
void
|
void
|
||||||
jumpifnot (exp, label)
|
jumpifnot (tree exp, rtx label)
|
||||||
tree exp;
|
|
||||||
rtx label;
|
|
||||||
{
|
{
|
||||||
do_jump (exp, label, NULL_RTX);
|
do_jump (exp, label, NULL_RTX);
|
||||||
}
|
}
|
||||||
|
@ -100,9 +98,7 @@ jumpifnot (exp, label)
|
||||||
/* Generate code to evaluate EXP and jump to LABEL if the value is nonzero. */
|
/* Generate code to evaluate EXP and jump to LABEL if the value is nonzero. */
|
||||||
|
|
||||||
void
|
void
|
||||||
jumpif (exp, label)
|
jumpif (tree exp, rtx label)
|
||||||
tree exp;
|
|
||||||
rtx label;
|
|
||||||
{
|
{
|
||||||
do_jump (exp, NULL_RTX, label);
|
do_jump (exp, NULL_RTX, label);
|
||||||
}
|
}
|
||||||
|
@ -120,9 +116,7 @@ jumpif (exp, label)
|
||||||
&&, || and comparison operators in EXP. */
|
&&, || and comparison operators in EXP. */
|
||||||
|
|
||||||
void
|
void
|
||||||
do_jump (exp, if_false_label, if_true_label)
|
do_jump (tree exp, rtx if_false_label, rtx if_true_label)
|
||||||
tree exp;
|
|
||||||
rtx if_false_label, if_true_label;
|
|
||||||
{
|
{
|
||||||
enum tree_code code = TREE_CODE (exp);
|
enum tree_code code = TREE_CODE (exp);
|
||||||
/* Some cases need to create a label to jump to
|
/* Some cases need to create a label to jump to
|
||||||
|
@ -617,10 +611,8 @@ do_jump (exp, if_false_label, if_true_label)
|
||||||
and LT if SWAP is 1. */
|
and LT if SWAP is 1. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_jump_by_parts_greater (exp, swap, if_false_label, if_true_label)
|
do_jump_by_parts_greater (tree exp, int swap, rtx if_false_label,
|
||||||
tree exp;
|
rtx if_true_label)
|
||||||
int swap;
|
|
||||||
rtx if_false_label, if_true_label;
|
|
||||||
{
|
{
|
||||||
rtx op0 = expand_expr (TREE_OPERAND (exp, swap), NULL_RTX, VOIDmode, 0);
|
rtx op0 = expand_expr (TREE_OPERAND (exp, swap), NULL_RTX, VOIDmode, 0);
|
||||||
rtx op1 = expand_expr (TREE_OPERAND (exp, !swap), NULL_RTX, VOIDmode, 0);
|
rtx op1 = expand_expr (TREE_OPERAND (exp, !swap), NULL_RTX, VOIDmode, 0);
|
||||||
|
@ -635,11 +627,8 @@ do_jump_by_parts_greater (exp, swap, if_false_label, if_true_label)
|
||||||
Jump to IF_TRUE_LABEL if OP0 is greater, IF_FALSE_LABEL otherwise. */
|
Jump to IF_TRUE_LABEL if OP0 is greater, IF_FALSE_LABEL otherwise. */
|
||||||
|
|
||||||
void
|
void
|
||||||
do_jump_by_parts_greater_rtx (mode, unsignedp, op0, op1, if_false_label, if_true_label)
|
do_jump_by_parts_greater_rtx (enum machine_mode mode, int unsignedp, rtx op0,
|
||||||
enum machine_mode mode;
|
rtx op1, rtx if_false_label, rtx if_true_label)
|
||||||
int unsignedp;
|
|
||||||
rtx op0, op1;
|
|
||||||
rtx if_false_label, if_true_label;
|
|
||||||
{
|
{
|
||||||
int nwords = (GET_MODE_SIZE (mode) / UNITS_PER_WORD);
|
int nwords = (GET_MODE_SIZE (mode) / UNITS_PER_WORD);
|
||||||
rtx drop_through_label = 0;
|
rtx drop_through_label = 0;
|
||||||
|
@ -688,9 +677,7 @@ do_jump_by_parts_greater_rtx (mode, unsignedp, op0, op1, if_false_label, if_true
|
||||||
with one insn, test the comparison and jump to the appropriate label. */
|
with one insn, test the comparison and jump to the appropriate label. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_jump_by_parts_equality (exp, if_false_label, if_true_label)
|
do_jump_by_parts_equality (tree exp, rtx if_false_label, rtx if_true_label)
|
||||||
tree exp;
|
|
||||||
rtx if_false_label, if_true_label;
|
|
||||||
{
|
{
|
||||||
rtx op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
|
rtx op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0);
|
||||||
rtx op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
|
rtx op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
|
||||||
|
@ -719,9 +706,7 @@ do_jump_by_parts_equality (exp, if_false_label, if_true_label)
|
||||||
for the available compare insns. */
|
for the available compare insns. */
|
||||||
|
|
||||||
void
|
void
|
||||||
do_jump_by_parts_equality_rtx (op0, if_false_label, if_true_label)
|
do_jump_by_parts_equality_rtx (rtx op0, rtx if_false_label, rtx if_true_label)
|
||||||
rtx op0;
|
|
||||||
rtx if_false_label, if_true_label;
|
|
||||||
{
|
{
|
||||||
int nwords = GET_MODE_SIZE (GET_MODE (op0)) / UNITS_PER_WORD;
|
int nwords = GET_MODE_SIZE (GET_MODE (op0)) / UNITS_PER_WORD;
|
||||||
rtx part;
|
rtx part;
|
||||||
|
@ -776,12 +761,8 @@ do_jump_by_parts_equality_rtx (op0, if_false_label, if_true_label)
|
||||||
compared. */
|
compared. */
|
||||||
|
|
||||||
rtx
|
rtx
|
||||||
compare_from_rtx (op0, op1, code, unsignedp, mode, size)
|
compare_from_rtx (rtx op0, rtx op1, enum rtx_code code, int unsignedp,
|
||||||
rtx op0, op1;
|
enum machine_mode mode, rtx size)
|
||||||
enum rtx_code code;
|
|
||||||
int unsignedp;
|
|
||||||
enum machine_mode mode;
|
|
||||||
rtx size;
|
|
||||||
{
|
{
|
||||||
enum rtx_code ucode;
|
enum rtx_code ucode;
|
||||||
rtx tem;
|
rtx tem;
|
||||||
|
@ -847,14 +828,9 @@ compare_from_rtx (op0, op1, code, unsignedp, mode, size)
|
||||||
compared. */
|
compared. */
|
||||||
|
|
||||||
void
|
void
|
||||||
do_compare_rtx_and_jump (op0, op1, code, unsignedp, mode, size,
|
do_compare_rtx_and_jump (rtx op0, rtx op1, enum rtx_code code, int unsignedp,
|
||||||
if_false_label, if_true_label)
|
enum machine_mode mode, rtx size, rtx if_false_label,
|
||||||
rtx op0, op1;
|
rtx if_true_label)
|
||||||
enum rtx_code code;
|
|
||||||
int unsignedp;
|
|
||||||
enum machine_mode mode;
|
|
||||||
rtx size;
|
|
||||||
rtx if_false_label, if_true_label;
|
|
||||||
{
|
{
|
||||||
enum rtx_code ucode;
|
enum rtx_code ucode;
|
||||||
rtx tem;
|
rtx tem;
|
||||||
|
@ -952,11 +928,9 @@ do_compare_rtx_and_jump (op0, op1, code, unsignedp, mode, size,
|
||||||
things pushed on the stack that aren't yet used. */
|
things pushed on the stack that aren't yet used. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_compare_and_jump (exp, signed_code, unsigned_code, if_false_label,
|
do_compare_and_jump (tree exp, enum rtx_code signed_code,
|
||||||
if_true_label)
|
enum rtx_code unsigned_code, rtx if_false_label,
|
||||||
tree exp;
|
rtx if_true_label)
|
||||||
enum rtx_code signed_code, unsigned_code;
|
|
||||||
rtx if_false_label, if_true_label;
|
|
||||||
{
|
{
|
||||||
rtx op0, op1;
|
rtx op0, op1;
|
||||||
tree type;
|
tree type;
|
||||||
|
|
57
gcc/doloop.c
57
gcc/doloop.c
|
@ -1,5 +1,6 @@
|
||||||
/* Perform doloop optimizations
|
/* Perform doloop optimizations
|
||||||
Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
Copyright (C) 1999, 2000, 2001, 2002, 2003
|
||||||
|
Free Software Foundation, Inc.
|
||||||
Contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz)
|
Contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz)
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
@ -59,23 +60,19 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
|
||||||
#ifdef HAVE_doloop_end
|
#ifdef HAVE_doloop_end
|
||||||
|
|
||||||
static rtx doloop_condition_get
|
static rtx doloop_condition_get (rtx);
|
||||||
PARAMS ((rtx));
|
static unsigned HOST_WIDE_INT doloop_iterations_max (const struct loop_info *,
|
||||||
static unsigned HOST_WIDE_INT doloop_iterations_max
|
enum machine_mode, int);
|
||||||
PARAMS ((const struct loop_info *, enum machine_mode, int));
|
static int doloop_valid_p (const struct loop *, rtx);
|
||||||
static int doloop_valid_p
|
static int doloop_modify (const struct loop *, rtx, rtx, rtx, rtx, rtx);
|
||||||
PARAMS ((const struct loop *, rtx));
|
static int doloop_modify_runtime (const struct loop *, rtx, rtx, rtx,
|
||||||
static int doloop_modify
|
enum machine_mode, rtx);
|
||||||
PARAMS ((const struct loop *, rtx, rtx, rtx, rtx, rtx));
|
|
||||||
static int doloop_modify_runtime
|
|
||||||
PARAMS ((const struct loop *, rtx, rtx, rtx, enum machine_mode, rtx));
|
|
||||||
|
|
||||||
|
|
||||||
/* Return the loop termination condition for PATTERN or zero
|
/* Return the loop termination condition for PATTERN or zero
|
||||||
if it is not a decrement and branch jump insn. */
|
if it is not a decrement and branch jump insn. */
|
||||||
static rtx
|
static rtx
|
||||||
doloop_condition_get (pattern)
|
doloop_condition_get (rtx pattern)
|
||||||
rtx pattern;
|
|
||||||
{
|
{
|
||||||
rtx cmp;
|
rtx cmp;
|
||||||
rtx inc;
|
rtx inc;
|
||||||
|
@ -146,10 +143,8 @@ doloop_condition_get (pattern)
|
||||||
MODE is the mode of the iteration count and NONNEG is nonzero if
|
MODE is the mode of the iteration count and NONNEG is nonzero if
|
||||||
the iteration count has been proved to be non-negative. */
|
the iteration count has been proved to be non-negative. */
|
||||||
static unsigned HOST_WIDE_INT
|
static unsigned HOST_WIDE_INT
|
||||||
doloop_iterations_max (loop_info, mode, nonneg)
|
doloop_iterations_max (const struct loop_info *loop_info,
|
||||||
const struct loop_info *loop_info;
|
enum machine_mode mode, int nonneg)
|
||||||
enum machine_mode mode;
|
|
||||||
int nonneg;
|
|
||||||
{
|
{
|
||||||
unsigned HOST_WIDE_INT n_iterations_max;
|
unsigned HOST_WIDE_INT n_iterations_max;
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
|
@ -255,9 +250,7 @@ doloop_iterations_max (loop_info, mode, nonneg)
|
||||||
/* Return nonzero if the loop specified by LOOP is suitable for
|
/* Return nonzero if the loop specified by LOOP is suitable for
|
||||||
the use of special low-overhead looping instructions. */
|
the use of special low-overhead looping instructions. */
|
||||||
static int
|
static int
|
||||||
doloop_valid_p (loop, jump_insn)
|
doloop_valid_p (const struct loop *loop, rtx jump_insn)
|
||||||
const struct loop *loop;
|
|
||||||
rtx jump_insn;
|
|
||||||
{
|
{
|
||||||
const struct loop_info *loop_info = LOOP_INFO (loop);
|
const struct loop_info *loop_info = LOOP_INFO (loop);
|
||||||
|
|
||||||
|
@ -405,14 +398,8 @@ doloop_valid_p (loop, jump_insn)
|
||||||
low-overhead looping insn to emit at the end of the loop. This
|
low-overhead looping insn to emit at the end of the loop. This
|
||||||
returns nonzero if it was successful. */
|
returns nonzero if it was successful. */
|
||||||
static int
|
static int
|
||||||
doloop_modify (loop, iterations, iterations_max,
|
doloop_modify (const struct loop *loop, rtx iterations, rtx iterations_max,
|
||||||
doloop_seq, start_label, condition)
|
rtx doloop_seq, rtx start_label, rtx condition)
|
||||||
const struct loop *loop;
|
|
||||||
rtx iterations;
|
|
||||||
rtx iterations_max;
|
|
||||||
rtx doloop_seq;
|
|
||||||
rtx start_label;
|
|
||||||
rtx condition;
|
|
||||||
{
|
{
|
||||||
rtx counter_reg;
|
rtx counter_reg;
|
||||||
rtx count;
|
rtx count;
|
||||||
|
@ -545,14 +532,9 @@ doloop_modify (loop, iterations, iterations_max,
|
||||||
number of loop iterations. DOLOOP_INSN is the low-overhead looping
|
number of loop iterations. DOLOOP_INSN is the low-overhead looping
|
||||||
insn to insert. Returns nonzero if loop successfully modified. */
|
insn to insert. Returns nonzero if loop successfully modified. */
|
||||||
static int
|
static int
|
||||||
doloop_modify_runtime (loop, iterations_max,
|
doloop_modify_runtime (const struct loop *loop, rtx iterations_max,
|
||||||
doloop_seq, start_label, mode, condition)
|
rtx doloop_seq, rtx start_label,
|
||||||
const struct loop *loop;
|
enum machine_mode mode, rtx condition)
|
||||||
rtx iterations_max;
|
|
||||||
rtx doloop_seq;
|
|
||||||
rtx start_label;
|
|
||||||
enum machine_mode mode;
|
|
||||||
rtx condition;
|
|
||||||
{
|
{
|
||||||
const struct loop_info *loop_info = LOOP_INFO (loop);
|
const struct loop_info *loop_info = LOOP_INFO (loop);
|
||||||
HOST_WIDE_INT abs_inc;
|
HOST_WIDE_INT abs_inc;
|
||||||
|
@ -759,8 +741,7 @@ doloop_modify_runtime (loop, iterations_max,
|
||||||
is a candidate for this optimization. Returns nonzero if loop
|
is a candidate for this optimization. Returns nonzero if loop
|
||||||
successfully modified. */
|
successfully modified. */
|
||||||
int
|
int
|
||||||
doloop_optimize (loop)
|
doloop_optimize (const struct loop *loop)
|
||||||
const struct loop *loop;
|
|
||||||
{
|
{
|
||||||
struct loop_info *loop_info = LOOP_INFO (loop);
|
struct loop_info *loop_info = LOOP_INFO (loop);
|
||||||
rtx initial_value;
|
rtx initial_value;
|
||||||
|
|
113
gcc/dominance.c
113
gcc/dominance.c
|
@ -1,5 +1,5 @@
|
||||||
/* Calculate (post)dominators in slightly super-linear time.
|
/* Calculate (post)dominators in slightly super-linear time.
|
||||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2003 Free Software Foundation, Inc.
|
||||||
Contributed by Michael Matz (matz@ifh.de).
|
Contributed by Michael Matz (matz@ifh.de).
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
@ -115,19 +115,16 @@ struct dom_info
|
||||||
unsigned int nodes;
|
unsigned int nodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void init_dom_info PARAMS ((struct dom_info *));
|
static void init_dom_info (struct dom_info *);
|
||||||
static void free_dom_info PARAMS ((struct dom_info *));
|
static void free_dom_info (struct dom_info *);
|
||||||
static void calc_dfs_tree_nonrec PARAMS ((struct dom_info *,
|
static void calc_dfs_tree_nonrec (struct dom_info *, basic_block,
|
||||||
basic_block,
|
enum cdi_direction);
|
||||||
enum cdi_direction));
|
static void calc_dfs_tree (struct dom_info *, enum cdi_direction);
|
||||||
static void calc_dfs_tree PARAMS ((struct dom_info *,
|
static void compress (struct dom_info *, TBB);
|
||||||
enum cdi_direction));
|
static TBB eval (struct dom_info *, TBB);
|
||||||
static void compress PARAMS ((struct dom_info *, TBB));
|
static void link_roots (struct dom_info *, TBB, TBB);
|
||||||
static TBB eval PARAMS ((struct dom_info *, TBB));
|
static void calc_idoms (struct dom_info *, enum cdi_direction);
|
||||||
static void link_roots PARAMS ((struct dom_info *, TBB, TBB));
|
void debug_dominance_info (dominance_info);
|
||||||
static void calc_idoms PARAMS ((struct dom_info *,
|
|
||||||
enum cdi_direction));
|
|
||||||
void debug_dominance_info PARAMS ((dominance_info));
|
|
||||||
|
|
||||||
/* Helper macro for allocating and initializing an array,
|
/* Helper macro for allocating and initializing an array,
|
||||||
for aesthetic reasons. */
|
for aesthetic reasons. */
|
||||||
|
@ -150,8 +147,7 @@ void debug_dominance_info PARAMS ((dominance_info));
|
||||||
This initializes the contents of DI, which already must be allocated. */
|
This initializes the contents of DI, which already must be allocated. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_dom_info (di)
|
init_dom_info (struct dom_info *di)
|
||||||
struct dom_info *di;
|
|
||||||
{
|
{
|
||||||
/* We need memory for n_basic_blocks nodes and the ENTRY_BLOCK or
|
/* We need memory for n_basic_blocks nodes and the ENTRY_BLOCK or
|
||||||
EXIT_BLOCK. */
|
EXIT_BLOCK. */
|
||||||
|
@ -180,8 +176,7 @@ init_dom_info (di)
|
||||||
/* Free all allocated memory in DI, but not DI itself. */
|
/* Free all allocated memory in DI, but not DI itself. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_dom_info (di)
|
free_dom_info (struct dom_info *di)
|
||||||
struct dom_info *di;
|
|
||||||
{
|
{
|
||||||
free (di->dfs_parent);
|
free (di->dfs_parent);
|
||||||
free (di->path_min);
|
free (di->path_min);
|
||||||
|
@ -203,10 +198,7 @@ free_dom_info (di)
|
||||||
assigned their dfs number and are linked together to form a tree. */
|
assigned their dfs number and are linked together to form a tree. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
calc_dfs_tree_nonrec (di, bb, reverse)
|
calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb, enum cdi_direction reverse)
|
||||||
struct dom_info *di;
|
|
||||||
basic_block bb;
|
|
||||||
enum cdi_direction reverse;
|
|
||||||
{
|
{
|
||||||
/* We never call this with bb==EXIT_BLOCK_PTR (ENTRY_BLOCK_PTR if REVERSE). */
|
/* We never call this with bb==EXIT_BLOCK_PTR (ENTRY_BLOCK_PTR if REVERSE). */
|
||||||
/* We call this _only_ if bb is not already visited. */
|
/* We call this _only_ if bb is not already visited. */
|
||||||
|
@ -321,9 +313,7 @@ calc_dfs_tree_nonrec (di, bb, reverse)
|
||||||
because there may be nodes from which the EXIT_BLOCK is unreachable. */
|
because there may be nodes from which the EXIT_BLOCK is unreachable. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
calc_dfs_tree (di, reverse)
|
calc_dfs_tree (struct dom_info *di, enum cdi_direction reverse)
|
||||||
struct dom_info *di;
|
|
||||||
enum cdi_direction reverse;
|
|
||||||
{
|
{
|
||||||
/* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE). */
|
/* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE). */
|
||||||
basic_block begin = reverse ? EXIT_BLOCK_PTR : ENTRY_BLOCK_PTR;
|
basic_block begin = reverse ? EXIT_BLOCK_PTR : ENTRY_BLOCK_PTR;
|
||||||
|
@ -364,9 +354,7 @@ calc_dfs_tree (di, reverse)
|
||||||
from V to that root. */
|
from V to that root. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
compress (di, v)
|
compress (struct dom_info *di, TBB v)
|
||||||
struct dom_info *di;
|
|
||||||
TBB v;
|
|
||||||
{
|
{
|
||||||
/* Btw. It's not worth to unrecurse compress() as the depth is usually not
|
/* Btw. It's not worth to unrecurse compress() as the depth is usually not
|
||||||
greater than 5 even for huge graphs (I've not seen call depth > 4).
|
greater than 5 even for huge graphs (I've not seen call depth > 4).
|
||||||
|
@ -386,9 +374,7 @@ compress (di, v)
|
||||||
value on the path from V to the root. */
|
value on the path from V to the root. */
|
||||||
|
|
||||||
static inline TBB
|
static inline TBB
|
||||||
eval (di, v)
|
eval (struct dom_info *di, TBB v)
|
||||||
struct dom_info *di;
|
|
||||||
TBB v;
|
|
||||||
{
|
{
|
||||||
/* The representant of the set V is in, also called root (as the set
|
/* The representant of the set V is in, also called root (as the set
|
||||||
representation is a tree). */
|
representation is a tree). */
|
||||||
|
@ -417,9 +403,7 @@ eval (di, v)
|
||||||
of W. */
|
of W. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
link_roots (di, v, w)
|
link_roots (struct dom_info *di, TBB v, TBB w)
|
||||||
struct dom_info *di;
|
|
||||||
TBB v, w;
|
|
||||||
{
|
{
|
||||||
TBB s = w;
|
TBB s = w;
|
||||||
|
|
||||||
|
@ -461,9 +445,7 @@ link_roots (di, v, w)
|
||||||
On return the immediate dominator to node V is in di->dom[V]. */
|
On return the immediate dominator to node V is in di->dom[V]. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
calc_idoms (di, reverse)
|
calc_idoms (struct dom_info *di, enum cdi_direction reverse)
|
||||||
struct dom_info *di;
|
|
||||||
enum cdi_direction reverse;
|
|
||||||
{
|
{
|
||||||
TBB v, w, k, par;
|
TBB v, w, k, par;
|
||||||
basic_block en_block;
|
basic_block en_block;
|
||||||
|
@ -557,8 +539,7 @@ calc_idoms (di, reverse)
|
||||||
immediate resp. all dominators). */
|
immediate resp. all dominators). */
|
||||||
|
|
||||||
dominance_info
|
dominance_info
|
||||||
calculate_dominance_info (reverse)
|
calculate_dominance_info (enum cdi_direction reverse)
|
||||||
enum cdi_direction reverse;
|
|
||||||
{
|
{
|
||||||
struct dom_info di;
|
struct dom_info di;
|
||||||
dominance_info info;
|
dominance_info info;
|
||||||
|
@ -596,8 +577,7 @@ calculate_dominance_info (reverse)
|
||||||
|
|
||||||
/* Free dominance information. */
|
/* Free dominance information. */
|
||||||
void
|
void
|
||||||
free_dominance_info (info)
|
free_dominance_info (dominance_info info)
|
||||||
dominance_info info;
|
|
||||||
{
|
{
|
||||||
basic_block bb;
|
basic_block bb;
|
||||||
|
|
||||||
|
@ -616,9 +596,7 @@ free_dominance_info (info)
|
||||||
|
|
||||||
/* Return the immediate dominator of basic block BB. */
|
/* Return the immediate dominator of basic block BB. */
|
||||||
basic_block
|
basic_block
|
||||||
get_immediate_dominator (dom, bb)
|
get_immediate_dominator (dominance_info dom, basic_block bb)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb;
|
|
||||||
{
|
{
|
||||||
return et_forest_node_value (dom->forest,
|
return et_forest_node_value (dom->forest,
|
||||||
et_forest_parent (dom->forest,
|
et_forest_parent (dom->forest,
|
||||||
|
@ -628,9 +606,7 @@ get_immediate_dominator (dom, bb)
|
||||||
/* Set the immediate dominator of the block possibly removing
|
/* Set the immediate dominator of the block possibly removing
|
||||||
existing edge. NULL can be used to remove any edge. */
|
existing edge. NULL can be used to remove any edge. */
|
||||||
inline void
|
inline void
|
||||||
set_immediate_dominator (dom, bb, dominated_by)
|
set_immediate_dominator (dominance_info dom, basic_block bb, basic_block dominated_by)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb, dominated_by;
|
|
||||||
{
|
{
|
||||||
void *aux_bb_node;
|
void *aux_bb_node;
|
||||||
et_forest_node_t bb_node = BB_NODE (dom, bb);
|
et_forest_node_t bb_node = BB_NODE (dom, bb);
|
||||||
|
@ -649,10 +625,7 @@ set_immediate_dominator (dom, bb, dominated_by)
|
||||||
|
|
||||||
/* Store all basic blocks dominated by BB into BBS and return their number. */
|
/* Store all basic blocks dominated by BB into BBS and return their number. */
|
||||||
int
|
int
|
||||||
get_dominated_by (dom, bb, bbs)
|
get_dominated_by (dominance_info dom, basic_block bb, basic_block **bbs)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb;
|
|
||||||
basic_block **bbs;
|
|
||||||
{
|
{
|
||||||
int n, i;
|
int n, i;
|
||||||
|
|
||||||
|
@ -665,10 +638,7 @@ get_dominated_by (dom, bb, bbs)
|
||||||
|
|
||||||
/* Redirect all edges pointing to BB to TO. */
|
/* Redirect all edges pointing to BB to TO. */
|
||||||
void
|
void
|
||||||
redirect_immediate_dominators (dom, bb, to)
|
redirect_immediate_dominators (dominance_info dom, basic_block bb, basic_block to)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb;
|
|
||||||
basic_block to;
|
|
||||||
{
|
{
|
||||||
et_forest_node_t *bbs = xmalloc (n_basic_blocks * sizeof (basic_block));
|
et_forest_node_t *bbs = xmalloc (n_basic_blocks * sizeof (basic_block));
|
||||||
et_forest_node_t node = BB_NODE (dom, bb);
|
et_forest_node_t node = BB_NODE (dom, bb);
|
||||||
|
@ -686,10 +656,7 @@ redirect_immediate_dominators (dom, bb, to)
|
||||||
|
|
||||||
/* Find first basic block in the tree dominating both BB1 and BB2. */
|
/* Find first basic block in the tree dominating both BB1 and BB2. */
|
||||||
basic_block
|
basic_block
|
||||||
nearest_common_dominator (dom, bb1, bb2)
|
nearest_common_dominator (dominance_info dom, basic_block bb1, basic_block bb2)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb1;
|
|
||||||
basic_block bb2;
|
|
||||||
{
|
{
|
||||||
if (!bb1)
|
if (!bb1)
|
||||||
return bb2;
|
return bb2;
|
||||||
|
@ -704,18 +671,14 @@ nearest_common_dominator (dom, bb1, bb2)
|
||||||
|
|
||||||
/* Return TRUE in case BB1 is dominated by BB2. */
|
/* Return TRUE in case BB1 is dominated by BB2. */
|
||||||
bool
|
bool
|
||||||
dominated_by_p (dom, bb1, bb2)
|
dominated_by_p (dominance_info dom, basic_block bb1, basic_block bb2)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb1;
|
|
||||||
basic_block bb2;
|
|
||||||
{
|
{
|
||||||
return nearest_common_dominator (dom, bb1, bb2) == bb2;
|
return nearest_common_dominator (dom, bb1, bb2) == bb2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify invariants of dominator structure. */
|
/* Verify invariants of dominator structure. */
|
||||||
void
|
void
|
||||||
verify_dominators (dom)
|
verify_dominators (dominance_info dom)
|
||||||
dominance_info dom;
|
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
basic_block bb;
|
basic_block bb;
|
||||||
|
@ -738,9 +701,7 @@ verify_dominators (dom)
|
||||||
|
|
||||||
/* Recount dominator of BB. */
|
/* Recount dominator of BB. */
|
||||||
basic_block
|
basic_block
|
||||||
recount_dominator (dom, bb)
|
recount_dominator (dominance_info dom, basic_block bb)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb;
|
|
||||||
{
|
{
|
||||||
basic_block dom_bb = NULL;
|
basic_block dom_bb = NULL;
|
||||||
edge e;
|
edge e;
|
||||||
|
@ -757,10 +718,7 @@ recount_dominator (dom, bb)
|
||||||
/* Iteratively recount dominators of BBS. The change is supposed to be local
|
/* Iteratively recount dominators of BBS. The change is supposed to be local
|
||||||
and not to grow further. */
|
and not to grow further. */
|
||||||
void
|
void
|
||||||
iterate_fix_dominators (dom, bbs, n)
|
iterate_fix_dominators (dominance_info dom, basic_block *bbs, int n)
|
||||||
dominance_info dom;
|
|
||||||
basic_block *bbs;
|
|
||||||
int n;
|
|
||||||
{
|
{
|
||||||
int i, changed = 1;
|
int i, changed = 1;
|
||||||
basic_block old_dom, new_dom;
|
basic_block old_dom, new_dom;
|
||||||
|
@ -782,9 +740,7 @@ iterate_fix_dominators (dom, bbs, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
add_to_dominance_info (dom, bb)
|
add_to_dominance_info (dominance_info dom, basic_block bb)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb;
|
|
||||||
{
|
{
|
||||||
VARRAY_GROW (dom->varray, last_basic_block + 3);
|
VARRAY_GROW (dom->varray, last_basic_block + 3);
|
||||||
#ifdef ENABLE_CHECKING
|
#ifdef ENABLE_CHECKING
|
||||||
|
@ -795,17 +751,14 @@ add_to_dominance_info (dom, bb)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
delete_from_dominance_info (dom, bb)
|
delete_from_dominance_info (dominance_info dom, basic_block bb)
|
||||||
dominance_info dom;
|
|
||||||
basic_block bb;
|
|
||||||
{
|
{
|
||||||
et_forest_remove_node (dom->forest, BB_NODE (dom, bb));
|
et_forest_remove_node (dom->forest, BB_NODE (dom, bb));
|
||||||
SET_BB_NODE (dom, bb, NULL);
|
SET_BB_NODE (dom, bb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_dominance_info (dom)
|
debug_dominance_info (dominance_info dom)
|
||||||
dominance_info dom;
|
|
||||||
{
|
{
|
||||||
basic_block bb, bb2;
|
basic_block bb, bb2;
|
||||||
FOR_EACH_BB (bb)
|
FOR_EACH_BB (bb)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Dwarf2 assembler output helper routines.
|
/* Dwarf2 assembler output helper routines.
|
||||||
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
@ -45,9 +45,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
to print a newline, since the caller may want to add a comment. */
|
to print a newline, since the caller may want to add a comment. */
|
||||||
|
|
||||||
void
|
void
|
||||||
dw2_assemble_integer (size, x)
|
dw2_assemble_integer (int size, rtx x)
|
||||||
int size;
|
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
const char *op = integer_asm_op (size, FALSE);
|
const char *op = integer_asm_op (size, FALSE);
|
||||||
|
|
||||||
|
@ -275,8 +273,7 @@ dw2_asm_output_nstring (const char *str, size_t orig_len,
|
||||||
/* Return the size of an unsigned LEB128 quantity. */
|
/* Return the size of an unsigned LEB128 quantity. */
|
||||||
|
|
||||||
int
|
int
|
||||||
size_of_uleb128 (value)
|
size_of_uleb128 (unsigned HOST_WIDE_INT value)
|
||||||
unsigned HOST_WIDE_INT value;
|
|
||||||
{
|
{
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
|
||||||
|
@ -293,8 +290,7 @@ size_of_uleb128 (value)
|
||||||
/* Return the size of a signed LEB128 quantity. */
|
/* Return the size of a signed LEB128 quantity. */
|
||||||
|
|
||||||
int
|
int
|
||||||
size_of_sleb128 (value)
|
size_of_sleb128 (HOST_WIDE_INT value)
|
||||||
HOST_WIDE_INT value;
|
|
||||||
{
|
{
|
||||||
int size = 0, byte;
|
int size = 0, byte;
|
||||||
|
|
||||||
|
@ -315,8 +311,7 @@ size_of_sleb128 (value)
|
||||||
include leb128. */
|
include leb128. */
|
||||||
|
|
||||||
int
|
int
|
||||||
size_of_encoded_value (encoding)
|
size_of_encoded_value (int encoding)
|
||||||
int encoding;
|
|
||||||
{
|
{
|
||||||
if (encoding == DW_EH_PE_omit)
|
if (encoding == DW_EH_PE_omit)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -338,8 +333,7 @@ size_of_encoded_value (encoding)
|
||||||
/* Yield a name for a given pointer encoding. */
|
/* Yield a name for a given pointer encoding. */
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
eh_data_format_name (format)
|
eh_data_format_name (int format)
|
||||||
int format;
|
|
||||||
{
|
{
|
||||||
#if HAVE_DESIGNATED_INITIALIZERS
|
#if HAVE_DESIGNATED_INITIALIZERS
|
||||||
#define S(p, v) [p] = v,
|
#define S(p, v) [p] = v,
|
||||||
|
@ -675,8 +669,8 @@ dw2_asm_output_delta_sleb128 (const char *lab1 ATTRIBUTE_UNUSED,
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static rtx dw2_force_const_mem PARAMS ((rtx));
|
static rtx dw2_force_const_mem (rtx);
|
||||||
static int dw2_output_indirect_constant_1 PARAMS ((splay_tree_node, void *));
|
static int dw2_output_indirect_constant_1 (splay_tree_node, void *);
|
||||||
|
|
||||||
static GTY((param1_is (char *), param2_is (tree))) splay_tree indirect_pool;
|
static GTY((param1_is (char *), param2_is (tree))) splay_tree indirect_pool;
|
||||||
|
|
||||||
|
@ -694,8 +688,7 @@ static GTY(()) int dw2_const_labelno;
|
||||||
"near" the function in any interesting sense. */
|
"near" the function in any interesting sense. */
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
dw2_force_const_mem (x)
|
dw2_force_const_mem (rtx x)
|
||||||
rtx x;
|
|
||||||
{
|
{
|
||||||
splay_tree_node node;
|
splay_tree_node node;
|
||||||
const char *str;
|
const char *str;
|
||||||
|
@ -755,9 +748,8 @@ dw2_force_const_mem (x)
|
||||||
splay_tree_foreach. Emit one queued constant to memory. */
|
splay_tree_foreach. Emit one queued constant to memory. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dw2_output_indirect_constant_1 (node, data)
|
dw2_output_indirect_constant_1 (splay_tree_node node,
|
||||||
splay_tree_node node;
|
void *data ATTRIBUTE_UNUSED)
|
||||||
void* data ATTRIBUTE_UNUSED;
|
|
||||||
{
|
{
|
||||||
const char *sym;
|
const char *sym;
|
||||||
rtx sym_ref;
|
rtx sym_ref;
|
||||||
|
@ -775,7 +767,7 @@ dw2_output_indirect_constant_1 (node, data)
|
||||||
/* Emit the constants queued through dw2_force_const_mem. */
|
/* Emit the constants queued through dw2_force_const_mem. */
|
||||||
|
|
||||||
void
|
void
|
||||||
dw2_output_indirect_constants ()
|
dw2_output_indirect_constants (void)
|
||||||
{
|
{
|
||||||
if (indirect_pool)
|
if (indirect_pool)
|
||||||
splay_tree_foreach (indirect_pool, dw2_output_indirect_constant_1, NULL);
|
splay_tree_foreach (indirect_pool, dw2_output_indirect_constant_1, NULL);
|
||||||
|
|
1589
gcc/dwarf2out.c
1589
gcc/dwarf2out.c
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,6 @@
|
||||||
/* dwarf2out.h - Various declarations for functions found in dwarf2out.c
|
/* dwarf2out.h - Various declarations for functions found in dwarf2out.c
|
||||||
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1998, 1999, 2000, 2003
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
@ -18,11 +19,11 @@ along with GCC; see the file COPYING. If not, write to the Free
|
||||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
extern void dwarf2out_decl PARAMS ((tree));
|
extern void dwarf2out_decl (tree);
|
||||||
extern void dwarf2out_frame_debug PARAMS ((rtx));
|
extern void dwarf2out_frame_debug (rtx);
|
||||||
|
|
||||||
extern void debug_dwarf PARAMS ((void));
|
extern void debug_dwarf (void);
|
||||||
struct die_struct;
|
struct die_struct;
|
||||||
extern void debug_dwarf_die PARAMS ((struct die_struct *));
|
extern void debug_dwarf_die (struct die_struct *);
|
||||||
extern void dwarf2out_set_demangle_name_func PARAMS ((const char *(*) (const char *)));
|
extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *));
|
||||||
extern void dwarf2out_add_library_unit_info PARAMS ((const char *, const char *));
|
extern void dwarf2out_add_library_unit_info (const char *, const char *);
|
||||||
|
|
735
gcc/dwarfout.c
735
gcc/dwarfout.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue