ClangASTContext.h revision a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999
15e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen//===-- ClangASTContext.h ---------------------------------------*- C++ -*-===//
25e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen//
3a335d334d45701a42c283257fa44f2f7148e186dBrian Paul//                     The LLVM Compiler Infrastructure
4ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes//
55761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul// This file is distributed under the University of Illinois Open Source
65761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul// License. See LICENSE.TXT for details.
7ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes//
85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen//===----------------------------------------------------------------------===//
95e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#ifndef liblldb_ClangASTContext_h_
115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#define liblldb_ClangASTContext_h_
125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen// C Includes
14ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes// C++ Includes
155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include <string>
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include <vector>
17ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes#include <memory>
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include <stdint.h>
195e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
205e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen// Other libraries and framework includes
215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "llvm/ADT/OwningPtr.h"
225e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "llvm/ADT/SmallVector.h"
235e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "clang/AST/TemplateBase.h"
245e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
255e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
26e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul// Project includes
27e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul#include "lldb/lldb-enumerations.h"
28e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul#include "lldb/Core/ClangForward.h"
29e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul#include "lldb/Symbol/ClangASTType.h"
30e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paul
31e9b34885b8ff2ccb67a801cd1ce07e0df1b0e397Brian Paulnamespace lldb_private {
325e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
331d5a68970f1d8fcca29ce24e6667a143733197f0Brian Paulclass Declaration;
341d5a68970f1d8fcca29ce24e6667a143733197f0Brian Paul
35ba8f6172bdfb44594537a304225b54152584d701Gareth Hughesclass ClangASTContext
365e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen{
37f2c023291a1f2887294d2aac504f8b82857ad092Brian Paulpublic:
38f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul    enum {
39f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul        eTypeHasChildren        = (1u <<  0),
402dbc515a669be123a019aeb4aa5aae6b1679f6a9Brian Paul        eTypeHasValue           = (1u <<  1),
415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen        eTypeIsArray            = (1u <<  2),
4216b393d05990b6e917e144f9de87d0103b4c3e6dIan Romanick        eTypeIsBlock            = (1u <<  3),
43001d944fd50e0579739b8865e6e09be5d267c05aEric Anholt        eTypeIsBuiltIn          = (1u <<  4),
445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen        eTypeIsClass            = (1u <<  5),
45ede4205b245ee58bacf866d298273ebbe31feacfLuca Barbieri        eTypeIsCPlusPlus        = (1u <<  6),
4663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca        eTypeIsEnumeration      = (1u <<  7),
4763e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca        eTypeIsFuncPrototype    = (1u <<  8),
4863e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca        eTypeIsMember           = (1u <<  9),
4963e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca        eTypeIsObjC             = (1u << 10),
5063e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca        eTypeIsPointer          = (1u << 11),
51da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin        eTypeIsReference        = (1u << 12),
525606dfb572bf4b89b4882265924705bacc8c182bIan Romanick        eTypeIsStructUnion      = (1u << 13),
535606dfb572bf4b89b4882265924705bacc8c182bIan Romanick        eTypeIsTemplate         = (1u << 14),
545606dfb572bf4b89b4882265924705bacc8c182bIan Romanick        eTypeIsTypedef          = (1u << 15),
555606dfb572bf4b89b4882265924705bacc8c182bIan Romanick        eTypeIsVector           = (1u << 16),
565606dfb572bf4b89b4882265924705bacc8c182bIan Romanick        eTypeIsScalar           = (1u << 17)
575606dfb572bf4b89b4882265924705bacc8c182bIan Romanick    };
585fc5820cbc0faf57a48154466b4792294841a690José Fonseca
5950e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich    typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
6050e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich    typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
6150e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich
6250e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich    //------------------------------------------------------------------
6350e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich    // Constructors and Destructors
6450e0091a9d70f9e6383ad322d4df7576bd7c38f7Mathias Fröhlich    //------------------------------------------------------------------
655606dfb572bf4b89b4882265924705bacc8c182bIan Romanick    ClangASTContext (const char *triple = NULL);
665606dfb572bf4b89b4882265924705bacc8c182bIan Romanick
675606dfb572bf4b89b4882265924705bacc8c182bIan Romanick    ~ClangASTContext();
686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    clang::ASTContext *
706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    getASTContext();
715e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
727f25d9ebb4856273c46ea4bbba4152b85f610a91Brian Paul    clang::Builtin::Context *
7333e9ac20e3b399c6ec6ec2f586a9402b68590992Brian Paul    getBuiltinContext();
74e9d9dab0cd8614898ecc2aceb49d8faf354cdbdfBrian Paul
7532ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell    clang::IdentifierTable *
765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    getIdentifierTable();
77f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg
78b939adfa155f2b3ca5c5226e86da85629654d79bKeith Whitwell    clang::LangOptions *
799a21d4670ce88cd2476930f3c5f7945cc57579e8Ian Romanick    getLanguageOptions();
8084870e215667c999202be31057df6e31a0389bb7Brian Paul
8184870e215667c999202be31057df6e31a0389bb7Brian Paul    clang::SelectorTable *
826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    getSelectorTable();
835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
845e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    clang::FileManager *
85fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul    getFileManager();
86fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul
87fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul    clang::SourceManager *
88fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul    getSourceManager();
89fe49dcb3b03454ec1451b610ea89f2374946e090Brian Paul
905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    clang::DiagnosticsEngine *
91c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul    getDiagnosticsEngine();
92c628fd743ee3c3305e9beac7f0e6efacf6982115Brian Paul
9353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    clang::DiagnosticConsumer *
9453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    getDiagnosticConsumer();
9553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
9653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    clang::TargetOptions *
9753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    getTargetOptions();
986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
994c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    clang::TargetInfo *
1004dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    getTargetInfo();
10153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
10253f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    void
10353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    Clear();
10453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
10553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    const char *
10653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    GetTargetTriple ();
10794b30dc390f1fdd526c080080830016fad3e2ee2Brian Paul
108fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell    void
10953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    SetTargetTriple (const char *target_triple);
11053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
11153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    void
11253f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    SetArchitecture (const ArchSpec &arch);
11353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
11453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    bool
11553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    HasExternalSource ();
11653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
117762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    void
118762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    SetExternalSource (llvm::OwningPtr<clang::ExternalASTSource> &ast_source_ap);
119762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
120762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    void
121762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    RemoveExternalSource ();
122762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
123762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    bool
124762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    GetCompleteType (lldb::clang_type_t clang_type);
125762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
126762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    static bool
127762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    GetCompleteType (clang::ASTContext *ast,
128762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich                     lldb::clang_type_t clang_type);
129762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
130762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    bool
131762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    IsCompleteType (lldb::clang_type_t clang_type);
132762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
133762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    static bool
134762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich    IsCompleteType (clang::ASTContext *ast,
1354c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                    lldb::clang_type_t clang_type);
13653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
13753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    bool
138b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    GetCompleteDecl (clang::Decl *decl)
139b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    {
140b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich        return ClangASTContext::GetCompleteDecl(getASTContext(), decl);
141b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    }
142b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
143b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    static bool
144b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    GetCompleteDecl (clang::ASTContext *ast,
145b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich                     clang::Decl *decl);
146b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
147b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    void SetMetadataAsUserID (uintptr_t object,
148b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich                              lldb::user_id_t user_id);
149b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
150b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    void SetMetadata (uintptr_t object,
151b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich                      ClangASTMetadata &meta_data)
152b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    {
153b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich        SetMetadata(getASTContext(), object, meta_data);
154b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    }
155b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
156b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    static void
157b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    SetMetadata (clang::ASTContext *ast,
158b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich                 uintptr_t object,
159b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich                 ClangASTMetadata &meta_data);
160b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
161b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    ClangASTMetadata *
162b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    GetMetadata (uintptr_t object)
163b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    {
164b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich        return GetMetadata(getASTContext(), object);
165b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    }
166b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
16753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    static ClangASTMetadata *
16853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    GetMetadata (clang::ASTContext *ast,
16953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                 uintptr_t object);
17053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
171f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    //------------------------------------------------------------------
172f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    // Basic Types
173f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    //------------------------------------------------------------------
174f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich
175f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    lldb::clang_type_t
176f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding,
177f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich                                          uint32_t bit_size);
178f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich
179f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    static lldb::clang_type_t
180f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast,
181f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich                                         lldb::Encoding encoding,
182f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich                                         uint32_t bit_size);
183f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich
184f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    lldb::clang_type_t
185f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    GetBuiltinTypeForDWARFEncodingAndBitSize (
186f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich        const char *type_name,
187762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich        uint32_t dw_ate,
188f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich        uint32_t bit_size);
189f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich
190f364ac1da10ff67eba5196c1074aff579864f741Mathias Fröhlich    static lldb::clang_type_t
191f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich    GetBuiltInType_void(clang::ASTContext *ast);
192b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
193b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    lldb::clang_type_t
194f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich    GetBuiltInType_void()
195b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    {
196b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich        return GetBuiltInType_void(getASTContext());
197f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich    }
1982a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich
1992a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich    lldb::clang_type_t
2002a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich    GetBuiltInType_bool();
201b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich
202b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    lldb::clang_type_t
203f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich    GetBuiltInType_objc_id();
2042a207c4bf95312b68093280b97229cc4316f5724Mathias Froehlich
205b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    lldb::clang_type_t
206b57101302d832f890b9a3b228513d930d91e1de0Mathias Fröhlich    GetBuiltInType_objc_Class();
207f60e892c5017f66282080983da87f638d13917c5Mathias Fröhlich
20853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    static lldb::clang_type_t
2094c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul    GetUnknownAnyType(clang::ASTContext *ast);
210bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol
211bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol    lldb::clang_type_t
2126489a1d5bab75589569658d374257bf23cb67a23Paul Berry    GetUnknownAnyType()
21351e7b058750cc480c296d45f773d7a5a662457f5Brian Paul    {
2146489a1d5bab75589569658d374257bf23cb67a23Paul Berry        return ClangASTContext::GetUnknownAnyType(getASTContext());
2157c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell    }
2164c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul
2175761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    lldb::clang_type_t
2185761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    GetBuiltInType_objc_selector();
2195761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul
2205761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    lldb::clang_type_t
2215761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    GetCStringType(bool is_const);
2225761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul
2235761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    lldb::clang_type_t
2245761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    GetVoidType();
2255761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul
2265761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    lldb::clang_type_t
2275761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    GetVoidType(clang::ASTContext *ast);
2285761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul
2295761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    lldb::clang_type_t
2305761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    GetVoidPtrType(bool is_const);
2315761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul
2325761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    static lldb::clang_type_t
2335761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    GetVoidPtrType(clang::ASTContext *ast, bool is_const);
2347d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry
2357d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry    static clang::DeclContext *
2367d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry    GetTranslationUnitDecl (clang::ASTContext *ast);
2377d68c639ddb0f9df45cf698b8e8227bf1860b5fePaul Berry
2385761c64823c10093c0f72bc8a62c99b86362e4e5Brian Paul    clang::DeclContext *
2394c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    GetTranslationUnitDecl ()
2407c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell    {
2417c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell        return GetTranslationUnitDecl (getASTContext());
242da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    }
243da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
244da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    static bool
245da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
246da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                                      lldb::LanguageType &language,
247da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                                      bool &is_instance_method,
248da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                                      ConstString &language_object_name);
2497c42390453e611367cf1ba11446692ec04e0abfbZack Rusin
2507c42390453e611367cf1ba11446692ec04e0abfbZack Rusin    static lldb::clang_type_t
2517c42390453e611367cf1ba11446692ec04e0abfbZack Rusin    CopyType(clang::ASTContext *dest_context,
2527c42390453e611367cf1ba11446692ec04e0abfbZack Rusin             clang::ASTContext *source_context,
2537c42390453e611367cf1ba11446692ec04e0abfbZack Rusin             lldb::clang_type_t clang_type);
2547c42390453e611367cf1ba11446692ec04e0abfbZack Rusin
2557c42390453e611367cf1ba11446692ec04e0abfbZack Rusin    static clang::Decl *
2567c42390453e611367cf1ba11446692ec04e0abfbZack Rusin    CopyDecl (clang::ASTContext *dest_context,
2577c42390453e611367cf1ba11446692ec04e0abfbZack Rusin              clang::ASTContext *source_context,
2587c42390453e611367cf1ba11446692ec04e0abfbZack Rusin              clang::Decl *source_decl);
259da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
260da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    static bool
261da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    AreTypesSame(clang::ASTContext *ast,
262da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                 lldb::clang_type_t type1,
263da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                 lldb::clang_type_t type2,
264da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                 bool ignore_qualifiers = false);
265da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
266da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    bool
267da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    AreTypesSame(lldb::clang_type_t type1,
268da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                 lldb::clang_type_t type2,
269da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                 bool ignore_qualifiers = false)
270da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    {
271da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin        return ClangASTContext::AreTypesSame(getASTContext(), type1, type2, ignore_qualifiers);
272da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    }
273da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
274da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
275da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    lldb::clang_type_t
276da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    GetTypeForDecl (clang::TagDecl *decl);
277da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
278da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    lldb::clang_type_t
279da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl);
280da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
281da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    static lldb::BasicType
282da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    GetLLDBBasicTypeEnumeration (lldb::clang_type_t clang_type);
283da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
284da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    //------------------------------------------------------------------
285da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    // CVR modifiers
286da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    //------------------------------------------------------------------
287da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
288cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul    static lldb::clang_type_t
289cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul    AddConstModifier (lldb::clang_type_t clang_type);
290da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
291da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    static lldb::clang_type_t
292da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    AddRestrictModifier (lldb::clang_type_t clang_type);
293da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
294da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    static lldb::clang_type_t
295da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    AddVolatileModifier (lldb::clang_type_t clang_type);
296da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
297da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    //------------------------------------------------------------------
298da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    // Structure, Unions, Classes
299da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    //------------------------------------------------------------------
300da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
301da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    lldb::clang_type_t
302da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    CreateRecordType (clang::DeclContext *decl_ctx,
303da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      lldb::AccessType access_type,
304da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      const char *name,
305da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      int kind,
306da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      lldb::LanguageType language,
307da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      ClangASTMetadata *metadata = NULL);
308da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
309da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    static clang::FieldDecl *
310da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    AddFieldToRecordType (clang::ASTContext *ast,
311da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                          lldb::clang_type_t record_qual_type,
312cfae745a8bcbc108611178b69c645cfe29f28b37Brian Paul                          const char *name,
313da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                          lldb::clang_type_t field_type,
3147c26b61f9366a397e353d7b7f1f1d1f6d0dcd0c7Keith Whitwell                          lldb::AccessType access,
3156489a1d5bab75589569658d374257bf23cb67a23Paul Berry                          uint32_t bitfield_bit_size);
31651e7b058750cc480c296d45f773d7a5a662457f5Brian Paul
3176489a1d5bab75589569658d374257bf23cb67a23Paul Berry    clang::FieldDecl *
31827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell    AddFieldToRecordType (lldb::clang_type_t record_qual_type,
3194c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                          const char *name,
3204dafbc3dc75be565704f437016f70a63c48d1539Brian Paul                          lldb::clang_type_t field_type,
32153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                          lldb::AccessType access,
32253f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                          uint32_t bitfield_bit_size)
32353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    {
32453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul        return ClangASTContext::AddFieldToRecordType (getASTContext(),
32553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                                                      record_qual_type,
32653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                                                      name,
32753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                                                      field_type,
32853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                                                      access,
32953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                                                      bitfield_bit_size);
33053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    }
33153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul
332c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell    static void
3339d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul    BuildIndirectFields (clang::ASTContext *ast,
3349d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul                         lldb::clang_type_t record_qual_type);
3353d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry
3363d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry    void
3373d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry    BuildIndirectFields (lldb::clang_type_t record_qual_type)
338a90046f1097ad95de2aa95ca65741dff5cddced9Brian    {
3394c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul        ClangASTContext::BuildIndirectFields(getASTContext(),
34027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell                                             record_qual_type);
3411a65d098cea54352335460fedf97f705d20f2ab7Brian Paul    }
34290ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul
3436489a1d5bab75589569658d374257bf23cb67a23Paul Berry    static clang::CXXMethodDecl *
3446489a1d5bab75589569658d374257bf23cb67a23Paul Berry    AddMethodToCXXRecordType (clang::ASTContext *ast,
3456489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              lldb::clang_type_t record_opaque_type,
3466489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              const char *name,
3476489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              lldb::clang_type_t method_type,
3486489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              lldb::AccessType access,
3496489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_virtual,
3506489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_static,
3519520f483b8f1e45fa474674b415554988de5d8d3Brian Paul                              bool is_inline,
3521a65d098cea54352335460fedf97f705d20f2ab7Brian Paul                              bool is_explicit,
3536489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_attr_used,
3543d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry                              bool is_artificial);
3553d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry
3566489a1d5bab75589569658d374257bf23cb67a23Paul Berry    clang::CXXMethodDecl *
3576489a1d5bab75589569658d374257bf23cb67a23Paul Berry    AddMethodToCXXRecordType (lldb::clang_type_t record_opaque_type,
3586489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              const char *name,
3596489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              lldb::clang_type_t method_type,
3606489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              lldb::AccessType access,
3616489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_virtual,
3621a65d098cea54352335460fedf97f705d20f2ab7Brian Paul                              bool is_static,
3636489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_inline,
3646489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_explicit,
3656489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_attr_used,
3666489a1d5bab75589569658d374257bf23cb67a23Paul Berry                              bool is_artificial)
3676489a1d5bab75589569658d374257bf23cb67a23Paul Berry
3686489a1d5bab75589569658d374257bf23cb67a23Paul Berry    {
3696489a1d5bab75589569658d374257bf23cb67a23Paul Berry        return ClangASTContext::AddMethodToCXXRecordType (getASTContext(),
3706489a1d5bab75589569658d374257bf23cb67a23Paul Berry                                                          record_opaque_type,
3719520f483b8f1e45fa474674b415554988de5d8d3Brian Paul                                                          name,
3721a65d098cea54352335460fedf97f705d20f2ab7Brian Paul                                                          method_type,
3736489a1d5bab75589569658d374257bf23cb67a23Paul Berry                                                          access,
3746489a1d5bab75589569658d374257bf23cb67a23Paul Berry                                                          is_virtual,
3756489a1d5bab75589569658d374257bf23cb67a23Paul Berry                                                          is_static,
3763d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry                                                          is_inline,
3773d7c5a4f6f4155e249f6eac76d861eb1bc59eb69Paul Berry                                                          is_explicit,
3786489a1d5bab75589569658d374257bf23cb67a23Paul Berry                                                          is_attr_used,
3796489a1d5bab75589569658d374257bf23cb67a23Paul Berry                                                          is_artificial);
3806489a1d5bab75589569658d374257bf23cb67a23Paul Berry    }
3816489a1d5bab75589569658d374257bf23cb67a23Paul Berry
3821a65d098cea54352335460fedf97f705d20f2ab7Brian Paul    class TemplateParameterInfos
3836489a1d5bab75589569658d374257bf23cb67a23Paul Berry    {
38490ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul    public:
38553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul        bool
38653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul        IsValid() const
38727413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell        {
38827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell            if (args.empty())
38927413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell                return false;
39027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell            return args.size() == names.size();
3919d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul        }
3929d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul
39327413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell        size_t
39427413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell        GetSize () const
39527413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell        {
39627413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell            if (IsValid())
39727413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell                return args.size();
39827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell            return 0;
39927413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell        }
40027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell
40107373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian        llvm::SmallVector<const char *, 8> names;
40207373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian        llvm::SmallVector<clang::TemplateArgument, 8> args;
40307373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian    };
40407373512c72ca0fc19cccd1d102f14f1a41fd1bdBrian
40527413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell    clang::FunctionTemplateDecl *
40627413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell    CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
40727413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell                                clang::FunctionDecl *func_decl,
40827413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell                                const char *name,
40927413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell                                const TemplateParameterInfos &infos);
41027413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell
41127413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell    void
41227413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell    CreateFunctionTemplateSpecializationInfo (clang::FunctionDecl *func_decl,
41327413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell                                              clang::FunctionTemplateDecl *Template,
41453f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul                                              const TemplateParameterInfos &infos);
41527413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell
41627413ed249d5614de3057eda3401a6cc9ca5b324Keith Whitwell    clang::ClassTemplateDecl *
41790ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul    CreateClassTemplateDecl (clang::DeclContext *decl_ctx,
41890ebb581e60d29bd565ad4d8a49e642de7b0ce5dBrian Paul                             lldb::AccessType access_type,
419c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell                             const char *class_name,
4204c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                             int kind,
421a90046f1097ad95de2aa95ca65741dff5cddced9Brian                             const TemplateParameterInfos &infos);
4228d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul
423bec341d00c5fbc9c5f1c19c1b6729de636ffbfcbDave Airlie    clang::ClassTemplateSpecializationDecl *
424e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    CreateClassTemplateSpecializationDecl (clang::DeclContext *decl_ctx,
425e4da46e007de5c83202976a12efb0e894494a354Eric Anholt                                           clang::ClassTemplateDecl *class_template_decl,
426e4da46e007de5c83202976a12efb0e894494a354Eric Anholt                                           int kind,
427bec341d00c5fbc9c5f1c19c1b6729de636ffbfcbDave Airlie                                           const TemplateParameterInfos &infos);
428e4da46e007de5c83202976a12efb0e894494a354Eric Anholt
429e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    lldb::clang_type_t
430e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    CreateClassTemplateSpecializationType (clang::ClassTemplateSpecializationDecl *class_template_specialization_decl);
431e4da46e007de5c83202976a12efb0e894494a354Eric Anholt
432e4da46e007de5c83202976a12efb0e894494a354Eric Anholt    static clang::DeclContext *
433bec341d00c5fbc9c5f1c19c1b6729de636ffbfcbDave Airlie    GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl);
4341c09bcfdda4083636a3ac27d804a34ef87875ce7Brian
4354c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    static clang::DeclContext *
436c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell    GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl);
437c3626a91cee5034528f3f92c802a8e5947ea5f92Keith Whitwell
438894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul
439e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    static bool
440e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    CheckOverloadedOperatorKindParameterCount (uint32_t op_kind,
4414c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                                               uint32_t num_params);
4424c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul
4434c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    bool
4444c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    FieldIsBitfield (clang::FieldDecl* field,
4454c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                     uint32_t& bitfield_bit_size);
4464c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul
4474c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    static bool
4484c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    FieldIsBitfield (clang::ASTContext *ast,
4494c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                     clang::FieldDecl* field,
4504c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                     uint32_t& bitfield_bit_size);
451555f0a88182e2b1af809b2d97abdac02814a2f28Brian Paul
452555f0a88182e2b1af809b2d97abdac02814a2f28Brian Paul    static bool
4534c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    RecordHasFields (const clang::RecordDecl *record_decl);
4544c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul
4554c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    void
4564c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    SetDefaultAccessForRecordFields (lldb::clang_type_t clang_type,
4574c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                                     int default_accessibility,
4584c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                                     int *assigned_accessibilities,
4594c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                                     size_t num_assigned_accessibilities);
4604c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul
4614c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    lldb::clang_type_t
4624c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul    CreateObjCClass (const char *name,
4634c4268dd31ce119d5d3db090adf0935bf3c27831Brian Paul                     clang::DeclContext *decl_ctx,
464e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     bool isForwardDecl,
465e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     bool isInternal,
466e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     ClangASTMetadata *metadata = NULL);
467e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
468e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    static clang::FieldDecl *
469e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    AddObjCClassIVar (clang::ASTContext *ast,
470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      lldb::clang_type_t class_opaque_type,
471e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      const char *name,
472e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      lldb::clang_type_t ivar_opaque_type,
473e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      lldb::AccessType access,
474e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      uint32_t bitfield_bit_size,
475e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      bool isSynthesized);
476e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
477e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    clang::FieldDecl *
478e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    AddObjCClassIVar (lldb::clang_type_t class_opaque_type,
479e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      const char *name,
480e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      lldb::clang_type_t ivar_opaque_type,
481e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      lldb::AccessType access,
482e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      uint32_t bitfield_bit_size,
483e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                      bool isSynthesized)
484e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul    {
485e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul        return ClangASTContext::AddObjCClassIVar (getASTContext(),
486e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                                  class_opaque_type,
487894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                                                  name,
488ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                                                  ivar_opaque_type,
489ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                                                  access,
490ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                                                  bitfield_bit_size,
491ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                                                  isSynthesized);
492ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul    }
493ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
494ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul    static bool
495ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul    AddObjCClassProperty
496ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul    (
497ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        clang::ASTContext *ast,
498ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        lldb::clang_type_t class_opaque_type,
499ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        const char *property_name,
500ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        lldb::clang_type_t property_opaque_type,  // The property type is only required if you don't have an ivar decl
501ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        clang::ObjCIvarDecl *ivar_decl,
502ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        const char *property_setter_name,
503ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        const char *property_getter_name,
504ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        uint32_t property_attributes,
505ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul        ClangASTMetadata *metadata = NULL
5064c8fadc6d996c8c433826c4c763104b7d69cf7e5Brian Paul    );
5070fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5080fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    bool
5090fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    AddObjCClassProperty
5100fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    (
5110fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        lldb::clang_type_t class_opaque_type,
5120fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        const char *property_name,
5130fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        lldb::clang_type_t property_opaque_type,
5140fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        clang::ObjCIvarDecl *ivar_decl,
5150fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        const char *property_setter_name,
5160fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        const char *property_getter_name,
5170fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        uint32_t property_attributes,
5180fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        ClangASTMetadata *metadata = NULL
5190fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    )
5200fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    {
5210fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        return ClangASTContext::AddObjCClassProperty (getASTContext(),
5220fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      class_opaque_type,
5230fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      property_name,
5240fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      property_opaque_type,
5250fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      ivar_decl,
5260fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      property_setter_name,
5270fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      property_getter_name,
5280fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      property_attributes,
5290fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                                      metadata);
5300fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    }
5310fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5320fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    bool
5330fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    SetObjCSuperClass (lldb::clang_type_t class_clang_type,
5340fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                       lldb::clang_type_t superclass_clang_type);
5350fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5360fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    static bool
5370fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    ObjCTypeHasIVars (lldb::clang_type_t class_clang_type, bool check_superclass);
5380fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5390fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    static bool
5400fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl,
5410fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                      bool check_superclass);
5420fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5430fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5440fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    static clang::ObjCMethodDecl *
5450fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    AddMethodToObjCObjectType (clang::ASTContext *ast,
5460fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                               lldb::clang_type_t class_opaque_type,
5470fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                               const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
5480fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                               lldb::clang_type_t method_opaque_type,
5490fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                               lldb::AccessType access);
5500fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5510fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    clang::ObjCMethodDecl *
5520fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    AddMethodToObjCObjectType (lldb::clang_type_t class_opaque_type,
5530fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                               const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
5540fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                               lldb::clang_type_t method_opaque_type,
5550fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                               lldb::AccessType access)
5560fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    {
5570fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul        return AddMethodToObjCObjectType (getASTContext(),
5580fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                          class_opaque_type,
5590fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                          name,
5600fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                          method_opaque_type,
5610fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul                                          access);
5620fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    }
5630fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul
5640fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    static bool
565a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie    SetHasExternalStorage (lldb::clang_type_t clang_type, bool has_extern);
566a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie
567a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie    //------------------------------------------------------------------
5680fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    // Aggregate Types
5690fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    //------------------------------------------------------------------
5700fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    static bool
5710fefafb2e46fa7ead35ef05fda10368af0970c88Brian Paul    IsAggregateType (lldb::clang_type_t clang_type);
5726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
5735e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    // Returns a mask containing bits from the ClangASTContext::eTypeXXX enumerations
5746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static uint32_t
575ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetTypeInfo (lldb::clang_type_t clang_type,
576ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     clang::ASTContext *ast,                // The AST for clang_type (can be NULL)
577ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     lldb::clang_type_t *pointee_or_element_type);  // (can be NULL)
578ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
579ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static uint32_t
580ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetNumChildren (clang::ASTContext *ast,
581ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                    lldb::clang_type_t clang_type,
582ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                    bool omit_empty_base_classes);
583ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
584ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static uint32_t
585ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetNumDirectBaseClasses (clang::ASTContext *ast,
586ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                             lldb::clang_type_t clang_type);
587ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
588ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static uint32_t
589ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetNumVirtualBaseClasses (clang::ASTContext *ast,
590ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                              lldb::clang_type_t clang_type);
591ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
592ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static uint32_t
593ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetNumFields (clang::ASTContext *ast,
594ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                  lldb::clang_type_t clang_type);
595ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
596ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static lldb::clang_type_t
597ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetDirectBaseClassAtIndex (clang::ASTContext *ast,
598ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                               lldb::clang_type_t clang_type,
599ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                               uint32_t idx,
600ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                               uint32_t *bit_offset_ptr);
601ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
602ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static lldb::clang_type_t
603ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
604ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                                lldb::clang_type_t clang_type,
605ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                                uint32_t idx,
606ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                                uint32_t *bit_offset_ptr);
607ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
608ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static lldb::clang_type_t
609ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetFieldAtIndex (clang::ASTContext *ast,
610ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     lldb::clang_type_t clang_type,
611ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     uint32_t idx,
612ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     std::string& name,
613ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     uint64_t *bit_offset_ptr,
614ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     uint32_t *bitfield_bit_size_ptr,
615ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                     bool *is_bitfield_ptr);
616ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
617ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    static uint32_t
618ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetNumPointeeChildren (lldb::clang_type_t clang_type);
619ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell
620ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    lldb::clang_type_t
621ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell    GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
622ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                              const char *parent_name,
623ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                              lldb::clang_type_t  parent_clang_type,
624ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                              uint32_t idx,
625ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                              bool transparent_pointers,
626ff56908e09c0351179478deb19677cf56eec1f64Keith Whitwell                              bool omit_empty_base_classes,
6275e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                              bool ignore_array_bounds,
6285e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                              std::string& child_name,
6296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                              uint32_t &child_byte_size,
6305e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                              int32_t &child_byte_offset,
6315e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                              uint32_t &child_bitfield_bit_size,
6326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                              uint32_t &child_bitfield_bit_offset,
633b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              bool &child_is_base_class,
634b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              bool &child_is_deref_of_parent);
635b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul
636b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    static lldb::clang_type_t
637b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
638b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              clang::ASTContext *ast,
639b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              const char *parent_name,
640b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              lldb::clang_type_t  parent_clang_type,
641b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              uint32_t idx,
642b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              bool transparent_pointers,
643b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              bool omit_empty_base_classes,
644b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              bool ignore_array_bounds,
645b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              std::string& child_name,
646b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              uint32_t &child_byte_size,
647b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              int32_t &child_byte_offset,
648b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              uint32_t &child_bitfield_bit_size,
649b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              uint32_t &child_bitfield_bit_offset,
650b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              bool &child_is_base_class,
651b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul                              bool &child_is_deref_of_parent);
652b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul
6534dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    // Lookup a child given a name. This function will match base class names
6546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // and member member names in "clang_type" only, not descendants.
6554dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    static uint32_t
6564dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    GetIndexOfChildWithName (clang::ASTContext *ast,
6576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                             lldb::clang_type_t clang_type,
6585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                             const char *name,
6595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                             bool omit_empty_base_classes);
6606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
6616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // Lookup a child member given a name. This function will match member names
6626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // only and will descend into "clang_type" children in search for the first
6636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // member in this class, or any base class that matches "name".
6647391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul    // TODO: Return all matches for a given name by returning a vector<vector<uint32_t>>
6655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    // so we catch all names that match a given child name, not just the first.
666180b0dab8b87ef7987b9f2c44068d1eea3f54939Jouk Jansen    static size_t
6676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    GetIndexOfChildMemberWithName (clang::ASTContext *ast,
6685e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                                   lldb::clang_type_t clang_type,
6695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                                   const char *name,
6705e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                                   bool omit_empty_base_classes,
6716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                                   std::vector<uint32_t>& child_indexes);
6725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    size_t
6746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    GetNumTemplateArguments (lldb::clang_type_t clang_type)
6756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    {
6766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell        return GetNumTemplateArguments(getASTContext(), clang_type);
677b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    }
6785e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    lldb::clang_type_t
6806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    GetTemplateArgument (lldb::clang_type_t clang_type,
6816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                         size_t idx,
6827391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul                         lldb::TemplateArgumentKind &kind)
683ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes    {
6845e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen        return GetTemplateArgument(getASTContext(), clang_type, idx, kind);
6856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    }
6866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
6876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static size_t
6886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    GetNumTemplateArguments (clang::ASTContext *ast,
6895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                             lldb::clang_type_t clang_type);
6905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
6915e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static lldb::clang_type_t
6926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    GetTemplateArgument (clang::ASTContext *ast,
6934dafbc3dc75be565704f437016f70a63c48d1539Brian Paul                         lldb::clang_type_t clang_type,
6946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                         size_t idx,
6954dafbc3dc75be565704f437016f70a63c48d1539Brian Paul                         lldb::TemplateArgumentKind &kind);
6964dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
6976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
6986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // clang::TagType
6996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
7006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    bool
7025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    SetTagTypeKind (lldb::clang_type_t  tag_qual_type,
7035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                    int kind);
7045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
7056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
7064dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    // C++ Base Classes
7075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    //------------------------------------------------------------------
7084dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
7094dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    clang::CXXBaseSpecifier *
7106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    CreateBaseClassSpecifier (lldb::clang_type_t  base_class_type,
7115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                              lldb::AccessType access,
7125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                              bool is_virtual,
7134d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul                              bool base_of_class);
7144d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul
7154d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    static void
7164d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes,
7174d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul                               unsigned num_base_classes);
7184d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul
7194d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    bool
720093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie    SetBaseClassesForClassType (lldb::clang_type_t  class_clang_type,
721093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie                                clang::CXXBaseSpecifier const * const *base_classes,
722093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie                                unsigned num_base_classes);
723093dc9e548537e6c77e33064a584f849ad90dfa5Dave Airlie
7245e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    //------------------------------------------------------------------
7254d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    // DeclContext Functions
7266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
7274dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
7286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static clang::DeclContext *
7294dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    GetDeclContextForType (lldb::clang_type_t  qual_type);
7304dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
7314d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    //------------------------------------------------------------------
7324d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    // Namespace Declarations
7334d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul    //------------------------------------------------------------------
7344d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul
7356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    clang::NamespaceDecl *
73653f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    GetUniqueNamespaceDeclaration (const char *name,
7376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                                   clang::DeclContext *decl_ctx);
7386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
7406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // Function Types
7416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
7426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    clang::FunctionDecl *
744e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    CreateFunctionDeclaration (clang::DeclContext *decl_ctx,
7456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                               const char *name,
7466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                               lldb::clang_type_t  function_Type,
7476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                               int storage,
7486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                               bool is_inline);
7496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static lldb::clang_type_t
7516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    CreateFunctionType (clang::ASTContext *ast,
7523728673bd1b974e54858fbab6ff62d3607b0d3f0Brian Paul                        lldb::clang_type_t result_type,
753e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák                        lldb::clang_type_t *args,
7544d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul                        unsigned num_args,
7554d21ecde7702852f30a4f3b90af0e9811b230c63Brian Paul                        bool is_variadic,
756e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák                        unsigned type_quals);
757e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
758e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    lldb::clang_type_t
7596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    CreateFunctionType (lldb::clang_type_t result_type,
760e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák                        lldb::clang_type_t *args,
76174713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                        unsigned num_args,
76274713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                        bool is_variadic,
76374713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                        unsigned type_quals)
76474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul    {
76574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul        return ClangASTContext::CreateFunctionType(getASTContext(),
76674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                                                   result_type,
76774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                                                   args,
76874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                                                   num_args,
769175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt                                                   is_variadic,
770175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt                                                   type_quals);
771175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt    }
772175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt
773175ad8050e3337f7065306017ea4eb8eae599f6dEric Anholt    clang::ParmVarDecl *
77474713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul    CreateParameterDeclaration (const char *name,
77574713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                               lldb::clang_type_t param_type,
77674713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul                               int storage);
77774713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul
77874713e2d293f9e796a4053a5a99ee5cb7df5c740Brian Paul    void
7796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    SetFunctionParameters (clang::FunctionDecl *function_decl,
7806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                           clang::ParmVarDecl **params,
7816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                           unsigned num_params);
7826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
7846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // Array Types
7856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
7866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
7876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    lldb::clang_type_t
7886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    CreateArrayType (lldb::clang_type_t  element_type,
7896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                     size_t element_count,
7906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                     uint32_t bit_stride);
791ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
792ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul    //------------------------------------------------------------------
793e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    // Tag Declarations
794ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul    //------------------------------------------------------------------
795e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    bool
796a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie    StartTagDeclarationDefinition (lldb::clang_type_t  qual_type);
797a637280e42b9a2f4ccbb5e7b209c5645073f584eDave Airlie
7985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    bool
7995e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    CompleteTagDeclarationDefinition (lldb::clang_type_t  qual_type);
8005e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
8024dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    // Enumeration Types
8036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
8044dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    lldb::clang_type_t
8054dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    CreateEnumerationType (const char *name,
8066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                           clang::DeclContext *decl_ctx,
807095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul                           const Declaration &decl,
808095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul                           lldb::clang_type_t integer_qual_type);
809fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell
810fd2756006a0baf63f60548d8f509de5b9a143608Keith Whitwell    static lldb::clang_type_t
8115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    GetEnumerationIntegerType (lldb::clang_type_t enum_clang_type);
812095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul
813ba8f6172bdfb44594537a304225b54152584d701Gareth Hughes    bool
8146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    AddEnumerationValueToEnumerationType (lldb::clang_type_t  enum_qual_type,
815095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul                                          lldb::clang_type_t  enumerator_qual_type,
816095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul                                          const Declaration &decl,
8175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                                          const char *name,
8186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                                          int64_t enum_value,
819095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul                                          uint32_t enum_value_bit_size);
820095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul
821095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul    //------------------------------------------------------------------
822095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul    // Pointers & References
823ea81daf9544205b892926bdbbcdfdfc63fd7d872Brian Paul    //------------------------------------------------------------------
824095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul    lldb::clang_type_t
8256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    CreatePointerType (lldb::clang_type_t clang_type);
8265e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8275e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static lldb::clang_type_t
8285e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    CreatePointerType (clang::ASTContext *ast,
8296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                       lldb::clang_type_t clang_type);
8304dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
8316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static lldb::clang_type_t
8324dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    CreateLValueReferenceType (clang::ASTContext *ast_context,
8334dafbc3dc75be565704f437016f70a63c48d1539Brian Paul                               lldb::clang_type_t clang_type);
8346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
835bcb3957b6c22caf35d9b300440648c3e656e8b4cKeith Whitwell    static lldb::clang_type_t
8366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    CreateRValueReferenceType (clang::ASTContext *ast_context,
8376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                               lldb::clang_type_t clang_type);
8386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    lldb::clang_type_t
8405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    CreateLValueReferenceType (lldb::clang_type_t clang_type)
8415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    {
8425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen        return ClangASTContext::CreateLValueReferenceType(getASTContext(), clang_type);
8436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    }
8444dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
8456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    lldb::clang_type_t
8464dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    CreateRValueReferenceType (lldb::clang_type_t clang_type)
8474dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    {
8486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell        return ClangASTContext::CreateRValueReferenceType(getASTContext(), clang_type);
8496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    }
8506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    lldb::clang_type_t
8525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    CreateMemberPointerType (lldb::clang_type_t  clang_pointee_type,
8535e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                             lldb::clang_type_t  clang_class_type);
8545e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8555e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    uint32_t
8565e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    GetPointerBitSize ();
8575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static bool
8595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsIntegerType (lldb::clang_type_t clang_type, bool &is_signed);
8605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
861bc42c19f22c3b719712529d86faea818f34150a2Brian Paul    static bool
8625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsPointerType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type = NULL);
8635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8645e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static bool
8655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsReferenceType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type = NULL);
8665e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8675e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static bool
8685e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsPointerOrReferenceType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type = NULL);
8695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8705e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static bool
871bc42c19f22c3b719712529d86faea818f34150a2Brian Paul    IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast,
8725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                                    lldb::clang_type_t clang_type,
8736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                                    lldb::clang_type_t *target_type = NULL);
8746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static bool
8766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    IsPossibleDynamicType (clang::ASTContext *ast,
8776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                           lldb::clang_type_t clang_type,
8786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                           lldb::clang_type_t *dynamic_pointee_type, // Can pass NULL
8795e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                           bool check_cplusplus,
8805e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                           bool check_objc);
8815e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8825e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static bool
8835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsCStringType (lldb::clang_type_t clang_type, uint32_t &length);
8846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8855e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static bool
8865e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsFunctionPointerType (lldb::clang_type_t clang_type);
8875e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
8886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static lldb::clang_type_t
8894dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    GetAsArrayType (lldb::clang_type_t clang_type,
8906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                    lldb::clang_type_t *member_type = NULL,
8914dafbc3dc75be565704f437016f70a63c48d1539Brian Paul                    uint64_t *size = NULL);
8924dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
8936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static bool
894e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    IsArrayType (lldb::clang_type_t clang_type,
8956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                 lldb::clang_type_t *member_type = NULL,
8966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                 uint64_t *size = NULL)
8976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    {
8986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell        return GetAsArrayType(clang_type, member_type, size) != 0;
8996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    }
9006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9015e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    //------------------------------------------------------------------
902180b0dab8b87ef7987b9f2c44068d1eea3f54939Jouk Jansen    // Typedefs
903071357096e682e9af59ad45ea5abc444ab431837Michal Krol    //------------------------------------------------------------------
904740467dd62962b4effdaf51e38edc032e2a39487Nicholas Miell    lldb::clang_type_t
9055e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    CreateTypedefType (const char *name,
9065e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                       lldb::clang_type_t clang_type,
9075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                       clang::DeclContext *decl_ctx);
9086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9094dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    //------------------------------------------------------------------
9106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    // Type names
9116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
9126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static bool
9134dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    IsFloatingPointType (lldb::clang_type_t clang_type, uint32_t &count, bool &is_complex);
9144dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
9155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    // true iff this is one of the types that can "fit"
9165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    // in a Scalar object
9175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    static bool
9185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsScalarType (lldb::clang_type_t clang_type);
9195e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static bool
9216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    IsPointerToScalarType (lldb::clang_type_t clang_type);
922efb41b07ff213735e8ea08f38a7799f9d80459fcBrian Paul
9232a37053fd5591eeb21db33aa8f6ee444da1eee7aMichal Krol    static bool
9245e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsArrayOfScalarType (lldb::clang_type_t clang_type);
9255e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
92686b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul    static bool
9276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    GetCXXClassName (lldb::clang_type_t clang_type,
9284dafbc3dc75be565704f437016f70a63c48d1539Brian Paul                     std::string &class_name);
9296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9304dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    static bool
9314dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    IsCXXClassType (lldb::clang_type_t clang_type);
9324dafbc3dc75be565704f437016f70a63c48d1539Brian Paul
9336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static bool
934cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    IsBeingDefined (lldb::clang_type_t clang_type);
9356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
936b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    static bool
937b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    IsObjCClassType (lldb::clang_type_t clang_type);
938cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
939b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul    static bool
9406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    IsObjCObjectPointerType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type);
9416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static bool
94389966cdb1b5974059c32308d74b5bb09943a6fa1Brian Paul    GetObjCClassName (lldb::clang_type_t clang_type,
9446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                      std::string &class_name);
9456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9464cb3579e52fed48d623698610e31d05ac8c8946fBrian Paul    static bool
9475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    IsCharType (lldb::clang_type_t clang_type);
948b114ff3783c1aff636c4293eccfc9e04b802d3bfBrian Paul
949e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák    static size_t
9505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    GetArraySize (lldb::clang_type_t clang_type);
9516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    //static bool
9536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //ConvertFloatValueToString (clang::ASTContext *ast,
9544dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    //                           lldb::clang_type_t clang_type,
9556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //                           const uint8_t* bytes,
9566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //                           size_t byte_size,
9576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //                           int apint_byte_order,
9586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //                           std::string &float_str);
9595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
9606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static size_t
9615e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    ConvertStringToFloatValue (clang::ASTContext *ast,
9625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                               lldb::clang_type_t clang_type,
9635e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                               const char *s,
9646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell                               uint8_t *dst,
9654dafbc3dc75be565704f437016f70a63c48d1539Brian Paul                               size_t dst_size);
9666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9674dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    //------------------------------------------------------------------
9684dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    // Qualifiers
9696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
9706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    static unsigned
9716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    GetTypeQualifiers(lldb::clang_type_t clang_type);
9726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellprotected:
9736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell    //------------------------------------------------------------------
9745e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    // Classes that inherit from ClangASTContext can see and modify these
9755e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    //------------------------------------------------------------------
9765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    std::string                             m_target_triple;
97753f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    std::auto_ptr<clang::ASTContext>        m_ast_ap;
9784dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    std::auto_ptr<clang::LangOptions>       m_language_options_ap;
97953f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    std::auto_ptr<clang::FileManager>       m_file_manager_ap;
9804dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    std::auto_ptr<clang::FileSystemOptions> m_file_system_options_ap;
9814dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    std::auto_ptr<clang::SourceManager>     m_source_manager_ap;
9825e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    std::auto_ptr<clang::DiagnosticsEngine>  m_diagnostics_engine_ap;
9835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    std::auto_ptr<clang::DiagnosticConsumer> m_diagnostic_consumer_ap;
9845e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    llvm::IntrusiveRefCntPtr<clang::TargetOptions>  m_target_options_rp;
98586b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul    std::auto_ptr<clang::TargetInfo>        m_target_info_ap;
9864dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    std::auto_ptr<clang::IdentifierTable>   m_identifier_table_ap;
9874dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    std::auto_ptr<clang::SelectorTable>     m_selector_table_ap;
98853f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul    std::auto_ptr<clang::Builtin::Context>  m_builtins_ap;
9894dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    CompleteTagDeclCallback                 m_callback_tag_decl;
9904dafbc3dc75be565704f437016f70a63c48d1539Brian Paul    CompleteObjCInterfaceDeclCallback       m_callback_objc_decl;
991736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul    void *                                  m_callback_baton;
9925ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheideggerprivate:
993736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul    //------------------------------------------------------------------
994736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul    // For ClangASTContext only
995736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul    //------------------------------------------------------------------
996736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul    ClangASTContext(const ClangASTContext&);
997736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul    const ClangASTContext& operator=(const ClangASTContext&);
998736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul};
999736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul
1000736fcbec4732830e7976fb5eb309b13e03be132cBrian Paul} // namespace lldb_private
10016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
1002b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian#endif  // liblldb_ClangASTContext_h_
1003b6adf336f41d2f0ed0ea33eaf53faee9635a2405Brian