Bug 18617 - Incorrect expression bytecode generated for narrowing conversions
Summary: Incorrect expression bytecode generated for narrowing conversions
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: exp (show other bugs)
Version: 7.9
: P2 normal
Target Milestone: 7.10
Assignee: Robert O'Callahan
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-07-01 05:55 UTC by Robert O'Callahan
Modified: 2015-07-08 10:20 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments
preserve 'to' bits when generating bytecode for a narrowing conversion (859 bytes, patch)
2015-07-01 21:56 UTC, Robert O'Callahan
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Robert O'Callahan 2015-07-01 05:55:41 UTC
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.
Comment 1 Kyle Huey (Mozilla) 2015-07-01 18:38:12 UTC
Your testcase WFM on gdb 7.7.
Comment 2 Robert O'Callahan 2015-07-01 21:56:54 UTC
Created attachment 8406 [details]
preserve 'to' bits when generating bytecode for a narrowing conversion
Comment 3 Pedro Alves 2015-07-02 14:26:58 UTC
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
Comment 5 cvs-commit@gcc.gnu.org 2015-07-08 10:10:44 UTC
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.
Comment 6 cvs-commit@gcc.gnu.org 2015-07-08 10:17:00 UTC
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.
Comment 7 Pedro Alves 2015-07-08 10:20:35 UTC
Fixed.