Author: gclayton Date: Thu Sep 17 17:23:34 2015 New Revision: 247953 URL: http://llvm.org/viewvc/llvm-project?rev=247953&view=rev Log: TypeSystem is now a plugin interface and removed any "ClangASTContext &Class::GetClangASTContext()" functions.
This cleans up type systems to be more pluggable. Prior to this we had issues: - Module, SymbolFile, and many others has "ClangASTContext &GetClangASTContext()" functions. All have been switched over to use "TypeSystem *GetTypeSystemForLanguage()" - Cleaned up any places that were using the GetClangASTContext() functions to use TypeSystem - Cleaned up Module so that it no longer has dedicated type system member variables: lldb::ClangASTContextUP m_ast; ///< The Clang AST context for this module. lldb::GoASTContextUP m_go_ast; ///< The Go AST context for this module. Now we have a type system map: typedef std::map<lldb::LanguageType, lldb::TypeSystemSP> TypeSystemMap; TypeSystemMap m_type_system_map; ///< A map of any type systems associated with this module - Many places in code were using ClangASTContext static functions to place with CompilerType objects and add modifiers (const, volatile, restrict) and to make typedefs, L and R value references and more. These have been made into CompilerType functions that are abstract: class CompilerType { ... //---------------------------------------------------------------------- // Return a new CompilerType that is a L value reference to this type if // this type is valid and the type system supports L value references, // else return an invalid type. //---------------------------------------------------------------------- CompilerType GetLValueReferenceType () const; //---------------------------------------------------------------------- // Return a new CompilerType that is a R value reference to this type if // this type is valid and the type system supports R value references, // else return an invalid type. //---------------------------------------------------------------------- CompilerType GetRValueReferenceType () const; //---------------------------------------------------------------------- // Return a new CompilerType adds a const modifier to this type if // this type is valid and the type system supports const modifiers, // else return an invalid type. //---------------------------------------------------------------------- CompilerType AddConstModifier () const; //---------------------------------------------------------------------- // Return a new CompilerType adds a volatile modifier to this type if // this type is valid and the type system supports volatile modifiers, // else return an invalid type. //---------------------------------------------------------------------- CompilerType AddVolatileModifier () const; //---------------------------------------------------------------------- // Return a new CompilerType adds a restrict modifier to this type if // this type is valid and the type system supports restrict modifiers, // else return an invalid type. //---------------------------------------------------------------------- CompilerType AddRestrictModifier () const; //---------------------------------------------------------------------- // Create a typedef to this type using "name" as the name of the typedef // this type is valid and the type system supports typedefs, else return // an invalid type. //---------------------------------------------------------------------- CompilerType CreateTypedef (const char *name, const CompilerDeclContext &decl_ctx) const; }; Other changes include: - Removed "CompilerType TypeSystem::GetIntTypeFromBitSize(...)" and CompilerType TypeSystem::GetFloatTypeFromBitSize(...) and replaced it with "CompilerType TypeSystem::GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size);" - Fixed code in Type.h to not request the full type for a type for no good reason, just request the forward type and let the type expand as needed Modified: lldb/trunk/include/lldb/Core/Module.h lldb/trunk/include/lldb/Core/PluginManager.h lldb/trunk/include/lldb/Symbol/ClangASTContext.h lldb/trunk/include/lldb/Symbol/CompilerType.h lldb/trunk/include/lldb/Symbol/GoASTContext.h lldb/trunk/include/lldb/Symbol/SymbolFile.h lldb/trunk/include/lldb/Symbol/Type.h lldb/trunk/include/lldb/Symbol/TypeSystem.h lldb/trunk/include/lldb/lldb-forward.h lldb/trunk/include/lldb/lldb-private-interfaces.h lldb/trunk/source/API/SBModule.cpp lldb/trunk/source/API/SBType.cpp lldb/trunk/source/API/SystemInitializerFull.cpp lldb/trunk/source/Commands/CommandObjectArgs.cpp lldb/trunk/source/Core/Module.cpp lldb/trunk/source/Core/PluginManager.cpp lldb/trunk/source/Core/ValueObjectDynamicValue.cpp lldb/trunk/source/Core/ValueObjectRegister.cpp lldb/trunk/source/DataFormatters/FormatManager.cpp lldb/trunk/source/DataFormatters/VectorType.cpp lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp lldb/trunk/source/Expression/ClangExpressionParser.cpp lldb/trunk/source/Initialization/SystemInitializerCommon.cpp lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp lldb/trunk/source/Plugins/Language/ObjC/CoreMedia.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp lldb/trunk/source/Symbol/ClangASTContext.cpp lldb/trunk/source/Symbol/CompilerType.cpp lldb/trunk/source/Symbol/GoASTContext.cpp lldb/trunk/source/Symbol/SymbolFile.cpp lldb/trunk/source/Symbol/Type.cpp lldb/trunk/source/Symbol/TypeSystem.cpp lldb/trunk/source/Symbol/Variable.cpp lldb/trunk/source/Target/ThreadPlanTracer.cpp Modified: lldb/trunk/include/lldb/Core/Module.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Module.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/Module.h (original) +++ lldb/trunk/include/lldb/Core/Module.h Thu Sep 17 17:23:34 2015 @@ -944,9 +944,6 @@ public: bool GetIsDynamicLinkEditor (); - ClangASTContext & - GetClangASTContext (); - TypeSystem * GetTypeSystemForLanguage (lldb::LanguageType language); @@ -1101,6 +1098,7 @@ public: bool &match_name_after_lookup); protected: + typedef std::map<lldb::LanguageType, lldb::TypeSystemSP> TypeSystemMap; //------------------------------------------------------------------ // Member Variables //------------------------------------------------------------------ @@ -1119,15 +1117,13 @@ protected: lldb::SymbolVendorUP m_symfile_ap; ///< A pointer to the symbol vendor for this module. std::vector<lldb::SymbolVendorUP> m_old_symfiles; ///< If anyone calls Module::SetSymbolFileFileSpec() and changes the symbol file, ///< we need to keep all old symbol files around in case anyone has type references to them - lldb::ClangASTContextUP m_ast; ///< The Clang AST context for this module. - lldb::GoASTContextUP m_go_ast; ///< The Go AST context for this module. + TypeSystemMap m_type_system_map; ///< A map of any type systems associated with this module PathMappingList m_source_mappings; ///< Module specific source remappings for when you have debug info for a module that doesn't match where the sources currently are lldb::SectionListUP m_sections_ap; ///< Unified section list for module that is used by the ObjectFile and and ObjectFile instances for the debug info std::atomic<bool> m_did_load_objfile; std::atomic<bool> m_did_load_symbol_vendor; std::atomic<bool> m_did_parse_uuid; - std::atomic<bool> m_did_init_ast; mutable bool m_file_has_changed:1, m_first_file_changed_log:1; /// See if the module was modified after it was initially opened. Modified: lldb/trunk/include/lldb/Core/PluginManager.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/PluginManager.h (original) +++ lldb/trunk/include/lldb/Core/PluginManager.h Thu Sep 17 17:23:34 2015 @@ -419,6 +419,22 @@ public: static InstrumentationRuntimeCreateInstance GetInstrumentationRuntimeCreateCallbackForPluginName (const ConstString &name); + //------------------------------------------------------------------ + // TypeSystem + //------------------------------------------------------------------ + static bool + RegisterPlugin (const ConstString &name, + const char *description, + TypeSystemCreateInstance create_callback); + + static bool + UnregisterPlugin (TypeSystemCreateInstance create_callback); + + static TypeSystemCreateInstance + GetTypeSystemCreateCallbackAtIndex (uint32_t idx); + + static TypeSystemCreateInstance + GetTypeSystemCreateCallbackForPluginName (const ConstString &name); //------------------------------------------------------------------ // Some plug-ins might register a DebuggerInitializeCallback Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original) +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Thu Sep 17 17:23:34 2015 @@ -55,7 +55,28 @@ public: ClangASTContext (const char *triple = NULL); ~ClangASTContext() override; - + + //------------------------------------------------------------------ + // PluginInterface functions + //------------------------------------------------------------------ + ConstString + GetPluginName() override; + + uint32_t + GetPluginVersion() override; + + static ConstString + GetPluginNameStatic (); + + static lldb::TypeSystemSP + CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch); + + static void + Initialize (); + + static void + Terminate (); + static ClangASTContext* GetASTContext (clang::ASTContext* ast_ctx); @@ -153,7 +174,7 @@ public: //------------------------------------------------------------------ CompilerType GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, - uint32_t bit_size); + size_t bit_size) override; static CompilerType GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast, @@ -448,13 +469,7 @@ public: //------------------------------------------------------------------ // Integer type functions //------------------------------------------------------------------ - - CompilerType - GetIntTypeFromBitSize (size_t bit_size, bool is_signed) override - { - return GetIntTypeFromBitSize (getASTContext(), bit_size, is_signed); - } - + static CompilerType GetIntTypeFromBitSize (clang::ASTContext *ast, size_t bit_size, bool is_signed); @@ -471,12 +486,6 @@ public: //------------------------------------------------------------------ // Floating point functions //------------------------------------------------------------------ - - CompilerType - GetFloatTypeFromBitSize (size_t bit_size) override - { - return GetFloatTypeFromBitSize (getASTContext(), bit_size); - } static CompilerType GetFloatTypeFromBitSize (clang::ASTContext *ast, @@ -673,7 +682,10 @@ public: bool IsVoidType (void *type) override; - + + bool + SupportsLanguage (lldb::LanguageType language) override; + static bool GetCXXClassName (const CompilerType& type, std::string &class_name); @@ -710,15 +722,6 @@ public: // Creating related types //---------------------------------------------------------------------- - static CompilerType - AddConstModifier (const CompilerType& type); - - static CompilerType - AddRestrictModifier (const CompilerType& type); - - static CompilerType - AddVolatileModifier (const CompilerType& type); - // Using the current type, create a new typedef to that type using "typedef_name" // as the name and "decl_ctx" as the decl context. static CompilerType @@ -752,9 +755,6 @@ public: TypeMemberFunctionImpl GetMemberFunctionAtIndex (void *type, size_t idx) override; - static CompilerType - GetLValueReferenceType (const CompilerType& type); - CompilerType GetNonReferenceType (void *type) override; @@ -763,10 +763,25 @@ public: CompilerType GetPointerType (void *type) override; - - static CompilerType - GetRValueReferenceType (const CompilerType& type); - + + CompilerType + GetLValueReferenceType (void *type) override; + + CompilerType + GetRValueReferenceType (void *type) override; + + CompilerType + AddConstModifier (void *type) override; + + CompilerType + AddVolatileModifier (void *type) override; + + CompilerType + AddRestrictModifier (void *type) override; + + CompilerType + CreateTypedef (void *type, const char *name, const CompilerDeclContext &decl_ctx) override; + // If the current object represents a typedef type, get the underlying type CompilerType GetTypedefedType (void *type) override; @@ -804,7 +819,10 @@ public: uint32_t GetNumChildren (void *type, bool omit_empty_base_classes) override; - + + CompilerType + GetBuiltinTypeByName (const ConstString &name) override; + lldb::BasicType GetBasicTypeEnumeration (void *type) override; Modified: lldb/trunk/include/lldb/Symbol/CompilerType.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/CompilerType.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/CompilerType.h (original) +++ lldb/trunk/include/lldb/Symbol/CompilerType.h Thu Sep 17 17:23:34 2015 @@ -272,15 +272,75 @@ public: TypeMemberFunctionImpl GetMemberFunctionAtIndex (size_t idx); + //---------------------------------------------------------------------- + // If this type is a reference to a type (L value or R value reference), + // return a new type with the reference removed, else return the current + // type itself. + //---------------------------------------------------------------------- CompilerType GetNonReferenceType () const; + //---------------------------------------------------------------------- + // If this type is a pointer type, return the type that the pointer + // points to, else return an invalid type. + //---------------------------------------------------------------------- CompilerType GetPointeeType () const; + //---------------------------------------------------------------------- + // Return a new CompilerType that is a pointer to this type + //---------------------------------------------------------------------- CompilerType GetPointerType () const; + //---------------------------------------------------------------------- + // Return a new CompilerType that is a L value reference to this type if + // this type is valid and the type system supports L value references, + // else return an invalid type. + //---------------------------------------------------------------------- + CompilerType + GetLValueReferenceType () const; + + //---------------------------------------------------------------------- + // Return a new CompilerType that is a R value reference to this type if + // this type is valid and the type system supports R value references, + // else return an invalid type. + //---------------------------------------------------------------------- + CompilerType + GetRValueReferenceType () const; + + //---------------------------------------------------------------------- + // Return a new CompilerType adds a const modifier to this type if + // this type is valid and the type system supports const modifiers, + // else return an invalid type. + //---------------------------------------------------------------------- + CompilerType + AddConstModifier () const; + + //---------------------------------------------------------------------- + // Return a new CompilerType adds a volatile modifier to this type if + // this type is valid and the type system supports volatile modifiers, + // else return an invalid type. + //---------------------------------------------------------------------- + CompilerType + AddVolatileModifier () const; + + //---------------------------------------------------------------------- + // Return a new CompilerType adds a restrict modifier to this type if + // this type is valid and the type system supports restrict modifiers, + // else return an invalid type. + //---------------------------------------------------------------------- + CompilerType + AddRestrictModifier () const; + + //---------------------------------------------------------------------- + // Create a typedef to this type using "name" as the name of the typedef + // this type is valid and the type system supports typedefs, else return + // an invalid type. + //---------------------------------------------------------------------- + CompilerType + CreateTypedef (const char *name, const CompilerDeclContext &decl_ctx) const; + // If the current object represents a typedef type, get the underlying type CompilerType GetTypedefedType () const; Modified: lldb/trunk/include/lldb/Symbol/GoASTContext.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/GoASTContext.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/GoASTContext.h (original) +++ lldb/trunk/include/lldb/Symbol/GoASTContext.h Thu Sep 17 17:23:34 2015 @@ -27,6 +27,28 @@ class GoASTContext : public TypeSystem GoASTContext(); ~GoASTContext(); + //------------------------------------------------------------------ + // PluginInterface functions + //------------------------------------------------------------------ + ConstString + GetPluginName() override; + + uint32_t + GetPluginVersion() override; + + static ConstString + GetPluginNameStatic (); + + static lldb::TypeSystemSP + CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch); + + static void + Initialize (); + + static void + Terminate (); + + DWARFASTParser *GetDWARFParser() override; void @@ -101,7 +123,7 @@ class GoASTContext : public TypeSystem CompilerType CreateBaseType(int go_kind, const ConstString &type_name_const_str, uint64_t byte_size); // For interface, map, chan. - CompilerType CreateTypedef(int kind, const ConstString &name, CompilerType impl); + CompilerType CreateTypedefType(int kind, const ConstString &name, CompilerType impl); CompilerType CreateVoidType(const ConstString &name); CompilerType CreateFunctionType(const lldb_private::ConstString &name, CompilerType *params, size_t params_count, @@ -124,37 +146,39 @@ class GoASTContext : public TypeSystem static bool IsDirectIface(uint8_t kind); static bool IsPointerKind(uint8_t kind); - virtual bool IsArrayType(void *type, CompilerType *element_type, uint64_t *size, bool *is_incomplete) override; + bool IsArrayType(void *type, CompilerType *element_type, uint64_t *size, bool *is_incomplete) override; - virtual bool IsAggregateType(void *type) override; + bool IsAggregateType(void *type) override; - virtual bool IsCharType(void *type) override; + bool IsCharType(void *type) override; - virtual bool IsCompleteType(void *type) override; + bool IsCompleteType(void *type) override; - virtual bool IsDefined(void *type) override; + bool IsDefined(void *type) override; - virtual bool IsFloatingPointType(void *type, uint32_t &count, bool &is_complex) override; + bool IsFloatingPointType(void *type, uint32_t &count, bool &is_complex) override; - virtual bool IsFunctionType(void *type, bool *is_variadic_ptr = NULL) override; + bool IsFunctionType(void *type, bool *is_variadic_ptr = NULL) override; - virtual size_t GetNumberOfFunctionArguments(void *type) override; + size_t GetNumberOfFunctionArguments(void *type) override; - virtual CompilerType GetFunctionArgumentAtIndex(void *type, const size_t index) override; + CompilerType GetFunctionArgumentAtIndex(void *type, const size_t index) override; - virtual bool IsFunctionPointerType(void *type) override; + bool IsFunctionPointerType(void *type) override; - virtual bool IsIntegerType(void *type, bool &is_signed) override; + bool IsIntegerType(void *type, bool &is_signed) override; - virtual bool IsPossibleDynamicType(void *type, + bool IsPossibleDynamicType(void *type, CompilerType *target_type, // Can pass NULL bool check_cplusplus, bool check_objc) override; - virtual bool IsPointerType(void *type, CompilerType *pointee_type = NULL) override; + bool IsPointerType(void *type, CompilerType *pointee_type = NULL) override; + + bool IsScalarType(void *type) override; - virtual bool IsScalarType(void *type) override; + bool IsVoidType(void *type) override; - virtual bool IsVoidType(void *type) override; + bool SupportsLanguage (lldb::LanguageType language) override; //---------------------------------------------------------------------- // Type Completion @@ -217,9 +241,9 @@ class GoASTContext : public TypeSystem virtual uint32_t GetNumChildren(void *type, bool omit_empty_base_classes) override; virtual lldb::BasicType GetBasicTypeEnumeration(void *type) override; - virtual CompilerType GetIntTypeFromBitSize (size_t bit_size, bool is_signed) override; - virtual CompilerType GetFloatTypeFromBitSize (size_t bit_size) override; + virtual CompilerType GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, + size_t bit_size) override; virtual uint32_t GetNumFields(void *type) override; Modified: lldb/trunk/include/lldb/Symbol/SymbolFile.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolFile.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/SymbolFile.h (original) +++ lldb/trunk/include/lldb/Symbol/SymbolFile.h Thu Sep 17 17:23:34 2015 @@ -147,8 +147,6 @@ public: virtual size_t GetTypes (lldb_private::SymbolContextScope *sc_scope, uint32_t type_mask, lldb_private::TypeList &type_list) = 0; - virtual ClangASTContext & - GetClangASTContext (); virtual lldb_private::TypeSystem * GetTypeSystemForLanguage (lldb::LanguageType language); Modified: lldb/trunk/include/lldb/Symbol/Type.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Type.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/Type.h (original) +++ lldb/trunk/include/lldb/Symbol/Type.h Thu Sep 17 17:23:34 2015 @@ -14,7 +14,6 @@ #include "lldb/Core/ClangForward.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/UserID.h" -#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/CompilerType.h" #include "lldb/Symbol/Declaration.h" @@ -254,9 +253,6 @@ public: CompilerType GetForwardCompilerType (); - ClangASTContext & - GetClangASTContext (); - static int Compare(const Type &a, const Type &b); @@ -422,7 +418,7 @@ public: GetPointerType () const { if (type_sp) - return type_sp->GetLayoutCompilerType ().GetPointerType(); + return type_sp->GetForwardCompilerType().GetPointerType(); return clang_type.GetPointerType(); } @@ -430,7 +426,7 @@ public: GetPointeeType () const { if (type_sp) - return type_sp->GetFullCompilerType ().GetPointeeType(); + return type_sp->GetForwardCompilerType ().GetPointeeType(); return clang_type.GetPointeeType(); } @@ -438,39 +434,43 @@ public: GetReferenceType () const { if (type_sp) - return ClangASTContext::GetLValueReferenceType(type_sp->GetLayoutCompilerType ()); - return ClangASTContext::GetLValueReferenceType(clang_type); + return type_sp->GetForwardCompilerType ().GetLValueReferenceType(); + else + return clang_type.GetLValueReferenceType(); } CompilerType GetTypedefedType () const { if (type_sp) - return type_sp->GetFullCompilerType ().GetTypedefedType(); - return clang_type.GetTypedefedType(); + return type_sp->GetForwardCompilerType ().GetTypedefedType(); + else + return clang_type.GetTypedefedType(); } CompilerType GetDereferencedType () const { if (type_sp) - return type_sp->GetFullCompilerType ().GetNonReferenceType(); - return clang_type.GetNonReferenceType(); + return type_sp->GetForwardCompilerType ().GetNonReferenceType(); + else + return clang_type.GetNonReferenceType(); } CompilerType GetUnqualifiedType () const { if (type_sp) - return type_sp->GetLayoutCompilerType ().GetFullyUnqualifiedType(); - return clang_type.GetFullyUnqualifiedType(); + return type_sp->GetForwardCompilerType ().GetFullyUnqualifiedType(); + else + return clang_type.GetFullyUnqualifiedType(); } CompilerType GetCanonicalType () const { if (type_sp) - return type_sp->GetFullCompilerType ().GetCanonicalType(); + return type_sp->GetForwardCompilerType ().GetCanonicalType(); return clang_type.GetCanonicalType(); } Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original) +++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Thu Sep 17 17:23:34 2015 @@ -14,6 +14,7 @@ #include <string> #include "lldb/lldb-private.h" #include "lldb/Core/ClangForward.h" +#include "lldb/Core/PluginInterface.h" #include "lldb/Expression/Expression.h" #include "lldb/Symbol/CompilerDeclContext.h" #include "clang/AST/CharUnits.h" @@ -28,7 +29,7 @@ namespace lldb_private { //---------------------------------------------------------------------- // Interface for representing the Type Systems in different languages. //---------------------------------------------------------------------- -class TypeSystem +class TypeSystem : public PluginInterface { public: //---------------------------------------------------------------------- @@ -71,6 +72,9 @@ public: LLVMCastKind getKind() const { return m_kind; } + static lldb::TypeSystemSP + CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch); + //---------------------------------------------------------------------- // Constructors and Destructors //---------------------------------------------------------------------- @@ -182,7 +186,11 @@ public: virtual bool IsVoidType (void *type) = 0; - + + // TypeSystems can support more than one language + virtual bool + SupportsLanguage (lldb::LanguageType language) = 0; + //---------------------------------------------------------------------- // Type Completion //---------------------------------------------------------------------- @@ -245,7 +253,25 @@ public: virtual CompilerType GetPointerType (void *type) = 0; - + + virtual CompilerType + GetLValueReferenceType (void *type); + + virtual CompilerType + GetRValueReferenceType (void *type); + + virtual CompilerType + AddConstModifier (void *type); + + virtual CompilerType + AddVolatileModifier (void *type); + + virtual CompilerType + AddRestrictModifier (void *type); + + virtual CompilerType + CreateTypedef (void *type, const char *name, const CompilerDeclContext &decl_ctx); + //---------------------------------------------------------------------- // Exploring the type //---------------------------------------------------------------------- @@ -261,7 +287,10 @@ public: virtual uint32_t GetNumChildren (void *type, bool omit_empty_base_classes) = 0; - + + virtual CompilerType + GetBuiltinTypeByName (const ConstString &name); + virtual lldb::BasicType GetBasicTypeEnumeration (void *type) = 0; @@ -417,10 +446,8 @@ public: GetBasicTypeFromAST (lldb::BasicType basic_type) = 0; virtual CompilerType - GetIntTypeFromBitSize (size_t bit_size, bool is_signed) = 0; - - virtual CompilerType - GetFloatTypeFromBitSize (size_t bit_size) = 0; + GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, + size_t bit_size) = 0; virtual bool IsBeingDefined (void *type) = 0; Modified: lldb/trunk/include/lldb/lldb-forward.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-forward.h (original) +++ lldb/trunk/include/lldb/lldb-forward.h Thu Sep 17 17:23:34 2015 @@ -426,6 +426,7 @@ namespace lldb { typedef std::shared_ptr<lldb_private::TypeMemberFunctionImpl> TypeMemberFunctionImplSP; typedef std::shared_ptr<lldb_private::TypeEnumMemberImpl> TypeEnumMemberImplSP; typedef std::shared_ptr<lldb_private::TypeFilterImpl> TypeFilterImplSP; + typedef std::shared_ptr<lldb_private::TypeSystem> TypeSystemSP; typedef std::shared_ptr<lldb_private::TypeFormatImpl> TypeFormatImplSP; typedef std::shared_ptr<lldb_private::TypeNameSpecifierImpl> TypeNameSpecifierImplSP; typedef std::shared_ptr<lldb_private::TypeSummaryImpl> TypeSummaryImplSP; Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-private-interfaces.h (original) +++ lldb/trunk/include/lldb/lldb-private-interfaces.h Thu Sep 17 17:23:34 2015 @@ -46,6 +46,7 @@ namespace lldb_private typedef lldb::MemoryHistorySP (*MemoryHistoryCreateInstance) (const lldb::ProcessSP &process_sp); typedef lldb::InstrumentationRuntimeType (*InstrumentationRuntimeGetType) (); typedef lldb::InstrumentationRuntimeSP (*InstrumentationRuntimeCreateInstance) (const lldb::ProcessSP &process_sp); + typedef lldb::TypeSystemSP (*TypeSystemCreateInstance) (lldb::LanguageType language, const lldb_private::ArchSpec &arch); typedef int (*ComparisonFunction)(const void *, const void *); typedef void (*DebuggerInitializeCallback)(Debugger &debugger); Modified: lldb/trunk/source/API/SBModule.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBModule.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/API/SBModule.cpp (original) +++ lldb/trunk/source/API/SBModule.cpp Thu Sep 17 17:23:34 2015 @@ -20,10 +20,10 @@ #include "lldb/Core/StreamString.h" #include "lldb/Core/ValueObjectList.h" #include "lldb/Core/ValueObjectVariable.h" -#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/Symtab.h" +#include "lldb/Symbol/TypeSystem.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/Target.h" @@ -521,7 +521,11 @@ SBModule::FindFirstType (const char *nam sb_type = SBType (module_sp->FindFirstType(sc, name, exact_match)); if (!sb_type.IsValid()) - sb_type = SBType (ClangASTContext::GetBasicType (module_sp->GetClangASTContext().getASTContext(), name)); + { + TypeSystem *type_system = module_sp->GetTypeSystemForLanguage(eLanguageTypeC); + if (type_system) + sb_type = SBType (type_system->GetBuiltinTypeByName(name)); + } } return sb_type; } @@ -531,7 +535,11 @@ SBModule::GetBasicType(lldb::BasicType t { ModuleSP module_sp (GetSP ()); if (module_sp) - return SBType (ClangASTContext::GetBasicType (module_sp->GetClangASTContext().getASTContext(), type)); + { + TypeSystem *type_system = module_sp->GetTypeSystemForLanguage(eLanguageTypeC); + if (type_system) + return SBType (type_system->GetBasicTypeFromAST(type)); + } return SBType(); } @@ -564,9 +572,13 @@ SBModule::FindTypes (const char *type) } else { - SBType sb_type(ClangASTContext::GetBasicType (module_sp->GetClangASTContext().getASTContext(), name)); - if (sb_type.IsValid()) - retval.Append(sb_type); + TypeSystem *type_system = module_sp->GetTypeSystemForLanguage(eLanguageTypeC); + if (type_system) + { + CompilerType compiler_type = type_system->GetBuiltinTypeByName(name); + if (compiler_type) + retval.Append(SBType(compiler_type)); + } } } Modified: lldb/trunk/source/API/SBType.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBType.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/API/SBType.cpp (original) +++ lldb/trunk/source/API/SBType.cpp Thu Sep 17 17:23:34 2015 @@ -16,6 +16,7 @@ #include "lldb/Core/Stream.h" #include "lldb/Symbol/CompilerType.h" #include "lldb/Symbol/Type.h" +#include "lldb/Symbol/TypeSystem.h" #include "llvm/ADT/APSInt.h" #include "clang/AST/Decl.h" Modified: lldb/trunk/source/API/SystemInitializerFull.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SystemInitializerFull.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/API/SystemInitializerFull.cpp (original) +++ lldb/trunk/source/API/SystemInitializerFull.cpp Thu Sep 17 17:23:34 2015 @@ -24,6 +24,8 @@ #include "lldb/Host/Host.h" #include "lldb/Initialization/SystemInitializerCommon.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/GoASTContext.h" #include "Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h" #include "Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h" @@ -251,6 +253,9 @@ SystemInitializerFull::Initialize() llvm::InitializeAllTargetMCs(); llvm::InitializeAllDisassemblers(); + ClangASTContext::Initialize(); + GoASTContext::Initialize(); + ABIMacOSX_i386::Initialize(); ABIMacOSX_arm::Initialize(); ABIMacOSX_arm64::Initialize(); @@ -359,6 +364,10 @@ SystemInitializerFull::Terminate() // Terminate and unload and loaded system or user LLDB plug-ins PluginManager::Terminate(); + + ClangASTContext::Terminate(); + GoASTContext::Terminate(); + ABIMacOSX_i386::Terminate(); ABIMacOSX_arm::Terminate(); ABIMacOSX_arm64::Terminate(); Modified: lldb/trunk/source/Commands/CommandObjectArgs.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectArgs.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectArgs.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectArgs.cpp Thu Sep 17 17:23:34 2015 @@ -146,8 +146,14 @@ CommandObjectArgs::DoExecute (Args& args result.SetStatus (eReturnStatusFailed); return false; } - - ClangASTContext &ast_context = thread_module_sp->GetClangASTContext(); + + TypeSystem *type_system = thread_module_sp->GetTypeSystemForLanguage(eLanguageTypeC); + if (type_system == nullptr) + { + result.AppendError ("Unable to create C type system."); + result.SetStatus (eReturnStatusFailed); + return false; + } ValueList value_list; @@ -156,7 +162,7 @@ CommandObjectArgs::DoExecute (Args& args const char *arg_type_cstr = args.GetArgumentAtIndex(arg_index); Value value; value.SetValueType(Value::eValueTypeScalar); - CompilerType clang_type; + CompilerType compiler_type; char *int_pos; if ((int_pos = strstr (const_cast<char*>(arg_type_cstr), "int"))) @@ -198,10 +204,9 @@ CommandObjectArgs::DoExecute (Args& args result.SetStatus (eReturnStatusFailed); return false; } + compiler_type = type_system->GetBuiltinTypeForEncodingAndBitSize(encoding, width); - clang_type = ast_context.GetBuiltinTypeForEncodingAndBitSize(encoding, width); - - if (!clang_type.IsValid()) + if (!compiler_type.IsValid()) { result.AppendErrorWithFormat ("Couldn't get Clang type for format %s (%s integer, width %d).\n", arg_type_cstr, @@ -215,9 +220,9 @@ CommandObjectArgs::DoExecute (Args& args else if (strchr (arg_type_cstr, '*')) { if (!strcmp (arg_type_cstr, "void*")) - clang_type = ast_context.GetBasicType(eBasicTypeVoid).GetPointerType(); + compiler_type = type_system->GetBasicTypeFromAST(eBasicTypeVoid).GetPointerType(); else if (!strcmp (arg_type_cstr, "char*")) - clang_type = ast_context.GetCStringType (false); + compiler_type = type_system->GetBasicTypeFromAST(eBasicTypeChar).GetPointerType(); else { result.AppendErrorWithFormat ("Invalid format: %s.\n", arg_type_cstr); @@ -232,7 +237,7 @@ CommandObjectArgs::DoExecute (Args& args return false; } - value.SetCompilerType (clang_type); + value.SetCompilerType (compiler_type); value_list.PushValue(value); } Modified: lldb/trunk/source/Core/Module.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Core/Module.cpp (original) +++ lldb/trunk/source/Core/Module.cpp Thu Sep 17 17:23:34 2015 @@ -15,6 +15,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/ModuleList.h" #include "lldb/Core/ModuleSpec.h" +#include "lldb/Core/PluginManager.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/Section.h" #include "lldb/Core/StreamString.h" @@ -23,17 +24,16 @@ #include "lldb/Host/Symbols.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/ScriptInterpreter.h" -#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/CompileUnit.h" -#include "lldb/Symbol/GoASTContext.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContext.h" +#include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/SymbolVendor.h" +#include "lldb/Symbol/TypeSystem.h" #include "lldb/Target/Language.h" #include "lldb/Target/Process.h" #include "lldb/Target/SectionLoadList.h" #include "lldb/Target/Target.h" -#include "lldb/Symbol/SymbolFile.h" #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" @@ -148,14 +148,12 @@ Module::Module (const ModuleSpec &module m_object_mod_time (), m_objfile_sp (), m_symfile_ap (), - m_ast (new ClangASTContext), - m_go_ast(), + m_type_system_map(), m_source_mappings (), m_sections_ap(), m_did_load_objfile (false), m_did_load_symbol_vendor (false), m_did_parse_uuid (false), - m_did_init_ast (false), m_file_has_changed (false), m_first_file_changed_log (false) { @@ -253,14 +251,12 @@ Module::Module(const FileSpec& file_spec m_object_mod_time (), m_objfile_sp (), m_symfile_ap (), - m_ast (new ClangASTContext), - m_go_ast(), + m_type_system_map(), m_source_mappings (), m_sections_ap(), m_did_load_objfile (false), m_did_load_symbol_vendor (false), m_did_parse_uuid (false), - m_did_init_ast (false), m_file_has_changed (false), m_first_file_changed_log (false) { @@ -300,14 +296,12 @@ Module::Module () : m_object_mod_time (), m_objfile_sp (), m_symfile_ap (), - m_ast (new ClangASTContext), - m_go_ast(), + m_type_system_map(), m_source_mappings (), m_sections_ap(), m_did_load_objfile (false), m_did_load_symbol_vendor (false), m_did_parse_uuid (false), - m_did_init_ast (false), m_file_has_changed (false), m_first_file_changed_log (false) { @@ -424,64 +418,26 @@ Module::GetUUID() TypeSystem * Module::GetTypeSystemForLanguage (LanguageType language) { - if (language == eLanguageTypeGo) - { - Mutex::Locker locker (m_mutex); - if (!m_go_ast) - { - ObjectFile * objfile = GetObjectFile(); - ArchSpec object_arch; - if (objfile && objfile->GetArchitecture(object_arch)) - { - m_go_ast.reset(new GoASTContext); - m_go_ast->SetAddressByteSize(object_arch.GetAddressByteSize()); - } - } - return m_go_ast.get(); - } - else if (language != eLanguageTypeSwift) - { - // For now assume all languages except swift use the ClangASTContext for types - return &GetClangASTContext(); - } - return nullptr; -} + Mutex::Locker locker (m_mutex); + TypeSystemMap::iterator pos = m_type_system_map.find(language); + if (pos != m_type_system_map.end()) + return pos->second.get(); -ClangASTContext & -Module::GetClangASTContext () -{ - if (m_did_init_ast.load() == false) + for (const auto &pair : m_type_system_map) { - Mutex::Locker locker (m_mutex); - if (m_did_init_ast.load() == false) + if (pair.second && pair.second->SupportsLanguage(language)) { - ObjectFile * objfile = GetObjectFile(); - ArchSpec object_arch; - if (objfile && objfile->GetArchitecture(object_arch)) - { - m_did_init_ast = true; - - // LLVM wants this to be set to iOS or MacOSX; if we're working on - // a bare-boards type image, change the triple for llvm's benefit. - if (object_arch.GetTriple().getVendor() == llvm::Triple::Apple - && object_arch.GetTriple().getOS() == llvm::Triple::UnknownOS) - { - if (object_arch.GetTriple().getArch() == llvm::Triple::arm || - object_arch.GetTriple().getArch() == llvm::Triple::aarch64 || - object_arch.GetTriple().getArch() == llvm::Triple::thumb) - { - object_arch.GetTriple().setOS(llvm::Triple::IOS); - } - else - { - object_arch.GetTriple().setOS(llvm::Triple::MacOSX); - } - } - m_ast->SetArchitecture (object_arch); - } + // Add a new mapping for "language" to point to an already existing + // TypeSystem that supports this language + m_type_system_map[language] = pair.second; + return pair.second.get(); } } - return *m_ast; + + // Cache even if we get a shared pointer that contains null type system back + lldb::TypeSystemSP type_system_sp = TypeSystem::CreateInstance (language, GetArchitecture()); + m_type_system_map[language] = type_system_sp; + return type_system_sp.get(); } void Modified: lldb/trunk/source/Core/PluginManager.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Core/PluginManager.cpp (original) +++ lldb/trunk/source/Core/PluginManager.cpp Thu Sep 17 17:23:34 2015 @@ -2516,6 +2516,108 @@ PluginManager::GetInstrumentationRuntime return NULL; } +#pragma mark TypeSystem + + +struct TypeSystemInstance +{ + TypeSystemInstance() : + name(), + description(), + create_callback(NULL) + { + } + + ConstString name; + std::string description; + TypeSystemCreateInstance create_callback; +}; + +typedef std::vector<TypeSystemInstance> TypeSystemInstances; + +static Mutex & +GetTypeSystemMutex () +{ + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} + +static TypeSystemInstances & +GetTypeSystemInstances () +{ + static TypeSystemInstances g_instances; + return g_instances; +} + +bool +PluginManager::RegisterPlugin (const ConstString &name, + const char *description, + TypeSystemCreateInstance create_callback) +{ + if (create_callback) + { + TypeSystemInstance instance; + assert ((bool)name); + instance.name = name; + if (description && description[0]) + instance.description = description; + instance.create_callback = create_callback; + Mutex::Locker locker (GetTypeSystemMutex ()); + GetTypeSystemInstances ().push_back (instance); + } + return false; +} + +bool +PluginManager::UnregisterPlugin (TypeSystemCreateInstance create_callback) +{ + if (create_callback) + { + Mutex::Locker locker (GetTypeSystemMutex ()); + TypeSystemInstances &instances = GetTypeSystemInstances (); + + TypeSystemInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } + } + return false; +} + +TypeSystemCreateInstance +PluginManager::GetTypeSystemCreateCallbackAtIndex (uint32_t idx) +{ + Mutex::Locker locker (GetTypeSystemMutex ()); + TypeSystemInstances &instances = GetTypeSystemInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; + return NULL; +} + +TypeSystemCreateInstance +PluginManager::GetTypeSystemCreateCallbackForPluginName (const ConstString &name) +{ + if (name) + { + Mutex::Locker locker (GetTypeSystemMutex ()); + TypeSystemInstances &instances = GetTypeSystemInstances (); + + TypeSystemInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (name == pos->name) + return pos->create_callback; + } + } + return NULL; +} + + #pragma mark PluginManager void Modified: lldb/trunk/source/Core/ValueObjectDynamicValue.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectDynamicValue.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObjectDynamicValue.cpp (original) +++ lldb/trunk/source/Core/ValueObjectDynamicValue.cpp Thu Sep 17 17:23:34 2015 @@ -154,7 +154,7 @@ FixupTypeAndOrName (const TypeAndOrName& if (parent.IsPointerType()) corrected_type = orig_type.GetPointerType (); else if (parent.IsPointerOrReferenceType()) - corrected_type = ClangASTContext::GetLValueReferenceType(orig_type); + corrected_type = orig_type.GetLValueReferenceType(); ret.SetCompilerType(corrected_type); } else /*if (m_dynamic_type_info.HasName())*/ Modified: lldb/trunk/source/Core/ValueObjectRegister.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectRegister.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObjectRegister.cpp (original) +++ lldb/trunk/source/Core/ValueObjectRegister.cpp Thu Sep 17 17:23:34 2015 @@ -319,8 +319,10 @@ ValueObjectRegister::GetCompilerTypeImpl Module *exe_module = target->GetExecutableModulePointer(); if (exe_module) { - m_clang_type = exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize (m_reg_info.encoding, - m_reg_info.byte_size * 8); + TypeSystem *type_system = exe_module->GetTypeSystemForLanguage (eLanguageTypeC); + if (type_system) + m_clang_type = type_system->GetBuiltinTypeForEncodingAndBitSize (m_reg_info.encoding, + m_reg_info.byte_size * 8); } } } Modified: lldb/trunk/source/DataFormatters/FormatManager.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatManager.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/DataFormatters/FormatManager.cpp (original) +++ lldb/trunk/source/DataFormatters/FormatManager.cpp Thu Sep 17 17:23:34 2015 @@ -229,7 +229,7 @@ FormatManager::GetPossibleMatches (Value if (non_ref_type.IsTypedefType()) { CompilerType deffed_referenced_type = non_ref_type.GetTypedefedType(); - deffed_referenced_type = is_rvalue_ref ? ClangASTContext::GetRValueReferenceType(deffed_referenced_type) : ClangASTContext::GetLValueReferenceType(deffed_referenced_type); + deffed_referenced_type = is_rvalue_ref ? deffed_referenced_type.GetRValueReferenceType() : deffed_referenced_type.GetLValueReferenceType(); GetPossibleMatches(valobj, deffed_referenced_type, reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, Modified: lldb/trunk/source/DataFormatters/VectorType.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/VectorType.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/DataFormatters/VectorType.cpp (original) +++ lldb/trunk/source/DataFormatters/VectorType.cpp Thu Sep 17 17:23:34 2015 @@ -31,7 +31,7 @@ GetCompilerTypeForFormat (lldb::Format f { case lldb::eFormatAddressInfo: case lldb::eFormatPointer: - return type_system->GetIntTypeFromBitSize(8*type_system->GetPointerByteSize(), false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8*type_system->GetPointerByteSize()); case lldb::eFormatBoolean: return type_system->GetBasicTypeFromAST(lldb::eBasicTypeBool); @@ -70,37 +70,37 @@ GetCompilerTypeForFormat (lldb::Format f return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar); case lldb::eFormatVectorOfFloat32: - return type_system->GetFloatTypeFromBitSize(32); + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, 32); case lldb::eFormatVectorOfFloat64: - return type_system->GetFloatTypeFromBitSize(64); + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, 64); case lldb::eFormatVectorOfSInt16: - return type_system->GetIntTypeFromBitSize(16, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 16); case lldb::eFormatVectorOfSInt32: - return type_system->GetIntTypeFromBitSize(32, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 32); case lldb::eFormatVectorOfSInt64: - return type_system->GetIntTypeFromBitSize(64, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 64); case lldb::eFormatVectorOfSInt8: - return type_system->GetIntTypeFromBitSize(8, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 8); case lldb::eFormatVectorOfUInt128: - return type_system->GetIntTypeFromBitSize(128, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 128); case lldb::eFormatVectorOfUInt16: - return type_system->GetIntTypeFromBitSize(16, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 16); case lldb::eFormatVectorOfUInt32: - return type_system->GetIntTypeFromBitSize(32, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 32); case lldb::eFormatVectorOfUInt64: - return type_system->GetIntTypeFromBitSize(64, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 64); case lldb::eFormatVectorOfUInt8: - return type_system->GetIntTypeFromBitSize(8, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8); case lldb::eFormatDefault: return element_type; @@ -113,7 +113,7 @@ GetCompilerTypeForFormat (lldb::Format f case lldb::eFormatOSType: case lldb::eFormatVoid: default: - return type_system->GetIntTypeFromBitSize(8, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8); } } Modified: lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp (original) +++ lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Thu Sep 17 17:23:34 2015 @@ -1678,7 +1678,17 @@ ClangExpressionDeclMap::GetVariableValue return false; } - ASTContext *ast = var_type->GetClangASTContext().getASTContext(); + ClangASTContext *clang_ast = llvm::dyn_cast_or_null<ClangASTContext>(var_type->GetForwardCompilerType().GetTypeSystem()); + + if (!clang_ast) + { + if (log) + log->PutCString("Skipped a definition because it has no Clang AST"); + return false; + } + + + ASTContext *ast = clang_ast->getASTContext(); if (!ast) { @@ -1785,7 +1795,7 @@ ClangExpressionDeclMap::AddOneVariable ( if (is_reference) var_decl = context.AddVarDecl(pt); else - var_decl = context.AddVarDecl(ClangASTContext::GetLValueReferenceType(pt)); + var_decl = context.AddVarDecl(pt.GetLValueReferenceType()); std::string decl_name(context.m_decl_name.getAsString()); ConstString entity_name(decl_name.c_str()); @@ -1829,7 +1839,7 @@ ClangExpressionDeclMap::AddOneVariable(N return; } - NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::GetLValueReferenceType(parser_type)); + NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType()); llvm::cast<ClangExpressionVariable>(pvar_sp.get())->EnableParserVars(GetParserID()); ClangExpressionVariable::ParserVars *parser_vars = llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetParserVars(GetParserID()); @@ -1861,8 +1871,8 @@ ClangExpressionDeclMap::AddOneGenericVar ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); - TypeFromUser user_type (ClangASTContext::GetLValueReferenceType(ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType())); - TypeFromParser parser_type (ClangASTContext::GetLValueReferenceType(ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType())); + TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType()); + TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType()); NamedDecl *var_decl = context.AddVarDecl(parser_type); std::string decl_name(context.m_decl_name.getAsString()); Modified: lldb/trunk/source/Expression/ClangExpressionParser.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionParser.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Expression/ClangExpressionParser.cpp (original) +++ lldb/trunk/source/Expression/ClangExpressionParser.cpp Thu Sep 17 17:23:34 2015 @@ -28,6 +28,7 @@ #include "lldb/Expression/IRInterpreter.h" #include "lldb/Host/File.h" #include "lldb/Host/HostInfo.h" +#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" Modified: lldb/trunk/source/Initialization/SystemInitializerCommon.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Initialization/SystemInitializerCommon.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Initialization/SystemInitializerCommon.cpp (original) +++ lldb/trunk/source/Initialization/SystemInitializerCommon.cpp Thu Sep 17 17:23:34 2015 @@ -13,7 +13,8 @@ #include "lldb/Host/HostInfo.h" #include "lldb/Core/Log.h" #include "lldb/Core/Timer.h" - +#include "lldb/Symbol/GoASTContext.h" +#include "lldb/Symbol/ClangASTContext.h" #include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h" #include "Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h" #include "Plugins/DynamicLoader/Windows-DYLD/DynamicLoaderWindowsDYLD.h" @@ -103,6 +104,9 @@ SystemInitializerCommon::Initialize() process_gdb_remote::ProcessGDBRemoteLog::Initialize(); // Initialize plug-ins + ClangASTContext::Initialize(); + GoASTContext::Initialize(); + ObjectContainerBSDArchive::Initialize(); ObjectFileELF::Initialize(); ObjectFilePECOFF::Initialize(); @@ -166,6 +170,9 @@ SystemInitializerCommon::Terminate() PlatformRemoteiOS::Terminate(); PlatformiOSSimulator::Terminate(); + ClangASTContext::Terminate(); + GoASTContext::Terminate(); + EmulateInstructionARM::Terminate(); EmulateInstructionMIPS::Terminate(); EmulateInstructionMIPS64::Terminate(); Modified: lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp (original) +++ lldb/trunk/source/Plugins/Language/ObjC/Cocoa.cpp Thu Sep 17 17:23:34 2015 @@ -763,7 +763,7 @@ GetNSPathStore2Type (Target &target) return CompilerType(); CompilerType voidstar = ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType(); - CompilerType uint32 = ast_ctx->GetIntTypeFromBitSize(32, false); + CompilerType uint32 = ast_ctx->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 32); return ast_ctx->GetOrCreateStructForIdentifier(g_type_name, { {"isa",voidstar}, Modified: lldb/trunk/source/Plugins/Language/ObjC/CoreMedia.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/CoreMedia.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/CoreMedia.cpp (original) +++ lldb/trunk/source/Plugins/Language/ObjC/CoreMedia.cpp Thu Sep 17 17:23:34 2015 @@ -30,8 +30,8 @@ lldb_private::formatters::CMTimeSummaryP return false; // fetch children by offset to compensate for potential lack of debug info - auto int64_ty = type_system->GetIntTypeFromBitSize(64, true); - auto int32_ty = type_system->GetIntTypeFromBitSize(32, true); + auto int64_ty = type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 64); + auto int32_ty = type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 32); auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true)); auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true)); Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserGo.cpp Thu Sep 17 17:23:34 2015 @@ -177,7 +177,7 @@ DWARFASTParserGo::ParseTypeFromDWARF(con return type->shared_from_this(); } impl = type->GetForwardCompilerType(); - clang_type = m_ast.CreateTypedef(go_kind, type_name_const_str, impl); + clang_type = m_ast.CreateTypedefType (go_kind, type_name_const_str, impl); } break; } Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Thu Sep 17 17:23:34 2015 @@ -495,15 +495,6 @@ SymbolFileDWARF::GetUniqueDWARFASTTypeMa return m_unique_ast_type_map; } -ClangASTContext & -SymbolFileDWARF::GetClangASTContext () -{ - if (GetDebugMapSymfile ()) - return m_debug_map_symfile->GetClangASTContext (); - else - return m_obj_file->GetModule()->GetClangASTContext(); -} - TypeSystem * SymbolFileDWARF::GetTypeSystemForLanguage (LanguageType language) { @@ -575,12 +566,6 @@ SymbolFileDWARF::InitializeObject() else m_apple_objc_ap.reset(); } - - // Set the symbol file to this file if we don't have a debug map symbol - // file as our main symbol file. This allows the clang ASTContext to complete - // types using this symbol file when it needs to complete classes and structures. - if (GetDebugMapSymfile () == nullptr) - GetClangASTContext().SetSymbolFile(this); } bool @@ -2098,7 +2083,9 @@ SymbolFileDWARF::DeclContextMatchesThisS return true; } - if ((TypeSystem *)&GetClangASTContext() == decl_ctx->GetTypeSystem()) + TypeSystem *decl_ctx_type_system = decl_ctx->GetTypeSystem(); + TypeSystem *type_system = GetTypeSystemForLanguage(decl_ctx_type_system->GetMinimumLanguage(nullptr)); + if (decl_ctx_type_system == type_system) return true; // The type systems match, return true // The namespace AST was valid, and it does not match... Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Thu Sep 17 17:23:34 2015 @@ -221,9 +221,6 @@ public: uint32_t type_mask, lldb_private::TypeList &type_list) override; - lldb_private::ClangASTContext & - GetClangASTContext () override; - lldb_private::TypeSystem * GetTypeSystemForLanguage (lldb::LanguageType language) override; Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp Thu Sep 17 17:23:34 2015 @@ -297,9 +297,6 @@ SymbolFileDWARFDebugMap::~SymbolFileDWAR void SymbolFileDWARFDebugMap::InitializeObject() { - // Set the symbol file to this file. This allows the clang ASTContext to complete - // types using this symbol file when it needs to complete classes and structures. - GetClangASTContext().SetSymbolFile(this); } void Modified: lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp Thu Sep 17 17:23:34 2015 @@ -79,14 +79,6 @@ SymbolFileSymtab::~SymbolFileSymtab() { } -ClangASTContext & -SymbolFileSymtab::GetClangASTContext () -{ - ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext(); - - return ast; -} - uint32_t SymbolFileSymtab::CalculateAbilities () { Modified: lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h Thu Sep 17 17:23:34 2015 @@ -110,9 +110,6 @@ protected: lldb_private::Symtab::IndexCollection m_data_indexes; lldb_private::Symtab::NameToIndexMap m_objc_class_name_to_index; TypeMap m_objc_class_types; - - lldb_private::ClangASTContext & - GetClangASTContext (); private: DISALLOW_COPY_AND_ASSIGN (SymbolFileSymtab); Modified: lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp (original) +++ lldb/trunk/source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp Thu Sep 17 17:23:34 2015 @@ -444,7 +444,7 @@ SystemRuntimeMacOSX::ReadLibdispatchTSDI ClangASTContext *ast_ctx = m_process->GetTarget().GetScratchClangASTContext(); if (ast_ctx->getASTContext() && m_dispatch_tsd_indexes_addr != LLDB_INVALID_ADDRESS) { - CompilerType uint16 = ast_ctx->GetIntTypeFromBitSize(16, false); + CompilerType uint16 = ast_ctx->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 16); CompilerType dispatch_tsd_indexes_s = ast_ctx->CreateRecordType(nullptr, lldb::eAccessPublic, "__lldb_dispatch_tsd_indexes_s", clang::TTK_Struct, lldb::eLanguageTypeC); ClangASTContext::StartTagDeclarationDefinition(dispatch_tsd_indexes_s); Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original) +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Thu Sep 17 17:23:34 2015 @@ -64,6 +64,8 @@ #include "lldb/Core/ArchSpec.h" #include "lldb/Core/Flags.h" #include "lldb/Core/Log.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/PluginManager.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/StreamFile.h" #include "lldb/Core/ThreadSafeDenseMap.h" @@ -77,9 +79,11 @@ #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" #include "lldb/Symbol/ClangExternalASTSourceCommon.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/VerifyDecl.h" #include "lldb/Target/ExecutionContext.h" +#include "lldb/Target/Language.h" #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" @@ -95,6 +99,17 @@ using namespace lldb_private; using namespace llvm; using namespace clang; +namespace +{ + static inline bool ClangASTContextSupportsLanguage (lldb::LanguageType language) + { + return language == eLanguageTypeUnknown || // Clang is the default type system + Language::LanguageIsC (language) || + Language::LanguageIsCPlusPlus (language) || + Language::LanguageIsObjC (language); + } +} + typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext*> ClangASTMap; static ClangASTMap & @@ -336,6 +351,74 @@ ClangASTContext::~ClangASTContext() m_ast_ap.reset(); } +ConstString +ClangASTContext::GetPluginNameStatic() +{ + return ConstString("clang"); +} + +ConstString +ClangASTContext::GetPluginName() +{ + return ClangASTContext::GetPluginNameStatic(); +} + +uint32_t +ClangASTContext::GetPluginVersion() +{ + return 1; +} + +lldb::TypeSystemSP +ClangASTContext::CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch) +{ + if (ClangASTContextSupportsLanguage(language)) + { + std::shared_ptr<ClangASTContext> ast_sp(new ClangASTContext); + if (ast_sp) + { + if (arch.IsValid()) + { + ArchSpec fixed_arch = arch; + // LLVM wants this to be set to iOS or MacOSX; if we're working on + // a bare-boards type image, change the triple for llvm's benefit. + if (fixed_arch.GetTriple().getVendor() == llvm::Triple::Apple && + fixed_arch.GetTriple().getOS() == llvm::Triple::UnknownOS) + { + if (fixed_arch.GetTriple().getArch() == llvm::Triple::arm || + fixed_arch.GetTriple().getArch() == llvm::Triple::aarch64 || + fixed_arch.GetTriple().getArch() == llvm::Triple::thumb) + { + fixed_arch.GetTriple().setOS(llvm::Triple::IOS); + } + else + { + fixed_arch.GetTriple().setOS(llvm::Triple::MacOSX); + } + } + ast_sp->SetArchitecture (fixed_arch); + } + } + return ast_sp; + } + return lldb::TypeSystemSP(); +} + + +void +ClangASTContext::Initialize() +{ + PluginManager::RegisterPlugin (GetPluginNameStatic(), + "clang base AST context plug-in", + CreateInstance); +} + +void +ClangASTContext::Terminate() +{ + PluginManager::UnregisterPlugin (CreateInstance); +} + void ClangASTContext::Clear() @@ -595,8 +678,9 @@ QualTypeMatchesBitSize(const uint64_t bi return true; return false; } + CompilerType -ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) +ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, size_t bit_size) { return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size); } @@ -2132,24 +2216,6 @@ ClangASTContext::GetPointerSizedIntType return CompilerType(); } -CompilerType -ClangASTContext::GetFloatTypeFromBitSize (clang::ASTContext *ast, - size_t bit_size) -{ - if (ast) - { - if (bit_size == ast->getTypeSize(ast->FloatTy)) - return CompilerType(ast, ast->FloatTy); - else if (bit_size == ast->getTypeSize(ast->DoubleTy)) - return CompilerType(ast, ast->DoubleTy); - else if (bit_size == ast->getTypeSize(ast->LongDoubleTy)) - return CompilerType(ast, ast->LongDoubleTy); - else if (bit_size == ast->getTypeSize(ast->HalfTy)) - return CompilerType(ast, ast->HalfTy); - } - return CompilerType(); -} - bool ClangASTContext::GetCompleteDecl (clang::ASTContext *ast, clang::Decl *decl) @@ -3302,6 +3368,12 @@ ClangASTContext::IsVoidType (void* type) } bool +ClangASTContext::SupportsLanguage (lldb::LanguageType language) +{ + return ClangASTContextSupportsLanguage(language); +} + +bool ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name) { if (type) @@ -3788,44 +3860,6 @@ ClangASTContext::GetTypeQualifiers(void* //---------------------------------------------------------------------- CompilerType -ClangASTContext::AddConstModifier (const CompilerType& type) -{ - if (IsClangType(type)) - { - // Make sure this type is a clang AST type - clang::QualType result(GetQualType(type)); - result.addConst(); - return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr()); - } - - return CompilerType(); -} - -CompilerType -ClangASTContext::AddRestrictModifier (const CompilerType& type) -{ - if (IsClangType(type)) - { - clang::QualType result(GetQualType(type)); - result.getQualifiers().setRestrict (true); - return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr()); - } - return CompilerType(); -} - -CompilerType -ClangASTContext::AddVolatileModifier (const CompilerType& type) -{ - if (IsClangType(type)) - { - clang::QualType result(GetQualType(type)); - result.getQualifiers().setVolatile (true); - return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr()); - } - return CompilerType(); -} - -CompilerType ClangASTContext::GetArrayElementType (void* type, uint64_t *stride) { if (type) @@ -4115,28 +4149,6 @@ ClangASTContext::GetMemberFunctionAtInde } CompilerType -ClangASTContext::GetLValueReferenceType (const CompilerType& type) -{ - if (IsClangType(type)) - { - ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()); - return CompilerType(ast->getASTContext(), ast->getASTContext()->getLValueReferenceType(GetQualType(type))); - } - return CompilerType(); -} - -CompilerType -ClangASTContext::GetRValueReferenceType (const CompilerType& type) -{ - if (IsClangType(type)) - { - ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()); - return CompilerType(ast->getASTContext(), ast->getASTContext()->getRValueReferenceType(GetQualType(type))); - } - return CompilerType(); -} - -CompilerType ClangASTContext::GetNonReferenceType (void* type) { if (type) @@ -4209,6 +4221,92 @@ ClangASTContext::GetPointerType (void* t return CompilerType(); } + +CompilerType +ClangASTContext::GetLValueReferenceType (void *type) +{ + if (type) + return CompilerType(this, getASTContext()->getLValueReferenceType(GetQualType(type)).getAsOpaquePtr()); + else + return CompilerType(); +} + +CompilerType +ClangASTContext::GetRValueReferenceType (void *type) +{ + if (type) + return CompilerType(this, getASTContext()->getRValueReferenceType(GetQualType(type)).getAsOpaquePtr()); + else + return CompilerType(); +} + +CompilerType +ClangASTContext::AddConstModifier (void *type) +{ + if (type) + { + clang::QualType result(GetQualType(type)); + result.addConst(); + return CompilerType (this, result.getAsOpaquePtr()); + } + return CompilerType(); +} + +CompilerType +ClangASTContext::AddVolatileModifier (void *type) +{ + if (type) + { + clang::QualType result(GetQualType(type)); + result.addVolatile(); + return CompilerType (this, result.getAsOpaquePtr()); + } + return CompilerType(); + +} + +CompilerType +ClangASTContext::AddRestrictModifier (void *type) +{ + if (type) + { + clang::QualType result(GetQualType(type)); + result.addRestrict(); + return CompilerType (this, result.getAsOpaquePtr()); + } + return CompilerType(); + +} + +CompilerType +ClangASTContext::CreateTypedef (void *type, const char *typedef_name, const CompilerDeclContext &compiler_decl_ctx) +{ + if (type) + { + clang::ASTContext* clang_ast = getASTContext(); + clang::QualType qual_type (GetQualType(type)); + + clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx); + if (decl_ctx == nullptr) + decl_ctx = getASTContext()->getTranslationUnitDecl(); + + clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast, + decl_ctx, + clang::SourceLocation(), + clang::SourceLocation(), + &clang_ast->Idents.get(typedef_name), + clang_ast->getTrivialTypeSourceInfo(qual_type)); + + decl->setAccess(clang::AS_public); // TODO respect proper access specifier + + // Get a uniqued clang::QualType for the typedef decl type + return CompilerType (this, clang_ast->getTypedefType (decl).getAsOpaquePtr()); + + } + return CompilerType(); + +} + CompilerType ClangASTContext::GetTypedefedType (void* type) { @@ -4769,6 +4867,12 @@ ClangASTContext::GetNumChildren (void* t return num_children; } +CompilerType +ClangASTContext::GetBuiltinTypeByName (const ConstString &name) +{ + return GetBasicType (GetBasicTypeEnumeration (name)); +} + lldb::BasicType ClangASTContext::GetBasicTypeEnumeration (void* type) { Modified: lldb/trunk/source/Symbol/CompilerType.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CompilerType.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Symbol/CompilerType.cpp (original) +++ lldb/trunk/source/Symbol/CompilerType.cpp Thu Sep 17 17:23:34 2015 @@ -532,11 +532,66 @@ CompilerType::GetPointerType () const } CompilerType +CompilerType::GetLValueReferenceType () const +{ + if (IsValid()) + return m_type_system->GetLValueReferenceType(m_type); + else + return CompilerType(); +} + +CompilerType +CompilerType::GetRValueReferenceType () const +{ + if (IsValid()) + return m_type_system->GetRValueReferenceType(m_type); + else + return CompilerType(); +} + +CompilerType +CompilerType::AddConstModifier () const +{ + if (IsValid()) + return m_type_system->AddConstModifier(m_type); + else + return CompilerType(); +} + +CompilerType +CompilerType::AddVolatileModifier () const +{ + if (IsValid()) + return m_type_system->AddVolatileModifier(m_type); + else + return CompilerType(); +} + +CompilerType +CompilerType::AddRestrictModifier () const +{ + if (IsValid()) + return m_type_system->AddRestrictModifier(m_type); + else + return CompilerType(); +} + +CompilerType +CompilerType::CreateTypedef (const char *name, const CompilerDeclContext &decl_ctx) const +{ + if (IsValid()) + return m_type_system->CreateTypedef(m_type, name, decl_ctx); + else + return CompilerType(); +} + +CompilerType CompilerType::GetTypedefedType () const { if (IsValid()) return m_type_system->GetTypedefedType(m_type); - return CompilerType(); + else + return CompilerType(); } //---------------------------------------------------------------------- Modified: lldb/trunk/source/Symbol/GoASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/GoASTContext.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Symbol/GoASTContext.cpp (original) +++ lldb/trunk/source/Symbol/GoASTContext.cpp Thu Sep 17 17:23:34 2015 @@ -11,10 +11,13 @@ #include <utility> #include <vector> +#include "lldb/Core/Module.h" +#include "lldb/Core/PluginManager.h" #include "lldb/Core/UniqueCStringMap.h" #include "lldb/Core/ValueObject.h" #include "lldb/DataFormatters/StringPrinter.h" #include "lldb/Symbol/CompilerType.h" +#include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/GoASTContext.h" #include "lldb/Symbol/Type.h" @@ -295,6 +298,59 @@ GoASTContext::~GoASTContext() { } +//------------------------------------------------------------------ +// PluginInterface functions +//------------------------------------------------------------------ + +ConstString +GoASTContext::GetPluginNameStatic() +{ + return ConstString("go"); +} + +ConstString +GoASTContext::GetPluginName() +{ + return GoASTContext::GetPluginNameStatic(); +} + +uint32_t +GoASTContext::GetPluginVersion() +{ + return 1; +} + +lldb::TypeSystemSP +GoASTContext::CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch) +{ + if (language == eLanguageTypeGo) + { + if (arch.IsValid()) + { + std::shared_ptr<GoASTContext> go_ast_sp(new GoASTContext); + go_ast_sp->SetAddressByteSize(arch.GetAddressByteSize()); + return go_ast_sp; + } + } + return lldb::TypeSystemSP(); +} + + +void +GoASTContext::Initialize() +{ + PluginManager::RegisterPlugin (GetPluginNameStatic(), + "AST context plug-in", + CreateInstance); +} + +void +GoASTContext::Terminate() +{ + PluginManager::UnregisterPlugin (CreateInstance); +} + + //---------------------------------------------------------------------- // Tests //---------------------------------------------------------------------- @@ -548,6 +604,12 @@ GoASTContext::IsVoidType(void *type) return static_cast<GoType *>(type)->GetGoKind() == GoType::KIND_LLDB_VOID; } +bool +GoASTContext::SupportsLanguage (lldb::LanguageType language) +{ + return language == eLanguageTypeGo; +} + //---------------------------------------------------------------------- // Type Completion //---------------------------------------------------------------------- @@ -829,11 +891,9 @@ GoASTContext::GetBasicTypeFromAST(lldb:: return CompilerType(); } -CompilerType GoASTContext::GetIntTypeFromBitSize (size_t bit_size, bool is_signed) -{ - return CompilerType(); -} -CompilerType GoASTContext::GetFloatTypeFromBitSize (size_t bit_size) +CompilerType +GoASTContext::GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, + size_t bit_size) { return CompilerType(); } @@ -1306,7 +1366,7 @@ GoASTContext::CreateBaseType(int go_kind } CompilerType -GoASTContext::CreateTypedef(int kind, const ConstString &name, CompilerType impl) +GoASTContext::CreateTypedefType(int kind, const ConstString &name, CompilerType impl) { GoType *type = new GoElem(kind, name, impl); (*m_types)[name].reset(type); Modified: lldb/trunk/source/Symbol/SymbolFile.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolFile.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Symbol/SymbolFile.cpp (original) +++ lldb/trunk/source/Symbol/SymbolFile.cpp Thu Sep 17 17:23:34 2015 @@ -16,6 +16,7 @@ #include "lldb/Core/StreamString.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/TypeList.h" +#include "lldb/Symbol/TypeSystem.h" #include "lldb/Symbol/VariableList.h" using namespace lldb_private; @@ -84,12 +85,6 @@ SymbolFile::GetTypeList () return nullptr; } -ClangASTContext & -SymbolFile::GetClangASTContext () -{ - return m_obj_file->GetModule()->GetClangASTContext(); -} - TypeSystem * SymbolFile::GetTypeSystemForLanguage (lldb::LanguageType language) { Modified: lldb/trunk/source/Symbol/Type.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Type.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Symbol/Type.cpp (original) +++ lldb/trunk/source/Symbol/Type.cpp Thu Sep 17 17:23:34 2015 @@ -16,13 +16,13 @@ #include "lldb/Core/StreamString.h" #include "lldb/Symbol/CompilerType.h" -#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolContextScope.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/Type.h" #include "lldb/Symbol/TypeList.h" +#include "lldb/Symbol/TypeSystem.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" @@ -344,7 +344,11 @@ Type::GetByteSize() case eEncodingIsPointerUID: case eEncodingIsLValueReferenceUID: case eEncodingIsRValueReferenceUID: - m_byte_size = m_symbol_file->GetClangASTContext().GetPointerByteSize(); + { + ArchSpec arch; + if (m_symbol_file->GetObjectFile()->GetArchitecture(arch)) + m_byte_size = arch.GetAddressByteSize(); + } break; } } @@ -512,21 +516,20 @@ Type::ResolveClangType (ResolveState cla break; case eEncodingIsConstUID: - m_clang_type = ClangASTContext::AddConstModifier(encoding_type->GetForwardCompilerType ()); + m_clang_type = encoding_type->GetForwardCompilerType ().AddConstModifier(); break; case eEncodingIsRestrictUID: - m_clang_type = ClangASTContext::AddRestrictModifier(encoding_type->GetForwardCompilerType ()); + m_clang_type = encoding_type->GetForwardCompilerType ().AddRestrictModifier(); break; case eEncodingIsVolatileUID: - m_clang_type = ClangASTContext::AddVolatileModifier(encoding_type->GetForwardCompilerType ()); + m_clang_type = encoding_type->GetForwardCompilerType ().AddVolatileModifier(); break; case eEncodingIsTypedefUID: - m_clang_type = ClangASTContext::CreateTypedefType (encoding_type->GetForwardCompilerType (), - GetName().AsCString(), - GetSymbolFile()->GetDeclContextContainingUID(GetID())); + m_clang_type = encoding_type->GetForwardCompilerType ().CreateTypedef(GetName().AsCString(), + GetSymbolFile()->GetDeclContextContainingUID(GetID())); m_name.Clear(); break; @@ -535,11 +538,11 @@ Type::ResolveClangType (ResolveState cla break; case eEncodingIsLValueReferenceUID: - m_clang_type = ClangASTContext::GetLValueReferenceType(encoding_type->GetForwardCompilerType ()); + m_clang_type = encoding_type->GetForwardCompilerType ().GetLValueReferenceType(); break; case eEncodingIsRValueReferenceUID: - m_clang_type = ClangASTContext::GetRValueReferenceType(encoding_type->GetForwardCompilerType ()); + m_clang_type = encoding_type->GetForwardCompilerType ().GetRValueReferenceType(); break; default: @@ -550,7 +553,8 @@ Type::ResolveClangType (ResolveState cla else { // We have no encoding type, return void? - CompilerType void_clang_type (ClangASTContext::GetBasicType(GetClangASTContext().getASTContext(), eBasicTypeVoid)); + TypeSystem *type_system = m_symbol_file->GetTypeSystemForLanguage(eLanguageTypeC); + CompilerType void_clang_type = type_system->GetBasicTypeFromAST(eBasicTypeVoid); switch (m_encoding_uid_type) { case eEncodingIsUID: @@ -558,21 +562,20 @@ Type::ResolveClangType (ResolveState cla break; case eEncodingIsConstUID: - m_clang_type = ClangASTContext::AddConstModifier (void_clang_type); + m_clang_type = void_clang_type.AddConstModifier(); break; case eEncodingIsRestrictUID: - m_clang_type = ClangASTContext::AddRestrictModifier (void_clang_type); + m_clang_type = void_clang_type.AddRestrictModifier(); break; case eEncodingIsVolatileUID: - m_clang_type = ClangASTContext::AddVolatileModifier (void_clang_type); + m_clang_type = void_clang_type.AddVolatileModifier(); break; case eEncodingIsTypedefUID: - m_clang_type = ClangASTContext::CreateTypedefType (void_clang_type, - GetName().AsCString(), - GetSymbolFile()->GetDeclContextContainingUID(GetID())); + m_clang_type = void_clang_type.CreateTypedef(GetName().AsCString(), + GetSymbolFile()->GetDeclContextContainingUID(GetID())); break; case eEncodingIsPointerUID: @@ -580,11 +583,11 @@ Type::ResolveClangType (ResolveState cla break; case eEncodingIsLValueReferenceUID: - m_clang_type = ClangASTContext::GetLValueReferenceType(void_clang_type); + m_clang_type = void_clang_type.GetLValueReferenceType(); break; case eEncodingIsRValueReferenceUID: - m_clang_type = ClangASTContext::GetRValueReferenceType(void_clang_type); + m_clang_type = void_clang_type.GetRValueReferenceType(); break; default: @@ -676,12 +679,6 @@ Type::GetForwardCompilerType () return m_clang_type; } -ClangASTContext & -Type::GetClangASTContext () -{ - return m_symbol_file->GetClangASTContext(); -} - int Type::Compare(const Type &a, const Type &b) { @@ -1135,7 +1132,7 @@ TypeImpl::GetReferenceType () const { if (m_dynamic_type.IsValid()) { - return TypeImpl(m_static_type.GetReferenceType(), ClangASTContext::GetLValueReferenceType(m_dynamic_type)); + return TypeImpl(m_static_type.GetReferenceType(), m_dynamic_type.GetLValueReferenceType()); } return TypeImpl(m_static_type.GetReferenceType()); } Modified: lldb/trunk/source/Symbol/TypeSystem.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeSystem.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Symbol/TypeSystem.cpp (original) +++ lldb/trunk/source/Symbol/TypeSystem.cpp Thu Sep 17 17:23:34 2015 @@ -8,6 +8,9 @@ #include "lldb/Symbol/TypeSystem.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Symbol/CompilerType.h" + using namespace lldb_private; TypeSystem::TypeSystem(LLVMCastKind kind) : @@ -19,3 +22,61 @@ TypeSystem::TypeSystem(LLVMCastKind kind TypeSystem::~TypeSystem() { } + +lldb::TypeSystemSP +TypeSystem::CreateInstance (lldb::LanguageType language, const lldb_private::ArchSpec &arch) +{ + uint32_t i = 0; + TypeSystemCreateInstance create_callback; + while ((create_callback = PluginManager::GetTypeSystemCreateCallbackAtIndex (i++)) != nullptr) + { + lldb::TypeSystemSP type_system_sp = create_callback(language, arch); + if (type_system_sp) + return type_system_sp; + } + + return lldb::TypeSystemSP(); +} + +CompilerType +TypeSystem::GetLValueReferenceType (void *type) +{ + return CompilerType(); +} + +CompilerType +TypeSystem::GetRValueReferenceType (void *type) +{ + return CompilerType(); +} + +CompilerType +TypeSystem::AddConstModifier (void *type) +{ + return CompilerType(); +} + +CompilerType +TypeSystem::AddVolatileModifier (void *type) +{ + return CompilerType(); +} + +CompilerType +TypeSystem::AddRestrictModifier (void *type) +{ + return CompilerType(); +} + +CompilerType +TypeSystem::CreateTypedef (void *type, const char *name, const CompilerDeclContext &decl_ctx) +{ + return CompilerType(); +} + +CompilerType +TypeSystem::GetBuiltinTypeByName (const ConstString &name) +{ + return CompilerType(); +} + Modified: lldb/trunk/source/Symbol/Variable.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Variable.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Symbol/Variable.cpp (original) +++ lldb/trunk/source/Symbol/Variable.cpp Thu Sep 17 17:23:34 2015 @@ -22,6 +22,7 @@ #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/Type.h" +#include "lldb/Symbol/TypeSystem.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/ABI.h" #include "lldb/Target/Process.h" @@ -36,20 +37,17 @@ using namespace lldb_private; //---------------------------------------------------------------------- // Variable constructor //---------------------------------------------------------------------- -Variable::Variable -( - lldb::user_id_t uid, - const char *name, - const char *mangled, // The mangled or fully qualified name of the variable. - const lldb::SymbolFileTypeSP &symfile_type_sp, - ValueType scope, - SymbolContextScope *context, - Declaration* decl_ptr, - const DWARFExpression& location, - bool external, - bool artificial, - bool static_member -) : +Variable::Variable (lldb::user_id_t uid, + const char *name, + const char *mangled, // The mangled or fully qualified name of the variable. + const lldb::SymbolFileTypeSP &symfile_type_sp, + ValueType scope, + SymbolContextScope *context, + Declaration* decl_ptr, + const DWARFExpression& location, + bool external, + bool artificial, + bool static_member) : UserID(uid), m_name(name), m_mangled (ConstString(mangled)), Modified: lldb/trunk/source/Target/ThreadPlanTracer.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanTracer.cpp?rev=247953&r1=247952&r2=247953&view=diff ============================================================================== --- lldb/trunk/source/Target/ThreadPlanTracer.cpp (original) +++ lldb/trunk/source/Target/ThreadPlanTracer.cpp Thu Sep 17 17:23:34 2015 @@ -135,12 +135,9 @@ ThreadPlanAssemblyTracer::GetIntPointerT TargetSP target_sp (m_thread.CalculateTarget()); if (target_sp) { - Module *exe_module = target_sp->GetExecutableModulePointer(); - - if (exe_module) - { - m_intptr_type = TypeFromUser(exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, target_sp->GetArchitecture().GetAddressByteSize() * 8)); - } + TypeSystem *type_system = target_sp->GetScratchTypeSystemForLanguage(eLanguageTypeC); + if (type_system) + m_intptr_type = TypeFromUser(type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, target_sp->GetArchitecture().GetAddressByteSize() * 8)); } } return m_intptr_type; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits