[lldb/Utility] Clean up Scalar constructors

- move initialization to initializer lists
- make desctructor non-virtual (nothing else is)
- fix long double constructor so that it actually works
This commit is contained in:
Pavel Labath
2020-07-20 16:42:01 +02:00
parent 81d7ebaf5c
commit e89414f406
3 changed files with 22 additions and 36 deletions

View File

@@ -60,41 +60,30 @@ public:
};
// Constructors and Destructors
Scalar();
Scalar(int v) : m_type(e_sint), m_float(static_cast<float>(0)) {
m_integer = llvm::APInt(sizeof(int) * 8, v, true);
}
Scalar(unsigned int v) : m_type(e_uint), m_float(static_cast<float>(0)) {
m_integer = llvm::APInt(sizeof(int) * 8, v);
}
Scalar(long v) : m_type(e_slong), m_float(static_cast<float>(0)) {
m_integer = llvm::APInt(sizeof(long) * 8, v, true);
}
Scalar(unsigned long v) : m_type(e_ulong), m_float(static_cast<float>(0)) {
m_integer = llvm::APInt(sizeof(long) * 8, v);
}
Scalar(long long v) : m_type(e_slonglong), m_float(static_cast<float>(0)) {
m_integer = llvm::APInt(sizeof(long long) * 8, v, true);
}
Scalar() : m_type(e_void), m_float(0.0f) {}
Scalar(int v)
: m_type(e_sint), m_integer(sizeof(v) * 8, v, true), m_float(0.0f) {}
Scalar(unsigned int v)
: m_type(e_uint), m_integer(sizeof(v) * 8, v, false), m_float(0.0f) {}
Scalar(long v)
: m_type(e_slong), m_integer(sizeof(v) * 8, v, true), m_float(0.0f) {}
Scalar(unsigned long v)
: m_type(e_ulong), m_integer(sizeof(v) * 8, v, false), m_float(0.0f) {}
Scalar(long long v)
: m_type(e_slonglong), m_integer(sizeof(v) * 8, v, true), m_float(0.0f) {}
Scalar(unsigned long long v)
: m_type(e_ulonglong), m_float(static_cast<float>(0)) {
m_integer = llvm::APInt(sizeof(long long) * 8, v);
: m_type(e_ulonglong), m_integer(sizeof(v) * 8, v, false), m_float(0.0f) {
}
Scalar(float v) : m_type(e_float), m_float(v) { m_float = llvm::APFloat(v); }
Scalar(double v) : m_type(e_double), m_float(v) {
m_float = llvm::APFloat(v);
Scalar(float v) : m_type(e_float), m_float(v) {}
Scalar(double v) : m_type(e_double), m_float(v) {}
Scalar(long double v) : m_type(e_long_double), m_float(double(v)) {
bool ignore;
m_float.convert(llvm::APFloat::x87DoubleExtended(),
llvm::APFloat::rmNearestTiesToEven, &ignore);
}
Scalar(long double v)
: m_type(e_long_double),
m_float(llvm::APFloat::x87DoubleExtended(),
llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128,
(reinterpret_cast<type128 *>(&v))->x)) {}
Scalar(llvm::APInt v) : m_type(), m_float(static_cast<float>(0)) {
m_integer = llvm::APInt(std::move(v));
m_type = GetBestTypeForBitSize(m_integer.getBitWidth(), true);
}
// Scalar(const RegisterValue& reg_value);
virtual ~Scalar();
Scalar(llvm::APInt v)
: m_type(GetBestTypeForBitSize(v.getBitWidth(), true)),
m_integer(std::move(v)), m_float(0.0f) {}
/// Return the most efficient Scalar::Type for the requested bit size.
static Type GetBestTypeForBitSize(size_t bit_size, bool sign);

View File

@@ -126,8 +126,6 @@ static Scalar::Type PromoteToMaxType(
return Scalar::e_void;
}
Scalar::Scalar() : m_type(e_void), m_float(static_cast<float>(0)) {}
bool Scalar::GetData(DataExtractor &data, size_t limit_byte_size) const {
size_t byte_size = GetByteSize();
if (byte_size == 0) {
@@ -232,8 +230,6 @@ void Scalar::GetValue(Stream *s, bool show_type) const {
}
}
Scalar::~Scalar() = default;
Scalar::Type Scalar::GetBestTypeForBitSize(size_t bit_size, bool sign) {
// Scalar types are always host types, hence the sizeof().
if (sign) {

View File

@@ -92,6 +92,7 @@ TEST(ScalarTest, Getters) {
CheckConversion<unsigned long long>(0x8765432112345678ull);
CheckConversion<float>(42.25f);
CheckConversion<double>(42.25);
CheckConversion<long double>(42.25L);
EXPECT_EQ(APInt(128, 1) << 70, Scalar(std::pow(2.0f, 70.0f)).SInt128(APInt()));
EXPECT_EQ(APInt(128, -1, true) << 70,