17#include "llvm/ADT/APSInt.h"
18#include "llvm/ADT/SmallString.h"
39 llvm_unreachable(
"Unhandled category!");
43 static const llvm::fltSemantics *
const order[] = {
44 &APFloat::IEEEsingle(), &APFloat::IEEEdouble(),
45 &APFloat::x87DoubleExtended()};
46 for (
const auto &entry : llvm::enumerate(order)) {
47 if (entry.value() == &sem)
50 llvm_unreachable(
"Unsupported semantics!");
57 switch (b.GetType()) {
71 if (lhs_key > rhs_key)
73 else if (rhs_key > lhs_key)
90 auto buffer_up = std::make_unique<DataBufferHeap>(byte_size, 0);
94 if (limit_byte_size < byte_size) {
98 byte_size = limit_byte_size;
103 offset = byte_size - limit_byte_size;
104 byte_size = limit_byte_size;
108 data.
SetData(std::move(buffer_up), offset, byte_size);
116 const auto &store = [&](
const llvm::APInt &val) {
117 StoreIntToMemory(val, storage.data(), (val.getBitWidth() + 7) / 8);
126 store(
m_float.bitcastToAPInt());
138 return m_float.bitcastToAPInt().getBitWidth() / 8;
166 llvm::SmallString<24> string;
194 bool success =
false;
199 m_float = llvm::APFloat(semantics);
201 llvm::APFloat::rmNearestTiesToEven);
209 m_float.convert(semantics, llvm::APFloat::rmNearestTiesToEven, &ignore);
238 llvm_unreachable(
"Unrecognized type!");
242 bool success =
false;
260 bool success =
false;
279 llvm::APSInt result(
bits, is_unsigned);
281 f.convertToInteger(result, llvm::APFloat::rmTowardZero, &isExact);
282 return std::move(result);
290 APSInt ext =
m_integer.extOrTrunc(
sizeof(T) * 8);
292 return ext.getSExtValue();
293 return ext.getZExtValue();
296 return ToAPInt(
m_float,
sizeof(T) * 8, std::is_unsigned<T>::value)
303 return GetAs<signed char>(fail_value);
307 return GetAs<unsigned char>(fail_value);
311 return GetAs<short>(fail_value);
315 return GetAs<unsigned short>(fail_value);
318int Scalar::SInt(
int fail_value)
const {
return GetAs<int>(fail_value); }
321 return GetAs<unsigned int>(fail_value);
324long Scalar::SLong(
long fail_value)
const {
return GetAs<long>(fail_value); }
327 return GetAs<unsigned long>(fail_value);
331 return GetAs<long long>(fail_value);
335 return GetAs<unsigned long long>(fail_value);
368 return llvm::APIntOps::RoundSignedAPIntToFloat(
m_integer);
369 return llvm::APIntOps::RoundAPIntToFloat(
m_integer);
374 result.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven,
376 return result.convertToFloat();
388 return llvm::APIntOps::RoundSignedAPIntToDouble(
m_integer);
389 return llvm::APIntOps::RoundAPIntToDouble(
m_integer);
394 result.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven,
396 return result.convertToDouble();
404 return static_cast<long double>(
Double(fail_value));
633 if (value_str ==
nullptr || value_str[0] ==
'\0') {
634 error.SetErrorString(
"Invalid c-string value string.");
639 error.SetErrorString(
"Invalid encoding.");
644 llvm::StringRef str = value_str;
646 bool is_negative = is_signed && str.consume_front(
"-");
648 if (str.getAsInteger(0,
integer)) {
649 error.SetErrorStringWithFormatv(
650 "'{0}' is not a valid integer string value", value_str);
658 fits =
integer.isSignedIntN(byte_size * 8);
660 fits =
integer.isIntN(byte_size * 8);
662 error.SetErrorStringWithFormatv(
663 "value {0} is too large to fit in a {1} byte integer value",
664 value_str, byte_size);
669 APSInt(std::move(
integer), !is_signed).extOrTrunc(8 * byte_size);
677 const llvm::fltSemantics &sem =
678 byte_size <= 4 ? APFloat::IEEEsingle()
679 : byte_size <= 8 ? APFloat::IEEEdouble()
680 : APFloat::x87DoubleExtended();
682 if (llvm::Expected<APFloat::opStatus> op =
683 f.convertFromString(value_str, APFloat::rmNearestTiesToEven)) {
687 error = op.takeError();
692 error.SetErrorString(
"vector encoding unsupported.");
706 error.SetErrorString(
"invalid encoding");
709 error.SetErrorString(
"vector encoding unsupported");
714 return Status(
"insufficient data");
717 APSInt(APInt::getZero(8 * byte_size), encoding ==
eEncodingUint);
721 std::vector<uint8_t> buffer(byte_size);
722 std::copy_n(data.
GetDataStart(), byte_size, buffer.rbegin());
723 llvm::LoadIntFromMemory(
m_integer, buffer.data(), byte_size);
730 if (byte_size ==
sizeof(
float))
732 else if (byte_size ==
sizeof(
double))
734 else if (byte_size ==
sizeof(
long double))
737 error.SetErrorStringWithFormat(
"unsupported float byte size: %" PRIu64
"",
738 static_cast<uint64_t
>(byte_size));
748 if (sign_bit_pos < max_bit_pos) {
755 if (max_bit_pos == sign_bit_pos)
757 else if (sign_bit_pos < (max_bit_pos - 1)) {
758 llvm::APInt sign_bit = llvm::APInt::getSignMask(sign_bit_pos + 1);
759 llvm::APInt bitwize_and =
m_integer & sign_bit;
760 if (bitwize_and.getBoolValue()) {
762 ~(sign_bit) + llvm::APInt(
m_integer.getBitWidth(), 1);
779 error.SetErrorString(
"invalid scalar value");
786 const size_t bytes_copied =
792 if (bytes_copied == 0)
793 error.SetErrorString(
"failed to copy data");
820 llvm::APFloat::cmpResult result;
828 if (result == llvm::APFloat::cmpEqual)
835 return !(lhs == rhs);
842 llvm::APFloat::cmpResult result;
850 if (result == llvm::APFloat::cmpLessThan)
static llvm::raw_ostream & error(Stream &strm)
static llvm::APInt ToAPInt(const llvm::APFloat &f, unsigned bits, bool is_unsigned)
unsigned int UInt(unsigned int fail_value=0) const
const char * GetTypeAsCString() const
bool IntegralPromote(uint16_t bits, bool sign)
bool SetBit(uint32_t bit)
int SInt(int fail_value=0) const
long SLong(long fail_value=0) const
size_t GetByteSize() const
unsigned char UChar(unsigned char fail_value=0) const
Status SetValueFromData(const DataExtractor &data, lldb::Encoding encoding, size_t byte_size)
bool SignExtend(uint32_t bit_pos)
short SShort(short fail_value=0) const
T GetAs(T fail_value) const
void TruncOrExtendTo(uint16_t bits, bool sign)
Convert to an integer with bits and the given signedness.
unsigned long long ULongLong(unsigned long long fail_value=0) const
Scalar::Type GetType() const
unsigned long ULong(unsigned long fail_value=0) const
size_t GetAsMemoryData(void *dst, size_t dst_len, lldb::ByteOrder dst_byte_order, Status &error) const
void GetBytes(llvm::MutableArrayRef< uint8_t > storage) const
Store the binary representation of this value into the given storage.
bool GetData(DataExtractor &data, size_t limit_byte_size=UINT32_MAX) const
signed char SChar(signed char fail_value=0) const
bool FloatPromote(const llvm::fltSemantics &semantics)
bool ClearBit(uint32_t bit)
static PromotionKey GetFloatPromoKey(const llvm::fltSemantics &semantics)
float Float(float fail_value=0.0f) const
Scalar & operator&=(const Scalar &rhs)
long long SLongLong(long long fail_value=0) const
static const char * GetValueTypeAsCString(Scalar::Type value_type)
bool ExtractBitfield(uint32_t bit_size, uint32_t bit_offset)
std::tuple< Type, unsigned, bool > PromotionKey
void GetValue(Stream *s, bool show_type) const
double Double(double fail_value=0.0) const
Scalar & operator<<=(const Scalar &rhs)
Status SetValueFromCString(const char *s, lldb::Encoding encoding, size_t byte_size)
static Type PromoteToMaxType(Scalar &lhs, Scalar &rhs)
llvm::APInt SInt128(const llvm::APInt &fail_value) const
unsigned short UShort(unsigned short fail_value=0) const
Scalar & operator+=(Scalar rhs)
bool ShiftRightLogical(const Scalar &rhs)
PromotionKey GetPromoKey() const
long double LongDouble(long double fail_value=0.0) const
Scalar & operator>>=(const Scalar &rhs)
llvm::APInt UInt128(const llvm::APInt &fail_value) const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
lldb::ByteOrder InlHostByteOrder()
A class that represents a running process on the host machine.
const Scalar operator&(Scalar lhs, Scalar rhs)
const Scalar operator*(Scalar lhs, Scalar rhs)
bool operator<=(const Scalar &lhs, const Scalar &rhs)
const Scalar operator/(Scalar lhs, Scalar rhs)
bool operator!=(const Address &lhs, const Address &rhs)
bool operator>(const Address &lhs, const Address &rhs)
const Scalar operator>>(const Scalar &lhs, const Scalar &rhs)
const Scalar operator%(Scalar lhs, Scalar rhs)
AdaptedConstIterator< C, E, A > operator+(typename AdaptedConstIterator< C, E, A >::BackingIterator::difference_type offset, AdaptedConstIterator< C, E, A > &rhs)
const Scalar operator^(Scalar lhs, Scalar rhs)
bool operator==(const Address &lhs, const Address &rhs)
const Scalar operator|(Scalar lhs, Scalar rhs)
bool operator<(const Address &lhs, const Address &rhs)
static uint32_t bits(const uint32_t val, const uint32_t msbit, const uint32_t lsbit)
bool operator>=(const Scalar &lhs, const Scalar &rhs)
AdaptedConstIterator< C, E, A >::BackingIterator::difference_type operator-(AdaptedConstIterator< C, E, A > &lhs, AdaptedConstIterator< C, E, A > &rhs)
Stream & operator<<(Stream &s, const SourceLocationSpec &loc)
Dump a SourceLocationSpec object to a stream.
Encoding
Register encoding definitions.
@ eEncodingVector
vector registers
@ eEncodingUint
unsigned integer
@ eEncodingSint
signed integer
ByteOrder
Byte ordering definitions.