[Lldb-commits] [lldb] r247953 - TypeSystem is now a plugin interface and removed any "ClangASTContext &Class::GetClangASTContext()" functions.

Greg Clayton via lldb-commits lldb-commits at lists.llvm.org
Wed Sep 23 10:01:33 PDT 2015


% ./dotest.py lang/cpp/dynamic-value
LLDB library dir: /Volumes/work/gclayton/Documents/src/lldb/tot/build/Debug
LLDB import library dir: /Volumes/work/gclayton/Documents/src/lldb/tot/build/Debug
lldb-350.99.0
lldb.pre_flight: None
lldb.post_flight: None

Session logs for test failures/errors/unexpected successes will go into directory '2015-09-23-09_48_14'
Command invoked: ./dotest.py lang/cpp/dynamic-value
compilers=['clang']

Configuration: arch=x86_64 compiler=clang
----------------------------------------------------------------------
Collected 6 tests

.=success F=fail E=error s=skipped x=expected-fail u=unexpected-success

.x.x..
----------------------------------------------------------------------
Ran 6 tests in 5.136s

RESULT: PASSED (4 passes, 0 failures, 0 errors, 0 skipped, 2 expected failures, 0 unexpected successes)
Session logs for test failures/errors/unexpected successes can be found in directory '2015-09-23-09_48_14'

This passes on MacOSX. You will need to help me figure out what it going wrong. You should be able to repro this by looking at what the test case did, which is what I did since I didn't write this test. But it looks like the steps to repro should be:

Compile "sbvalue-cast.cpp" into an executable:

% make CXX_SOURCES=sbvalue-cast.cpp

Then run LLDB on the a.out binary that is produced:

% ll a.out
(lldb) target create "a.out"
(lldb) b /Set breakpoint here/
(lldb) r
(lldb) frame variable --dynamic-type no-dynamic-values *teller
(Base) *teller = (m_base_val = 20)

Can you let me know what your output for the above command looks like?

> On Sep 21, 2015, at 7:57 AM, Zachary Turner <zturner at google.com> wrote:
> 
> Hi Greg, will you have some time to look at this today?  It's definitely this patch that started causing the failure, so I suspect there is something wrong on all platforms
> 
> On Fri, Sep 18, 2015 at 12:41 PM Zachary Turner <zturner at google.com> wrote:
> Hi Greg,
> 
> This has broken TestCppValueCast on Windows.  Ironically, it has also *fixed* TestCxxWcharT on Windows.  In any case, here is the important line from the log file of TestCppValueCast.
> 
> Traceback (most recent call last):
>   File "D:\src\llvm\tools\lldb\test\lldbtest.py", line 483, in wrapper
>     return func(self, *args, **kwargs)
>   File "D:\src\llvm\tools\lldb\test\lldbtest.py", line 551, in wrapper
>     return func(self, *args, **kwargs)
>   File "D:\src\llvm\tools\lldb\test\lang\cpp\dynamic-value\TestCppValueCast.py", line 49, in test_value_cast_with_dwarf_and_regular_inheritance
>     self.do_sbvalue_cast(self.exe_name)
>   File "D:\src\llvm\tools\lldb\test\lang\cpp\dynamic-value\TestCppValueCast.py", line 99, in do_sbvalue_cast
>     self.assertTrue(tellerA.GetChildMemberWithName('m_base_val').GetValueAsUnsigned(error, 0) == 20)
> AssertionError: False is not True
> 
> Is it possible your patch has an error?
> 
> On Thu, Sep 17, 2015 at 3:25 PM Greg Clayton via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> 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();
>                  



More information about the lldb-commits mailing list