Home | History | Annotate | Download | only in Core
      1 //===-- Scalar.cpp ----------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/Core/Scalar.h"
     11 
     12 #include <math.h>
     13 #include <inttypes.h>
     14 
     15 #include "lldb/Interpreter/Args.h"
     16 #include "lldb/Core/Error.h"
     17 #include "lldb/Core/Stream.h"
     18 #include "lldb/Core/DataExtractor.h"
     19 #include "lldb/Host/Endian.h"
     20 
     21 #include "Plugins/Process/Utility/InstructionUtils.h"
     22 
     23 using namespace lldb;
     24 using namespace lldb_private;
     25 
     26 //----------------------------------------------------------------------
     27 // Promote to max type currently follows the ANSI C rule for type
     28 // promotion in expressions.
     29 //----------------------------------------------------------------------
     30 static Scalar::Type
     31 PromoteToMaxType
     32 (
     33     const Scalar& lhs,                  // The const left hand side object
     34     const Scalar& rhs,                  // The const right hand side object
     35     Scalar& temp_value,             // A modifiable temp value than can be used to hold either the promoted lhs or rhs object
     36     const Scalar* &promoted_lhs_ptr,    // Pointer to the resulting possibly promoted value of lhs (at most one of lhs/rhs will get promoted)
     37     const Scalar* &promoted_rhs_ptr // Pointer to the resulting possibly promoted value of rhs (at most one of lhs/rhs will get promoted)
     38 )
     39 {
     40     Scalar result;
     41     // Initialize the promoted values for both the right and left hand side values
     42     // to be the objects themselves. If no promotion is needed (both right and left
     43     // have the same type), then the temp_value will not get used.
     44     promoted_lhs_ptr = &lhs;
     45     promoted_rhs_ptr = &rhs;
     46     // Extract the types of both the right and left hand side values
     47     Scalar::Type lhs_type = lhs.GetType();
     48     Scalar::Type rhs_type = rhs.GetType();
     49 
     50     if (lhs_type > rhs_type)
     51     {
     52         // Right hand side need to be promoted
     53         temp_value = rhs;                   // Copy right hand side into the temp value
     54         if (temp_value.Promote(lhs_type))   // Promote it
     55             promoted_rhs_ptr = &temp_value; // Update the pointer for the promoted right hand side
     56     }
     57     else if (lhs_type < rhs_type)
     58     {
     59         // Left hand side need to be promoted
     60         temp_value = lhs;                   // Copy left hand side value into the temp value
     61         if (temp_value.Promote(rhs_type))   // Promote it
     62             promoted_lhs_ptr = &temp_value; // Update the pointer for the promoted left hand side
     63     }
     64 
     65     // Make sure our type promotion worked as exptected
     66     if (promoted_lhs_ptr->GetType() == promoted_rhs_ptr->GetType())
     67         return promoted_lhs_ptr->GetType(); // Return the resulting max type
     68 
     69     // Return the void type (zero) if we fail to promote either of the values.
     70     return Scalar::e_void;
     71 }
     72 
     73 
     74 //----------------------------------------------------------------------
     75 // Scalar constructor
     76 //----------------------------------------------------------------------
     77 Scalar::Scalar() :
     78     m_type(e_void),
     79     m_data()
     80 {
     81 }
     82 
     83 //----------------------------------------------------------------------
     84 // Scalar copy constructor
     85 //----------------------------------------------------------------------
     86 Scalar::Scalar(const Scalar& rhs) :
     87     m_type(rhs.m_type),
     88     m_data(rhs.m_data)  // TODO: verify that for C++ this will correctly copy the union??
     89 {
     90 }
     91 
     92 //Scalar::Scalar(const RegisterValue& reg) :
     93 //  m_type(e_void),
     94 //  m_data()
     95 //{
     96 //  switch (reg.info.encoding)
     97 //  {
     98 //  case eEncodingUint:     // unsigned integer
     99 //      switch (reg.info.byte_size)
    100 //      {
    101 //      case 1: m_type = e_uint; m_data.uint = reg.value.uint8; break;
    102 //      case 2: m_type = e_uint; m_data.uint = reg.value.uint16; break;
    103 //      case 4: m_type = e_uint; m_data.uint = reg.value.uint32; break;
    104 //      case 8: m_type = e_ulonglong; m_data.ulonglong = reg.value.uint64; break;
    105 //      break;
    106 //      }
    107 //      break;
    108 //
    109 //  case eEncodingSint:     // signed integer
    110 //      switch (reg.info.byte_size)
    111 //      {
    112 //      case 1: m_type = e_sint; m_data.sint = reg.value.sint8; break;
    113 //      case 2: m_type = e_sint; m_data.sint = reg.value.sint16; break;
    114 //      case 4: m_type = e_sint; m_data.sint = reg.value.sint32; break;
    115 //      case 8: m_type = e_slonglong; m_data.slonglong = reg.value.sint64; break;
    116 //      break;
    117 //      }
    118 //      break;
    119 //
    120 //  case eEncodingIEEE754:  // float
    121 //      switch (reg.info.byte_size)
    122 //      {
    123 //      case 4: m_type = e_float; m_data.flt = reg.value.float32; break;
    124 //      case 8: m_type = e_double; m_data.dbl = reg.value.float64; break;
    125 //      break;
    126 //      }
    127 //      break;
    128 //    case eEncodingVector: // vector registers
    129 //      break;
    130 //  }
    131 //}
    132 
    133 bool
    134 Scalar::GetData (DataExtractor &data, size_t limit_byte_size) const
    135 {
    136     size_t byte_size = GetByteSize();
    137     if (byte_size > 0)
    138     {
    139         if (limit_byte_size < byte_size)
    140         {
    141             if (lldb::endian::InlHostByteOrder() == eByteOrderLittle)
    142             {
    143                 // On little endian systems if we want fewer bytes from the
    144                 // current type we just specify fewer bytes since the LSByte
    145                 // is first...
    146                 data.SetData((uint8_t*)&m_data, limit_byte_size, lldb::endian::InlHostByteOrder());
    147             }
    148             else if (lldb::endian::InlHostByteOrder() == eByteOrderBig)
    149             {
    150                 // On big endian systems if we want fewer bytes from the
    151                 // current type have to advance our initial byte pointer and
    152                 // trim down the number of bytes since the MSByte is first
    153                 data.SetData(((uint8_t*)&m_data) + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder());
    154             }
    155         }
    156         else
    157         {
    158             // We want all of the data
    159             data.SetData((uint8_t*)&m_data, byte_size, lldb::endian::InlHostByteOrder());
    160         }
    161         return true;
    162     }
    163     data.Clear();
    164     return false;
    165 }
    166 
    167 size_t
    168 Scalar::GetByteSize() const
    169 {
    170     switch (m_type)
    171     {
    172     case e_void:
    173         break;
    174     case e_sint:        return sizeof(m_data.sint);
    175     case e_uint:        return sizeof(m_data.uint);
    176     case e_slong:       return sizeof(m_data.slong);
    177     case e_ulong:       return sizeof(m_data.ulong);
    178     case e_slonglong:   return sizeof(m_data.slonglong);
    179     case e_ulonglong:   return sizeof(m_data.ulonglong);
    180     case e_float:       return sizeof(m_data.flt);
    181     case e_double:      return sizeof(m_data.dbl);
    182     case e_long_double: return sizeof(m_data.ldbl);
    183     }
    184     return 0;
    185 }
    186 
    187 bool
    188 Scalar::IsZero() const
    189 {
    190     switch (m_type)
    191     {
    192     case e_void:
    193         break;
    194     case e_sint:        return m_data.sint == 0;
    195     case e_uint:        return m_data.uint == 0;
    196     case e_slong:       return m_data.slong == 0;
    197     case e_ulong:       return m_data.ulong == 0;
    198     case e_slonglong:   return m_data.slonglong == 0;
    199     case e_ulonglong:   return m_data.ulonglong == 0;
    200     case e_float:       return m_data.flt == 0.0f;
    201     case e_double:      return m_data.dbl == 0.0;
    202     case e_long_double: return m_data.ldbl == 0.0;
    203     }
    204     return false;
    205 }
    206 
    207 void
    208 Scalar::GetValue (Stream *s, bool show_type) const
    209 {
    210     if (show_type)
    211         s->Printf("(%s) ", GetTypeAsCString());
    212 
    213     switch (m_type)
    214     {
    215     case e_void:
    216         break;
    217     case e_sint:        s->Printf("%i", m_data.sint);               break;
    218     case e_uint:        s->Printf("0x%8.8x", m_data.uint);          break;
    219     case e_slong:       s->Printf("%li", m_data.slong);             break;
    220     case e_ulong:       s->Printf("0x%8.8lx", m_data.ulong);        break;
    221     case e_slonglong:   s->Printf("%lli", m_data.slonglong);        break;
    222     case e_ulonglong:   s->Printf("0x%16.16llx", m_data.ulonglong); break;
    223     case e_float:       s->Printf("%f", m_data.flt);                break;
    224     case e_double:      s->Printf("%g", m_data.dbl);                break;
    225     case e_long_double: s->Printf("%Lg", m_data.ldbl);              break;
    226     }
    227 }
    228 
    229 const char *
    230 Scalar::GetTypeAsCString() const
    231 {
    232     switch (m_type)
    233     {
    234     case e_void:        return "void";
    235     case e_sint:        return "int";
    236     case e_uint:        return "unsigned int";
    237     case e_slong:       return "long";
    238     case e_ulong:       return "unsigned long";
    239     case e_slonglong:   return "long long";
    240     case e_ulonglong:   return "unsigned long long";
    241     case e_float:       return "float";
    242     case e_double:      return "double";
    243     case e_long_double: return "long double";
    244     }
    245     return "<invalid Scalar type>";
    246 }
    247 
    248 
    249 
    250 //----------------------------------------------------------------------
    251 // Scalar copy constructor
    252 //----------------------------------------------------------------------
    253 Scalar&
    254 Scalar::operator=(const Scalar& rhs)
    255 {
    256     if (this != &rhs)
    257     {
    258         m_type = rhs.m_type;
    259         ::memcpy (&m_data, &rhs.m_data, sizeof(m_data));
    260     }
    261     return *this;
    262 }
    263 
    264 Scalar&
    265 Scalar::operator= (const int v)
    266 {
    267     m_type = e_sint;
    268     m_data.sint = v;
    269     return *this;
    270 }
    271 
    272 
    273 Scalar&
    274 Scalar::operator= (unsigned int v)
    275 {
    276     m_type = e_uint;
    277     m_data.uint = v;
    278     return *this;
    279 }
    280 
    281 Scalar&
    282 Scalar::operator= (long v)
    283 {
    284     m_type = e_slong;
    285     m_data.slong = v;
    286     return *this;
    287 }
    288 
    289 Scalar&
    290 Scalar::operator= (unsigned long v)
    291 {
    292     m_type = e_ulong;
    293     m_data.ulong = v;
    294     return *this;
    295 }
    296 
    297 Scalar&
    298 Scalar::operator= (long long v)
    299 {
    300     m_type = e_slonglong;
    301     m_data.slonglong = v;
    302     return *this;
    303 }
    304 
    305 Scalar&
    306 Scalar::operator= (unsigned long long v)
    307 {
    308     m_type = e_ulonglong;
    309     m_data.ulonglong = v;
    310     return *this;
    311 }
    312 
    313 Scalar&
    314 Scalar::operator= (float v)
    315 {
    316     m_type = e_float;
    317     m_data.flt = v;
    318     return *this;
    319 }
    320 
    321 Scalar&
    322 Scalar::operator= (double v)
    323 {
    324     m_type = e_double;
    325     m_data.dbl = v;
    326     return *this;
    327 }
    328 
    329 Scalar&
    330 Scalar::operator= (long double v)
    331 {
    332     m_type = e_long_double;
    333     m_data.ldbl = v;
    334     return *this;
    335 }
    336 
    337 //----------------------------------------------------------------------
    338 // Destructor
    339 //----------------------------------------------------------------------
    340 Scalar::~Scalar()
    341 {
    342 }
    343 
    344 bool
    345 Scalar::Promote(Scalar::Type type)
    346 {
    347     bool success = false;
    348     switch (m_type)
    349     {
    350     case e_void:
    351         break;
    352 
    353     case e_sint:
    354         switch (type)
    355         {
    356         case e_void:        break;
    357         case e_sint:        success = true; break;
    358         case e_uint:        m_data.uint         = m_data.sint;      success = true; break;
    359         case e_slong:       m_data.slong        = m_data.sint;      success = true; break;
    360         case e_ulong:       m_data.ulong        = m_data.sint;      success = true; break;
    361         case e_slonglong:   m_data.slonglong    = m_data.sint;      success = true; break;
    362         case e_ulonglong:   m_data.ulonglong    = m_data.sint;      success = true; break;
    363         case e_float:       m_data.flt          = m_data.sint;      success = true; break;
    364         case e_double:      m_data.dbl          = m_data.sint;      success = true; break;
    365         case e_long_double: m_data.ldbl         = m_data.sint;      success = true; break;
    366         }
    367         break;
    368 
    369     case e_uint:
    370         switch (type)
    371         {
    372         case e_void:
    373         case e_sint:        break;
    374         case e_uint:        success = true; break;
    375         case e_slong:       m_data.slong        = m_data.uint;      success = true; break;
    376         case e_ulong:       m_data.ulong        = m_data.uint;      success = true; break;
    377         case e_slonglong:   m_data.slonglong    = m_data.uint;      success = true; break;
    378         case e_ulonglong:   m_data.ulonglong    = m_data.uint;      success = true; break;
    379         case e_float:       m_data.flt          = m_data.uint;      success = true; break;
    380         case e_double:      m_data.dbl          = m_data.uint;      success = true; break;
    381         case e_long_double: m_data.ldbl         = m_data.uint;      success = true; break;
    382         }
    383         break;
    384 
    385     case e_slong:
    386         switch (type)
    387         {
    388         case e_void:
    389         case e_sint:
    390         case e_uint:        break;
    391         case e_slong:       success = true; break;
    392         case e_ulong:       m_data.ulong        = m_data.slong;     success = true; break;
    393         case e_slonglong:   m_data.slonglong    = m_data.slong;     success = true; break;
    394         case e_ulonglong:   m_data.ulonglong    = m_data.slong;     success = true; break;
    395         case e_float:       m_data.flt          = m_data.slong;     success = true; break;
    396         case e_double:      m_data.dbl          = m_data.slong;     success = true; break;
    397         case e_long_double: m_data.ldbl         = m_data.slong;     success = true; break;
    398         }
    399         break;
    400 
    401     case e_ulong:
    402         switch (type)
    403         {
    404         case e_void:
    405         case e_sint:
    406         case e_uint:
    407         case e_slong:       break;
    408         case e_ulong:       success = true; break;
    409         case e_slonglong:   m_data.slonglong    = m_data.ulong;     success = true; break;
    410         case e_ulonglong:   m_data.ulonglong    = m_data.ulong;     success = true; break;
    411         case e_float:       m_data.flt          = m_data.ulong;     success = true; break;
    412         case e_double:      m_data.dbl          = m_data.ulong;     success = true; break;
    413         case e_long_double: m_data.ldbl         = m_data.ulong;     success = true; break;
    414         }
    415         break;
    416 
    417     case e_slonglong:
    418         switch (type)
    419         {
    420         case e_void:
    421         case e_sint:
    422         case e_uint:
    423         case e_slong:
    424         case e_ulong:       break;
    425         case e_slonglong:   success = true; break;
    426         case e_ulonglong:   m_data.ulonglong    = m_data.slonglong;     success = true; break;
    427         case e_float:       m_data.flt          = m_data.slonglong;     success = true; break;
    428         case e_double:      m_data.dbl          = m_data.slonglong;     success = true; break;
    429         case e_long_double: m_data.ldbl         = m_data.slonglong;     success = true; break;
    430         }
    431         break;
    432 
    433     case e_ulonglong:
    434         switch (type)
    435         {
    436         case e_void:
    437         case e_sint:
    438         case e_uint:
    439         case e_slong:
    440         case e_ulong:
    441         case e_slonglong:   break;
    442         case e_ulonglong:   success = true; break;
    443         case e_float:       m_data.flt          = m_data.ulonglong;     success = true; break;
    444         case e_double:      m_data.dbl          = m_data.ulonglong;     success = true; break;
    445         case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
    446         }
    447         break;
    448 
    449     case e_float:
    450         switch (type)
    451         {
    452         case e_void:
    453         case e_sint:
    454         case e_uint:
    455         case e_slong:
    456         case e_ulong:
    457         case e_slonglong:
    458         case e_ulonglong:   break;
    459         case e_float:       success = true; break;
    460         case e_double:      m_data.dbl          = m_data.flt;           success = true; break;
    461         case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
    462         }
    463         break;
    464 
    465     case e_double:
    466         switch (type)
    467         {
    468         case e_void:
    469         case e_sint:
    470         case e_uint:
    471         case e_slong:
    472         case e_ulong:
    473         case e_slonglong:
    474         case e_ulonglong:
    475         case e_float:       break;
    476         case e_double:      success = true; break;
    477         case e_long_double: m_data.ldbl         = m_data.dbl;       success = true; break;
    478         }
    479         break;
    480 
    481     case e_long_double:
    482         switch (type)
    483         {
    484         case e_void:
    485         case e_sint:
    486         case e_uint:
    487         case e_slong:
    488         case e_ulong:
    489         case e_slonglong:
    490         case e_ulonglong:
    491         case e_float:
    492         case e_double:      break;
    493         case e_long_double: success = true; break;
    494         }
    495         break;
    496     }
    497 
    498     if (success)
    499         m_type = type;
    500     return success;
    501 }
    502 
    503 const char *
    504 Scalar::GetValueTypeAsCString (Scalar::Type type)
    505 {
    506     switch (type)
    507     {
    508     case e_void:        return "void";
    509     case e_sint:        return "int";
    510     case e_uint:        return "unsigned int";
    511     case e_slong:       return "long";
    512     case e_ulong:       return "unsigned long";
    513     case e_slonglong:   return "long long";
    514     case e_ulonglong:   return "unsigned long long";
    515     case e_float:       return "float";
    516     case e_double:      return "double";
    517     case e_long_double: return "long double";
    518     }
    519     return "???";
    520 }
    521 
    522 
    523 Scalar::Type
    524 Scalar::GetValueTypeForSignedIntegerWithByteSize (size_t byte_size)
    525 {
    526     if (byte_size <= sizeof(sint_t))
    527         return e_sint;
    528     if (byte_size <= sizeof(slong_t))
    529         return e_slong;
    530     if (byte_size <= sizeof(slonglong_t))
    531         return e_slonglong;
    532     return e_void;
    533 }
    534 
    535 Scalar::Type
    536 Scalar::GetValueTypeForUnsignedIntegerWithByteSize (size_t byte_size)
    537 {
    538     if (byte_size <= sizeof(uint_t))
    539         return e_uint;
    540     if (byte_size <= sizeof(ulong_t))
    541         return e_ulong;
    542     if (byte_size <= sizeof(ulonglong_t))
    543         return e_ulonglong;
    544     return e_void;
    545 }
    546 
    547 Scalar::Type
    548 Scalar::GetValueTypeForFloatWithByteSize (size_t byte_size)
    549 {
    550     if (byte_size == sizeof(float_t))
    551         return e_float;
    552     if (byte_size == sizeof(double_t))
    553         return e_double;
    554     if (byte_size == sizeof(long_double_t))
    555         return e_long_double;
    556     return e_void;
    557 }
    558 
    559 bool
    560 Scalar::Cast(Scalar::Type type)
    561 {
    562     bool success = false;
    563     switch (m_type)
    564     {
    565     case e_void:
    566         break;
    567 
    568     case e_sint:
    569         switch (type)
    570         {
    571         case e_void:        break;
    572         case e_sint:        success = true; break;
    573         case e_uint:        m_data.uint         = m_data.sint;      success = true; break;
    574         case e_slong:       m_data.slong        = m_data.sint;      success = true; break;
    575         case e_ulong:       m_data.ulong        = m_data.sint;      success = true; break;
    576         case e_slonglong:   m_data.slonglong    = m_data.sint;      success = true; break;
    577         case e_ulonglong:   m_data.ulonglong    = m_data.sint;      success = true; break;
    578         case e_float:       m_data.flt          = m_data.sint;      success = true; break;
    579         case e_double:      m_data.dbl          = m_data.sint;      success = true; break;
    580         case e_long_double: m_data.ldbl         = m_data.sint;      success = true; break;
    581         }
    582         break;
    583 
    584     case e_uint:
    585         switch (type)
    586         {
    587         case e_void:
    588         case e_sint:        m_data.sint         = m_data.uint;      success = true; break;
    589         case e_uint:        success = true; break;
    590         case e_slong:       m_data.slong        = m_data.uint;      success = true; break;
    591         case e_ulong:       m_data.ulong        = m_data.uint;      success = true; break;
    592         case e_slonglong:   m_data.slonglong    = m_data.uint;      success = true; break;
    593         case e_ulonglong:   m_data.ulonglong    = m_data.uint;      success = true; break;
    594         case e_float:       m_data.flt          = m_data.uint;      success = true; break;
    595         case e_double:      m_data.dbl          = m_data.uint;      success = true; break;
    596         case e_long_double: m_data.ldbl         = m_data.uint;      success = true; break;
    597         }
    598         break;
    599 
    600     case e_slong:
    601         switch (type)
    602         {
    603         case e_void:
    604         case e_sint:        m_data.sint         = (sint_t)m_data.slong;     success = true; break;
    605         case e_uint:        m_data.uint         = (uint_t)m_data.slong;     success = true; break;
    606         case e_slong:       success = true; break;
    607         case e_ulong:       m_data.ulong        = m_data.slong;     success = true; break;
    608         case e_slonglong:   m_data.slonglong    = m_data.slong;     success = true; break;
    609         case e_ulonglong:   m_data.ulonglong    = m_data.slong;     success = true; break;
    610         case e_float:       m_data.flt          = m_data.slong;     success = true; break;
    611         case e_double:      m_data.dbl          = m_data.slong;     success = true; break;
    612         case e_long_double: m_data.ldbl         = m_data.slong;     success = true; break;
    613         }
    614         break;
    615 
    616     case e_ulong:
    617         switch (type)
    618         {
    619         case e_void:
    620         case e_sint:        m_data.sint         = (sint_t)m_data.ulong;     success = true; break;
    621         case e_uint:        m_data.uint         = (uint_t)m_data.ulong;     success = true; break;
    622         case e_slong:       m_data.slong        = m_data.ulong;     success = true; break;
    623         case e_ulong:       success = true; break;
    624         case e_slonglong:   m_data.slonglong    = m_data.ulong;     success = true; break;
    625         case e_ulonglong:   m_data.ulonglong    = m_data.ulong;     success = true; break;
    626         case e_float:       m_data.flt          = m_data.ulong;     success = true; break;
    627         case e_double:      m_data.dbl          = m_data.ulong;     success = true; break;
    628         case e_long_double: m_data.ldbl         = m_data.ulong;     success = true; break;
    629         }
    630         break;
    631 
    632     case e_slonglong:
    633         switch (type)
    634         {
    635         case e_void:
    636         case e_sint:        m_data.sint         = (sint_t)m_data.slonglong;     success = true; break;
    637         case e_uint:        m_data.uint         = (uint_t)m_data.slonglong;     success = true; break;
    638         case e_slong:       m_data.slong        = m_data.slonglong;     success = true; break;
    639         case e_ulong:       m_data.ulong        = m_data.slonglong;     success = true; break;
    640         case e_slonglong:   success = true; break;
    641         case e_ulonglong:   m_data.ulonglong    = m_data.slonglong;     success = true; break;
    642         case e_float:       m_data.flt          = m_data.slonglong;     success = true; break;
    643         case e_double:      m_data.dbl          = m_data.slonglong;     success = true; break;
    644         case e_long_double: m_data.ldbl         = m_data.slonglong;     success = true; break;
    645         }
    646         break;
    647 
    648     case e_ulonglong:
    649         switch (type)
    650         {
    651         case e_void:
    652         case e_sint:        m_data.sint         = (sint_t)m_data.ulonglong;     success = true; break;
    653         case e_uint:        m_data.uint         = (uint_t)m_data.ulonglong;     success = true; break;
    654         case e_slong:       m_data.slong        = m_data.ulonglong;     success = true; break;
    655         case e_ulong:       m_data.ulong        = m_data.ulonglong;     success = true; break;
    656         case e_slonglong:   m_data.slonglong    = m_data.ulonglong;     success = true; break;
    657         case e_ulonglong:   success = true; break;
    658         case e_float:       m_data.flt          = m_data.ulonglong;     success = true; break;
    659         case e_double:      m_data.dbl          = m_data.ulonglong;     success = true; break;
    660         case e_long_double: m_data.ldbl         = m_data.ulonglong;     success = true; break;
    661         }
    662         break;
    663 
    664     case e_float:
    665         switch (type)
    666         {
    667         case e_void:
    668         case e_sint:        m_data.sint         = (sint_t)m_data.flt;       success = true; break;
    669         case e_uint:        m_data.uint         = (uint_t)m_data.flt;       success = true; break;
    670         case e_slong:       m_data.slong        = (slong_t)m_data.flt;      success = true; break;
    671         case e_ulong:       m_data.ulong        = (ulong_t)m_data.flt;      success = true; break;
    672         case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.flt;  success = true; break;
    673         case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.flt;  success = true; break;
    674         case e_float:       success = true; break;
    675         case e_double:      m_data.dbl          = m_data.flt;               success = true; break;
    676         case e_long_double: m_data.ldbl         = m_data.flt;               success = true; break;
    677         }
    678         break;
    679 
    680     case e_double:
    681         switch (type)
    682         {
    683         case e_void:
    684         case e_sint:        m_data.sint         = (sint_t)m_data.dbl;       success = true; break;
    685         case e_uint:        m_data.uint         = (uint_t)m_data.dbl;       success = true; break;
    686         case e_slong:       m_data.slong        = (slong_t)m_data.dbl;      success = true; break;
    687         case e_ulong:       m_data.ulong        = (ulong_t)m_data.dbl;      success = true; break;
    688         case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.dbl;  success = true; break;
    689         case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.dbl;  success = true; break;
    690         case e_float:       m_data.flt          = (float_t)m_data.dbl;      success = true; break;
    691         case e_double:      success = true; break;
    692         case e_long_double: m_data.ldbl         = m_data.dbl;               success = true; break;
    693         }
    694         break;
    695 
    696     case e_long_double:
    697         switch (type)
    698         {
    699         case e_void:
    700         case e_sint:        m_data.sint         = (sint_t)m_data.ldbl;      success = true; break;
    701         case e_uint:        m_data.uint         = (uint_t)m_data.ldbl;      success = true; break;
    702         case e_slong:       m_data.slong        = (slong_t)m_data.ldbl;     success = true; break;
    703         case e_ulong:       m_data.ulong        = (ulong_t)m_data.ldbl;     success = true; break;
    704         case e_slonglong:   m_data.slonglong    = (slonglong_t)m_data.ldbl; success = true; break;
    705         case e_ulonglong:   m_data.ulonglong    = (ulonglong_t)m_data.ldbl; success = true; break;
    706         case e_float:       m_data.flt          = (float_t)m_data.ldbl;     success = true; break;
    707         case e_double:      m_data.dbl          = (double_t)m_data.ldbl;    success = true; break;
    708         case e_long_double: success = true; break;
    709         }
    710         break;
    711     }
    712 
    713     if (success)
    714         m_type = type;
    715     return success;
    716 }
    717 
    718 bool
    719 Scalar::MakeSigned ()
    720 {
    721     bool success = false;
    722 
    723     switch (m_type)
    724     {
    725     case e_void:                                break;
    726     case e_sint:                                success = true; break;
    727     case e_uint:        m_type = e_sint;        success = true; break;
    728     case e_slong:                               success = true; break;
    729     case e_ulong:       m_type = e_slong;       success = true; break;
    730     case e_slonglong:                           success = true; break;
    731     case e_ulonglong:   m_type = e_slonglong;   success = true; break;
    732     case e_float:                               success = true; break;
    733     case e_double:                              success = true; break;
    734     case e_long_double:                         success = true; break;
    735     }
    736 
    737     return success;
    738 }
    739 
    740 int
    741 Scalar::SInt(int fail_value) const
    742 {
    743     switch (m_type)
    744     {
    745     case e_void:        break;
    746     case e_sint:        return m_data.sint;
    747     case e_uint:        return (int)m_data.uint;
    748     case e_slong:       return (int)m_data.slong;
    749     case e_ulong:       return (int)m_data.ulong;
    750     case e_slonglong:   return (int)m_data.slonglong;
    751     case e_ulonglong:   return (int)m_data.ulonglong;
    752     case e_float:       return (int)m_data.flt;
    753     case e_double:      return (int)m_data.dbl;
    754     case e_long_double: return (int)m_data.ldbl;
    755     }
    756     return fail_value;
    757 }
    758 
    759 unsigned int
    760 Scalar::UInt(unsigned int fail_value) const
    761 {
    762     switch (m_type)
    763     {
    764     case e_void:        break;
    765     case e_sint:        return (unsigned int)m_data.sint;
    766     case e_uint:        return (unsigned int)m_data.uint;
    767     case e_slong:       return (unsigned int)m_data.slong;
    768     case e_ulong:       return (unsigned int)m_data.ulong;
    769     case e_slonglong:   return (unsigned int)m_data.slonglong;
    770     case e_ulonglong:   return (unsigned int)m_data.ulonglong;
    771     case e_float:       return (unsigned int)m_data.flt;
    772     case e_double:      return (unsigned int)m_data.dbl;
    773     case e_long_double: return (unsigned int)m_data.ldbl;
    774     }
    775     return fail_value;
    776 }
    777 
    778 
    779 long
    780 Scalar::SLong(long fail_value) const
    781 {
    782     switch (m_type)
    783     {
    784     case e_void:        break;
    785     case e_sint:        return (long)m_data.sint;
    786     case e_uint:        return (long)m_data.uint;
    787     case e_slong:       return (long)m_data.slong;
    788     case e_ulong:       return (long)m_data.ulong;
    789     case e_slonglong:   return (long)m_data.slonglong;
    790     case e_ulonglong:   return (long)m_data.ulonglong;
    791     case e_float:       return (long)m_data.flt;
    792     case e_double:      return (long)m_data.dbl;
    793     case e_long_double: return (long)m_data.ldbl;
    794     }
    795     return fail_value;
    796 }
    797 
    798 
    799 
    800 unsigned long
    801 Scalar::ULong(unsigned long fail_value) const
    802 {
    803     switch (m_type)
    804     {
    805     case e_void:        break;
    806     case e_sint:        return (unsigned long)m_data.sint;
    807     case e_uint:        return (unsigned long)m_data.uint;
    808     case e_slong:       return (unsigned long)m_data.slong;
    809     case e_ulong:       return (unsigned long)m_data.ulong;
    810     case e_slonglong:   return (unsigned long)m_data.slonglong;
    811     case e_ulonglong:   return (unsigned long)m_data.ulonglong;
    812     case e_float:       return (unsigned long)m_data.flt;
    813     case e_double:      return (unsigned long)m_data.dbl;
    814     case e_long_double: return (unsigned long)m_data.ldbl;
    815     }
    816     return fail_value;
    817 }
    818 
    819 uint64_t
    820 Scalar::GetRawBits64(uint64_t fail_value) const
    821 {
    822     switch (m_type)
    823     {
    824     case e_void:
    825         break;
    826 
    827     case e_sint:
    828     case e_uint:
    829         return m_data.uint;
    830 
    831     case e_slong:
    832     case e_ulong:
    833         return m_data.ulong;
    834 
    835     case e_slonglong:
    836     case e_ulonglong:
    837         return m_data.ulonglong;
    838 
    839     case e_float:
    840         if (sizeof(m_data.flt) == sizeof(m_data.uint))
    841             return m_data.uint;
    842         else if (sizeof(m_data.flt) == sizeof(m_data.ulong))
    843             return m_data.ulong;
    844         else if (sizeof(m_data.flt) == sizeof(m_data.ulonglong))
    845             return m_data.ulonglong;
    846         break;
    847 
    848     case e_double:
    849         if (sizeof(m_data.dbl) == sizeof(m_data.uint))
    850             return m_data.uint;
    851         else if (sizeof(m_data.dbl) == sizeof(m_data.ulong))
    852             return m_data.ulong;
    853         else if (sizeof(m_data.dbl) == sizeof(m_data.ulonglong))
    854             return m_data.ulonglong;
    855         break;
    856 
    857     case e_long_double:
    858         if (sizeof(m_data.ldbl) == sizeof(m_data.uint))
    859             return m_data.uint;
    860         else if (sizeof(m_data.ldbl) == sizeof(m_data.ulong))
    861             return m_data.ulong;
    862         else if (sizeof(m_data.ldbl) == sizeof(m_data.ulonglong))
    863             return m_data.ulonglong;
    864         break;
    865     }
    866     return fail_value;
    867 }
    868 
    869 
    870 
    871 long long
    872 Scalar::SLongLong(long long fail_value) const
    873 {
    874     switch (m_type)
    875     {
    876     case e_void:        break;
    877     case e_sint:        return (long long)m_data.sint;
    878     case e_uint:        return (long long)m_data.uint;
    879     case e_slong:       return (long long)m_data.slong;
    880     case e_ulong:       return (long long)m_data.ulong;
    881     case e_slonglong:   return (long long)m_data.slonglong;
    882     case e_ulonglong:   return (long long)m_data.ulonglong;
    883     case e_float:       return (long long)m_data.flt;
    884     case e_double:      return (long long)m_data.dbl;
    885     case e_long_double: return (long long)m_data.ldbl;
    886     }
    887     return fail_value;
    888 }
    889 
    890 
    891 unsigned long long
    892 Scalar::ULongLong(unsigned long long fail_value) const
    893 {
    894     switch (m_type)
    895     {
    896     case e_void:        break;
    897     case e_sint:        return (unsigned long long)m_data.sint;
    898     case e_uint:        return (unsigned long long)m_data.uint;
    899     case e_slong:       return (unsigned long long)m_data.slong;
    900     case e_ulong:       return (unsigned long long)m_data.ulong;
    901     case e_slonglong:   return (unsigned long long)m_data.slonglong;
    902     case e_ulonglong:   return (unsigned long long)m_data.ulonglong;
    903     case e_float:       return (unsigned long long)m_data.flt;
    904     case e_double:      return (unsigned long long)m_data.dbl;
    905     case e_long_double: return (unsigned long long)m_data.ldbl;
    906     }
    907     return fail_value;
    908 }
    909 
    910 
    911 float
    912 Scalar::Float(float fail_value) const
    913 {
    914     switch (m_type)
    915     {
    916     case e_void:        break;
    917     case e_sint:        return (float)m_data.sint;
    918     case e_uint:        return (float)m_data.uint;
    919     case e_slong:       return (float)m_data.slong;
    920     case e_ulong:       return (float)m_data.ulong;
    921     case e_slonglong:   return (float)m_data.slonglong;
    922     case e_ulonglong:   return (float)m_data.ulonglong;
    923     case e_float:       return (float)m_data.flt;
    924     case e_double:      return (float)m_data.dbl;
    925     case e_long_double: return (float)m_data.ldbl;
    926     }
    927     return fail_value;
    928 }
    929 
    930 
    931 double
    932 Scalar::Double(double fail_value) const
    933 {
    934     switch (m_type)
    935     {
    936     case e_void:        break;
    937     case e_sint:        return (double)m_data.sint;
    938     case e_uint:        return (double)m_data.uint;
    939     case e_slong:       return (double)m_data.slong;
    940     case e_ulong:       return (double)m_data.ulong;
    941     case e_slonglong:   return (double)m_data.slonglong;
    942     case e_ulonglong:   return (double)m_data.ulonglong;
    943     case e_float:       return (double)m_data.flt;
    944     case e_double:      return (double)m_data.dbl;
    945     case e_long_double: return (double)m_data.ldbl;
    946     }
    947     return fail_value;
    948 }
    949 
    950 
    951 long double
    952 Scalar::LongDouble(long double fail_value) const
    953 {
    954     switch (m_type)
    955     {
    956     case e_void:        break;
    957     case e_sint:        return (long double)m_data.sint;
    958     case e_uint:        return (long double)m_data.uint;
    959     case e_slong:       return (long double)m_data.slong;
    960     case e_ulong:       return (long double)m_data.ulong;
    961     case e_slonglong:   return (long double)m_data.slonglong;
    962     case e_ulonglong:   return (long double)m_data.ulonglong;
    963     case e_float:       return (long double)m_data.flt;
    964     case e_double:      return (long double)m_data.dbl;
    965     case e_long_double: return (long double)m_data.ldbl;
    966     }
    967     return fail_value;
    968 }
    969 
    970 
    971 Scalar&
    972 Scalar::operator+= (const Scalar& rhs)
    973 {
    974     Scalar temp_value;
    975     const Scalar* a;
    976     const Scalar* b;
    977     if ((m_type = PromoteToMaxType(*this, rhs, temp_value, a, b)) != Scalar::e_void)
    978     {
    979         switch (m_type)
    980         {
    981         case e_void:        break;
    982         case e_sint:        m_data.sint         = a->m_data.sint        + b->m_data.sint;       break;
    983         case e_uint:        m_data.uint         = a->m_data.uint        + b->m_data.uint;       break;
    984         case e_slong:       m_data.slong        = a->m_data.slong       + b->m_data.slong;      break;
    985         case e_ulong:       m_data.ulong        = a->m_data.ulong       + b->m_data.ulong;      break;
    986         case e_slonglong:   m_data.slonglong    = a->m_data.slonglong   + b->m_data.slonglong;  break;
    987         case e_ulonglong:   m_data.ulonglong    = a->m_data.ulonglong   + b->m_data.ulonglong;  break;
    988         case e_float:       m_data.flt          = a->m_data.flt         + b->m_data.flt;        break;
    989         case e_double:      m_data.dbl          = a->m_data.dbl         + b->m_data.dbl;        break;
    990         case e_long_double: m_data.ldbl         = a->m_data.ldbl        + b->m_data.ldbl;       break;
    991         }
    992     }
    993     return *this;
    994 }
    995 
    996 Scalar&
    997 Scalar::operator<<= (const Scalar& rhs)
    998 {
    999     switch (m_type)
   1000     {
   1001     case e_void:
   1002     case e_float:
   1003     case e_double:
   1004     case e_long_double:
   1005         m_type = e_void;
   1006         break;
   1007 
   1008     case e_sint:
   1009         switch (rhs.m_type)
   1010         {
   1011         case e_void:
   1012         case e_float:
   1013         case e_double:
   1014         case e_long_double:
   1015             m_type = e_void;
   1016             break;
   1017         case e_sint:            m_data.sint <<= rhs.m_data.sint;        break;
   1018         case e_uint:            m_data.sint <<= rhs.m_data.uint;        break;
   1019         case e_slong:           m_data.sint <<= rhs.m_data.slong;       break;
   1020         case e_ulong:           m_data.sint <<= rhs.m_data.ulong;       break;
   1021         case e_slonglong:       m_data.sint <<= rhs.m_data.slonglong;   break;
   1022         case e_ulonglong:       m_data.sint <<= rhs.m_data.ulonglong;   break;
   1023         }
   1024         break;
   1025 
   1026     case e_uint:
   1027         switch (rhs.m_type)
   1028         {
   1029         case e_void:
   1030         case e_float:
   1031         case e_double:
   1032         case e_long_double:
   1033             m_type = e_void;
   1034             break;
   1035         case e_sint:            m_data.uint <<= rhs.m_data.sint;        break;
   1036         case e_uint:            m_data.uint <<= rhs.m_data.uint;        break;
   1037         case e_slong:           m_data.uint <<= rhs.m_data.slong;       break;
   1038         case e_ulong:           m_data.uint <<= rhs.m_data.ulong;       break;
   1039         case e_slonglong:       m_data.uint <<= rhs.m_data.slonglong;   break;
   1040         case e_ulonglong:       m_data.uint <<= rhs.m_data.ulonglong;   break;
   1041         }
   1042         break;
   1043 
   1044     case e_slong:
   1045         switch (rhs.m_type)
   1046         {
   1047         case e_void:
   1048         case e_float:
   1049         case e_double:
   1050         case e_long_double:
   1051             m_type = e_void;
   1052             break;
   1053         case e_sint:            m_data.slong <<= rhs.m_data.sint;       break;
   1054         case e_uint:            m_data.slong <<= rhs.m_data.uint;       break;
   1055         case e_slong:           m_data.slong <<= rhs.m_data.slong;      break;
   1056         case e_ulong:           m_data.slong <<= rhs.m_data.ulong;      break;
   1057         case e_slonglong:       m_data.slong <<= rhs.m_data.slonglong;  break;
   1058         case e_ulonglong:       m_data.slong <<= rhs.m_data.ulonglong;  break;
   1059         }
   1060         break;
   1061 
   1062     case e_ulong:
   1063         switch (rhs.m_type)
   1064         {
   1065         case e_void:
   1066         case e_float:
   1067         case e_double:
   1068         case e_long_double:
   1069             m_type = e_void;
   1070             break;
   1071         case e_sint:            m_data.ulong <<= rhs.m_data.sint;       break;
   1072         case e_uint:            m_data.ulong <<= rhs.m_data.uint;       break;
   1073         case e_slong:           m_data.ulong <<= rhs.m_data.slong;      break;
   1074         case e_ulong:           m_data.ulong <<= rhs.m_data.ulong;      break;
   1075         case e_slonglong:       m_data.ulong <<= rhs.m_data.slonglong;  break;
   1076         case e_ulonglong:       m_data.ulong <<= rhs.m_data.ulonglong;  break;
   1077         }
   1078         break;
   1079     case e_slonglong:
   1080         switch (rhs.m_type)
   1081         {
   1082         case e_void:
   1083         case e_float:
   1084         case e_double:
   1085         case e_long_double:
   1086             m_type = e_void;
   1087             break;
   1088         case e_sint:            m_data.slonglong <<= rhs.m_data.sint;       break;
   1089         case e_uint:            m_data.slonglong <<= rhs.m_data.uint;       break;
   1090         case e_slong:           m_data.slonglong <<= rhs.m_data.slong;      break;
   1091         case e_ulong:           m_data.slonglong <<= rhs.m_data.ulong;      break;
   1092         case e_slonglong:       m_data.slonglong <<= rhs.m_data.slonglong;  break;
   1093         case e_ulonglong:       m_data.slonglong <<= rhs.m_data.ulonglong;  break;
   1094         }
   1095         break;
   1096 
   1097     case e_ulonglong:
   1098         switch (rhs.m_type)
   1099         {
   1100         case e_void:
   1101         case e_float:
   1102         case e_double:
   1103         case e_long_double:
   1104             m_type = e_void;
   1105             break;
   1106         case e_sint:            m_data.ulonglong <<= rhs.m_data.sint;       break;
   1107         case e_uint:            m_data.ulonglong <<= rhs.m_data.uint;       break;
   1108         case e_slong:           m_data.ulonglong <<= rhs.m_data.slong;      break;
   1109         case e_ulong:           m_data.ulonglong <<= rhs.m_data.ulong;      break;
   1110         case e_slonglong:       m_data.ulonglong <<= rhs.m_data.slonglong;  break;
   1111         case e_ulonglong:       m_data.ulonglong <<= rhs.m_data.ulonglong;  break;
   1112         }
   1113         break;
   1114     }
   1115     return *this;
   1116 }
   1117 
   1118 bool
   1119 Scalar::ShiftRightLogical(const Scalar& rhs)
   1120 {
   1121     switch (m_type)
   1122     {
   1123     case e_void:
   1124     case e_float:
   1125     case e_double:
   1126     case e_long_double:
   1127         m_type = e_void;
   1128         break;
   1129 
   1130     case e_sint:
   1131     case e_uint:
   1132         switch (rhs.m_type)
   1133         {
   1134         case e_void:
   1135         case e_float:
   1136         case e_double:
   1137         case e_long_double:
   1138             m_type = e_void;
   1139             break;
   1140         case e_sint:            m_data.uint >>= rhs.m_data.sint;        break;
   1141         case e_uint:            m_data.uint >>= rhs.m_data.uint;        break;
   1142         case e_slong:           m_data.uint >>= rhs.m_data.slong;       break;
   1143         case e_ulong:           m_data.uint >>= rhs.m_data.ulong;       break;
   1144         case e_slonglong:       m_data.uint >>= rhs.m_data.slonglong;   break;
   1145         case e_ulonglong:       m_data.uint >>= rhs.m_data.ulonglong;   break;
   1146         }
   1147         break;
   1148 
   1149     case e_slong:
   1150     case e_ulong:
   1151         switch (rhs.m_type)
   1152         {
   1153         case e_void:
   1154         case e_float:
   1155         case e_double:
   1156         case e_long_double:
   1157             m_type = e_void;
   1158             break;
   1159         case e_sint:            m_data.ulong >>= rhs.m_data.sint;       break;
   1160         case e_uint:            m_data.ulong >>= rhs.m_data.uint;       break;
   1161         case e_slong:           m_data.ulong >>= rhs.m_data.slong;      break;
   1162         case e_ulong:           m_data.ulong >>= rhs.m_data.ulong;      break;
   1163         case e_slonglong:       m_data.ulong >>= rhs.m_data.slonglong;  break;
   1164         case e_ulonglong:       m_data.ulong >>= rhs.m_data.ulonglong;  break;
   1165         }
   1166         break;
   1167 
   1168     case e_slonglong:
   1169     case e_ulonglong:
   1170         switch (rhs.m_type)
   1171         {
   1172         case e_void:
   1173         case e_float:
   1174         case e_double:
   1175         case e_long_double:
   1176             m_type = e_void;
   1177             break;
   1178         case e_sint:            m_data.ulonglong >>= rhs.m_data.sint;       break;
   1179         case e_uint:            m_data.ulonglong >>= rhs.m_data.uint;       break;
   1180         case e_slong:           m_data.ulonglong >>= rhs.m_data.slong;      break;
   1181         case e_ulong:           m_data.ulonglong >>= rhs.m_data.ulong;      break;
   1182         case e_slonglong:       m_data.ulonglong >>= rhs.m_data.slonglong;  break;
   1183         case e_ulonglong:       m_data.ulonglong >>= rhs.m_data.ulonglong;  break;
   1184         }
   1185         break;
   1186     }
   1187     return m_type != e_void;
   1188 }
   1189 
   1190 
   1191 Scalar&
   1192 Scalar::operator>>= (const Scalar& rhs)
   1193 {
   1194     switch (m_type)
   1195     {
   1196     case e_void:
   1197     case e_float:
   1198     case e_double:
   1199     case e_long_double:
   1200         m_type = e_void;
   1201         break;
   1202 
   1203     case e_sint:
   1204         switch (rhs.m_type)
   1205         {
   1206         case e_void:
   1207         case e_float:
   1208         case e_double:
   1209         case e_long_double:
   1210             m_type = e_void;
   1211             break;
   1212         case e_sint:            m_data.sint >>= rhs.m_data.sint;        break;
   1213         case e_uint:            m_data.sint >>= rhs.m_data.uint;        break;
   1214         case e_slong:           m_data.sint >>= rhs.m_data.slong;       break;
   1215         case e_ulong:           m_data.sint >>= rhs.m_data.ulong;       break;
   1216         case e_slonglong:       m_data.sint >>= rhs.m_data.slonglong;   break;
   1217         case e_ulonglong:       m_data.sint >>= rhs.m_data.ulonglong;   break;
   1218         }
   1219         break;
   1220 
   1221     case e_uint:
   1222         switch (rhs.m_type)
   1223         {
   1224         case e_void:
   1225         case e_float:
   1226         case e_double:
   1227         case e_long_double:
   1228             m_type = e_void;
   1229             break;
   1230         case e_sint:            m_data.uint >>= rhs.m_data.sint;        break;
   1231         case e_uint:            m_data.uint >>= rhs.m_data.uint;        break;
   1232         case e_slong:           m_data.uint >>= rhs.m_data.slong;       break;
   1233         case e_ulong:           m_data.uint >>= rhs.m_data.ulong;       break;
   1234         case e_slonglong:       m_data.uint >>= rhs.m_data.slonglong;   break;
   1235         case e_ulonglong:       m_data.uint >>= rhs.m_data.ulonglong;   break;
   1236         }
   1237         break;
   1238 
   1239     case e_slong:
   1240         switch (rhs.m_type)
   1241         {
   1242         case e_void:
   1243         case e_float:
   1244         case e_double:
   1245         case e_long_double:
   1246             m_type = e_void;
   1247             break;
   1248         case e_sint:            m_data.slong >>= rhs.m_data.sint;       break;
   1249         case e_uint:            m_data.slong >>= rhs.m_data.uint;       break;
   1250         case e_slong:           m_data.slong >>= rhs.m_data.slong;      break;
   1251         case e_ulong:           m_data.slong >>= rhs.m_data.ulong;      break;
   1252         case e_slonglong:       m_data.slong >>= rhs.m_data.slonglong;  break;
   1253         case e_ulonglong:       m_data.slong >>= rhs.m_data.ulonglong;  break;
   1254         }
   1255         break;
   1256 
   1257     case e_ulong:
   1258         switch (rhs.m_type)
   1259         {
   1260         case e_void:
   1261         case e_float:
   1262         case e_double:
   1263         case e_long_double:
   1264             m_type = e_void;
   1265             break;
   1266         case e_sint:            m_data.ulong >>= rhs.m_data.sint;       break;
   1267         case e_uint:            m_data.ulong >>= rhs.m_data.uint;       break;
   1268         case e_slong:           m_data.ulong >>= rhs.m_data.slong;      break;
   1269         case e_ulong:           m_data.ulong >>= rhs.m_data.ulong;      break;
   1270         case e_slonglong:       m_data.ulong >>= rhs.m_data.slonglong;  break;
   1271         case e_ulonglong:       m_data.ulong >>= rhs.m_data.ulonglong;  break;
   1272         }
   1273         break;
   1274     case e_slonglong:
   1275         switch (rhs.m_type)
   1276         {
   1277         case e_void:
   1278         case e_float:
   1279         case e_double:
   1280         case e_long_double:
   1281             m_type = e_void;
   1282             break;
   1283         case e_sint:            m_data.slonglong >>= rhs.m_data.sint;       break;
   1284         case e_uint:            m_data.slonglong >>= rhs.m_data.uint;       break;
   1285         case e_slong:           m_data.slonglong >>= rhs.m_data.slong;      break;
   1286         case e_ulong:           m_data.slonglong >>= rhs.m_data.ulong;      break;
   1287         case e_slonglong:       m_data.slonglong >>= rhs.m_data.slonglong;  break;
   1288         case e_ulonglong:       m_data.slonglong >>= rhs.m_data.ulonglong;  break;
   1289         }
   1290         break;
   1291 
   1292     case e_ulonglong:
   1293         switch (rhs.m_type)
   1294         {
   1295         case e_void:
   1296         case e_float:
   1297         case e_double:
   1298         case e_long_double:
   1299             m_type = e_void;
   1300             break;
   1301         case e_sint:            m_data.ulonglong >>= rhs.m_data.sint;       break;
   1302         case e_uint:            m_data.ulonglong >>= rhs.m_data.uint;       break;
   1303         case e_slong:           m_data.ulonglong >>= rhs.m_data.slong;      break;
   1304         case e_ulong:           m_data.ulonglong >>= rhs.m_data.ulong;      break;
   1305         case e_slonglong:       m_data.ulonglong >>= rhs.m_data.slonglong;  break;
   1306         case e_ulonglong:       m_data.ulonglong >>= rhs.m_data.ulonglong;  break;
   1307         }
   1308         break;
   1309     }
   1310     return *this;
   1311 }
   1312 
   1313 
   1314 Scalar&
   1315 Scalar::operator&= (const Scalar& rhs)
   1316 {
   1317     switch (m_type)
   1318     {
   1319     case e_void:
   1320     case e_float:
   1321     case e_double:
   1322     case e_long_double:
   1323         m_type = e_void;
   1324         break;
   1325 
   1326     case e_sint:
   1327         switch (rhs.m_type)
   1328         {
   1329         case e_void:
   1330         case e_float:
   1331         case e_double:
   1332         case e_long_double:
   1333             m_type = e_void;
   1334             break;
   1335         case e_sint:            m_data.sint &= rhs.m_data.sint;         break;
   1336         case e_uint:            m_data.sint &= rhs.m_data.uint;         break;
   1337         case e_slong:           m_data.sint &= rhs.m_data.slong;        break;
   1338         case e_ulong:           m_data.sint &= rhs.m_data.ulong;        break;
   1339         case e_slonglong:       m_data.sint &= rhs.m_data.slonglong;    break;
   1340         case e_ulonglong:       m_data.sint &= rhs.m_data.ulonglong;    break;
   1341         }
   1342         break;
   1343 
   1344     case e_uint:
   1345         switch (rhs.m_type)
   1346         {
   1347         case e_void:
   1348         case e_float:
   1349         case e_double:
   1350         case e_long_double:
   1351             m_type = e_void;
   1352             break;
   1353         case e_sint:            m_data.uint &= rhs.m_data.sint;         break;
   1354         case e_uint:            m_data.uint &= rhs.m_data.uint;         break;
   1355         case e_slong:           m_data.uint &= rhs.m_data.slong;        break;
   1356         case e_ulong:           m_data.uint &= rhs.m_data.ulong;        break;
   1357         case e_slonglong:       m_data.uint &= rhs.m_data.slonglong;    break;
   1358         case e_ulonglong:       m_data.uint &= rhs.m_data.ulonglong;    break;
   1359         }
   1360         break;
   1361 
   1362     case e_slong:
   1363         switch (rhs.m_type)
   1364         {
   1365         case e_void:
   1366         case e_float:
   1367         case e_double:
   1368         case e_long_double:
   1369             m_type = e_void;
   1370             break;
   1371         case e_sint:            m_data.slong &= rhs.m_data.sint;        break;
   1372         case e_uint:            m_data.slong &= rhs.m_data.uint;        break;
   1373         case e_slong:           m_data.slong &= rhs.m_data.slong;       break;
   1374         case e_ulong:           m_data.slong &= rhs.m_data.ulong;       break;
   1375         case e_slonglong:       m_data.slong &= rhs.m_data.slonglong;   break;
   1376         case e_ulonglong:       m_data.slong &= rhs.m_data.ulonglong;   break;
   1377         }
   1378         break;
   1379 
   1380     case e_ulong:
   1381         switch (rhs.m_type)
   1382         {
   1383         case e_void:
   1384         case e_float:
   1385         case e_double:
   1386         case e_long_double:
   1387             m_type = e_void;
   1388             break;
   1389         case e_sint:            m_data.ulong &= rhs.m_data.sint;        break;
   1390         case e_uint:            m_data.ulong &= rhs.m_data.uint;        break;
   1391         case e_slong:           m_data.ulong &= rhs.m_data.slong;       break;
   1392         case e_ulong:           m_data.ulong &= rhs.m_data.ulong;       break;
   1393         case e_slonglong:       m_data.ulong &= rhs.m_data.slonglong;   break;
   1394         case e_ulonglong:       m_data.ulong &= rhs.m_data.ulonglong;   break;
   1395         }
   1396         break;
   1397     case e_slonglong:
   1398         switch (rhs.m_type)
   1399         {
   1400         case e_void:
   1401         case e_float:
   1402         case e_double:
   1403         case e_long_double:
   1404             m_type = e_void;
   1405             break;
   1406         case e_sint:            m_data.slonglong &= rhs.m_data.sint;        break;
   1407         case e_uint:            m_data.slonglong &= rhs.m_data.uint;        break;
   1408         case e_slong:           m_data.slonglong &= rhs.m_data.slong;       break;
   1409         case e_ulong:           m_data.slonglong &= rhs.m_data.ulong;       break;
   1410         case e_slonglong:       m_data.slonglong &= rhs.m_data.slonglong;   break;
   1411         case e_ulonglong:       m_data.slonglong &= rhs.m_data.ulonglong;   break;
   1412         }
   1413         break;
   1414 
   1415     case e_ulonglong:
   1416         switch (rhs.m_type)
   1417         {
   1418         case e_void:
   1419         case e_float:
   1420         case e_double:
   1421         case e_long_double:
   1422             m_type = e_void;
   1423             break;
   1424         case e_sint:            m_data.ulonglong &= rhs.m_data.sint;        break;
   1425         case e_uint:            m_data.ulonglong &= rhs.m_data.uint;        break;
   1426         case e_slong:           m_data.ulonglong &= rhs.m_data.slong;       break;
   1427         case e_ulong:           m_data.ulonglong &= rhs.m_data.ulong;       break;
   1428         case e_slonglong:       m_data.ulonglong &= rhs.m_data.slonglong;   break;
   1429         case e_ulonglong:       m_data.ulonglong &= rhs.m_data.ulonglong;   break;
   1430         }
   1431         break;
   1432     }
   1433     return *this;
   1434 }
   1435 
   1436 
   1437 
   1438 bool
   1439 Scalar::AbsoluteValue()
   1440 {
   1441     switch (m_type)
   1442     {
   1443     case e_void:
   1444         break;
   1445 
   1446     case e_sint:
   1447         if (m_data.sint < 0)
   1448             m_data.sint = -m_data.sint;
   1449         return true;
   1450 
   1451     case e_slong:
   1452         if (m_data.slong < 0)
   1453             m_data.slong = -m_data.slong;
   1454         return true;
   1455 
   1456     case e_slonglong:
   1457         if (m_data.slonglong < 0)
   1458             m_data.slonglong = -m_data.slonglong;
   1459         return true;
   1460 
   1461     case e_uint:
   1462     case e_ulong:
   1463     case e_ulonglong:   return true;
   1464     case e_float:       m_data.flt = fabsf(m_data.flt);     return true;
   1465     case e_double:      m_data.dbl = fabs(m_data.dbl);      return true;
   1466     case e_long_double: m_data.ldbl = fabsl(m_data.ldbl);   return true;
   1467     }
   1468     return false;
   1469 }
   1470 
   1471 
   1472 bool
   1473 Scalar::UnaryNegate()
   1474 {
   1475     switch (m_type)
   1476     {
   1477     case e_void:        break;
   1478     case e_sint:        m_data.sint = -m_data.sint;             return true;
   1479     case e_uint:        m_data.uint = -m_data.uint;             return true;
   1480     case e_slong:       m_data.slong = -m_data.slong;           return true;
   1481     case e_ulong:       m_data.ulong = -m_data.ulong;           return true;
   1482     case e_slonglong:   m_data.slonglong = -m_data.slonglong;   return true;
   1483     case e_ulonglong:   m_data.ulonglong = -m_data.ulonglong;   return true;
   1484     case e_float:       m_data.flt = -m_data.flt;               return true;
   1485     case e_double:      m_data.dbl = -m_data.dbl;               return true;
   1486     case e_long_double: m_data.ldbl = -m_data.ldbl;             return true;
   1487     }
   1488     return false;
   1489 }
   1490 
   1491 bool
   1492 Scalar::OnesComplement()
   1493 {
   1494     switch (m_type)
   1495     {
   1496     case e_sint:        m_data.sint = ~m_data.sint; return true;
   1497     case e_uint:        m_data.uint = ~m_data.uint; return true;
   1498     case e_slong:       m_data.slong = ~m_data.slong; return true;
   1499     case e_ulong:       m_data.ulong = ~m_data.ulong; return true;
   1500     case e_slonglong:   m_data.slonglong = ~m_data.slonglong; return true;
   1501     case e_ulonglong:   m_data.ulonglong = ~m_data.ulonglong; return true;
   1502 
   1503     case e_void:
   1504     case e_float:
   1505     case e_double:
   1506     case e_long_double:
   1507         break;
   1508     }
   1509     return false;
   1510 }
   1511 
   1512 
   1513 const Scalar
   1514 lldb_private::operator+ (const Scalar& lhs, const Scalar& rhs)
   1515 {
   1516     Scalar result;
   1517     Scalar temp_value;
   1518     const Scalar* a;
   1519     const Scalar* b;
   1520     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1521     {
   1522         switch (result.m_type)
   1523         {
   1524         case Scalar::e_void:            break;
   1525         case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        + b->m_data.sint;       break;
   1526         case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        + b->m_data.uint;       break;
   1527         case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       + b->m_data.slong;      break;
   1528         case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       + b->m_data.ulong;      break;
   1529         case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   + b->m_data.slonglong;  break;
   1530         case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   + b->m_data.ulonglong;  break;
   1531         case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         + b->m_data.flt;        break;
   1532         case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         + b->m_data.dbl;        break;
   1533         case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        + b->m_data.ldbl;       break;
   1534         }
   1535     }
   1536     return result;
   1537 }
   1538 
   1539 
   1540 const Scalar
   1541 lldb_private::operator- (const Scalar& lhs, const Scalar& rhs)
   1542 {
   1543     Scalar result;
   1544     Scalar temp_value;
   1545     const Scalar* a;
   1546     const Scalar* b;
   1547     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1548     {
   1549         switch (result.m_type)
   1550         {
   1551         case Scalar::e_void:            break;
   1552         case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        - b->m_data.sint;       break;
   1553         case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        - b->m_data.uint;       break;
   1554         case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       - b->m_data.slong;      break;
   1555         case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       - b->m_data.ulong;      break;
   1556         case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   - b->m_data.slonglong;  break;
   1557         case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   - b->m_data.ulonglong;  break;
   1558         case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         - b->m_data.flt;        break;
   1559         case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         - b->m_data.dbl;        break;
   1560         case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        - b->m_data.ldbl;       break;
   1561         }
   1562     }
   1563     return result;
   1564 }
   1565 
   1566 const Scalar
   1567 lldb_private::operator/ (const Scalar& lhs, const Scalar& rhs)
   1568 {
   1569     Scalar result;
   1570     Scalar temp_value;
   1571     const Scalar* a;
   1572     const Scalar* b;
   1573     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1574     {
   1575         switch (result.m_type)
   1576         {
   1577         case Scalar::e_void:            break;
   1578 
   1579         case Scalar::e_sint:            if (b->m_data.sint != 0)        { result.m_data.sint = a->m_data.sint/ b->m_data.sint; return result; } break;
   1580         case Scalar::e_uint:            if (b->m_data.uint != 0)        { result.m_data.uint = a->m_data.uint / b->m_data.uint; return result; } break;
   1581         case Scalar::e_slong:           if (b->m_data.slong != 0)       { result.m_data.slong = a->m_data.slong / b->m_data.slong; return result; } break;
   1582         case Scalar::e_ulong:           if (b->m_data.ulong != 0)       { result.m_data.ulong = a->m_data.ulong / b->m_data.ulong; return result; } break;
   1583         case Scalar::e_slonglong:       if (b->m_data.slonglong != 0)   { result.m_data.slonglong = a->m_data.slonglong / b->m_data.slonglong; return result; } break;
   1584         case Scalar::e_ulonglong:       if (b->m_data.ulonglong != 0)   { result.m_data.ulonglong = a->m_data.ulonglong / b->m_data.ulonglong; return result; } break;
   1585         case Scalar::e_float:           if (b->m_data.flt != 0.0f)      { result.m_data.flt = a->m_data.flt / b->m_data.flt; return result; } break;
   1586         case Scalar::e_double:      if (b->m_data.dbl != 0.0)       { result.m_data.dbl = a->m_data.dbl / b->m_data.dbl; return result; } break;
   1587         case Scalar::e_long_double: if (b->m_data.ldbl != 0.0)      { result.m_data.ldbl = a->m_data.ldbl / b->m_data.ldbl; return result; } break;
   1588         }
   1589     }
   1590     // For division only, the only way it should make it here is if a promotion failed,
   1591     // or if we are trying to do a divide by zero.
   1592     result.m_type = Scalar::e_void;
   1593     return result;
   1594 }
   1595 
   1596 const Scalar
   1597 lldb_private::operator* (const Scalar& lhs, const Scalar& rhs)
   1598 {
   1599     Scalar result;
   1600     Scalar temp_value;
   1601     const Scalar* a;
   1602     const Scalar* b;
   1603     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1604     {
   1605         switch (result.m_type)
   1606         {
   1607         case Scalar::e_void:            break;
   1608         case Scalar::e_sint:            result.m_data.sint      = a->m_data.sint        * b->m_data.sint;       break;
   1609         case Scalar::e_uint:            result.m_data.uint      = a->m_data.uint        * b->m_data.uint;       break;
   1610         case Scalar::e_slong:           result.m_data.slong     = a->m_data.slong       * b->m_data.slong;      break;
   1611         case Scalar::e_ulong:           result.m_data.ulong     = a->m_data.ulong       * b->m_data.ulong;      break;
   1612         case Scalar::e_slonglong:       result.m_data.slonglong = a->m_data.slonglong   * b->m_data.slonglong;  break;
   1613         case Scalar::e_ulonglong:       result.m_data.ulonglong = a->m_data.ulonglong   * b->m_data.ulonglong;  break;
   1614         case Scalar::e_float:           result.m_data.flt       = a->m_data.flt         * b->m_data.flt;        break;
   1615         case Scalar::e_double:      result.m_data.dbl       = a->m_data.dbl         * b->m_data.dbl;        break;
   1616         case Scalar::e_long_double: result.m_data.ldbl      = a->m_data.ldbl        * b->m_data.ldbl;       break;
   1617         }
   1618     }
   1619     return result;
   1620 }
   1621 
   1622 const Scalar
   1623 lldb_private::operator& (const Scalar& lhs, const Scalar& rhs)
   1624 {
   1625     Scalar result;
   1626     Scalar temp_value;
   1627     const Scalar* a;
   1628     const Scalar* b;
   1629     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1630     {
   1631         switch (result.m_type)
   1632         {
   1633         case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        & b->m_data.sint;       break;
   1634         case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        & b->m_data.uint;       break;
   1635         case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       & b->m_data.slong;      break;
   1636         case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       & b->m_data.ulong;      break;
   1637         case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   & b->m_data.slonglong;  break;
   1638         case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   & b->m_data.ulonglong;  break;
   1639 
   1640         case Scalar::e_void:
   1641         case Scalar::e_float:
   1642         case Scalar::e_double:
   1643         case Scalar::e_long_double:
   1644             // No bitwise AND on floats, doubles of long doubles
   1645             result.m_type = Scalar::e_void;
   1646             break;
   1647         }
   1648     }
   1649     return result;
   1650 }
   1651 
   1652 const Scalar
   1653 lldb_private::operator| (const Scalar& lhs, const Scalar& rhs)
   1654 {
   1655     Scalar result;
   1656     Scalar temp_value;
   1657     const Scalar* a;
   1658     const Scalar* b;
   1659     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1660     {
   1661         switch (result.m_type)
   1662         {
   1663         case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        | b->m_data.sint;       break;
   1664         case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        | b->m_data.uint;       break;
   1665         case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       | b->m_data.slong;      break;
   1666         case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       | b->m_data.ulong;      break;
   1667         case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   | b->m_data.slonglong;  break;
   1668         case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   | b->m_data.ulonglong;  break;
   1669 
   1670         case Scalar::e_void:
   1671         case Scalar::e_float:
   1672         case Scalar::e_double:
   1673         case Scalar::e_long_double:
   1674             // No bitwise AND on floats, doubles of long doubles
   1675             result.m_type = Scalar::e_void;
   1676             break;
   1677         }
   1678     }
   1679     return result;
   1680 }
   1681 
   1682 const Scalar
   1683 lldb_private::operator% (const Scalar& lhs, const Scalar& rhs)
   1684 {
   1685     Scalar result;
   1686     Scalar temp_value;
   1687     const Scalar* a;
   1688     const Scalar* b;
   1689     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1690     {
   1691         switch (result.m_type)
   1692         {
   1693         case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        % b->m_data.sint;       break;
   1694         case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        % b->m_data.uint;       break;
   1695         case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       % b->m_data.slong;      break;
   1696         case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       % b->m_data.ulong;      break;
   1697         case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   % b->m_data.slonglong;  break;
   1698         case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   % b->m_data.ulonglong;  break;
   1699 
   1700         case Scalar::e_void:
   1701         case Scalar::e_float:
   1702         case Scalar::e_double:
   1703         case Scalar::e_long_double:
   1704             // No bitwise AND on floats, doubles of long doubles
   1705             result.m_type = Scalar::e_void;
   1706             break;
   1707         }
   1708     }
   1709     return result;
   1710 }
   1711 
   1712 const Scalar
   1713 lldb_private::operator^ (const Scalar& lhs, const Scalar& rhs)
   1714 {
   1715     Scalar result;
   1716     Scalar temp_value;
   1717     const Scalar* a;
   1718     const Scalar* b;
   1719     if ((result.m_type = PromoteToMaxType(lhs, rhs, temp_value, a, b)) != Scalar::e_void)
   1720     {
   1721         switch (result.m_type)
   1722         {
   1723         case Scalar::e_sint:        result.m_data.sint      = a->m_data.sint        ^ b->m_data.sint;       break;
   1724         case Scalar::e_uint:        result.m_data.uint      = a->m_data.uint        ^ b->m_data.uint;       break;
   1725         case Scalar::e_slong:       result.m_data.slong     = a->m_data.slong       ^ b->m_data.slong;      break;
   1726         case Scalar::e_ulong:       result.m_data.ulong     = a->m_data.ulong       ^ b->m_data.ulong;      break;
   1727         case Scalar::e_slonglong:   result.m_data.slonglong = a->m_data.slonglong   ^ b->m_data.slonglong;  break;
   1728         case Scalar::e_ulonglong:   result.m_data.ulonglong = a->m_data.ulonglong   ^ b->m_data.ulonglong;  break;
   1729 
   1730         case Scalar::e_void:
   1731         case Scalar::e_float:
   1732         case Scalar::e_double:
   1733         case Scalar::e_long_double:
   1734             // No bitwise AND on floats, doubles of long doubles
   1735             result.m_type = Scalar::e_void;
   1736             break;
   1737         }
   1738     }
   1739     return result;
   1740 }
   1741 
   1742 const Scalar
   1743 lldb_private::operator<< (const Scalar& lhs, const Scalar &rhs)
   1744 {
   1745     Scalar result = lhs;
   1746     result <<= rhs;
   1747     return result;
   1748 }
   1749 
   1750 const Scalar
   1751 lldb_private::operator>> (const Scalar& lhs, const Scalar &rhs)
   1752 {
   1753     Scalar result = lhs;
   1754     result >>= rhs;
   1755     return result;
   1756 }
   1757 
   1758 // Return the raw unsigned integer without any casting or conversion
   1759 unsigned int
   1760 Scalar::RawUInt () const
   1761 {
   1762     return m_data.uint;
   1763 }
   1764 
   1765 // Return the raw unsigned long without any casting or conversion
   1766 unsigned long
   1767 Scalar::RawULong () const
   1768 {
   1769     return m_data.ulong;
   1770 }
   1771 
   1772 // Return the raw unsigned long long without any casting or conversion
   1773 unsigned long long
   1774 Scalar::RawULongLong () const
   1775 {
   1776     return m_data.ulonglong;
   1777 }
   1778 
   1779 
   1780 Error
   1781 Scalar::SetValueFromCString (const char *value_str, Encoding encoding, size_t byte_size)
   1782 {
   1783     Error error;
   1784     if (value_str == NULL || value_str[0] == '\0')
   1785     {
   1786         error.SetErrorString ("Invalid c-string value string.");
   1787         return error;
   1788     }
   1789     bool success = false;
   1790     switch (encoding)
   1791     {
   1792     case eEncodingInvalid:
   1793         error.SetErrorString ("Invalid encoding.");
   1794         break;
   1795 
   1796     case eEncodingUint:
   1797         if (byte_size <= sizeof (unsigned long long))
   1798         {
   1799             uint64_t uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 0, &success);
   1800             if (!success)
   1801                 error.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string value", value_str);
   1802             else if (!UIntValueIsValidForSize (uval64, byte_size))
   1803                 error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %zu byte unsigned integer value", uval64, byte_size);
   1804             else
   1805             {
   1806                 m_type = Scalar::GetValueTypeForUnsignedIntegerWithByteSize (byte_size);
   1807                 switch (m_type)
   1808                 {
   1809                 case e_uint:        m_data.uint = (uint_t)uval64;           break;
   1810                 case e_ulong:       m_data.ulong = (ulong_t)uval64;         break;
   1811                 case e_ulonglong:   m_data.ulonglong = (ulonglong_t)uval64; break;
   1812                 default:
   1813                     error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %zu", byte_size);
   1814                     break;
   1815                 }
   1816             }
   1817         }
   1818         else
   1819         {
   1820             error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %zu", byte_size);
   1821             return error;
   1822         }
   1823         break;
   1824 
   1825     case eEncodingSint:
   1826         if (byte_size <= sizeof (long long))
   1827         {
   1828             uint64_t sval64 = Args::StringToSInt64(value_str, INT64_MAX, 0, &success);
   1829             if (!success)
   1830                 error.SetErrorStringWithFormat ("'%s' is not a valid signed integer string value", value_str);
   1831             else if (!SIntValueIsValidForSize (sval64, byte_size))
   1832                 error.SetErrorStringWithFormat ("value 0x%" PRIx64 " is too large to fit in a %zu byte signed integer value", sval64, byte_size);
   1833             else
   1834             {
   1835                 m_type = Scalar::GetValueTypeForSignedIntegerWithByteSize (byte_size);
   1836                 switch (m_type)
   1837                 {
   1838                 case e_sint:        m_data.sint = (sint_t)sval64;           break;
   1839                 case e_slong:       m_data.slong = (slong_t)sval64;         break;
   1840                 case e_slonglong:   m_data.slonglong = (slonglong_t)sval64; break;
   1841                 default:
   1842                     error.SetErrorStringWithFormat ("unsupported signed integer byte size: %zu", byte_size);
   1843                     break;
   1844                 }
   1845             }
   1846         }
   1847         else
   1848         {
   1849             error.SetErrorStringWithFormat ("unsupported signed integer byte size: %zu", byte_size);
   1850             return error;
   1851         }
   1852         break;
   1853 
   1854     case eEncodingIEEE754:
   1855         if (byte_size == sizeof (float))
   1856         {
   1857             if (::sscanf (value_str, "%f", &m_data.flt) == 1)
   1858                 m_type = e_float;
   1859             else
   1860                 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
   1861         }
   1862         else if (byte_size == sizeof (double))
   1863         {
   1864             if (::sscanf (value_str, "%lf", &m_data.dbl) == 1)
   1865                 m_type = e_double;
   1866             else
   1867                 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
   1868         }
   1869         else if (byte_size == sizeof (long double))
   1870         {
   1871             if (::sscanf (value_str, "%Lf", &m_data.ldbl) == 1)
   1872                 m_type = e_long_double;
   1873             else
   1874                 error.SetErrorStringWithFormat ("'%s' is not a valid float string value", value_str);
   1875         }
   1876         else
   1877         {
   1878             error.SetErrorStringWithFormat ("unsupported float byte size: %zu", byte_size);
   1879             return error;
   1880         }
   1881         break;
   1882 
   1883     case eEncodingVector:
   1884         error.SetErrorString ("vector encoding unsupported.");
   1885         break;
   1886     }
   1887     if (error.Fail())
   1888         m_type = e_void;
   1889 
   1890     return error;
   1891 }
   1892 
   1893 Error
   1894 Scalar::SetValueFromData (DataExtractor &data, lldb::Encoding encoding, size_t byte_size)
   1895 {
   1896     Error error;
   1897 
   1898     switch (encoding)
   1899     {
   1900     case lldb::eEncodingInvalid:
   1901         error.SetErrorString ("invalid encoding");
   1902         break;
   1903     case lldb::eEncodingVector:
   1904         error.SetErrorString ("vector encoding unsupported");
   1905         break;
   1906     case lldb::eEncodingUint:
   1907         {
   1908             lldb::offset_t offset;
   1909 
   1910             switch (byte_size)
   1911             {
   1912             case 1: operator=((uint8_t)data.GetU8(&offset)); break;
   1913             case 2: operator=((uint16_t)data.GetU16(&offset)); break;
   1914             case 4: operator=((uint32_t)data.GetU32(&offset)); break;
   1915             case 8: operator=((uint64_t)data.GetU64(&offset)); break;
   1916             default:
   1917                 error.SetErrorStringWithFormat ("unsupported unsigned integer byte size: %zu", byte_size);
   1918                 break;
   1919             }
   1920         }
   1921         break;
   1922     case lldb::eEncodingSint:
   1923         {
   1924             lldb::offset_t offset;
   1925 
   1926             switch (byte_size)
   1927             {
   1928             case 1: operator=((int8_t)data.GetU8(&offset)); break;
   1929             case 2: operator=((int16_t)data.GetU16(&offset)); break;
   1930             case 4: operator=((int32_t)data.GetU32(&offset)); break;
   1931             case 8: operator=((int64_t)data.GetU64(&offset)); break;
   1932             default:
   1933                 error.SetErrorStringWithFormat ("unsupported signed integer byte size: %zu", byte_size);
   1934                 break;
   1935             }
   1936         }
   1937         break;
   1938     case lldb::eEncodingIEEE754:
   1939         {
   1940             lldb::offset_t offset;
   1941 
   1942             if (byte_size == sizeof (float))
   1943                 operator=((float)data.GetFloat(&offset));
   1944             else if (byte_size == sizeof (double))
   1945                 operator=((double)data.GetDouble(&offset));
   1946             else if (byte_size == sizeof (long double))
   1947                 operator=((long double)data.GetLongDouble(&offset));
   1948             else
   1949                 error.SetErrorStringWithFormat ("unsupported float byte size: %zu", byte_size);
   1950         }
   1951         break;
   1952     }
   1953 
   1954     return error;
   1955 }
   1956 
   1957 bool
   1958 Scalar::SignExtend (uint32_t sign_bit_pos)
   1959 {
   1960     const uint32_t max_bit_pos = GetByteSize() * 8;
   1961 
   1962     if (sign_bit_pos < max_bit_pos)
   1963     {
   1964         switch (m_type)
   1965         {
   1966         case Scalar::e_void:
   1967         case Scalar::e_float:
   1968         case Scalar::e_double:
   1969         case Scalar::e_long_double:
   1970             return false;
   1971 
   1972         case Scalar::e_sint:
   1973         case Scalar::e_uint:
   1974             if (max_bit_pos == sign_bit_pos)
   1975                 return true;
   1976             else if (sign_bit_pos < (max_bit_pos-1))
   1977             {
   1978                 unsigned int sign_bit = 1u << sign_bit_pos;
   1979                 if (m_data.uint & sign_bit)
   1980                 {
   1981                     const unsigned int mask = ~(sign_bit) + 1u;
   1982                     m_data.uint |= mask;
   1983                 }
   1984                 return true;
   1985             }
   1986             break;
   1987 
   1988         case Scalar::e_slong:
   1989         case Scalar::e_ulong:
   1990             if (max_bit_pos == sign_bit_pos)
   1991                 return true;
   1992             else if (sign_bit_pos < (max_bit_pos-1))
   1993             {
   1994                 unsigned long sign_bit = 1ul << sign_bit_pos;
   1995                 if (m_data.ulong & sign_bit)
   1996                 {
   1997                     const unsigned long mask = ~(sign_bit) + 1ul;
   1998                     m_data.ulong |= mask;
   1999                 }
   2000                 return true;
   2001             }
   2002             break;
   2003 
   2004         case Scalar::e_slonglong:
   2005         case Scalar::e_ulonglong:
   2006             if (max_bit_pos == sign_bit_pos)
   2007                 return true;
   2008             else if (sign_bit_pos < (max_bit_pos-1))
   2009             {
   2010                 unsigned long long sign_bit = 1ull << sign_bit_pos;
   2011                 if (m_data.ulonglong & sign_bit)
   2012                 {
   2013                     const unsigned long long mask = ~(sign_bit) + 1ull;
   2014                     m_data.ulonglong |= mask;
   2015                 }
   2016                 return true;
   2017             }
   2018             break;
   2019         }
   2020     }
   2021     return false;
   2022 }
   2023 
   2024 size_t
   2025 Scalar::GetAsMemoryData (void *dst,
   2026                          size_t dst_len,
   2027                          lldb::ByteOrder dst_byte_order,
   2028                          Error &error) const
   2029 {
   2030     // Get a data extractor that points to the native scalar data
   2031     DataExtractor data;
   2032     if (!GetData(data))
   2033     {
   2034         error.SetErrorString ("invalid scalar value");
   2035         return 0;
   2036     }
   2037 
   2038     const size_t src_len = data.GetByteSize();
   2039 
   2040     // Prepare a memory buffer that contains some or all of the register value
   2041     const size_t bytes_copied = data.CopyByteOrderedData (0,                  // src offset
   2042                                                             src_len,            // src length
   2043                                                             dst,                // dst buffer
   2044                                                             dst_len,            // dst length
   2045                                                             dst_byte_order);    // dst byte order
   2046     if (bytes_copied == 0)
   2047         error.SetErrorString ("failed to copy data");
   2048 
   2049     return bytes_copied;
   2050 }
   2051 
   2052 bool
   2053 Scalar::ExtractBitfield (uint32_t bit_size,
   2054                          uint32_t bit_offset)
   2055 {
   2056     if (bit_size == 0)
   2057         return true;
   2058 
   2059     uint32_t msbit = bit_offset + bit_size - 1;
   2060     uint32_t lsbit = bit_offset;
   2061     switch (m_type)
   2062     {
   2063         case Scalar::e_void:
   2064             break;
   2065 
   2066         case e_float:
   2067             if (sizeof(m_data.flt) == sizeof(sint_t))
   2068                 m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
   2069             else if (sizeof(m_data.flt) == sizeof(ulong_t))
   2070                 m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
   2071             else if (sizeof(m_data.flt) == sizeof(ulonglong_t))
   2072                 m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
   2073             else
   2074                 return false;
   2075             return true;
   2076 
   2077         case e_double:
   2078             if (sizeof(m_data.dbl) == sizeof(sint_t))
   2079                 m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
   2080             else if (sizeof(m_data.dbl) == sizeof(ulong_t))
   2081                 m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
   2082             else if (sizeof(m_data.dbl) == sizeof(ulonglong_t))
   2083                 m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
   2084             else
   2085                 return false;
   2086             return true;
   2087 
   2088         case e_long_double:
   2089             if (sizeof(m_data.ldbl) == sizeof(sint_t))
   2090                 m_data.sint = SignedBits (m_data.sint, msbit, lsbit);
   2091             else if (sizeof(m_data.ldbl) == sizeof(ulong_t))
   2092                 m_data.slong = SignedBits (m_data.slong, msbit, lsbit);
   2093             else if (sizeof(m_data.ldbl) == sizeof(ulonglong_t))
   2094                 m_data.slonglong = SignedBits (m_data.slonglong, msbit, lsbit);
   2095             else
   2096                 return false;
   2097             return true;
   2098 
   2099         case Scalar::e_sint:
   2100             m_data.sint = (sint_t)SignedBits (m_data.sint, msbit, lsbit);
   2101             return true;
   2102 
   2103         case Scalar::e_uint:
   2104             m_data.uint = (uint_t)UnsignedBits (m_data.uint, msbit, lsbit);
   2105             return true;
   2106 
   2107         case Scalar::e_slong:
   2108             m_data.slong = (slong_t)SignedBits (m_data.slong, msbit, lsbit);
   2109             return true;
   2110 
   2111         case Scalar::e_ulong:
   2112             m_data.ulong = (ulong_t)UnsignedBits (m_data.ulong, msbit, lsbit);
   2113             return true;
   2114 
   2115         case Scalar::e_slonglong:
   2116             m_data.slonglong = (slonglong_t)SignedBits (m_data.slonglong, msbit, lsbit);
   2117             return true;
   2118 
   2119         case Scalar::e_ulonglong:
   2120             m_data.ulonglong = (ulonglong_t)UnsignedBits (m_data.ulonglong, msbit, lsbit);
   2121             return true;
   2122     }
   2123     return false;
   2124 }
   2125 
   2126 
   2127 
   2128 
   2129 
   2130 bool
   2131 lldb_private::operator== (const Scalar& lhs, const Scalar& rhs)
   2132 {
   2133     // If either entry is void then we can just compare the types
   2134     if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
   2135         return lhs.m_type == rhs.m_type;
   2136 
   2137     Scalar temp_value;
   2138     const Scalar* a;
   2139     const Scalar* b;
   2140     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
   2141     {
   2142     case Scalar::e_void:            break;
   2143     case Scalar::e_sint:            return a->m_data.sint       == b->m_data.sint;
   2144     case Scalar::e_uint:            return a->m_data.uint       == b->m_data.uint;
   2145     case Scalar::e_slong:           return a->m_data.slong      == b->m_data.slong;
   2146     case Scalar::e_ulong:           return a->m_data.ulong      == b->m_data.ulong;
   2147     case Scalar::e_slonglong:       return a->m_data.slonglong  == b->m_data.slonglong;
   2148     case Scalar::e_ulonglong:       return a->m_data.ulonglong  == b->m_data.ulonglong;
   2149     case Scalar::e_float:           return a->m_data.flt        == b->m_data.flt;
   2150     case Scalar::e_double:      return a->m_data.dbl        == b->m_data.dbl;
   2151     case Scalar::e_long_double: return a->m_data.ldbl       == b->m_data.ldbl;
   2152     }
   2153     return false;
   2154 }
   2155 
   2156 bool
   2157 lldb_private::operator!= (const Scalar& lhs, const Scalar& rhs)
   2158 {
   2159     // If either entry is void then we can just compare the types
   2160     if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
   2161         return lhs.m_type != rhs.m_type;
   2162 
   2163     Scalar temp_value;  // A temp value that might get a copy of either promoted value
   2164     const Scalar* a;
   2165     const Scalar* b;
   2166     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
   2167     {
   2168     case Scalar::e_void:            break;
   2169     case Scalar::e_sint:            return a->m_data.sint       != b->m_data.sint;
   2170     case Scalar::e_uint:            return a->m_data.uint       != b->m_data.uint;
   2171     case Scalar::e_slong:           return a->m_data.slong      != b->m_data.slong;
   2172     case Scalar::e_ulong:           return a->m_data.ulong      != b->m_data.ulong;
   2173     case Scalar::e_slonglong:       return a->m_data.slonglong  != b->m_data.slonglong;
   2174     case Scalar::e_ulonglong:       return a->m_data.ulonglong  != b->m_data.ulonglong;
   2175     case Scalar::e_float:           return a->m_data.flt        != b->m_data.flt;
   2176     case Scalar::e_double:      return a->m_data.dbl        != b->m_data.dbl;
   2177     case Scalar::e_long_double: return a->m_data.ldbl       != b->m_data.ldbl;
   2178     }
   2179     return true;
   2180 }
   2181 
   2182 bool
   2183 lldb_private::operator< (const Scalar& lhs, const Scalar& rhs)
   2184 {
   2185     if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
   2186         return false;
   2187 
   2188     Scalar temp_value;
   2189     const Scalar* a;
   2190     const Scalar* b;
   2191     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
   2192     {
   2193     case Scalar::e_void:            break;
   2194     case Scalar::e_sint:            return a->m_data.sint       < b->m_data.sint;
   2195     case Scalar::e_uint:            return a->m_data.uint       < b->m_data.uint;
   2196     case Scalar::e_slong:           return a->m_data.slong      < b->m_data.slong;
   2197     case Scalar::e_ulong:           return a->m_data.ulong      < b->m_data.ulong;
   2198     case Scalar::e_slonglong:       return a->m_data.slonglong  < b->m_data.slonglong;
   2199     case Scalar::e_ulonglong:       return a->m_data.ulonglong  < b->m_data.ulonglong;
   2200     case Scalar::e_float:           return a->m_data.flt        < b->m_data.flt;
   2201     case Scalar::e_double:      return a->m_data.dbl        < b->m_data.dbl;
   2202     case Scalar::e_long_double: return a->m_data.ldbl       < b->m_data.ldbl;
   2203     }
   2204     return false;
   2205 }
   2206 
   2207 bool
   2208 lldb_private::operator<= (const Scalar& lhs, const Scalar& rhs)
   2209 {
   2210     if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
   2211         return false;
   2212 
   2213     Scalar temp_value;
   2214     const Scalar* a;
   2215     const Scalar* b;
   2216     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
   2217     {
   2218     case Scalar::e_void:            break;
   2219     case Scalar::e_sint:            return a->m_data.sint       <= b->m_data.sint;
   2220     case Scalar::e_uint:            return a->m_data.uint       <= b->m_data.uint;
   2221     case Scalar::e_slong:           return a->m_data.slong      <= b->m_data.slong;
   2222     case Scalar::e_ulong:           return a->m_data.ulong      <= b->m_data.ulong;
   2223     case Scalar::e_slonglong:       return a->m_data.slonglong  <= b->m_data.slonglong;
   2224     case Scalar::e_ulonglong:       return a->m_data.ulonglong  <= b->m_data.ulonglong;
   2225     case Scalar::e_float:           return a->m_data.flt        <= b->m_data.flt;
   2226     case Scalar::e_double:      return a->m_data.dbl        <= b->m_data.dbl;
   2227     case Scalar::e_long_double: return a->m_data.ldbl       <= b->m_data.ldbl;
   2228     }
   2229     return false;
   2230 }
   2231 
   2232 
   2233 bool
   2234 lldb_private::operator> (const Scalar& lhs, const Scalar& rhs)
   2235 {
   2236     if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
   2237         return false;
   2238 
   2239     Scalar temp_value;
   2240     const Scalar* a;
   2241     const Scalar* b;
   2242     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
   2243     {
   2244     case Scalar::e_void:            break;
   2245     case Scalar::e_sint:            return a->m_data.sint       > b->m_data.sint;
   2246     case Scalar::e_uint:            return a->m_data.uint       > b->m_data.uint;
   2247     case Scalar::e_slong:           return a->m_data.slong      > b->m_data.slong;
   2248     case Scalar::e_ulong:           return a->m_data.ulong      > b->m_data.ulong;
   2249     case Scalar::e_slonglong:       return a->m_data.slonglong  > b->m_data.slonglong;
   2250     case Scalar::e_ulonglong:       return a->m_data.ulonglong  > b->m_data.ulonglong;
   2251     case Scalar::e_float:           return a->m_data.flt        > b->m_data.flt;
   2252     case Scalar::e_double:      return a->m_data.dbl        > b->m_data.dbl;
   2253     case Scalar::e_long_double: return a->m_data.ldbl       > b->m_data.ldbl;
   2254     }
   2255     return false;
   2256 }
   2257 
   2258 bool
   2259 lldb_private::operator>= (const Scalar& lhs, const Scalar& rhs)
   2260 {
   2261     if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
   2262         return false;
   2263 
   2264     Scalar temp_value;
   2265     const Scalar* a;
   2266     const Scalar* b;
   2267     switch (PromoteToMaxType(lhs, rhs, temp_value, a, b))
   2268     {
   2269     case Scalar::e_void:            break;
   2270     case Scalar::e_sint:            return a->m_data.sint       >= b->m_data.sint;
   2271     case Scalar::e_uint:            return a->m_data.uint       >= b->m_data.uint;
   2272     case Scalar::e_slong:           return a->m_data.slong      >= b->m_data.slong;
   2273     case Scalar::e_ulong:           return a->m_data.ulong      >= b->m_data.ulong;
   2274     case Scalar::e_slonglong:       return a->m_data.slonglong  >= b->m_data.slonglong;
   2275     case Scalar::e_ulonglong:       return a->m_data.ulonglong  >= b->m_data.ulonglong;
   2276     case Scalar::e_float:           return a->m_data.flt        >= b->m_data.flt;
   2277     case Scalar::e_double:      return a->m_data.dbl        >= b->m_data.dbl;
   2278     case Scalar::e_long_double: return a->m_data.ldbl       >= b->m_data.ldbl;
   2279     }
   2280     return false;
   2281 }
   2282 
   2283 
   2284 
   2285 
   2286