diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-02-26 11:02:39 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-02-26 11:02:39 +0000 |
commit | e55f862af93fdfc69f4ee2a59d9e587939ef54b0 (patch) | |
tree | 911a8799b402d5fea8c4d113a243f9c16b8c3f6b /gcc/var-tracking.c | |
parent | 2058ec71c12051e69d8f7185bc0fa3e84b97b52a (diff) | |
download | gcc-e55f862af93fdfc69f4ee2a59d9e587939ef54b0.tar.gz |
PR debug/43160
* var-tracking.c (dv_onepart_p): Return true for DEBUG_EXPR_DECLs.
(add_value_chain, add_value_chains, remove_value_chain,
remove_value_chains): Handle DEBUG_EXPRs.
(check_changed_vars_1, check_changed_vars_2): Handle DEBUG_EXPR_DECLs.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157084 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 134 |
1 files changed, 78 insertions, 56 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 6e9af6e8999..99589e95f2b 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -784,6 +784,9 @@ dv_onepart_p (decl_or_value dv) if (!decl) return true; + if (TREE_CODE (decl) == DEBUG_EXPR_DECL) + return true; + return (target_for_debug_bind (decl) != NULL_TREE); } @@ -2563,39 +2566,48 @@ loc_cmp (rtx x, rtx y) static int add_value_chain (rtx *loc, void *dvp) { - if (GET_CODE (*loc) == VALUE && (void *) *loc != dvp) + decl_or_value dv, ldv; + value_chain vc, nvc; + void **slot; + + if (GET_CODE (*loc) == VALUE) + ldv = dv_from_value (*loc); + else if (GET_CODE (*loc) == DEBUG_EXPR) + ldv = dv_from_decl (DEBUG_EXPR_TREE_DECL (*loc)); + else + return 0; + + if (dv_as_opaque (ldv) == dvp) + return 0; + + dv = (decl_or_value) dvp; + slot = htab_find_slot_with_hash (value_chains, ldv, dv_htab_hash (ldv), + INSERT); + if (!*slot) { - decl_or_value dv = (decl_or_value) dvp; - decl_or_value ldv = dv_from_value (*loc); - value_chain vc, nvc; - void **slot = htab_find_slot_with_hash (value_chains, ldv, - dv_htab_hash (ldv), INSERT); - if (!*slot) - { - vc = (value_chain) pool_alloc (value_chain_pool); - vc->dv = ldv; - vc->next = NULL; - vc->refcount = 0; - *slot = (void *) vc; - } - else + vc = (value_chain) pool_alloc (value_chain_pool); + vc->dv = ldv; + vc->next = NULL; + vc->refcount = 0; + *slot = (void *) vc; + } + else + { + for (vc = ((value_chain) *slot)->next; vc; vc = vc->next) + if (dv_as_opaque (vc->dv) == dv_as_opaque (dv)) + break; + if (vc) { - for (vc = ((value_chain) *slot)->next; vc; vc = vc->next) - if (dv_as_opaque (vc->dv) == dv_as_opaque (dv)) - break; - if (vc) - { - vc->refcount++; - return 0; - } + vc->refcount++; + return 0; } - vc = (value_chain) *slot; - nvc = (value_chain) pool_alloc (value_chain_pool); - nvc->dv = dv; - nvc->next = vc->next; - nvc->refcount = 1; - vc->next = nvc; } + vc = (value_chain) *slot; + nvc = (value_chain) pool_alloc (value_chain_pool); + nvc->dv = dv; + nvc->next = vc->next; + nvc->refcount = 1; + vc->next = nvc; return 0; } @@ -2605,7 +2617,7 @@ add_value_chain (rtx *loc, void *dvp) static void add_value_chains (decl_or_value dv, rtx loc) { - if (GET_CODE (loc) == VALUE) + if (GET_CODE (loc) == VALUE || GET_CODE (loc) == DEBUG_EXPR) { add_value_chain (&loc, dv_as_opaque (dv)); return; @@ -2635,33 +2647,41 @@ add_cselib_value_chains (decl_or_value dv) static int remove_value_chain (rtx *loc, void *dvp) { - if (GET_CODE (*loc) == VALUE && (void *) *loc != dvp) - { - decl_or_value dv = (decl_or_value) dvp; - decl_or_value ldv = dv_from_value (*loc); - value_chain vc, dvc = NULL; - void **slot = htab_find_slot_with_hash (value_chains, ldv, - dv_htab_hash (ldv), NO_INSERT); - for (vc = (value_chain) *slot; vc->next; vc = vc->next) - if (dv_as_opaque (vc->next->dv) == dv_as_opaque (dv)) + decl_or_value dv, ldv; + value_chain vc; + void **slot; + + if (GET_CODE (*loc) == VALUE) + ldv = dv_from_value (*loc); + else if (GET_CODE (*loc) == DEBUG_EXPR) + ldv = dv_from_decl (DEBUG_EXPR_TREE_DECL (*loc)); + else + return 0; + + if (dv_as_opaque (ldv) == dvp) + return 0; + + dv = (decl_or_value) dvp; + slot = htab_find_slot_with_hash (value_chains, ldv, dv_htab_hash (ldv), + NO_INSERT); + for (vc = (value_chain) *slot; vc->next; vc = vc->next) + if (dv_as_opaque (vc->next->dv) == dv_as_opaque (dv)) + { + value_chain dvc = vc->next; + gcc_assert (dvc->refcount > 0); + if (--dvc->refcount == 0) { - dvc = vc->next; - gcc_assert (dvc->refcount > 0); - if (--dvc->refcount == 0) + vc->next = dvc->next; + pool_free (value_chain_pool, dvc); + if (vc->next == NULL && vc == (value_chain) *slot) { - vc->next = dvc->next; - pool_free (value_chain_pool, dvc); - if (vc->next == NULL && vc == (value_chain) *slot) - { - pool_free (value_chain_pool, vc); - htab_clear_slot (value_chains, slot); - } + pool_free (value_chain_pool, vc); + htab_clear_slot (value_chains, slot); } - return 0; } - gcc_unreachable (); - } - return 0; + return 0; + } + gcc_unreachable (); } /* If decl or value DVP refers to VALUEs from within LOC, remove backlinks @@ -2670,7 +2690,7 @@ remove_value_chain (rtx *loc, void *dvp) static void remove_value_chains (decl_or_value dv, rtx loc) { - if (GET_CODE (loc) == VALUE) + if (GET_CODE (loc) == VALUE || GET_CODE (loc) == DEBUG_EXPR) { remove_value_chain (&loc, dv_as_opaque (dv)); return; @@ -6677,7 +6697,8 @@ check_changed_vars_1 (void **slot, void *data) variable var = (variable) *slot; htab_t htab = (htab_t) data; - if (dv_is_value_p (var->dv)) + if (dv_is_value_p (var->dv) + || TREE_CODE (dv_as_decl (var->dv)) == DEBUG_EXPR_DECL) { value_chain vc = (value_chain) htab_find_with_hash (value_chains, var->dv, @@ -6707,7 +6728,8 @@ static void check_changed_vars_2 (variable var, htab_t htab) { variable_was_changed (var, NULL); - if (dv_is_value_p (var->dv)) + if (dv_is_value_p (var->dv) + || TREE_CODE (dv_as_decl (var->dv)) == DEBUG_EXPR_DECL) { value_chain vc = (value_chain) htab_find_with_hash (value_chains, var->dv, |