diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-12-10 08:44:18 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-12-10 08:44:18 +0100 |
commit | 1fe04fdc32193d90807322914def7b4a8d9c8834 (patch) | |
tree | c3243146716e433a79445edc57aef3842b72177b /gcc/asan.c | |
parent | cf8d35faee601f4a9f36d889a034ec643d939f76 (diff) | |
download | gcc-1fe04fdc32193d90807322914def7b4a8d9c8834.zip gcc-1fe04fdc32193d90807322914def7b4a8d9c8834.tar.gz gcc-1fe04fdc32193d90807322914def7b4a8d9c8834.tar.bz2 |
asan.c (instrument_derefs): Handle bitfield COMPONENT_REFs accesses as reads/writes to their...
* asan.c (instrument_derefs): Handle bitfield COMPONENT_REFs
accesses as reads/writes to their DECL_BIT_FIELD_REPRESENTATIVE.
From-SVN: r194344
Diffstat (limited to 'gcc/asan.c')
-rw-r--r-- | gcc/asan.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -797,9 +797,6 @@ instrument_derefs (gimple_stmt_iterator *iter, tree t, || (unsigned HOST_WIDE_INT) size_in_bytes - 1 >= 16) return; - /* For now just avoid instrumenting bit field acceses. - Fixing it is doable, but expected to be messy. */ - HOST_WIDE_INT bitsize, bitpos; tree offset; enum machine_mode mode; @@ -808,7 +805,17 @@ instrument_derefs (gimple_stmt_iterator *iter, tree t, &mode, &unsignedp, &volatilep, false); if (bitpos % (size_in_bytes * BITS_PER_UNIT) || bitsize != size_in_bytes * BITS_PER_UNIT) - return; + { + if (TREE_CODE (t) == COMPONENT_REF + && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE) + { + tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)); + instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr), + TREE_OPERAND (t, 0), repr, + NULL_TREE), location, is_store); + } + return; + } base = build_fold_addr_expr (t); build_check_stmt (location, base, iter, /*before_p=*/true, |