[Lldb-commits] [lldb] r346783 - [Cocoa] Implement formatter for the new NSDate representation.

Davide Italiano via lldb-commits lldb-commits at lists.llvm.org
Fri Nov 16 10:09:10 PST 2018


Sorry Zach, I was sick for the past few days. I'll look into this one now.

--
Davide
On Wed, Nov 14, 2018 at 9:16 AM Zachary Turner <zturner at google.com> wrote:
>
>
>
> On Tue, Nov 13, 2018 at 11:46 AM Davide Italiano via lldb-commits <lldb-commits at lists.llvm.org> wrote:
>>
>> Author: davide
>> Date: Tue Nov 13 11:43:43 2018
>> New Revision: 346783
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=346783&view=rev
>> Log:
>> [Cocoa] Implement formatter for the new NSDate representation.
>>
>> <rdar://problem/46002786>
>>
>> Modified:
>>     lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp
>>
>> Modified: lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp?rev=346783&r1=346782&r2=346783&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp (original)
>> +++ lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp Tue Nov 13 11:43:43 2018
>> @@ -742,6 +742,60 @@ bool lldb_private::formatters::NSURLSumm
>>    return false;
>>  }
>>
>> +/// Bias value for tagged pointer exponents.
>> +/// Recommended values:
>> +/// 0x3e3: encodes all dates between distantPast and distantFuture
>> +///   except for the range within about 1e-28 second of the reference date.
>> +/// 0x3ef: encodes all dates for a few million years beyond distantPast and
>> +///   distantFuture, except within about 1e-25 second of the reference date.
>> +const int TAGGED_DATE_EXPONENT_BIAS = 0x3ef;
>> +
>> +typedef union {
>> +  struct {
>> +    uint64_t fraction:52;  // unsigned
>> +    uint64_t exponent:11;  // signed
>> +    uint64_t sign:1;
>> +  };
>> +  uint64_t i;
>> +  double d;
>> +} DoubleBits;
>> +typedef union {
>> +  struct {
>> +    uint64_t fraction:52;  // unsigned
>> +    uint64_t exponent:7;   // signed
>> +    uint64_t sign:1;
>> +    uint64_t unused:4;  // placeholder for pointer tag bits
>> +  };
>
> MSVC gives:
>
> warning C4201: nonstandard extension used: nameless struct/union
>
>>
>> +  uint64_t i;
>> +} TaggedDoubleBits;
>> +
>> +static uint64_t decodeExponent(uint64_t exp) {
>> +  int64_t exp7 = exp;
>> +  // Tagged exponent field is 7-bit signed. Sign-extend the value to 64 bits
>> +  // before performing arithmetic.
>> +  int64_t exp11 = ((exp7 << 57) >> 57) + TAGGED_DATE_EXPONENT_BIAS;
>> +  return exp11;
>> +}
>
> this should probably be:
>
> return llvm::SignExtend64<7>(exp) + TAGGED_DATE_EXPONENT_BIAS;
>
>>
>> +
>> +static uint64_t decodeTaggedTimeInterval(uint64_t encodedTimeInterval) {
>> +  if (encodedTimeInterval == 0)
>> +    return 0.0;
>> +  if (encodedTimeInterval == std::numeric_limits<uint64_t>::max())
>> +    return -0.0;
>> +
>> +  TaggedDoubleBits encodedBits = { .i = encodedTimeInterval };
>
> Designated initializers are C++20 which are not allowed in LLVM.



-- 
Davide

"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare


More information about the lldb-commits mailing list