[Lldb-commits] [lldb] [lldb][TypeSystemClang][NFC] Clean up TypeSystemClang::GetBitSize (PR #100674)
Michael Buch via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 25 22:56:08 PDT 2024
https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/100674
>From 0f982058ed0e8a28c4e4b440f480584fa06e80d5 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 26 Jul 2024 01:19:02 +0100
Subject: [PATCH 1/4] [lldb][TypeSystemClang][NFC] Clean up
TypeSystemClang::GetBitSize
This patch does following NFC changes to TypeSystemClang::GetBitSize:
* Factor out the Objective-C logic into a helper function.
* We had a redundant check for `GetCompleteType` in the `RecordType`
case. We can remove that switch case entirely and rely on the
`default` case.
* Introduce a new case for `FunctionProto`. I don't see a good reason
for special-casing this in the `default` case.
* Introduce a new case for `IncompleteArray`.
The motivation for this is that there are a few issues around VLAs
(i.e., `Type::IncompleteArray`) whose fixes will be easier to reason
about after this refactor.
---
.../TypeSystem/Clang/TypeSystemClang.cpp | 116 +++++++++---------
.../TypeSystem/Clang/TypeSystemClang.h | 3 +
2 files changed, 63 insertions(+), 56 deletions(-)
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index f70efe5ed57e4..3c16e86f12a3f 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -4725,67 +4725,71 @@ TypeSystemClang::GetFloatTypeSemantics(size_t byte_size) {
return llvm::APFloatBase::Bogus();
}
+std::optional<uint64_t>
+TypeSystemClang::GetObjCBitSize(QualType qual_type,
+ ExecutionContextScope *exe_scope) {
+ assert(qual_type->isObjCObjectOrInterfaceType());
+ ExecutionContext exe_ctx(exe_scope);
+ Process *process = exe_ctx.GetProcessPtr();
+ if (process) {
+ if (ObjCLanguageRuntime *objc_runtime =
+ ObjCLanguageRuntime::Get(*process)) {
+ if (std::optional<uint64_t> bit_size =
+ objc_runtime->GetTypeBitSize(GetType(qual_type)))
+ return *bit_size;
+ }
+ } else {
+ static bool g_printed = false;
+ if (!g_printed) {
+ StreamString s;
+ DumpTypeDescription(qual_type.getAsOpaquePtr(), s);
+
+ llvm::outs() << "warning: trying to determine the size of type ";
+ llvm::outs() << s.GetString() << "\n";
+ llvm::outs() << "without a valid ExecutionContext. this is not "
+ "reliable. please file a bug against LLDB.\n";
+ llvm::outs() << "backtrace:\n";
+ llvm::sys::PrintStackTrace(llvm::outs());
+ llvm::outs() << "\n";
+ g_printed = true;
+ }
+ }
+
+ return getASTContext().getTypeSize(qual_type) +
+ getASTContext().getTypeSize(getASTContext().ObjCBuiltinClassTy);
+}
+
std::optional<uint64_t>
TypeSystemClang::GetBitSize(lldb::opaque_compiler_type_t type,
ExecutionContextScope *exe_scope) {
- if (GetCompleteType(type)) {
- clang::QualType qual_type(GetCanonicalQualType(type));
- const clang::Type::TypeClass type_class = qual_type->getTypeClass();
- switch (type_class) {
- case clang::Type::Record:
- if (GetCompleteType(type))
- return getASTContext().getTypeSize(qual_type);
- else
- return std::nullopt;
- break;
+ if (!GetCompleteType(type))
+ return std::nullopt;
- case clang::Type::ObjCInterface:
- case clang::Type::ObjCObject: {
- ExecutionContext exe_ctx(exe_scope);
- Process *process = exe_ctx.GetProcessPtr();
- if (process) {
- if (ObjCLanguageRuntime *objc_runtime =
- ObjCLanguageRuntime::Get(*process)) {
- if (std::optional<uint64_t> bit_size =
- objc_runtime->GetTypeBitSize(GetType(qual_type)))
- return *bit_size;
- }
- } else {
- static bool g_printed = false;
- if (!g_printed) {
- StreamString s;
- DumpTypeDescription(type, s);
-
- llvm::outs() << "warning: trying to determine the size of type ";
- llvm::outs() << s.GetString() << "\n";
- llvm::outs() << "without a valid ExecutionContext. this is not "
- "reliable. please file a bug against LLDB.\n";
- llvm::outs() << "backtrace:\n";
- llvm::sys::PrintStackTrace(llvm::outs());
- llvm::outs() << "\n";
- g_printed = true;
- }
- }
- }
- [[fallthrough]];
- default:
- const uint32_t bit_size = getASTContext().getTypeSize(qual_type);
- if (bit_size == 0) {
- if (qual_type->isIncompleteArrayType())
- return getASTContext().getTypeSize(
- qual_type->getArrayElementTypeNoTypeQual()
- ->getCanonicalTypeUnqualified());
- }
- if (qual_type->isObjCObjectOrInterfaceType())
- return bit_size +
- getASTContext().getTypeSize(getASTContext().ObjCBuiltinClassTy);
- // Function types actually have a size of 0, that's not an error.
- if (qual_type->isFunctionProtoType())
- return bit_size;
- if (bit_size)
- return bit_size;
- }
+ clang::QualType qual_type(GetCanonicalQualType(type));
+ const clang::Type::TypeClass type_class = qual_type->getTypeClass();
+ switch (type_class) {
+ case clang::Type::FunctionProto:
+ case clang::Type::Record:
+ return getASTContext().getTypeSize(qual_type);
+ case clang::Type::ObjCInterface:
+ case clang::Type::ObjCObject:
+ return GetObjCBitSize(qual_type, exe_scope);
+ case clang::Type::IncompleteArray: {
+ const uint32_t bit_size = getASTContext().getTypeSize(qual_type);
+ if (bit_size == 0)
+ return getASTContext().getTypeSize(
+ qual_type->getArrayElementTypeNoTypeQual()
+ ->getCanonicalTypeUnqualified());
+
+ return bit_size;
+ }
+ default: {
+ const uint32_t bit_size = getASTContext().getTypeSize(qual_type);
+ if (bit_size)
+ return bit_size;
}
+ }
+
return std::nullopt;
}
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
index d67b7a4c9fe72..70722eb375ab7 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
@@ -1172,6 +1172,9 @@ class TypeSystemClang : public TypeSystem {
/// on creation of a new instance.
void LogCreation() const;
+ std::optional<uint64_t> GetObjCBitSize(clang::QualType qual_type,
+ ExecutionContextScope *exe_scope);
+
// Classes that inherit from TypeSystemClang can see and modify these
std::string m_target_triple;
std::unique_ptr<clang::ASTContext> m_ast_up;
>From b4a595bce09fb7b96c593b8a461f9a0a02c5290c Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 26 Jul 2024 01:39:25 +0100
Subject: [PATCH 2/4] fixup! reduce scope of variable
---
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 3c16e86f12a3f..b13412671e25c 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -4783,12 +4783,10 @@ TypeSystemClang::GetBitSize(lldb::opaque_compiler_type_t type,
return bit_size;
}
- default: {
- const uint32_t bit_size = getASTContext().getTypeSize(qual_type);
- if (bit_size)
+ default:
+ if (const uint64_t bit_size = getASTContext().getTypeSize(qual_type))
return bit_size;
}
- }
return std::nullopt;
}
>From a031b2e9ce01fe2019ddb5e6e23e1f0a9bfef314 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 26 Jul 2024 01:40:21 +0100
Subject: [PATCH 3/4] fixup! uint32_t -> uint64_t
---
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index b13412671e25c..3f7a6344542f4 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -4775,7 +4775,7 @@ TypeSystemClang::GetBitSize(lldb::opaque_compiler_type_t type,
case clang::Type::ObjCObject:
return GetObjCBitSize(qual_type, exe_scope);
case clang::Type::IncompleteArray: {
- const uint32_t bit_size = getASTContext().getTypeSize(qual_type);
+ const uint64_t bit_size = getASTContext().getTypeSize(qual_type);
if (bit_size == 0)
return getASTContext().getTypeSize(
qual_type->getArrayElementTypeNoTypeQual()
>From 2212ebd4c047e09d4527255c74fe18f753feb592 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 26 Jul 2024 06:55:52 +0100
Subject: [PATCH 4/4] fixup! reduce scope of process variable
---
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 3f7a6344542f4..0386e3b261c55 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -4730,8 +4730,7 @@ TypeSystemClang::GetObjCBitSize(QualType qual_type,
ExecutionContextScope *exe_scope) {
assert(qual_type->isObjCObjectOrInterfaceType());
ExecutionContext exe_ctx(exe_scope);
- Process *process = exe_ctx.GetProcessPtr();
- if (process) {
+ if (Process *process = exe_ctx.GetProcessPtr()) {
if (ObjCLanguageRuntime *objc_runtime =
ObjCLanguageRuntime::Get(*process)) {
if (std::optional<uint64_t> bit_size =
More information about the lldb-commits
mailing list