[lldb-dev] intended semantics of Scalar

Tom Tromey via lldb-dev lldb-dev at lists.llvm.org
Fri Mar 23 14:27:45 PDT 2018


While trying to use Scalar in my code, I've found some oddities.

In particular, binary promotion does a bitwise reinterpretation of an
integer when promoting to a floating point type.

This was easy enough to fix, for most cases, but it caused more
questions:

* What are the intended semantics of operations like Float and Double?
  For example, I tried to write a unit test for this but I am not sure
  if it is correct:

      int a2 = 23;
      Scalar a2_scalar(a2);
      ASSERT_EQ((float)a2, a2_scalar.Float());
      ASSERT_EQ((double)a2, a2_scalar.Double());

  The current code here also does bitwise reinterpretation.

  This comment appears in Scalar.h but I did not find it much clearer:

  //----------------------------------------------------------------------
  // Returns a casted value of the current contained data without
  // modifying the current value. FAIL_VALUE will be returned if the type
  // of the value is void or invalid.
  //----------------------------------------------------------------------

* What is the intended difference between the Cast and Promote methods?
  These don't have comments.

* Are the 128- and 256-bit integers expected to participate in binary
  promotion the same way that other ints do?  If so then it seems to me
  that other parts of the code are also incorrect, for example in
  PromoteToMaxType:

      if (lhs_type > rhs_type) { [...]

  This will cause Scalar to attempt to promote floating point types to
  these wide integer types; but that doesn't seem correct to me.  There
  may be more such problems, I did not check exhaustively.

thanks,
Tom


More information about the lldb-dev mailing list