[Lldb-commits] [lldb] [LLDB] Add APFloat helper functions to Scalar class. (PR #86862)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Mar 27 13:18:35 PDT 2024
https://github.com/cmtice updated https://github.com/llvm/llvm-project/pull/86862
>From 03ef6db02f49ab4cc4f63b32553015b4f3801b5b Mon Sep 17 00:00:00 2001
From: Caroline Tice <cmtice at google.com>
Date: Wed, 27 Mar 2024 10:09:45 -0700
Subject: [PATCH 1/2] [LLDB] Add APFloat helper functions to Scalar class.
This adds the ability to create a Scalar from an APFloat, and to
create an APFloat from an APSInt or another APFloat.
---
lldb/include/lldb/Utility/Scalar.h | 6 +++++
lldb/source/Utility/Scalar.cpp | 42 ++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/lldb/include/lldb/Utility/Scalar.h b/lldb/include/lldb/Utility/Scalar.h
index 8e087a5ddeb855..d5e70fdf203001 100644
--- a/lldb/include/lldb/Utility/Scalar.h
+++ b/lldb/include/lldb/Utility/Scalar.h
@@ -71,6 +71,8 @@ class Scalar {
: m_type(e_int), m_integer(std::move(v), false), m_float(0.0f) {}
Scalar(llvm::APSInt v)
: m_type(e_int), m_integer(std::move(v)), m_float(0.0f) {}
+ Scalar(llvm::APFloat v)
+ : m_integer(0), m_float(v) {}
bool SignExtend(uint32_t bit_pos);
@@ -186,6 +188,10 @@ class Scalar {
Status SetValueFromData(const DataExtractor &data, lldb::Encoding encoding,
size_t byte_size);
+ llvm::APFloat CreateAPFloatFromAPSInt(lldb::BasicType basic_type);
+
+ llvm::APFloat CreateAPFloatFromAPFloat(lldb::BasicType basic_type);
+
protected:
Scalar::Type m_type = e_void;
llvm::APSInt m_integer;
diff --git a/lldb/source/Utility/Scalar.cpp b/lldb/source/Utility/Scalar.cpp
index 5ad68065bce1b7..afcb204d8f95a5 100644
--- a/lldb/source/Utility/Scalar.cpp
+++ b/lldb/source/Utility/Scalar.cpp
@@ -813,6 +813,48 @@ bool Scalar::ExtractBitfield(uint32_t bit_size, uint32_t bit_offset) {
return false;
}
+llvm::APFloat Scalar::CreateAPFloatFromAPSInt(lldb::BasicType basic_type) {
+ switch (basic_type) {
+ case lldb::eBasicTypeFloat:
+ return llvm::APFloat(m_integer.isSigned()
+ ? llvm::APIntOps::RoundSignedAPIntToFloat(m_integer)
+ : llvm::APIntOps::RoundAPIntToFloat(m_integer));
+ case lldb::eBasicTypeDouble:
+ // No way to get more precision at the moment.
+ case lldb::eBasicTypeLongDouble:
+ return llvm::APFloat(m_integer.isSigned()
+ ? llvm::APIntOps::RoundSignedAPIntToDouble(
+ m_integer)
+ : llvm::APIntOps::RoundAPIntToDouble(m_integer));
+ default:
+ const llvm::fltSemantics &sem = APFloat::IEEEsingle();
+ return llvm::APFloat::getNaN(sem);
+ }
+}
+
+llvm::APFloat Scalar::CreateAPFloatFromAPFloat(lldb::BasicType basic_type) {
+ switch (basic_type) {
+ case lldb::eBasicTypeFloat: {
+ bool loses_info;
+ m_float.convert(llvm::APFloat::IEEEsingle(),
+ llvm::APFloat::rmNearestTiesToEven, &loses_info);
+ return m_float;
+ }
+ case lldb::eBasicTypeDouble:
+ // No way to get more precision at the moment.
+ case lldb::eBasicTypeLongDouble: {
+ bool loses_info;
+ m_float.convert(llvm::APFloat::IEEEdouble(),
+ llvm::APFloat::rmNearestTiesToEven, &loses_info);
+ return m_float;
+ }
+ default:
+ const llvm::fltSemantics &sem = APFloat::IEEEsingle();
+ return llvm::APFloat::getNaN(sem);
+ }
+}
+
+
bool lldb_private::operator==(Scalar lhs, Scalar rhs) {
// If either entry is void then we can just compare the types
if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
>From 8de923d01dca34061f6a5ea7dad995ad754426ca Mon Sep 17 00:00:00 2001
From: Caroline Tice <cmtice at google.com>
Date: Wed, 27 Mar 2024 13:17:23 -0700
Subject: [PATCH 2/2] [LLDB] Add APFloat helper functions to Scalar class.
Fix clang-format issues.
---
lldb/include/lldb/Utility/Scalar.h | 3 +-
lldb/source/Utility/Scalar.cpp | 62 +++++++++++++++---------------
2 files changed, 32 insertions(+), 33 deletions(-)
diff --git a/lldb/include/lldb/Utility/Scalar.h b/lldb/include/lldb/Utility/Scalar.h
index d5e70fdf203001..c89566f5e9d01a 100644
--- a/lldb/include/lldb/Utility/Scalar.h
+++ b/lldb/include/lldb/Utility/Scalar.h
@@ -71,8 +71,7 @@ class Scalar {
: m_type(e_int), m_integer(std::move(v), false), m_float(0.0f) {}
Scalar(llvm::APSInt v)
: m_type(e_int), m_integer(std::move(v)), m_float(0.0f) {}
- Scalar(llvm::APFloat v)
- : m_integer(0), m_float(v) {}
+ Scalar(llvm::APFloat v) : m_integer(0), m_float(v) {}
bool SignExtend(uint32_t bit_pos);
diff --git a/lldb/source/Utility/Scalar.cpp b/lldb/source/Utility/Scalar.cpp
index afcb204d8f95a5..e94fd459623665 100644
--- a/lldb/source/Utility/Scalar.cpp
+++ b/lldb/source/Utility/Scalar.cpp
@@ -815,46 +815,46 @@ bool Scalar::ExtractBitfield(uint32_t bit_size, uint32_t bit_offset) {
llvm::APFloat Scalar::CreateAPFloatFromAPSInt(lldb::BasicType basic_type) {
switch (basic_type) {
- case lldb::eBasicTypeFloat:
- return llvm::APFloat(m_integer.isSigned()
- ? llvm::APIntOps::RoundSignedAPIntToFloat(m_integer)
- : llvm::APIntOps::RoundAPIntToFloat(m_integer));
- case lldb::eBasicTypeDouble:
- // No way to get more precision at the moment.
- case lldb::eBasicTypeLongDouble:
- return llvm::APFloat(m_integer.isSigned()
- ? llvm::APIntOps::RoundSignedAPIntToDouble(
- m_integer)
- : llvm::APIntOps::RoundAPIntToDouble(m_integer));
- default:
- const llvm::fltSemantics &sem = APFloat::IEEEsingle();
- return llvm::APFloat::getNaN(sem);
+ case lldb::eBasicTypeFloat:
+ return llvm::APFloat(
+ m_integer.isSigned()
+ ? llvm::APIntOps::RoundSignedAPIntToFloat(m_integer)
+ : llvm::APIntOps::RoundAPIntToFloat(m_integer));
+ case lldb::eBasicTypeDouble:
+ // No way to get more precision at the moment.
+ case lldb::eBasicTypeLongDouble:
+ return llvm::APFloat(
+ m_integer.isSigned()
+ ? llvm::APIntOps::RoundSignedAPIntToDouble(m_integer)
+ : llvm::APIntOps::RoundAPIntToDouble(m_integer));
+ default:
+ const llvm::fltSemantics &sem = APFloat::IEEEsingle();
+ return llvm::APFloat::getNaN(sem);
}
}
llvm::APFloat Scalar::CreateAPFloatFromAPFloat(lldb::BasicType basic_type) {
switch (basic_type) {
- case lldb::eBasicTypeFloat: {
- bool loses_info;
- m_float.convert(llvm::APFloat::IEEEsingle(),
- llvm::APFloat::rmNearestTiesToEven, &loses_info);
- return m_float;
- }
- case lldb::eBasicTypeDouble:
- // No way to get more precision at the moment.
- case lldb::eBasicTypeLongDouble: {
- bool loses_info;
- m_float.convert(llvm::APFloat::IEEEdouble(),
+ case lldb::eBasicTypeFloat: {
+ bool loses_info;
+ m_float.convert(llvm::APFloat::IEEEsingle(),
llvm::APFloat::rmNearestTiesToEven, &loses_info);
- return m_float;
- }
- default:
- const llvm::fltSemantics &sem = APFloat::IEEEsingle();
- return llvm::APFloat::getNaN(sem);
+ return m_float;
+ }
+ case lldb::eBasicTypeDouble:
+ // No way to get more precision at the moment.
+ case lldb::eBasicTypeLongDouble: {
+ bool loses_info;
+ m_float.convert(llvm::APFloat::IEEEdouble(),
+ llvm::APFloat::rmNearestTiesToEven, &loses_info);
+ return m_float;
+ }
+ default:
+ const llvm::fltSemantics &sem = APFloat::IEEEsingle();
+ return llvm::APFloat::getNaN(sem);
}
}
-
bool lldb_private::operator==(Scalar lhs, Scalar rhs) {
// If either entry is void then we can just compare the types
if (lhs.m_type == Scalar::e_void || rhs.m_type == Scalar::e_void)
More information about the lldb-commits
mailing list