From 7b06cb4523083206ad79776c80a564cd26bd8326 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Tue, 3 Mar 2020 13:01:51 -0800 Subject: [PATCH] Add an opque payload field to lldb::Type (NFC). Differential Revision: https://reviews.llvm.org/D75562 --- lldb/include/lldb/Symbol/Type.h | 14 ++++++------- .../LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp | 2 +- .../SymbolFile/DWARF/DWARFASTParserClang.cpp | 11 +++++------ .../Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 4 ++++ .../Plugins/TypeSystem/Clang/TypeSystemClang.h | 23 +++++++++++++++++++++- lldb/source/Symbol/Type.cpp | 9 ++++----- 6 files changed, 43 insertions(+), 20 deletions(-) diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h index 11b83d7..d18027c 100644 --- a/lldb/include/lldb/Symbol/Type.h +++ b/lldb/include/lldb/Symbol/Type.h @@ -97,7 +97,7 @@ public: llvm::Optional byte_size, SymbolContextScope *context, lldb::user_id_t encoding_uid, EncodingDataType encoding_uid_type, const Declaration &decl, const CompilerType &compiler_qual_type, - ResolveState compiler_type_resolve_state); + ResolveState compiler_type_resolve_state, uint32_t opaque_payload = 0); // This makes an invalid type. Used for functions that return a Type when // they get an error. @@ -196,11 +196,10 @@ public: uint32_t GetEncodingMask(); - bool IsCompleteObjCClass() { return m_is_complete_objc_class; } - - void SetIsCompleteObjCClass(bool is_complete_objc_class) { - m_is_complete_objc_class = is_complete_objc_class; - } + /// Return the language-specific payload. + uint32_t GetPayload() { return m_payload; } + /// Return the language-specific payload. + void SetPayload(uint32_t opaque_payload) { m_payload = opaque_payload; } protected: ConstString m_name; @@ -215,7 +214,8 @@ protected: Declaration m_decl; CompilerType m_compiler_type; ResolveState m_compiler_type_resolve_state; - bool m_is_complete_objc_class; + /// Language-specific flags. + uint32_t m_payload; Type *GetEncodingType(); diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp index 459e02e..5fb03a6 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp @@ -129,7 +129,7 @@ ObjCLanguageRuntime::LookupInCompleteClassCache(ConstString &name) { if (TypeSystemClang::IsObjCObjectOrInterfaceType( type_sp->GetForwardCompilerType())) { - if (type_sp->IsCompleteObjCClass()) { + if (TypePayloadClang(type_sp->GetPayload()).IsCompleteObjCClass()) { m_complete_class_cache[name] = type_sp; return type_sp; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 760933b..96500da 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -1634,12 +1634,11 @@ DWARFASTParserClang::ParseStructureLikeDIE(const SymbolContext &sc, // parameters in any class methods need it for the clang types for // function prototypes. LinkDeclContextToDIE(m_ast.GetDeclContextForType(clang_type), die); - type_sp = std::make_shared(die.GetID(), dwarf, attrs.name, - attrs.byte_size, nullptr, LLDB_INVALID_UID, - Type::eEncodingIsUID, &attrs.decl, - clang_type, Type::ResolveState::Forward); - - type_sp->SetIsCompleteObjCClass(attrs.is_complete_objc_class); + type_sp = std::make_shared( + die.GetID(), dwarf, attrs.name, attrs.byte_size, nullptr, + LLDB_INVALID_UID, Type::eEncodingIsUID, &attrs.decl, clang_type, + Type::ResolveState::Forward, + TypePayloadClang(attrs.is_complete_objc_class)); // Add our type to the unique type map so we don't end up creating many // copies of the same type over and over in the ASTContext for our diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index a94e5a1..22f401f 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -316,6 +316,10 @@ static ClangASTMap &GetASTMap() { return *g_map_ptr; } +TypePayloadClang::TypePayloadClang(bool is_complete_objc_class) { + SetIsCompleteObjCClass(is_complete_objc_class); +} + char TypeSystemClang::ID; bool TypeSystemClang::IsOperator(llvm::StringRef name, diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 49b0bd7..a609b06 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -33,6 +33,7 @@ #include "lldb/Symbol/TypeSystem.h" #include "lldb/Target/Target.h" #include "lldb/Utility/ConstString.h" +#include "lldb/Utility/Flags.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Logging.h" #include "lldb/lldb-enumerations.h" @@ -42,7 +43,9 @@ class PDBASTParser; namespace clang { class FileManager; -} +class HeaderSearch; +class ModuleMap; +} // namespace clang namespace lldb_private { @@ -50,6 +53,24 @@ class ClangASTMetadata; class ClangASTSource; class Declaration; +/// The implementation of lldb::Type's m_payload field for TypeSystemClang. +class TypePayloadClang { + /// Layout: bit 31 ... IsCompleteObjCClass. + uint32_t m_payload = 0; +public: + TypePayloadClang() = default; + explicit TypePayloadClang(bool is_complete_objc_class); + explicit TypePayloadClang(uint32_t opaque_payload) : m_payload(opaque_payload) {} + operator uint32_t() { return m_payload; } + + static constexpr unsigned ObjCClassBit = 1 << 31; + bool IsCompleteObjCClass() { return Flags(m_payload).Test(ObjCClassBit); } + void SetIsCompleteObjCClass(bool is_complete_objc_class) { + m_payload = is_complete_objc_class ? Flags(m_payload).Set(ObjCClassBit) + : Flags(m_payload).Clear(ObjCClassBit); + } +}; + /// A TypeSystem implementation based on Clang. /// /// This class uses a single clang::ASTContext as the backend for storing diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp index 09c0e16..804f7e0 100644 --- a/lldb/source/Symbol/Type.cpp +++ b/lldb/source/Symbol/Type.cpp @@ -143,15 +143,14 @@ Type::Type(lldb::user_id_t uid, SymbolFile *symbol_file, ConstString name, llvm::Optional byte_size, SymbolContextScope *context, user_id_t encoding_uid, EncodingDataType encoding_uid_type, const Declaration &decl, const CompilerType &compiler_type, - ResolveState compiler_type_resolve_state) + ResolveState compiler_type_resolve_state, uint32_t opaque_payload) : std::enable_shared_from_this(), UserID(uid), m_name(name), m_symbol_file(symbol_file), m_context(context), m_encoding_type(nullptr), m_encoding_uid(encoding_uid), m_encoding_uid_type(encoding_uid_type), m_decl(decl), m_compiler_type(compiler_type), - m_compiler_type_resolve_state( - compiler_type ? compiler_type_resolve_state - : ResolveState::Unresolved), - m_is_complete_objc_class(false) { + m_compiler_type_resolve_state(compiler_type ? compiler_type_resolve_state + : ResolveState::Unresolved), + m_payload(opaque_payload) { if (byte_size) { m_byte_size = *byte_size; m_byte_size_has_value = true; -- 2.7.4