From e3abc83ebaea2312510ace3da69436393e73046c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 9 May 2016 15:30:32 +0000 Subject: [PATCH] Fix handling of negative bitpos in expand_debug_expr expand_debug_expr handled negative bit positions using: else if (bitpos < 0) { HOST_WIDE_INT units = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT; op0 = adjust_address_nv (op0, mode1, units); bitpos += units * BITS_PER_UNIT; } Here "units" is the negative of the (negative) byte offset, so I think we should be offsetting OP0 by -units instead. E.g. a bitpos of -17 would give units==3, so this code would move OP0 up by 3 bytes and set bitpos to 7, giving a total bitpos of 31. Just noticed by inspection. An assert triggered for: gcc.target/i386/mpx/bitfields-1-lbv.c gcc.target/i386/mpx/field-addr-7-lbv.c gcc.target/i386/mpx/reference-3-lbv.cpp gcc.target/i386/mpx/reference-4-lbv.cpp at -m32 but otherwise this case doesn't seem to trigger during a bootstrap and regtest. Tested on x86_64-linux-gnu. gcc/ * cfgexpand.c (expand_debug_expr): Fix address offset for negative bitpos. From-SVN: r236041 --- gcc/ChangeLog | 5 +++++ gcc/cfgexpand.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85f0e6738f6..314f5f6d67f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-05-09 Richard Sandiford + + * cfgexpand.c (expand_debug_expr): Fix address offset for negative + bitpos. + 2016-05-09 Richard Sandiford * tree-affine.c (wide_int_constant_multiple_p): Add missing diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 21f21c97502..77a1964d4c0 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -4473,7 +4473,7 @@ expand_debug_expr (tree exp) { HOST_WIDE_INT units = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT; - op0 = adjust_address_nv (op0, mode1, units); + op0 = adjust_address_nv (op0, mode1, -units); bitpos += units * BITS_PER_UNIT; } else if (bitpos == 0 && bitsize == GET_MODE_BITSIZE (mode)) -- 2.30.2