Given the program: uint64_t u64max = (uint64_t)(int64_t)-1; int main(int argc, char* argv[]) { return 0; } and the commands break main cond 1 (unsigned char)u64max==255 the following expression bytecode is generated: {0x24, 0x0, 0x60, 0xd, 0x38, 0x1a, 0x2a, 0x40, 0x23, 0x0, 0xff, 0x13, 0x27} That is: const32 0x600d38 ref64 zero_ext 64 const16 0xff equal end The zero_ext operand is incorrect. It should have been 8, to keep the low 8 bits and zero the rest. The breakpoint condition therefore returns false when it should return true. The bug is in ax-gdb.c: /* 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); That should be gen_extend (ax, to); to keep `to` bits and zero the rest.
Your testcase WFM on gdb 7.7.
Created attachment 8406 [details] preserve 'to' bits when generating bytecode for a narrowing conversion
Hi. Thanks for finding and fixing this. It'd be great if you sent this as a full/finished patch to the patches list. Then someone can git am/push it. Please take a look at contribution guidelines in the wiki: https://sourceware.org/gdb/wiki/ContributionChecklist
https://sourceware.org/ml/gdb-patches/2015-07/msg00089.html
The master branch has been updated by Pedro Alves <palves@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bcf5c1d96b3b5493041002eb2b6d27288d9d160a commit bcf5c1d96b3b5493041002eb2b6d27288d9d160a Author: Robert O'Callahan <robert@ocallahan.org> Date: Wed Jul 8 10:53:36 2015 +0100 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 <robert@ocallahan.org> PR exp/18617 * ax-gdb.c (gen_conversion): Extend to 'to' bits, not 'from'. gdb/testsuite/ChangeLog: 2015-07-08 Robert O'Callahan <robert@ocallahan.org> PR exp/18617 * gdb.trace/ax.exp: Add test.
The gdb-7.10-branch branch has been updated by Pedro Alves <palves@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=cc1259417e727c47e58cea1bb4a148974689ad8e commit cc1259417e727c47e58cea1bb4a148974689ad8e Author: Robert O'Callahan <robert@ocallahan.org> Date: Wed Jul 8 11:11:22 2015 +0100 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 <robert@ocallahan.org> PR exp/18617 * ax-gdb.c (gen_conversion): Extend to 'to' bits, not 'from'. gdb/testsuite/ChangeLog: 2015-07-08 Robert O'Callahan <robert@ocallahan.org> PR exp/18617 * gdb.trace/ax.exp: Add test.
Fixed.