On Thu, Aug 14, 2014 at 09:46:46AM +0400, Yury Gribov wrote:
> --- a/gcc/asan.c
> +++ b/gcc/asan.c
> @@ -1690,22 +1690,21 @@ instrument_derefs (gimple_stmt_iterator *iter, tree t,
> int volatilep = 0, unsignedp = 0;
> tree inner = get_inner_reference (t, &bitsize, &bitpos, &offset,
> &mode, &unsignedp, &volatilep, false);
> - if (((size_in_bytes & (size_in_bytes - 1)) == 0
> - && (bitpos % (size_in_bytes * BITS_PER_UNIT)))
> - || bitsize != size_in_bytes * BITS_PER_UNIT)
> +
> + if (TREE_CODE (t) == COMPONENT_REF)
> {
> - if (TREE_CODE (t) == COMPONENT_REF
> - && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
> + if (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;
> }
> - return;
> + else if (bitpos % BITS_PER_UNIT
> + || bitsize != size_in_bytes * BITS_PER_UNIT)
> + return;
No, this should be if, not else if, and be after the } below.
We really can't handle it otherwise.
Generally, the bitfield COMPONENT_REFs should have
DECL_BIT_FIELD_REPRESENTATIVE which is not a bitfield, therefore the common
case will be handled.
As for BIT_FIELD_REFs, the question is what access to use instead of them.
Jakub