[Lldb-commits] [lldb] [lldb] Add SBType::GetByteAlign (PR #90960)
via lldb-commits
lldb-commits at lists.llvm.org
Fri May 3 04:29:46 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Pavel Labath (labath)
<details>
<summary>Changes</summary>
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
---
Full diff: https://github.com/llvm/llvm-project/pull/90960.diff
4 Files Affected:
- (modified) lldb/include/lldb/API/SBType.h (+2)
- (modified) lldb/source/API/SBType.cpp (+12)
- (modified) lldb/test/API/python_api/type/TestTypeList.py (+21)
- (modified) lldb/test/API/python_api/type/main.cpp (+3)
``````````diff
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);
``````````
</details>
https://github.com/llvm/llvm-project/pull/90960
More information about the lldb-commits
mailing list