diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index f70efe5ed57e4..0386e3b261c55 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -4725,67 +4725,68 @@ TypeSystemClang::GetFloatTypeSemantics(size_t byte_size) { return llvm::APFloatBase::Bogus(); } +std::optional +TypeSystemClang::GetObjCBitSize(QualType qual_type, + ExecutionContextScope *exe_scope) { + assert(qual_type->isObjCObjectOrInterfaceType()); + ExecutionContext exe_ctx(exe_scope); + if (Process *process = exe_ctx.GetProcessPtr()) { + if (ObjCLanguageRuntime *objc_runtime = + ObjCLanguageRuntime::Get(*process)) { + if (std::optional 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 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 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 uint64_t bit_size = getASTContext().getTypeSize(qual_type); + if (bit_size == 0) + return getASTContext().getTypeSize( + qual_type->getArrayElementTypeNoTypeQual() + ->getCanonicalTypeUnqualified()); + + return bit_size; + } + default: + if (const uint64_t bit_size = getASTContext().getTypeSize(qual_type)) + 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 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 m_ast_up;