[Lldb-commits] [lldb] [lldb] Add SBType::GetByteAlign (PR #90960)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri May 3 04:29:17 PDT 2024
https://github.com/labath created https://github.com/llvm/llvm-project/pull/90960
lldb already mostly(*) tracks this information. This just makes it available to the SB users.
(*) It does not do that for typedefs right now see llvm.org/pr90958
>From 738c13a680b945a0aea1dc762e7122b5ce5608ad Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Fri, 3 May 2024 11:18:15 +0000
Subject: [PATCH] [lldb] Add SBType::GetByteAlign
lldb already mostly(*) tracks this information. This just makes it
available to the SB users.
(*) It does not do that for typedefs right now see llvm.org/pr90958
---
lldb/include/lldb/API/SBType.h | 2 ++
lldb/source/API/SBType.cpp | 12 +++++++++++
lldb/test/API/python_api/type/TestTypeList.py | 21 +++++++++++++++++++
lldb/test/API/python_api/type/main.cpp | 3 +++
4 files changed, 38 insertions(+)
diff --git a/lldb/include/lldb/API/SBType.h b/lldb/include/lldb/API/SBType.h
index 5b9ff2170b2b24..63ba91082d5769 100644
--- a/lldb/include/lldb/API/SBType.h
+++ b/lldb/include/lldb/API/SBType.h
@@ -150,6 +150,8 @@ class SBType {
uint64_t GetByteSize();
+ uint64_t GetByteAlign();
+
bool IsPointerType();
bool IsReferenceType();
diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp
index 6cecb5c9ea810b..f9a2a0548ef83a 100644
--- a/lldb/source/API/SBType.cpp
+++ b/lldb/source/API/SBType.cpp
@@ -25,6 +25,7 @@
#include "lldb/Utility/Stream.h"
#include "llvm/ADT/APSInt.h"
+#include "llvm/Support/MathExtras.h"
#include <memory>
#include <optional>
@@ -132,6 +133,17 @@ uint64_t SBType::GetByteSize() {
return 0;
}
+uint64_t SBType::GetByteAlign() {
+ LLDB_INSTRUMENT_VA(this);
+
+ if (!IsValid()) return 0;
+
+ std::optional<uint64_t> bit_align =
+ m_opaque_sp->GetCompilerType(/*prefer_dynamic=*/false)
+ .GetTypeBitAlign(nullptr);
+ return llvm::divideCeil(bit_align.value_or(0), 8);
+}
+
bool SBType::IsPointerType() {
LLDB_INSTRUMENT_VA(this);
diff --git a/lldb/test/API/python_api/type/TestTypeList.py b/lldb/test/API/python_api/type/TestTypeList.py
index 17e27b624511cf..0498396903dcbd 100644
--- a/lldb/test/API/python_api/type/TestTypeList.py
+++ b/lldb/test/API/python_api/type/TestTypeList.py
@@ -272,3 +272,24 @@ def test(self):
self.assertTrue(int_enum_uchar)
self.DebugSBType(int_enum_uchar)
self.assertEqual(int_enum_uchar.GetName(), "unsigned char")
+
+ def test_GetByteAlign(self):
+ """Exercise SBType::GetByteAlign"""
+ self.build()
+ spec = lldb.SBModuleSpec()
+ spec.SetFileSpec(lldb.SBFileSpec(self.getBuildArtifact()))
+ module = lldb.SBModule(spec)
+ self.assertTrue(module)
+
+ # Invalid types should not crash.
+ self.assertEqual(lldb.SBType().GetByteAlign(), 0)
+
+ # Try a type with natural alignment.
+ void_ptr = module.GetBasicType(lldb.eBasicTypeVoid).GetPointerType()
+ self.assertTrue(void_ptr)
+ # Not exactly guaranteed by the spec, but should be true everywhere we
+ # care about.
+ self.assertEqual(void_ptr.GetByteSize(), void_ptr.GetByteAlign())
+
+ # And an over-aligned type.
+ self.assertEqual(module.FindFirstType("OverAlignedStruct").GetByteAlign(), 128)
diff --git a/lldb/test/API/python_api/type/main.cpp b/lldb/test/API/python_api/type/main.cpp
index 7384a3d8da16fb..986ed3009a15f6 100644
--- a/lldb/test/API/python_api/type/main.cpp
+++ b/lldb/test/API/python_api/type/main.cpp
@@ -50,6 +50,9 @@ enum EnumType {};
enum class ScopedEnumType {};
enum class EnumUChar : unsigned char {};
+struct alignas(128) OverAlignedStruct {};
+OverAlignedStruct over_aligned_struct;
+
int main (int argc, char const *argv[])
{
Task *task_head = new Task(-1, NULL);
More information about the lldb-commits
mailing list