Print this page
4470 overly aggressive D integer narrowing breaks 32-bit ustack helpers

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libdtrace/common/dt_cg.c
          +++ new/usr/src/lib/libdtrace/common/dt_cg.c
↓ open down ↓ 468 lines elided ↑ open up ↑
 469  469  {
 470  470          size_t srcsize = dt_node_type_size(src);
 471  471          size_t dstsize = dt_node_type_size(dst);
 472  472  
 473  473          dif_instr_t instr;
 474  474          int rg;
 475  475  
 476  476          if (!dt_node_is_scalar(dst))
 477  477                  return; /* not a scalar */
 478  478          if (dstsize == srcsize &&
 479      -            ((src->dn_flags ^ dst->dn_flags) & DT_NF_SIGNED) != 0)
      479 +            ((src->dn_flags ^ dst->dn_flags) & DT_NF_SIGNED) == 0)
 480  480                  return; /* not narrowing or changing signed-ness */
 481  481          if (dstsize > srcsize && (src->dn_flags & DT_NF_SIGNED) == 0)
 482  482                  return; /* nothing to do in this case */
 483  483  
 484  484          rg = dt_regset_alloc(drp);
 485  485  
 486  486          if (dstsize > srcsize) {
 487  487                  int n = sizeof (uint64_t) * NBBY - srcsize * NBBY;
 488  488                  int s = (dstsize - srcsize) * NBBY;
 489  489  
↓ open down ↓ 1650 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX