[Lldb-commits] [lldb] [lldb] Fix Scalar::GetData for non-multiple-of-8-bits values (PR #90846)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Thu May 2 04:06:34 PDT 2024
https://github.com/labath created https://github.com/llvm/llvm-project/pull/90846
It was aligning the byte size down. Now it aligns up. This manifested itself as SBTypeStaticField::GetConstantValue returning a zero-sized value for `bool` fields (because clang represents bool as a 1-bit value).
I've changed the code for float Scalars as well, although I'm not aware of floating point values that are not multiples of 8 bits.
>From 7336344b98881a5158d9d4d72af5c51ebd1e74e2 Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Thu, 2 May 2024 10:49:13 +0000
Subject: [PATCH] [lldb] Fix Scalar::GetData for non-multiple-of-8-bits values
It was aligning the byte size down. Now it aligns up. This manifested
itself as SBTypeStaticField::GetConstantValue returning a zero-sized
value for `bool` fields (because clang represents bool as a 1-bit value).
I've changed the code for float Scalars as well, although I'm not aware
of floating point values that are not multiples of 8 bits.
---
lldb/source/Utility/Scalar.cpp | 4 +--
lldb/test/API/python_api/type/TestTypeList.py | 11 +++++++
lldb/test/API/python_api/type/main.cpp | 1 +
lldb/unittests/Utility/ScalarTest.cpp | 30 +++++++++++++++++++
4 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/lldb/source/Utility/Scalar.cpp b/lldb/source/Utility/Scalar.cpp
index e94fd459623665..c70c5e10799187 100644
--- a/lldb/source/Utility/Scalar.cpp
+++ b/lldb/source/Utility/Scalar.cpp
@@ -134,9 +134,9 @@ size_t Scalar::GetByteSize() const {
case e_void:
break;
case e_int:
- return (m_integer.getBitWidth() / 8);
+ return (m_integer.getBitWidth() + 7) / 8;
case e_float:
- return m_float.bitcastToAPInt().getBitWidth() / 8;
+ return (m_float.bitcastToAPInt().getBitWidth() + 7) / 8;
}
return 0;
}
diff --git a/lldb/test/API/python_api/type/TestTypeList.py b/lldb/test/API/python_api/type/TestTypeList.py
index 81c44f7a39d61a..4dbfb06f8fc58c 100644
--- a/lldb/test/API/python_api/type/TestTypeList.py
+++ b/lldb/test/API/python_api/type/TestTypeList.py
@@ -52,6 +52,17 @@ def _find_static_field_in_Task_pointer(self, task_pointer):
self.DebugSBValue(value)
self.assertEqual(value.GetValueAsSigned(), 47)
+ static_constexpr_bool_field = task_type.GetStaticFieldWithName(
+ "static_constexpr_bool_field"
+ )
+ self.assertTrue(static_constexpr_bool_field)
+ self.assertEqual(static_constexpr_bool_field.GetName(), "static_constexpr_bool_field")
+ self.assertEqual(static_constexpr_bool_field.GetType().GetName(), "const bool")
+
+ value = static_constexpr_bool_field.GetConstantValue(self.target())
+ self.DebugSBValue(value)
+ self.assertEqual(value.GetValueAsUnsigned(), 1)
+
static_mutable_field = task_type.GetStaticFieldWithName("static_mutable_field")
self.assertTrue(static_mutable_field)
self.assertEqual(static_mutable_field.GetName(), "static_mutable_field")
diff --git a/lldb/test/API/python_api/type/main.cpp b/lldb/test/API/python_api/type/main.cpp
index c86644d918279a..7384a3d8da16fb 100644
--- a/lldb/test/API/python_api/type/main.cpp
+++ b/lldb/test/API/python_api/type/main.cpp
@@ -28,6 +28,7 @@ class Task {
union U {
} u;
static constexpr long static_constexpr_field = 47;
+ static constexpr bool static_constexpr_bool_field = true;
static int static_mutable_field;
Task(int i, Task *n):
id(i),
diff --git a/lldb/unittests/Utility/ScalarTest.cpp b/lldb/unittests/Utility/ScalarTest.cpp
index 8d957d16593ee7..500cb8bb2286e0 100644
--- a/lldb/unittests/Utility/ScalarTest.cpp
+++ b/lldb/unittests/Utility/ScalarTest.cpp
@@ -13,8 +13,11 @@
#include "lldb/Utility/Scalar.h"
#include "lldb/Utility/Status.h"
#include "lldb/Utility/StreamString.h"
+#include "lldb/lldb-enumerations.h"
+#include "llvm/ADT/APSInt.h"
#include "llvm/Testing/Support/Error.h"
+#include <algorithm>
#include <cmath>
using namespace lldb_private;
@@ -163,6 +166,33 @@ TEST(ScalarTest, GetBytes) {
ASSERT_EQ(0, memcmp(f, Storage, sizeof(f)));
}
+TEST(ScalarTest, GetData) {
+ auto get_data = [](llvm::APSInt v) {
+ DataExtractor data;
+ Scalar(v).GetData(data);
+ return data.GetData().vec();
+ };
+
+ auto vec = [](std::initializer_list<uint8_t> l) {
+ std::vector<uint8_t> v(l.begin(), l.end());
+ if (endian::InlHostByteOrder() == lldb::eByteOrderLittle)
+ std::reverse(v.begin(), v.end());
+ return v;
+ };
+
+ EXPECT_THAT(
+ get_data(llvm::APSInt::getMaxValue(/*numBits=*/1, /*Unsigned=*/true)),
+ vec({0x01}));
+
+ EXPECT_THAT(
+ get_data(llvm::APSInt::getMaxValue(/*numBits=*/8, /*Unsigned=*/true)),
+ vec({0xff}));
+
+ EXPECT_THAT(
+ get_data(llvm::APSInt::getMaxValue(/*numBits=*/9, /*Unsigned=*/true)),
+ vec({0x01, 0xff}));
+}
+
TEST(ScalarTest, SetValueFromData) {
uint8_t a[] = {1, 2, 3, 4};
Scalar s;
More information about the lldb-commits
mailing list