From: Robert O'Callahan Date: Wed, 8 Jul 2015 10:11:22 +0000 (+0100) Subject: PR18617 - Incorrect expression bytecode generated for narrowing conversions X-Git-Tag: gdb-7.10-release~88 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cc1259417e727c47e58cea1bb4a148974689ad8e;p=thirdparty%2Fbinutils-gdb.git PR18617 - Incorrect expression bytecode generated for narrowing conversions The existing code preserves 'from' bits, which is incorrect. E.g. (gdb) maint agent-eval (char)255L Scope: 0x4008d6 Reg mask: 00 0 const16 255 3 ext 64 5 end 'ext 64' should be 'ext 8'; this bytecode evaluates to 255 instead of the correct result of -1. The fix is simple. I ran the entire test suite on x86-64 and there were no new test failures. gdb/ChangeLog: 2015-07-08 Robert O'Callahan PR exp/18617 * ax-gdb.c (gen_conversion): Extend to 'to' bits, not 'from'. gdb/testsuite/ChangeLog: 2015-07-08 Robert O'Callahan PR exp/18617 * gdb.trace/ax.exp: Add test. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b3b5c594ace..b376ab881ad 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-07-08 Robert O'Callahan + + PR exp/18617 + * ax-gdb.c (gen_conversion): Extend to 'to' bits, not 'from'. + 2015-07-06 Joel Brobecker * version.in: Set GDB version number to 7.9.90.DATE-cvs. diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 7a9d1e7a8f0..38dacac8465 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -885,7 +885,7 @@ gen_conversion (struct agent_expr *ax, struct type *from, struct type *to) /* If we're converting to a narrower type, then we need to clear out the upper bits. */ if (TYPE_LENGTH (to) < TYPE_LENGTH (from)) - gen_extend (ax, from); + gen_extend (ax, to); /* If the two values have equal width, but different signednesses, then we need to extend. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0a90fa9b53a..e8651fa4eb1 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-07-08 Robert O'Callahan + + PR exp/18617 + * gdb.trace/ax.exp: Add test. + 2015-06-30 Martin Galvan * lib/gdb.exp (test_class_help): Remove the unneeded escaping of diff --git a/gdb/testsuite/gdb.trace/ax.exp b/gdb/testsuite/gdb.trace/ax.exp index e3d0479d92c..d0644756fb2 100644 --- a/gdb/testsuite/gdb.trace/ax.exp +++ b/gdb/testsuite/gdb.trace/ax.exp @@ -80,6 +80,8 @@ gdb_test "maint agent &gdb_long_test == &gdb_short_test" "" "maint agent &gdb_lo gdb_test "maint agent &gdb_long_test < &gdb_short_test" "" "maint agent &gdb_long_test < &gdb_short_test" +gdb_test "maint agent (unsigned char)1L" ".*ext 8.*" "maint agent (unsigned char)1L" + # Now test eval version of agent expressions. gdb_test "maint agent-eval 12" ".*const8 12.*end.*" "maint agent-eval 12"