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 <michaelbuc...@gmail.com> Date: Fri, 26 Jul 2024 01:19:02 +0100 Subject: [PATCH 1/2] [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 <michaelbuc...@gmail.com> Date: Fri, 26 Jul 2024 01:39:25 +0100 Subject: [PATCH 2/2] 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; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits