| //===-- ClangASTContext.h ---------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef liblldb_ClangASTContext_h_ |
| #define liblldb_ClangASTContext_h_ |
| |
| // C Includes |
| #include <stdint.h> |
| |
| // C++ Includes |
| #include <string> |
| #include <vector> |
| |
| // Other libraries and framework includes |
| #include "llvm/ADT/SmallVector.h" |
| #include "clang/AST/TemplateBase.h" |
| |
| |
| // Project includes |
| #include "lldb/lldb-enumerations.h" |
| #include "lldb/Core/ClangForward.h" |
| #include "lldb/Symbol/ClangASTType.h" |
| |
| namespace lldb_private { |
| |
| class Declaration; |
| |
| class ClangASTContext |
| { |
| public: |
| typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *); |
| typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *); |
| |
| //------------------------------------------------------------------ |
| // Constructors and Destructors |
| //------------------------------------------------------------------ |
| ClangASTContext (const char *triple = NULL); |
| |
| ~ClangASTContext(); |
| |
| clang::ASTContext * |
| getASTContext(); |
| |
| clang::Builtin::Context * |
| getBuiltinContext(); |
| |
| clang::IdentifierTable * |
| getIdentifierTable(); |
| |
| clang::LangOptions * |
| getLanguageOptions(); |
| |
| clang::SelectorTable * |
| getSelectorTable(); |
| |
| clang::FileManager * |
| getFileManager(); |
| |
| clang::SourceManager * |
| getSourceManager(); |
| |
| clang::DiagnosticsEngine * |
| getDiagnosticsEngine(); |
| |
| clang::DiagnosticConsumer * |
| getDiagnosticConsumer(); |
| |
| std::shared_ptr<clang::TargetOptions> &getTargetOptions(); |
| |
| clang::TargetInfo * |
| getTargetInfo(); |
| |
| void |
| Clear(); |
| |
| const char * |
| GetTargetTriple (); |
| |
| void |
| SetTargetTriple (const char *target_triple); |
| |
| void |
| SetArchitecture (const ArchSpec &arch); |
| |
| bool |
| HasExternalSource (); |
| |
| void |
| SetExternalSource (llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> &ast_source_ap); |
| |
| void |
| RemoveExternalSource (); |
| |
| bool |
| GetCompleteDecl (clang::Decl *decl) |
| { |
| return ClangASTContext::GetCompleteDecl(getASTContext(), decl); |
| } |
| |
| static bool |
| GetCompleteDecl (clang::ASTContext *ast, |
| clang::Decl *decl); |
| |
| void SetMetadataAsUserID (const void *object, |
| lldb::user_id_t user_id); |
| |
| void SetMetadata (const void *object, |
| ClangASTMetadata &meta_data) |
| { |
| SetMetadata(getASTContext(), object, meta_data); |
| } |
| |
| static void |
| SetMetadata (clang::ASTContext *ast, |
| const void *object, |
| ClangASTMetadata &meta_data); |
| |
| ClangASTMetadata * |
| GetMetadata (const void *object) |
| { |
| return GetMetadata(getASTContext(), object); |
| } |
| |
| static ClangASTMetadata * |
| GetMetadata (clang::ASTContext *ast, |
| const void *object); |
| |
| //------------------------------------------------------------------ |
| // Basic Types |
| //------------------------------------------------------------------ |
| ClangASTType |
| GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, |
| uint32_t bit_size); |
| |
| static ClangASTType |
| GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast, |
| lldb::Encoding encoding, |
| uint32_t bit_size); |
| |
| ClangASTType |
| GetBasicType (lldb::BasicType type); |
| |
| static ClangASTType |
| GetBasicType (clang::ASTContext *ast, lldb::BasicType type); |
| |
| static ClangASTType |
| GetBasicType (clang::ASTContext *ast, const ConstString &name); |
| |
| static lldb::BasicType |
| GetBasicTypeEnumeration (const ConstString &name); |
| |
| ClangASTType |
| GetBuiltinTypeForDWARFEncodingAndBitSize ( |
| const char *type_name, |
| uint32_t dw_ate, |
| uint32_t bit_size); |
| |
| ClangASTType |
| GetCStringType(bool is_const); |
| |
| static ClangASTType |
| GetUnknownAnyType(clang::ASTContext *ast); |
| |
| ClangASTType |
| GetUnknownAnyType() |
| { |
| return ClangASTContext::GetUnknownAnyType(getASTContext()); |
| } |
| |
| uint32_t |
| GetPointerByteSize (); |
| |
| static clang::DeclContext * |
| GetTranslationUnitDecl (clang::ASTContext *ast); |
| |
| clang::DeclContext * |
| GetTranslationUnitDecl () |
| { |
| return GetTranslationUnitDecl (getASTContext()); |
| } |
| |
| static bool |
| GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx, |
| lldb::LanguageType &language, |
| bool &is_instance_method, |
| ConstString &language_object_name); |
| |
| static ClangASTType |
| CopyType(clang::ASTContext *dest_context, |
| ClangASTType source_type); |
| |
| static clang::Decl * |
| CopyDecl (clang::ASTContext *dest_context, |
| clang::ASTContext *source_context, |
| clang::Decl *source_decl); |
| |
| static bool |
| AreTypesSame(ClangASTType type1, |
| ClangASTType type2, |
| bool ignore_qualifiers = false); |
| |
| ClangASTType |
| GetTypeForDecl (clang::TagDecl *decl); |
| |
| ClangASTType |
| GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl); |
| |
| //------------------------------------------------------------------ |
| // Structure, Unions, Classes |
| //------------------------------------------------------------------ |
| |
| static clang::AccessSpecifier |
| ConvertAccessTypeToAccessSpecifier (lldb::AccessType access); |
| |
| static clang::AccessSpecifier |
| UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs); |
| |
| static uint32_t |
| GetNumBaseClasses (const clang::CXXRecordDecl *cxx_record_decl, |
| bool omit_empty_base_classes); |
| |
| static uint32_t |
| GetIndexForRecordBase (const clang::RecordDecl *record_decl, |
| const clang::CXXBaseSpecifier *base_spec, |
| bool omit_empty_base_classes); |
| |
| ClangASTType |
| CreateRecordType (clang::DeclContext *decl_ctx, |
| lldb::AccessType access_type, |
| const char *name, |
| int kind, |
| lldb::LanguageType language, |
| ClangASTMetadata *metadata = NULL); |
| |
| class TemplateParameterInfos |
| { |
| public: |
| bool |
| IsValid() const |
| { |
| if (args.empty()) |
| return false; |
| return args.size() == names.size(); |
| } |
| |
| size_t |
| GetSize () const |
| { |
| if (IsValid()) |
| return args.size(); |
| return 0; |
| } |
| |
| llvm::SmallVector<const char *, 2> names; |
| llvm::SmallVector<clang::TemplateArgument, 2> args; |
| }; |
| |
| clang::FunctionTemplateDecl * |
| CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx, |
| clang::FunctionDecl *func_decl, |
| const char *name, |
| const TemplateParameterInfos &infos); |
| |
| void |
| CreateFunctionTemplateSpecializationInfo (clang::FunctionDecl *func_decl, |
| clang::FunctionTemplateDecl *Template, |
| const TemplateParameterInfos &infos); |
| |
| clang::ClassTemplateDecl * |
| CreateClassTemplateDecl (clang::DeclContext *decl_ctx, |
| lldb::AccessType access_type, |
| const char *class_name, |
| int kind, |
| const TemplateParameterInfos &infos); |
| |
| clang::ClassTemplateSpecializationDecl * |
| CreateClassTemplateSpecializationDecl (clang::DeclContext *decl_ctx, |
| clang::ClassTemplateDecl *class_template_decl, |
| int kind, |
| const TemplateParameterInfos &infos); |
| |
| ClangASTType |
| CreateClassTemplateSpecializationType (clang::ClassTemplateSpecializationDecl *class_template_specialization_decl); |
| |
| static clang::DeclContext * |
| GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl); |
| |
| static clang::DeclContext * |
| GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl); |
| |
| |
| static bool |
| CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, |
| uint32_t num_params); |
| |
| bool |
| FieldIsBitfield (clang::FieldDecl* field, |
| uint32_t& bitfield_bit_size); |
| |
| static bool |
| FieldIsBitfield (clang::ASTContext *ast, |
| clang::FieldDecl* field, |
| uint32_t& bitfield_bit_size); |
| |
| static bool |
| RecordHasFields (const clang::RecordDecl *record_decl); |
| |
| |
| ClangASTType |
| CreateObjCClass (const char *name, |
| clang::DeclContext *decl_ctx, |
| bool isForwardDecl, |
| bool isInternal, |
| ClangASTMetadata *metadata = NULL); |
| |
| // Returns a mask containing bits from the ClangASTContext::eTypeXXX enumerations |
| |
| |
| //------------------------------------------------------------------ |
| // Namespace Declarations |
| //------------------------------------------------------------------ |
| |
| clang::NamespaceDecl * |
| GetUniqueNamespaceDeclaration (const char *name, |
| clang::DeclContext *decl_ctx); |
| |
| //------------------------------------------------------------------ |
| // Function Types |
| //------------------------------------------------------------------ |
| |
| clang::FunctionDecl * |
| CreateFunctionDeclaration (clang::DeclContext *decl_ctx, |
| const char *name, |
| const ClangASTType &function_Type, |
| int storage, |
| bool is_inline); |
| |
| static ClangASTType |
| CreateFunctionType (clang::ASTContext *ast, |
| const ClangASTType &result_type, |
| const ClangASTType *args, |
| unsigned num_args, |
| bool is_variadic, |
| unsigned type_quals); |
| |
| ClangASTType |
| CreateFunctionType (const ClangASTType &result_type, |
| const ClangASTType *args, |
| unsigned num_args, |
| bool is_variadic, |
| unsigned type_quals) |
| { |
| return ClangASTContext::CreateFunctionType(getASTContext(), |
| result_type, |
| args, |
| num_args, |
| is_variadic, |
| type_quals); |
| } |
| |
| clang::ParmVarDecl * |
| CreateParameterDeclaration (const char *name, |
| const ClangASTType ¶m_type, |
| int storage); |
| |
| void |
| SetFunctionParameters (clang::FunctionDecl *function_decl, |
| clang::ParmVarDecl **params, |
| unsigned num_params); |
| |
| //------------------------------------------------------------------ |
| // Array Types |
| //------------------------------------------------------------------ |
| |
| ClangASTType |
| CreateArrayType (const ClangASTType &element_type, |
| size_t element_count, |
| bool is_vector); |
| |
| //------------------------------------------------------------------ |
| // Enumeration Types |
| //------------------------------------------------------------------ |
| ClangASTType |
| CreateEnumerationType (const char *name, |
| clang::DeclContext *decl_ctx, |
| const Declaration &decl, |
| const ClangASTType &integer_qual_type); |
| |
| //------------------------------------------------------------------ |
| // Floating point functions |
| //------------------------------------------------------------------ |
| |
| ClangASTType |
| GetFloatTypeFromBitSize (size_t bit_size) |
| { |
| return GetFloatTypeFromBitSize (getASTContext(), bit_size); |
| } |
| |
| static ClangASTType |
| GetFloatTypeFromBitSize (clang::ASTContext *ast, |
| size_t bit_size); |
| protected: |
| //------------------------------------------------------------------ |
| // Classes that inherit from ClangASTContext can see and modify these |
| //------------------------------------------------------------------ |
| std::string m_target_triple; |
| std::unique_ptr<clang::ASTContext> m_ast_ap; |
| std::unique_ptr<clang::LangOptions> m_language_options_ap; |
| std::unique_ptr<clang::FileManager> m_file_manager_ap; |
| std::unique_ptr<clang::FileSystemOptions> m_file_system_options_ap; |
| std::unique_ptr<clang::SourceManager> m_source_manager_ap; |
| std::unique_ptr<clang::DiagnosticsEngine> m_diagnostics_engine_ap; |
| std::unique_ptr<clang::DiagnosticConsumer> m_diagnostic_consumer_ap; |
| std::shared_ptr<clang::TargetOptions> m_target_options_rp; |
| std::unique_ptr<clang::TargetInfo> m_target_info_ap; |
| std::unique_ptr<clang::IdentifierTable> m_identifier_table_ap; |
| std::unique_ptr<clang::SelectorTable> m_selector_table_ap; |
| std::unique_ptr<clang::Builtin::Context> m_builtins_ap; |
| CompleteTagDeclCallback m_callback_tag_decl; |
| CompleteObjCInterfaceDeclCallback m_callback_objc_decl; |
| void * m_callback_baton; |
| uint32_t m_pointer_byte_size; |
| private: |
| //------------------------------------------------------------------ |
| // For ClangASTContext only |
| //------------------------------------------------------------------ |
| ClangASTContext(const ClangASTContext&); |
| const ClangASTContext& operator=(const ClangASTContext&); |
| }; |
| |
| } // namespace lldb_private |
| |
| #endif // liblldb_ClangASTContext_h_ |