124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangASTContext.h ---------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_ClangASTContext_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ClangASTContext_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1481a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton#include <stdint.h>
1581a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
21b01000fd063629facd45044f137446fb748ee179Greg Clayton#include "llvm/ADT/OwningPtr.h"
22f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton#include "llvm/ADT/SmallVector.h"
23f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton#include "clang/AST/TemplateBase.h"
24b01000fd063629facd45044f137446fb748ee179Greg Clayton
252546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-enumerations.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Declaration;
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangASTContext
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
38b01000fd063629facd45044f137446fb748ee179Greg Clayton    typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
39b01000fd063629facd45044f137446fb748ee179Greg Clayton    typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
40f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
44b01000fd063629facd45044f137446fb748ee179Greg Clayton    ClangASTContext (const char *triple = NULL);
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~ClangASTContext();
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getASTContext();
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::Builtin::Context *
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getBuiltinContext();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::IdentifierTable *
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getIdentifierTable();
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::LangOptions *
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getLanguageOptions();
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::SelectorTable *
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getSelectorTable();
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
638a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    clang::FileManager *
648a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    getFileManager();
658a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::SourceManager *
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getSourceManager();
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    clang::DiagnosticsEngine *
70c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    getDiagnosticsEngine();
71887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
72c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    clang::DiagnosticConsumer *
73c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    getDiagnosticConsumer();
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::TargetOptions *
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getTargetOptions();
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::TargetInfo *
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    getTargetInfo();
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetTargetTriple ();
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetTargetTriple (const char *target_triple);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    void
91395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    SetArchitecture (const ArchSpec &arch);
92395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton
93b01000fd063629facd45044f137446fb748ee179Greg Clayton    bool
94b01000fd063629facd45044f137446fb748ee179Greg Clayton    HasExternalSource ();
95b01000fd063629facd45044f137446fb748ee179Greg Clayton
96b01000fd063629facd45044f137446fb748ee179Greg Clayton    void
97b01000fd063629facd45044f137446fb748ee179Greg Clayton    SetExternalSource (llvm::OwningPtr<clang::ExternalASTSource> &ast_source_ap);
98b01000fd063629facd45044f137446fb748ee179Greg Clayton
99b01000fd063629facd45044f137446fb748ee179Greg Clayton    void
100b01000fd063629facd45044f137446fb748ee179Greg Clayton    RemoveExternalSource ();
101d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
102d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata    bool
103e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    GetCompleteDecl (clang::Decl *decl)
104e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
105e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return ClangASTContext::GetCompleteDecl(getASTContext(), decl);
106e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
107e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
108e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    static bool
109e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    GetCompleteDecl (clang::ASTContext *ast,
110e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                     clang::Decl *decl);
111fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
112017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton    void SetMetadataAsUserID (const void *object,
113a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                              lldb::user_id_t user_id);
114a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham
115017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton    void SetMetadata (const void *object,
116a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                      ClangASTMetadata &meta_data)
117fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    {
118a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham        SetMetadata(getASTContext(), object, meta_data);
119fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    }
120fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
121fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    static void
122fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    SetMetadata (clang::ASTContext *ast,
123017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton                 const void *object,
124a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                 ClangASTMetadata &meta_data);
125fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
126a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham    ClangASTMetadata *
127017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton    GetMetadata (const void *object)
128fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    {
129fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan        return GetMetadata(getASTContext(), object);
130fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    }
131fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
132a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham    static ClangASTMetadata *
133fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    GetMetadata (clang::ASTContext *ast,
134017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton                 const void *object);
135e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Basic Types
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding,
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                          uint32_t bit_size);
14252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static ClangASTType
144b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast,
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         lldb::Encoding encoding,
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         uint32_t bit_size);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
14952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBasicType (lldb::BasicType type);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static ClangASTType
15252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBasicType (clang::ASTContext *ast, lldb::BasicType type);
153a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
15452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static ClangASTType
15552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBasicType (clang::ASTContext *ast, const ConstString &name);
156a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan
15752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static lldb::BasicType
15852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBasicTypeEnumeration (const ConstString &name);
159960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
16052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
16152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBuiltinTypeForDWARFEncodingAndBitSize (
16252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const char *type_name,
16352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        uint32_t dw_ate,
16452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        uint32_t bit_size);
165960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
16652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
16752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetCStringType(bool is_const);
168fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
16952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static ClangASTType
170fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    GetUnknownAnyType(clang::ASTContext *ast);
171fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
17252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
173fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    GetUnknownAnyType()
174fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
175fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        return ClangASTContext::GetUnknownAnyType(getASTContext());
176fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1778d6115615f55ae38ff141f0a6859d59750da8d02Sean Callanan
17852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
17952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetPointerByteSize ();
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan    static clang::DeclContext *
182673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan    GetTranslationUnitDecl (clang::ASTContext *ast);
183673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan
184673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan    clang::DeclContext *
185673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan    GetTranslationUnitDecl ()
186673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan    {
187673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan        return GetTranslationUnitDecl (getASTContext());
188673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan    }
189673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan
190b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    static bool
191b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
192b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                      lldb::LanguageType &language,
193b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                      bool &is_instance_method,
194b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                      ConstString &language_object_name);
195b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
19652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static ClangASTType
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CopyType(clang::ASTContext *dest_context,
19852f792329be5db8e38961350589e97e8f2823acdGreg Clayton             ClangASTType source_type);
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    static clang::Decl *
2016916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    CopyDecl (clang::ASTContext *dest_context,
2026916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton              clang::ASTContext *source_context,
2036916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton              clang::Decl *source_decl);
2046916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2055510dddc33260a991284ef81ca343594f23262e8Sean Callanan    static bool
20652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AreTypesSame(ClangASTType type1,
20752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 ClangASTType type2,
20870c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan                 bool ignore_qualifiers = false);
2095510dddc33260a991284ef81ca343594f23262e8Sean Callanan
21052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
211b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetTypeForDecl (clang::TagDecl *decl);
212b01000fd063629facd45044f137446fb748ee179Greg Clayton
21352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
214b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl);
215b01000fd063629facd45044f137446fb748ee179Greg Clayton
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Structure, Unions, Classes
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static clang::AccessSpecifier
22152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ConvertAccessTypeToAccessSpecifier (lldb::AccessType access);
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static clang::AccessSpecifier
22452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs);
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static uint32_t
22752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNumBaseClasses (const clang::CXXRecordDecl *cxx_record_decl,
22852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                       bool omit_empty_base_classes);
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static uint32_t
23152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetIndexForRecordBase (const clang::RecordDecl *record_decl,
23252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           const clang::CXXBaseSpecifier *base_spec,
23352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           bool omit_empty_base_classes);
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
2365e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton    CreateRecordType (clang::DeclContext *decl_ctx,
2375e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton                      lldb::AccessType access_type,
2385e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton                      const char *name,
239e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                      int kind,
240fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan                      lldb::LanguageType language,
241a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                      ClangASTMetadata *metadata = NULL);
24260a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan
243f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    class TemplateParameterInfos
244f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    {
245f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    public:
246f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        bool
247f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        IsValid() const
248f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        {
249f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            if (args.empty())
250f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                return false;
251f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            return args.size() == names.size();
252f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        }
253f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
254f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        size_t
255f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        GetSize () const
256f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        {
257f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            if (IsValid())
258f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                return args.size();
259f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            return 0;
260f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        }
261f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
262f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        llvm::SmallVector<const char *, 8> names;
263f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        llvm::SmallVector<clang::TemplateArgument, 8> args;
264f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    };
265f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
266b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    clang::FunctionTemplateDecl *
267b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
268b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                clang::FunctionDecl *func_decl,
269b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                const char *name,
270b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                const TemplateParameterInfos &infos);
271b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
272b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    void
273b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    CreateFunctionTemplateSpecializationInfo (clang::FunctionDecl *func_decl,
274b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                              clang::FunctionTemplateDecl *Template,
275b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                              const TemplateParameterInfos &infos);
276b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
277f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    clang::ClassTemplateDecl *
278f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    CreateClassTemplateDecl (clang::DeclContext *decl_ctx,
2795e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton                             lldb::AccessType access_type,
280f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                             const char *class_name,
281f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                             int kind,
282f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                             const TemplateParameterInfos &infos);
283f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
284f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    clang::ClassTemplateSpecializationDecl *
285f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    CreateClassTemplateSpecializationDecl (clang::DeclContext *decl_ctx,
286f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                           clang::ClassTemplateDecl *class_template_decl,
287f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                           int kind,
288f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                           const TemplateParameterInfos &infos);
289f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
29052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
291f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    CreateClassTemplateSpecializationType (clang::ClassTemplateSpecializationDecl *class_template_specialization_decl);
292f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
293a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton    static clang::DeclContext *
294a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton    GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl);
295a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton
296a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton    static clang::DeclContext *
297a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton    GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl);
298a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton
299a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton
3008c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    static bool
3018c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    CheckOverloadedOperatorKindParameterCount (uint32_t op_kind,
3028c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                                               uint32_t num_params);
3038c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton
30460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan    bool
305e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    FieldIsBitfield (clang::FieldDecl* field,
306e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                     uint32_t& bitfield_bit_size);
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool
309b01000fd063629facd45044f137446fb748ee179Greg Clayton    FieldIsBitfield (clang::ASTContext *ast,
310e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                     clang::FieldDecl* field,
311e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                     uint32_t& bitfield_bit_size);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordHasFields (const clang::RecordDecl *record_decl);
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31684f8075072eef306234f8109573067647735c111Greg Clayton
31752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
31884f8075072eef306234f8109573067647735c111Greg Clayton    CreateObjCClass (const char *name,
31984f8075072eef306234f8109573067647735c111Greg Clayton                     clang::DeclContext *decl_ctx,
32084f8075072eef306234f8109573067647735c111Greg Clayton                     bool isForwardDecl,
321a4974db9b26cc4f33e16c990304b51f4a1d38611Sean Callanan                     bool isInternal,
322a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                     ClangASTMetadata *metadata = NULL);
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    // Returns a mask containing bits from the ClangASTContext::eTypeXXX enumerations
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Namespace Declarations
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::NamespaceDecl *
332e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    GetUniqueNamespaceDeclaration (const char *name,
333e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                                   clang::DeclContext *decl_ctx);
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Function Types
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::FunctionDecl *
3405f24c5053d9fa99bd20e6b1e5b8c659c68d57be7Greg Clayton    CreateFunctionDeclaration (clang::DeclContext *decl_ctx,
3415f24c5053d9fa99bd20e6b1e5b8c659c68d57be7Greg Clayton                               const char *name,
34252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               const ClangASTType &function_Type,
343e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                               int storage,
344e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                               bool is_inline);
345e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
34652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static ClangASTType
347b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateFunctionType (clang::ASTContext *ast,
34852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const ClangASTType &result_type,
34952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const ClangASTType *args,
3502ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                        unsigned num_args,
3512ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                        bool is_variadic,
3522ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                        unsigned type_quals);
3532ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan
35452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
35552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CreateFunctionType (const ClangASTType &result_type,
35652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const ClangASTType *args,
357e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                        unsigned num_args,
3582ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                        bool is_variadic,
3592ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                        unsigned type_quals)
3602ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan    {
361a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan        return ClangASTContext::CreateFunctionType(getASTContext(),
3622ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                                   result_type,
3632ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                                   args,
3642ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                                   num_args,
3652ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                                   is_variadic,
3662ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                                   type_quals);
3672ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan    }
368e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ParmVarDecl *
3702ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan    CreateParameterDeclaration (const char *name,
37152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const ClangASTType &param_type,
37252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                int storage);
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
375e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    SetFunctionParameters (clang::FunctionDecl *function_decl,
376e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                           clang::ParmVarDecl **params,
377e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton                           unsigned num_params);
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Array Types
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
38452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CreateArrayType (const ClangASTType &element_type,
385f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                     size_t element_count,
386f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                     bool is_vector);
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Enumeration Types
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
39152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
3920d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    CreateEnumerationType (const char *name,
3930d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton                           clang::DeclContext *decl_ctx,
3940d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton                           const Declaration &decl,
39552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           const ClangASTType &integer_qual_type);
396e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
39852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Floating point functions
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
402a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton    GetFloatTypeFromBitSize (size_t bit_size)
403a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton    {
404a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton        return GetFloatTypeFromBitSize (getASTContext(), bit_size);
405a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton    }
406a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton
40752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static ClangASTType
408a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton    GetFloatTypeFromBitSize (clang::ASTContext *ast,
409a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton                             size_t bit_size);
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from ClangASTContext can see and modify these
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41481a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton    std::string                                     m_target_triple;
41552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::ASTContext>              m_ast_ap;
41652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::LangOptions>             m_language_options_ap;
41752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::FileManager>             m_file_manager_ap;
41852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::FileSystemOptions>       m_file_system_options_ap;
41952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::SourceManager>           m_source_manager_ap;
42052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::DiagnosticsEngine>       m_diagnostics_engine_ap;
42152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::DiagnosticConsumer>      m_diagnostic_consumer_ap;
4226a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan    llvm::IntrusiveRefCntPtr<clang::TargetOptions>  m_target_options_rp;
42352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::TargetInfo>              m_target_info_ap;
42452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::IdentifierTable>         m_identifier_table_ap;
42552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::SelectorTable>           m_selector_table_ap;
42652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::unique_ptr<clang::Builtin::Context>        m_builtins_ap;
42781a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton    CompleteTagDeclCallback                         m_callback_tag_decl;
42881a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton    CompleteObjCInterfaceDeclCallback               m_callback_objc_decl;
42981a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton    void *                                          m_callback_baton;
43052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t                                        m_pointer_byte_size;
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For ClangASTContext only
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClangASTContext(const ClangASTContext&);
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ClangASTContext& operator=(const ClangASTContext&);
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangASTContext_h_
442