aboutsummaryrefslogtreecommitdiff
path: root/gcc/asan.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-12-10 08:44:18 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-12-10 08:44:18 +0100
commit1fe04fdc32193d90807322914def7b4a8d9c8834 (patch)
treec3243146716e433a79445edc57aef3842b72177b /gcc/asan.c
parentcf8d35faee601f4a9f36d889a034ec643d939f76 (diff)
downloadgcc-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.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/asan.c b/gcc/asan.c
index 41c5c33..b8f36cb 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -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,