Hey Ryan,

Sorry for the slow response. The bug here is that DTrace isn't appropriately 
sign extending the variable. Here's what we generate:

DIFO 0x831740 returns D type (integer) (size 4)
OFF OPCODE      INSTRUCTION
00: 2c050001    ldts DT_VAR(1280), %r1          ! DT_VAR(1280) = "x"
01: 25000002    setx DT_INTEGER[0], %r2         ! 0x0
02: 0f010200    cmp  %r1, %r2
03: 18000006    bl   6
04: 0e000001    mov  %r0, %r1
05: 11000007    ba   7
06: 25000101    setx DT_INTEGER[1], %r1         ! 0x1
07: 23000001    ret  %r1

If we don't specify the type for self->x, but instead cast it to an int we get 
the right thing:

DIFO 0x8317d0 returns D type (integer) (size 4)
OFF OPCODE      INSTRUCTION
00: 2c050001    ldts DT_VAR(1280), %r1          ! DT_VAR(1280) = "x"
01: 25000002    setx DT_INTEGER[0], %r2         ! 0x20
02: 04010201    sll  %r1, %r2, %r1
03: 2e010201    sra  %r1, %r2, %r1
04: 25000102    setx DT_INTEGER[1], %r2         ! 0x0
05: 0f010200    cmp  %r1, %r2
06: 18000009    bl   9
07: 0e000001    mov  %r0, %r1
08: 1100000a    ba   10
09: 25000201    setx DT_INTEGER[2], %r1         ! 0x1
10: 23000001    ret  %r1

Note that after we do the ldts we sign extend the result (%r1).

It looks like we need an implicit call to dt_cg_typecast() in the case where 
the type of the variable is not a uintptr_t. I've filed this bug:

  6978322 libdtrace compiler fails to sign extend certain variables  

Adam

On Jul 20, 2010, at 7:31 AM, Ryan Johnson wrote:

> Hi all,
> 
> I would have expected that x < 0, below, but it isn't (even though it 
> theoretically has only 32 bits, as confirmed by the second probe)
> 
> self signed int x;
> self signed long y;
> self signed int z;
> BEGIN {self->x = 0xffffffff; self->y = 0xffffffffffffffffl; self->z = 
> 0xffffffffffffffffl; }
> BEGIN/self->x & 0xffffffff00000000/ { printf("x has 33+ bits"); }
> BEGIN/self->x < 0/ {printf("x < 0"); }
> BEGIN/self->y < 0/ {printf("y < 0"); }
> BEGIN/self->z < 0/ {printf("z < 0"); }
> BEGIN {exit(0); }
> 
> I'm using Solaris 10, so maybe I've got an old-n-buggy version of dtrace, but 
> google didn't turn up anything obvious when I searched.
> 
> Ideas?
> Ryan
> _______________________________________________
> dtrace-discuss mailing list
> dtrace-discuss@opensolaris.org


--
Adam Leventhal, Fishworks                        http://blogs.sun.com/ahl

_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to