1 //===-- ClangASTContext.h ---------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef liblldb_ClangASTContext_h_
11 #define liblldb_ClangASTContext_h_
12 
13 // C Includes
14 #include <stdint.h>
15 
16 // C++ Includes
17 #include <string>
18 #include <vector>
19 
20 // Other libraries and framework includes
21 #include "llvm/ADT/OwningPtr.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "clang/AST/TemplateBase.h"
24 
25 
26 // Project includes
27 #include "lldb/lldb-enumerations.h"
28 #include "lldb/Core/ClangForward.h"
29 #include "lldb/Symbol/ClangASTType.h"
30 
31 namespace lldb_private {
32 
33 class Declaration;
34 
35 class ClangASTContext
36 {
37 public:
38     typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
39     typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
40 
41     //------------------------------------------------------------------
42     // Constructors and Destructors
43     //------------------------------------------------------------------
44     ClangASTContext (const char *triple = NULL);
45 
46     ~ClangASTContext();
47 
48     clang::ASTContext *
49     getASTContext();
50 
51     clang::Builtin::Context *
52     getBuiltinContext();
53 
54     clang::IdentifierTable *
55     getIdentifierTable();
56 
57     clang::LangOptions *
58     getLanguageOptions();
59 
60     clang::SelectorTable *
61     getSelectorTable();
62 
63     clang::FileManager *
64     getFileManager();
65 
66     clang::SourceManager *
67     getSourceManager();
68 
69     clang::DiagnosticsEngine *
70     getDiagnosticsEngine();
71 
72     clang::DiagnosticConsumer *
73     getDiagnosticConsumer();
74 
75     clang::TargetOptions *
76     getTargetOptions();
77 
78     clang::TargetInfo *
79     getTargetInfo();
80 
81     void
82     Clear();
83 
84     const char *
85     GetTargetTriple ();
86 
87     void
88     SetTargetTriple (const char *target_triple);
89 
90     void
91     SetArchitecture (const ArchSpec &arch);
92 
93     bool
94     HasExternalSource ();
95 
96     void
97     SetExternalSource (llvm::OwningPtr<clang::ExternalASTSource> &ast_source_ap);
98 
99     void
100     RemoveExternalSource ();
101 
102     bool
GetCompleteDecl(clang::Decl * decl)103     GetCompleteDecl (clang::Decl *decl)
104     {
105         return ClangASTContext::GetCompleteDecl(getASTContext(), decl);
106     }
107 
108     static bool
109     GetCompleteDecl (clang::ASTContext *ast,
110                      clang::Decl *decl);
111 
112     void SetMetadataAsUserID (const void *object,
113                               lldb::user_id_t user_id);
114 
SetMetadata(const void * object,ClangASTMetadata & meta_data)115     void SetMetadata (const void *object,
116                       ClangASTMetadata &meta_data)
117     {
118         SetMetadata(getASTContext(), object, meta_data);
119     }
120 
121     static void
122     SetMetadata (clang::ASTContext *ast,
123                  const void *object,
124                  ClangASTMetadata &meta_data);
125 
126     ClangASTMetadata *
GetMetadata(const void * object)127     GetMetadata (const void *object)
128     {
129         return GetMetadata(getASTContext(), object);
130     }
131 
132     static ClangASTMetadata *
133     GetMetadata (clang::ASTContext *ast,
134                  const void *object);
135 
136     //------------------------------------------------------------------
137     // Basic Types
138     //------------------------------------------------------------------
139     ClangASTType
140     GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding,
141                                           uint32_t bit_size);
142 
143     static ClangASTType
144     GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast,
145                                          lldb::Encoding encoding,
146                                          uint32_t bit_size);
147 
148     ClangASTType
149     GetBasicType (lldb::BasicType type);
150 
151     static ClangASTType
152     GetBasicType (clang::ASTContext *ast, lldb::BasicType type);
153 
154     static ClangASTType
155     GetBasicType (clang::ASTContext *ast, const ConstString &name);
156 
157     static lldb::BasicType
158     GetBasicTypeEnumeration (const ConstString &name);
159 
160     ClangASTType
161     GetBuiltinTypeForDWARFEncodingAndBitSize (
162         const char *type_name,
163         uint32_t dw_ate,
164         uint32_t bit_size);
165 
166     ClangASTType
167     GetCStringType(bool is_const);
168 
169     static ClangASTType
170     GetUnknownAnyType(clang::ASTContext *ast);
171 
172     ClangASTType
GetUnknownAnyType()173     GetUnknownAnyType()
174     {
175         return ClangASTContext::GetUnknownAnyType(getASTContext());
176     }
177 
178     uint32_t
179     GetPointerByteSize ();
180 
181     static clang::DeclContext *
182     GetTranslationUnitDecl (clang::ASTContext *ast);
183 
184     clang::DeclContext *
GetTranslationUnitDecl()185     GetTranslationUnitDecl ()
186     {
187         return GetTranslationUnitDecl (getASTContext());
188     }
189 
190     static bool
191     GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
192                                       lldb::LanguageType &language,
193                                       bool &is_instance_method,
194                                       ConstString &language_object_name);
195 
196     static ClangASTType
197     CopyType(clang::ASTContext *dest_context,
198              ClangASTType source_type);
199 
200     static clang::Decl *
201     CopyDecl (clang::ASTContext *dest_context,
202               clang::ASTContext *source_context,
203               clang::Decl *source_decl);
204 
205     static bool
206     AreTypesSame(ClangASTType type1,
207                  ClangASTType type2,
208                  bool ignore_qualifiers = false);
209 
210     ClangASTType
211     GetTypeForDecl (clang::TagDecl *decl);
212 
213     ClangASTType
214     GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl);
215 
216     //------------------------------------------------------------------
217     // Structure, Unions, Classes
218     //------------------------------------------------------------------
219 
220     static clang::AccessSpecifier
221     ConvertAccessTypeToAccessSpecifier (lldb::AccessType access);
222 
223     static clang::AccessSpecifier
224     UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs);
225 
226     static uint32_t
227     GetNumBaseClasses (const clang::CXXRecordDecl *cxx_record_decl,
228                        bool omit_empty_base_classes);
229 
230     static uint32_t
231     GetIndexForRecordBase (const clang::RecordDecl *record_decl,
232                            const clang::CXXBaseSpecifier *base_spec,
233                            bool omit_empty_base_classes);
234 
235     ClangASTType
236     CreateRecordType (clang::DeclContext *decl_ctx,
237                       lldb::AccessType access_type,
238                       const char *name,
239                       int kind,
240                       lldb::LanguageType language,
241                       ClangASTMetadata *metadata = NULL);
242 
243     class TemplateParameterInfos
244     {
245     public:
246         bool
IsValid()247         IsValid() const
248         {
249             if (args.empty())
250                 return false;
251             return args.size() == names.size();
252         }
253 
254         size_t
GetSize()255         GetSize () const
256         {
257             if (IsValid())
258                 return args.size();
259             return 0;
260         }
261 
262         llvm::SmallVector<const char *, 8> names;
263         llvm::SmallVector<clang::TemplateArgument, 8> args;
264     };
265 
266     clang::FunctionTemplateDecl *
267     CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
268                                 clang::FunctionDecl *func_decl,
269                                 const char *name,
270                                 const TemplateParameterInfos &infos);
271 
272     void
273     CreateFunctionTemplateSpecializationInfo (clang::FunctionDecl *func_decl,
274                                               clang::FunctionTemplateDecl *Template,
275                                               const TemplateParameterInfos &infos);
276 
277     clang::ClassTemplateDecl *
278     CreateClassTemplateDecl (clang::DeclContext *decl_ctx,
279                              lldb::AccessType access_type,
280                              const char *class_name,
281                              int kind,
282                              const TemplateParameterInfos &infos);
283 
284     clang::ClassTemplateSpecializationDecl *
285     CreateClassTemplateSpecializationDecl (clang::DeclContext *decl_ctx,
286                                            clang::ClassTemplateDecl *class_template_decl,
287                                            int kind,
288                                            const TemplateParameterInfos &infos);
289 
290     ClangASTType
291     CreateClassTemplateSpecializationType (clang::ClassTemplateSpecializationDecl *class_template_specialization_decl);
292 
293     static clang::DeclContext *
294     GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl);
295 
296     static clang::DeclContext *
297     GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl);
298 
299 
300     static bool
301     CheckOverloadedOperatorKindParameterCount (uint32_t op_kind,
302                                                uint32_t num_params);
303 
304     bool
305     FieldIsBitfield (clang::FieldDecl* field,
306                      uint32_t& bitfield_bit_size);
307 
308     static bool
309     FieldIsBitfield (clang::ASTContext *ast,
310                      clang::FieldDecl* field,
311                      uint32_t& bitfield_bit_size);
312 
313     static bool
314     RecordHasFields (const clang::RecordDecl *record_decl);
315 
316 
317     ClangASTType
318     CreateObjCClass (const char *name,
319                      clang::DeclContext *decl_ctx,
320                      bool isForwardDecl,
321                      bool isInternal,
322                      ClangASTMetadata *metadata = NULL);
323 
324     // Returns a mask containing bits from the ClangASTContext::eTypeXXX enumerations
325 
326 
327     //------------------------------------------------------------------
328     // Namespace Declarations
329     //------------------------------------------------------------------
330 
331     clang::NamespaceDecl *
332     GetUniqueNamespaceDeclaration (const char *name,
333                                    clang::DeclContext *decl_ctx);
334 
335     //------------------------------------------------------------------
336     // Function Types
337     //------------------------------------------------------------------
338 
339     clang::FunctionDecl *
340     CreateFunctionDeclaration (clang::DeclContext *decl_ctx,
341                                const char *name,
342                                const ClangASTType &function_Type,
343                                int storage,
344                                bool is_inline);
345 
346     static ClangASTType
347     CreateFunctionType (clang::ASTContext *ast,
348                         const ClangASTType &result_type,
349                         const ClangASTType *args,
350                         unsigned num_args,
351                         bool is_variadic,
352                         unsigned type_quals);
353 
354     ClangASTType
CreateFunctionType(const ClangASTType & result_type,const ClangASTType * args,unsigned num_args,bool is_variadic,unsigned type_quals)355     CreateFunctionType (const ClangASTType &result_type,
356                         const ClangASTType *args,
357                         unsigned num_args,
358                         bool is_variadic,
359                         unsigned type_quals)
360     {
361         return ClangASTContext::CreateFunctionType(getASTContext(),
362                                                    result_type,
363                                                    args,
364                                                    num_args,
365                                                    is_variadic,
366                                                    type_quals);
367     }
368 
369     clang::ParmVarDecl *
370     CreateParameterDeclaration (const char *name,
371                                 const ClangASTType &param_type,
372                                 int storage);
373 
374     void
375     SetFunctionParameters (clang::FunctionDecl *function_decl,
376                            clang::ParmVarDecl **params,
377                            unsigned num_params);
378 
379     //------------------------------------------------------------------
380     // Array Types
381     //------------------------------------------------------------------
382 
383     ClangASTType
384     CreateArrayType (const ClangASTType &element_type,
385                      size_t element_count,
386                      bool is_vector);
387 
388     //------------------------------------------------------------------
389     // Enumeration Types
390     //------------------------------------------------------------------
391     ClangASTType
392     CreateEnumerationType (const char *name,
393                            clang::DeclContext *decl_ctx,
394                            const Declaration &decl,
395                            const ClangASTType &integer_qual_type);
396 
397     //------------------------------------------------------------------
398     // Floating point functions
399     //------------------------------------------------------------------
400 
401     ClangASTType
GetFloatTypeFromBitSize(size_t bit_size)402     GetFloatTypeFromBitSize (size_t bit_size)
403     {
404         return GetFloatTypeFromBitSize (getASTContext(), bit_size);
405     }
406 
407     static ClangASTType
408     GetFloatTypeFromBitSize (clang::ASTContext *ast,
409                              size_t bit_size);
410 protected:
411     //------------------------------------------------------------------
412     // Classes that inherit from ClangASTContext can see and modify these
413     //------------------------------------------------------------------
414     std::string                                     m_target_triple;
415     std::unique_ptr<clang::ASTContext>              m_ast_ap;
416     std::unique_ptr<clang::LangOptions>             m_language_options_ap;
417     std::unique_ptr<clang::FileManager>             m_file_manager_ap;
418     std::unique_ptr<clang::FileSystemOptions>       m_file_system_options_ap;
419     std::unique_ptr<clang::SourceManager>           m_source_manager_ap;
420     std::unique_ptr<clang::DiagnosticsEngine>       m_diagnostics_engine_ap;
421     std::unique_ptr<clang::DiagnosticConsumer>      m_diagnostic_consumer_ap;
422     llvm::IntrusiveRefCntPtr<clang::TargetOptions>  m_target_options_rp;
423     std::unique_ptr<clang::TargetInfo>              m_target_info_ap;
424     std::unique_ptr<clang::IdentifierTable>         m_identifier_table_ap;
425     std::unique_ptr<clang::SelectorTable>           m_selector_table_ap;
426     std::unique_ptr<clang::Builtin::Context>        m_builtins_ap;
427     CompleteTagDeclCallback                         m_callback_tag_decl;
428     CompleteObjCInterfaceDeclCallback               m_callback_objc_decl;
429     void *                                          m_callback_baton;
430     uint32_t                                        m_pointer_byte_size;
431 private:
432     //------------------------------------------------------------------
433     // For ClangASTContext only
434     //------------------------------------------------------------------
435     ClangASTContext(const ClangASTContext&);
436     const ClangASTContext& operator=(const ClangASTContext&);
437 };
438 
439 } // namespace lldb_private
440 
441 #endif  // liblldb_ClangASTContext_h_
442