aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgexpand.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-09-24 13:22:38 +0200
committerMartin Liska <marxin@gcc.gnu.org>2018-09-24 11:22:38 +0000
commitbf9f9292131058faa03177b7a0d6f1c265eb29f2 (patch)
tree91afbb9244655cef727a35df6ce34bfce80453b6 /gcc/cfgexpand.c
parent54b7d98ec40895719d5d62be02e5f03d08aac543 (diff)
downloadgcc-bf9f9292131058faa03177b7a0d6f1c265eb29f2.zip
gcc-bf9f9292131058faa03177b7a0d6f1c265eb29f2.tar.gz
gcc-bf9f9292131058faa03177b7a0d6f1c265eb29f2.tar.bz2
Unpoison variable partition properly (PR sanitizer/85774).
2018-09-24 Martin Liska <mliska@suse.cz> PR sanitizer/85774 * asan.c: Make asan_handled_variables extern. * asan.h: Likewise. * cfgexpand.c (expand_stack_vars): Make sure a representative is unpoison if another variable in the partition is handled by use-after-scope sanitization. 2018-09-24 Martin Liska <mliska@suse.cz> PR sanitizer/85774 * g++.dg/asan/pr85774.C: New test. From-SVN: r264528
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r--gcc/cfgexpand.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index c8d7805..35ca276 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -1155,6 +1155,20 @@ expand_stack_vars (bool (*pred) (size_t), struct stack_vars_data *data)
if (repr_decl == NULL_TREE)
repr_decl = stack_vars[i].decl;
data->asan_decl_vec.safe_push (repr_decl);
+
+ /* Make sure a representative is unpoison if another
+ variable in the partition is handled by
+ use-after-scope sanitization. */
+ if (asan_handled_variables != NULL
+ && !asan_handled_variables->contains (repr_decl))
+ {
+ for (j = i; j != EOC; j = stack_vars[j].next)
+ if (asan_handled_variables->contains (stack_vars[j].decl))
+ break;
+ if (j != EOC)
+ asan_handled_variables->add (repr_decl);
+ }
+
data->asan_alignb = MAX (data->asan_alignb, alignb);
if (data->asan_base == NULL)
data->asan_base = gen_reg_rtx (Pmode);