diff options
Diffstat (limited to 'include/lldb/Symbol/ClangASTContext.h')
-rw-r--r-- | include/lldb/Symbol/ClangASTContext.h | 2061 |
1 files changed, 921 insertions, 1140 deletions
diff --git a/include/lldb/Symbol/ClangASTContext.h b/include/lldb/Symbol/ClangASTContext.h index 08f7b6b412dc..4262ecb4bf0e 100644 --- a/include/lldb/Symbol/ClangASTContext.h +++ b/include/lldb/Symbol/ClangASTContext.h @@ -20,13 +20,13 @@ #include <memory> #include <set> #include <string> -#include <vector> #include <utility> +#include <vector> // Other libraries and framework includes -#include "llvm/ADT/SmallVector.h" #include "clang/AST/ASTContext.h" #include "clang/AST/TemplateBase.h" +#include "llvm/ADT/SmallVector.h" // Project includes #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" @@ -43,1156 +43,934 @@ namespace lldb_private { class Declaration; -class ClangASTContext : public TypeSystem -{ +class ClangASTContext : public TypeSystem { public: - typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *); - typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *); - - //------------------------------------------------------------------ - // llvm casting support - //------------------------------------------------------------------ - static bool classof(const TypeSystem *ts) - { - return ts->getKind() == TypeSystem::eKindClang; - } + typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *); + typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, + clang::ObjCInterfaceDecl *); - //------------------------------------------------------------------ - // Constructors and Destructors - //------------------------------------------------------------------ - ClangASTContext(const char *triple = nullptr); + //------------------------------------------------------------------ + // llvm casting support + //------------------------------------------------------------------ + static bool classof(const TypeSystem *ts) { + return ts->getKind() == TypeSystem::eKindClang; + } - ~ClangASTContext() override; + //------------------------------------------------------------------ + // Constructors and Destructors + //------------------------------------------------------------------ + ClangASTContext(const char *triple = nullptr); - void - Finalize() override; + ~ClangASTContext() override; - //------------------------------------------------------------------ - // PluginInterface functions - //------------------------------------------------------------------ - ConstString - GetPluginName() override; + void Finalize() override; - uint32_t - GetPluginVersion() override; + //------------------------------------------------------------------ + // PluginInterface functions + //------------------------------------------------------------------ + ConstString GetPluginName() override; - static ConstString - GetPluginNameStatic (); + uint32_t GetPluginVersion() override; - static lldb::TypeSystemSP - CreateInstance (lldb::LanguageType language, Module *module, Target *target); - - static void - EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions); + static ConstString GetPluginNameStatic(); - static void - Initialize (); + static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language, + Module *module, Target *target); - static void - Terminate (); + static void EnumerateSupportedLanguages( + std::set<lldb::LanguageType> &languages_for_types, + std::set<lldb::LanguageType> &languages_for_expressions); - static ClangASTContext* - GetASTContext (clang::ASTContext* ast_ctx); + static void Initialize(); - clang::ASTContext * - getASTContext(); - - void setASTContext(clang::ASTContext* ast_ctx); - - clang::Builtin::Context * - getBuiltinContext(); + static void Terminate(); - clang::IdentifierTable * - getIdentifierTable(); + static ClangASTContext *GetASTContext(clang::ASTContext *ast_ctx); - clang::LangOptions * - getLanguageOptions(); + clang::ASTContext *getASTContext(); - clang::SelectorTable * - getSelectorTable(); + void setASTContext(clang::ASTContext *ast_ctx); - clang::FileManager * - getFileManager(); - - clang::SourceManager * - getSourceManager(); + clang::Builtin::Context *getBuiltinContext(); - clang::DiagnosticsEngine * - getDiagnosticsEngine(); - - clang::DiagnosticConsumer * - getDiagnosticConsumer(); + clang::IdentifierTable *getIdentifierTable(); - clang::MangleContext * - getMangleContext(); + clang::LangOptions *getLanguageOptions(); - std::shared_ptr<clang::TargetOptions> &getTargetOptions(); + clang::SelectorTable *getSelectorTable(); - clang::TargetInfo * - getTargetInfo(); + clang::FileManager *getFileManager(); - void - Clear(); - - const char * - GetTargetTriple (); + clang::SourceManager *getSourceManager(); - void - SetTargetTriple (const char *target_triple); + clang::DiagnosticsEngine *getDiagnosticsEngine(); - void - SetArchitecture (const ArchSpec &arch); + clang::DiagnosticConsumer *getDiagnosticConsumer(); - bool - HasExternalSource (); + clang::MangleContext *getMangleContext(); - void - SetExternalSource (llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> &ast_source_ap); + std::shared_ptr<clang::TargetOptions> &getTargetOptions(); - void - RemoveExternalSource (); - - bool - GetCompleteDecl (clang::Decl *decl) - { - return ClangASTContext::GetCompleteDecl(getASTContext(), decl); - } + clang::TargetInfo *getTargetInfo(); - static void - DumpDeclHiearchy (clang::Decl *decl); + void Clear(); - static void - DumpDeclContextHiearchy (clang::DeclContext *decl_ctx); + const char *GetTargetTriple(); - static bool - DeclsAreEquivalent (clang::Decl *lhs_decl, clang::Decl *rhs_decl); + void SetTargetTriple(const char *target_triple); - static bool - GetCompleteDecl (clang::ASTContext *ast, - clang::Decl *decl); + void SetArchitecture(const ArchSpec &arch); - void SetMetadataAsUserID (const void *object, - lldb::user_id_t user_id); + bool HasExternalSource(); - 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 - //------------------------------------------------------------------ - CompilerType - GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, - size_t bit_size) override; - - static CompilerType - GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast, - lldb::Encoding encoding, - uint32_t bit_size); - - CompilerType - GetBasicType (lldb::BasicType type); - - static CompilerType - GetBasicType (clang::ASTContext *ast, lldb::BasicType type); - - static CompilerType - GetBasicType (clang::ASTContext *ast, const ConstString &name); - - static lldb::BasicType - GetBasicTypeEnumeration (const ConstString &name); - - CompilerType - GetBuiltinTypeForDWARFEncodingAndBitSize ( - const char *type_name, - uint32_t dw_ate, - uint32_t bit_size); - - CompilerType - GetCStringType(bool is_const); - - static CompilerType - GetUnknownAnyType(clang::ASTContext *ast); - - CompilerType - GetUnknownAnyType() - { - return ClangASTContext::GetUnknownAnyType(getASTContext()); + void SetExternalSource( + llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> &ast_source_ap); + + void RemoveExternalSource(); + + bool GetCompleteDecl(clang::Decl *decl) { + return ClangASTContext::GetCompleteDecl(getASTContext(), decl); + } + + static void DumpDeclHiearchy(clang::Decl *decl); + + static void DumpDeclContextHiearchy(clang::DeclContext *decl_ctx); + + static bool DeclsAreEquivalent(clang::Decl *lhs_decl, clang::Decl *rhs_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 + //------------------------------------------------------------------ + CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, + size_t bit_size) override; + + static CompilerType GetBuiltinTypeForEncodingAndBitSize( + clang::ASTContext *ast, lldb::Encoding encoding, uint32_t bit_size); + + CompilerType GetBasicType(lldb::BasicType type); + + static CompilerType GetBasicType(clang::ASTContext *ast, + lldb::BasicType type); + + static CompilerType GetBasicType(clang::ASTContext *ast, + const ConstString &name); + + static lldb::BasicType GetBasicTypeEnumeration(const ConstString &name); + + CompilerType GetBuiltinTypeForDWARFEncodingAndBitSize(const char *type_name, + uint32_t dw_ate, + uint32_t bit_size); + + CompilerType GetCStringType(bool is_const); + + static CompilerType GetUnknownAnyType(clang::ASTContext *ast); + + CompilerType GetUnknownAnyType() { + return ClangASTContext::GetUnknownAnyType(getASTContext()); + } + + static clang::DeclContext *GetDeclContextForType(clang::QualType type); + + static clang::DeclContext *GetDeclContextForType(const CompilerType &type); + + uint32_t GetPointerByteSize() override; + + static clang::DeclContext *GetTranslationUnitDecl(clang::ASTContext *ast); + + clang::DeclContext *GetTranslationUnitDecl() { + return GetTranslationUnitDecl(getASTContext()); + } + + static clang::Decl *CopyDecl(clang::ASTContext *dest_context, + clang::ASTContext *source_context, + clang::Decl *source_decl); + + static bool AreTypesSame(CompilerType type1, CompilerType type2, + bool ignore_qualifiers = false); + + static CompilerType GetTypeForDecl(clang::NamedDecl *decl); + + static CompilerType GetTypeForDecl(clang::TagDecl *decl); + + static CompilerType GetTypeForDecl(clang::ObjCInterfaceDecl *objc_decl); + + template <typename RecordDeclType> + CompilerType GetTypeForIdentifier(const ConstString &type_name) { + CompilerType compiler_type; + + if (type_name.GetLength()) { + clang::ASTContext *ast = getASTContext(); + if (ast) { + clang::IdentifierInfo &myIdent = + ast->Idents.get(type_name.GetCString()); + clang::DeclarationName myName = + ast->DeclarationNames.getIdentifier(&myIdent); + + clang::DeclContext::lookup_result result = + ast->getTranslationUnitDecl()->lookup(myName); + + if (!result.empty()) { + clang::NamedDecl *named_decl = result[0]; + if (const RecordDeclType *record_decl = + llvm::dyn_cast<RecordDeclType>(named_decl)) + compiler_type.SetCompilerType( + ast, clang::QualType(record_decl->getTypeForDecl(), 0)); + } + } } - - static clang::DeclContext * - GetDeclContextForType (clang::QualType type); - - static clang::DeclContext * - GetDeclContextForType (const CompilerType& type); - - uint32_t - GetPointerByteSize () override; - - static clang::DeclContext * - GetTranslationUnitDecl (clang::ASTContext *ast); - - clang::DeclContext * - GetTranslationUnitDecl () - { - return GetTranslationUnitDecl (getASTContext()); + + return compiler_type; + } + + CompilerType CreateStructForIdentifier( + const ConstString &type_name, + const std::initializer_list<std::pair<const char *, CompilerType>> + &type_fields, + bool packed = false); + + CompilerType GetOrCreateStructForIdentifier( + const ConstString &type_name, + const std::initializer_list<std::pair<const char *, CompilerType>> + &type_fields, + bool packed = false); + + //------------------------------------------------------------------ + // 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); + + CompilerType CreateRecordType(clang::DeclContext *decl_ctx, + lldb::AccessType access_type, const char *name, + int kind, lldb::LanguageType language, + ClangASTMetadata *metadata = nullptr); + + class TemplateParameterInfos { + public: + bool IsValid() const { + if (args.empty()) + return false; + return args.size() == names.size(); } - - static clang::Decl * - CopyDecl (clang::ASTContext *dest_context, - clang::ASTContext *source_context, - clang::Decl *source_decl); - - static bool - AreTypesSame(CompilerType type1, - CompilerType type2, - bool ignore_qualifiers = false); - - static CompilerType - GetTypeForDecl (clang::NamedDecl *decl); - - static CompilerType - GetTypeForDecl (clang::TagDecl *decl); - - static CompilerType - GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl); - - template <typename RecordDeclType> - CompilerType - GetTypeForIdentifier (const ConstString &type_name) - { - CompilerType compiler_type; - - if (type_name.GetLength()) - { - clang::ASTContext *ast = getASTContext(); - if (ast) - { - clang::IdentifierInfo &myIdent = ast->Idents.get(type_name.GetCString()); - clang::DeclarationName myName = ast->DeclarationNames.getIdentifier(&myIdent); - - clang::DeclContext::lookup_result result = ast->getTranslationUnitDecl()->lookup(myName); - - if (!result.empty()) - { - clang::NamedDecl *named_decl = result[0]; - if (const RecordDeclType *record_decl = llvm::dyn_cast<RecordDeclType>(named_decl)) - compiler_type.SetCompilerType(ast, clang::QualType(record_decl->getTypeForDecl(), 0)); - } - } - } - - return compiler_type; + + size_t GetSize() const { + if (IsValid()) + return args.size(); + return 0; } - - CompilerType - CreateStructForIdentifier (const ConstString &type_name, - const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields, - bool packed = false); - - CompilerType - GetOrCreateStructForIdentifier (const ConstString &type_name, - const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields, - bool packed = false); - - //------------------------------------------------------------------ - // 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); - - CompilerType - CreateRecordType(clang::DeclContext *decl_ctx, - lldb::AccessType access_type, - const char *name, - int kind, - lldb::LanguageType language, - ClangASTMetadata *metadata = nullptr); - - 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; + }; - 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, + clang::FunctionTemplateDecl * + CreateFunctionTemplateDecl(clang::DeclContext *decl_ctx, + clang::FunctionDecl *func_decl, const char *name, const TemplateParameterInfos &infos); - clang::ClassTemplateSpecializationDecl * - CreateClassTemplateSpecializationDecl (clang::DeclContext *decl_ctx, - clang::ClassTemplateDecl *class_template_decl, - int kind, - const TemplateParameterInfos &infos); - - CompilerType - 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); - - CompilerType - CreateObjCClass(const char *name, - clang::DeclContext *decl_ctx, - bool isForwardDecl, - bool isInternal, - ClangASTMetadata *metadata = nullptr); - - bool - SetTagTypeKind (clang::QualType type, int kind) const; - - bool - SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl, - int default_accessibility, - int *assigned_accessibilities, - size_t num_assigned_accessibilities); - - // Returns a mask containing bits from the ClangASTContext::eTypeXXX enumerations - - //------------------------------------------------------------------ - // Namespace Declarations - //------------------------------------------------------------------ - - clang::NamespaceDecl * - GetUniqueNamespaceDeclaration (const char *name, - clang::DeclContext *decl_ctx); - - static clang::NamespaceDecl * - GetUniqueNamespaceDeclaration (clang::ASTContext *ast, - const char *name, - clang::DeclContext *decl_ctx); - - //------------------------------------------------------------------ - // Function Types - //------------------------------------------------------------------ - - clang::FunctionDecl * - CreateFunctionDeclaration (clang::DeclContext *decl_ctx, - const char *name, - const CompilerType &function_Type, - int storage, - bool is_inline); - - static CompilerType - CreateFunctionType (clang::ASTContext *ast, - const CompilerType &result_type, - const CompilerType *args, - unsigned num_args, - bool is_variadic, - unsigned type_quals); - - CompilerType - CreateFunctionType (const CompilerType &result_type, - const CompilerType *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 CompilerType ¶m_type, - int storage); - - void - SetFunctionParameters (clang::FunctionDecl *function_decl, - clang::ParmVarDecl **params, - unsigned num_params); - - CompilerType - CreateBlockPointerType (const CompilerType &function_type); - - //------------------------------------------------------------------ - // Array Types - //------------------------------------------------------------------ - - CompilerType - CreateArrayType (const CompilerType &element_type, - size_t element_count, - bool is_vector); - - //------------------------------------------------------------------ - // Enumeration Types - //------------------------------------------------------------------ - CompilerType - CreateEnumerationType (const char *name, - clang::DeclContext *decl_ctx, - const Declaration &decl, - const CompilerType &integer_qual_type); - - //------------------------------------------------------------------ - // Integer type functions - //------------------------------------------------------------------ - - static CompilerType - GetIntTypeFromBitSize (clang::ASTContext *ast, - size_t bit_size, bool is_signed); - - CompilerType - GetPointerSizedIntType (bool is_signed) - { - return GetPointerSizedIntType (getASTContext(), is_signed); - } - - static CompilerType - GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed); - - //------------------------------------------------------------------ - // Floating point functions - //------------------------------------------------------------------ - - static CompilerType - GetFloatTypeFromBitSize (clang::ASTContext *ast, - size_t bit_size); - - //------------------------------------------------------------------ - // TypeSystem methods - //------------------------------------------------------------------ - DWARFASTParser * - GetDWARFParser() override; - PDBASTParser * - GetPDBParser(); - - //------------------------------------------------------------------ - // ClangASTContext callbacks for external source lookups. - //------------------------------------------------------------------ - static void - CompleteTagDecl (void *baton, clang::TagDecl *); - - static void - CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *); - - static bool - LayoutRecordType(void *baton, - const clang::RecordDecl *record_decl, - uint64_t &size, - uint64_t &alignment, - llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets); - - //---------------------------------------------------------------------- - // CompilerDecl override functions - //---------------------------------------------------------------------- - ConstString - DeclGetName (void *opaque_decl) override; - - ConstString - DeclGetMangledName (void *opaque_decl) override; - - CompilerDeclContext - DeclGetDeclContext (void *opaque_decl) override; - - CompilerType - DeclGetFunctionReturnType(void *opaque_decl) override; - - size_t - DeclGetFunctionNumArguments(void *opaque_decl) override; - - CompilerType - DeclGetFunctionArgumentType (void *opaque_decl, size_t arg_idx) override; - - //---------------------------------------------------------------------- - // CompilerDeclContext override functions - //---------------------------------------------------------------------- - - std::vector<CompilerDecl> - DeclContextFindDeclByName (void *opaque_decl_ctx, - ConstString name, - const bool ignore_using_decls) override; - - bool - DeclContextIsStructUnionOrClass (void *opaque_decl_ctx) override; - - ConstString - DeclContextGetName (void *opaque_decl_ctx) override; - - ConstString - DeclContextGetScopeQualifiedName (void *opaque_decl_ctx) override; - - bool - DeclContextIsClassMethod (void *opaque_decl_ctx, - lldb::LanguageType *language_ptr, - bool *is_instance_method_ptr, - ConstString *language_object_name_ptr) override; - - //---------------------------------------------------------------------- - // Clang specific clang::DeclContext functions - //---------------------------------------------------------------------- - - static clang::DeclContext * - DeclContextGetAsDeclContext (const CompilerDeclContext &dc); - - static clang::ObjCMethodDecl * - DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc); - - static clang::CXXMethodDecl * - DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc); - - static clang::FunctionDecl * - DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc); - - static clang::NamespaceDecl * - DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc); - - static ClangASTMetadata * - DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object); - - static clang::ASTContext * - DeclContextGetClangASTContext (const CompilerDeclContext &dc); - - //---------------------------------------------------------------------- - // Tests - //---------------------------------------------------------------------- - - bool - IsArrayType (lldb::opaque_compiler_type_t type, - CompilerType *element_type, - uint64_t *size, - bool *is_incomplete) override; - - bool - IsVectorType (lldb::opaque_compiler_type_t type, - CompilerType *element_type, - uint64_t *size) override; - - bool - IsAggregateType (lldb::opaque_compiler_type_t type) override; - - bool - IsAnonymousType (lldb::opaque_compiler_type_t type) override; - - bool - IsBeingDefined (lldb::opaque_compiler_type_t type) override; - - bool - IsCharType (lldb::opaque_compiler_type_t type) override; - - bool - IsCompleteType (lldb::opaque_compiler_type_t type) override; - - bool - IsConst(lldb::opaque_compiler_type_t type) override; - - bool - IsCStringType (lldb::opaque_compiler_type_t type, uint32_t &length) override; - - static bool - IsCXXClassType (const CompilerType& type); - - bool - IsDefined(lldb::opaque_compiler_type_t type) override; - - bool - IsFloatingPointType (lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex) override; - - bool - IsFunctionType (lldb::opaque_compiler_type_t type, bool *is_variadic_ptr) override; - - uint32_t - IsHomogeneousAggregate (lldb::opaque_compiler_type_t type, CompilerType* base_type_ptr) override; - - size_t - GetNumberOfFunctionArguments (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetFunctionArgumentAtIndex (lldb::opaque_compiler_type_t type, const size_t index) override; - - bool - IsFunctionPointerType (lldb::opaque_compiler_type_t type) override; - - bool - IsBlockPointerType (lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) override; - - bool - IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed) override; - - bool - IsEnumerationType (lldb::opaque_compiler_type_t type, bool &is_signed) override; - - static bool - IsObjCClassType (const CompilerType& type); - - static bool - IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass); - - static bool - IsObjCObjectOrInterfaceType (const CompilerType& type); - - static bool - IsObjCObjectPointerType(const CompilerType& type, CompilerType *target_type = nullptr); - - bool - IsPolymorphicClass (lldb::opaque_compiler_type_t type) override; - - static bool - IsClassType(lldb::opaque_compiler_type_t type); - - static bool - IsEnumType(lldb::opaque_compiler_type_t type); - - bool - IsPossibleDynamicType(lldb::opaque_compiler_type_t type, - CompilerType *target_type, // Can pass nullptr - bool check_cplusplus, - bool check_objc) override; - - bool - IsRuntimeGeneratedType (lldb::opaque_compiler_type_t type) override; - - bool - IsPointerType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type) override; - - bool - IsPointerOrReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type) override; - - bool - IsReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool* is_rvalue) override; - - bool - IsScalarType (lldb::opaque_compiler_type_t type) override; - - bool - IsTypedefType (lldb::opaque_compiler_type_t type) override; - - bool - IsVoidType (lldb::opaque_compiler_type_t type) override; - - bool - SupportsLanguage (lldb::LanguageType language) override; - - static bool - GetCXXClassName (const CompilerType& type, std::string &class_name); - - static bool - GetObjCClassName (const CompilerType& type, std::string &class_name); - - //---------------------------------------------------------------------- - // Type Completion - //---------------------------------------------------------------------- - - bool - GetCompleteType (lldb::opaque_compiler_type_t type) override; - - //---------------------------------------------------------------------- - // Accessors - //---------------------------------------------------------------------- - - ConstString - GetTypeName (lldb::opaque_compiler_type_t type) override; - - uint32_t - GetTypeInfo (lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_compiler_type) override; - - lldb::LanguageType - GetMinimumLanguage (lldb::opaque_compiler_type_t type) override; - - lldb::TypeClass - GetTypeClass (lldb::opaque_compiler_type_t type) override; - - unsigned - GetTypeQualifiers(lldb::opaque_compiler_type_t type) override; - - //---------------------------------------------------------------------- - // Creating related types - //---------------------------------------------------------------------- - - // Using the current type, create a new typedef to that type using "typedef_name" - // as the name and "decl_ctx" as the decl context. - static CompilerType - CreateTypedefType (const CompilerType& type, - const char *typedef_name, - const CompilerDeclContext &compiler_decl_ctx); - - CompilerType - GetArrayElementType (lldb::opaque_compiler_type_t type, uint64_t *stride) override; - - CompilerType - GetCanonicalType (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetFullyUnqualifiedType (lldb::opaque_compiler_type_t type) override; - - // Returns -1 if this isn't a function of if the function doesn't have a prototype - // Returns a value >= 0 if there is a prototype. - int - GetFunctionArgumentCount (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetFunctionArgumentTypeAtIndex (lldb::opaque_compiler_type_t type, size_t idx) override; - - CompilerType - GetFunctionReturnType (lldb::opaque_compiler_type_t type) override; - - size_t - GetNumMemberFunctions (lldb::opaque_compiler_type_t type) override; - - TypeMemberFunctionImpl - GetMemberFunctionAtIndex (lldb::opaque_compiler_type_t type, size_t idx) override; - - CompilerType - GetNonReferenceType (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetPointeeType (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetPointerType (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetLValueReferenceType (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetRValueReferenceType (lldb::opaque_compiler_type_t type) override; - - CompilerType - AddConstModifier (lldb::opaque_compiler_type_t type) override; - - CompilerType - AddVolatileModifier (lldb::opaque_compiler_type_t type) override; - - CompilerType - AddRestrictModifier (lldb::opaque_compiler_type_t type) override; - - CompilerType - CreateTypedef (lldb::opaque_compiler_type_t type, const char *name, const CompilerDeclContext &decl_ctx) override; - - // If the current object represents a typedef type, get the underlying type - CompilerType - GetTypedefedType (lldb::opaque_compiler_type_t type) override; - - //---------------------------------------------------------------------- - // Create related types using the current type's AST - //---------------------------------------------------------------------- - CompilerType - GetBasicTypeFromAST (lldb::BasicType basic_type) override; - - //---------------------------------------------------------------------- - // Exploring the type - //---------------------------------------------------------------------- - - uint64_t - GetByteSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) - { - return (GetBitSize (type, exe_scope) + 7) / 8; - } - - uint64_t - GetBitSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override; - - lldb::Encoding - GetEncoding (lldb::opaque_compiler_type_t type, uint64_t &count) override; - - lldb::Format - GetFormat (lldb::opaque_compiler_type_t type) override; - - size_t - GetTypeBitAlign (lldb::opaque_compiler_type_t type) override; - - uint32_t - GetNumChildren (lldb::opaque_compiler_type_t type, bool omit_empty_base_classes) override; - - CompilerType - GetBuiltinTypeByName (const ConstString &name) override; - - lldb::BasicType - GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type) override; - - static lldb::BasicType - GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type, const ConstString &name); - - void - ForEachEnumerator (lldb::opaque_compiler_type_t type, std::function <bool (const CompilerType &integer_type, const ConstString &name, const llvm::APSInt &value)> const &callback) override; - - uint32_t - GetNumFields (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetFieldAtIndex (lldb::opaque_compiler_type_t type, - size_t idx, - std::string& name, - uint64_t *bit_offset_ptr, - uint32_t *bitfield_bit_size_ptr, - bool *is_bitfield_ptr) override; - - uint32_t - GetNumDirectBaseClasses (lldb::opaque_compiler_type_t type) override; - - uint32_t - GetNumVirtualBaseClasses (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetDirectBaseClassAtIndex (lldb::opaque_compiler_type_t type, - size_t idx, - uint32_t *bit_offset_ptr) override; - - CompilerType - GetVirtualBaseClassAtIndex (lldb::opaque_compiler_type_t type, - size_t idx, - uint32_t *bit_offset_ptr) override; - - static uint32_t - GetNumPointeeChildren (clang::QualType type); - - CompilerType - GetChildCompilerTypeAtIndex (lldb::opaque_compiler_type_t type, - ExecutionContext *exe_ctx, - size_t idx, - bool transparent_pointers, - bool omit_empty_base_classes, - bool ignore_array_bounds, - std::string& child_name, - uint32_t &child_byte_size, - int32_t &child_byte_offset, - uint32_t &child_bitfield_bit_size, - uint32_t &child_bitfield_bit_offset, - bool &child_is_base_class, - bool &child_is_deref_of_parent, - ValueObject *valobj, - uint64_t &language_flags) override; - - // Lookup a child given a name. This function will match base class names - // and member member names in "clang_type" only, not descendants. - uint32_t - GetIndexOfChildWithName (lldb::opaque_compiler_type_t type, + 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); + + CompilerType + 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( + bool is_method, clang::OverloadedOperatorKind 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); + + CompilerType CreateObjCClass(const char *name, clang::DeclContext *decl_ctx, + bool isForwardDecl, bool isInternal, + ClangASTMetadata *metadata = nullptr); + + bool SetTagTypeKind(clang::QualType type, int kind) const; + + bool SetDefaultAccessForRecordFields(clang::RecordDecl *record_decl, + int default_accessibility, + int *assigned_accessibilities, + size_t num_assigned_accessibilities); + + // Returns a mask containing bits from the ClangASTContext::eTypeXXX + // enumerations + + //------------------------------------------------------------------ + // Namespace Declarations + //------------------------------------------------------------------ + + clang::NamespaceDecl * + GetUniqueNamespaceDeclaration(const char *name, clang::DeclContext *decl_ctx); + + static clang::NamespaceDecl * + GetUniqueNamespaceDeclaration(clang::ASTContext *ast, const char *name, + clang::DeclContext *decl_ctx); + + //------------------------------------------------------------------ + // Function Types + //------------------------------------------------------------------ + + clang::FunctionDecl * + CreateFunctionDeclaration(clang::DeclContext *decl_ctx, const char *name, + const CompilerType &function_Type, int storage, + bool is_inline); + + static CompilerType CreateFunctionType(clang::ASTContext *ast, + const CompilerType &result_type, + const CompilerType *args, + unsigned num_args, bool is_variadic, + unsigned type_quals); + + CompilerType CreateFunctionType(const CompilerType &result_type, + const CompilerType *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 CompilerType ¶m_type, + int storage); + + void SetFunctionParameters(clang::FunctionDecl *function_decl, + clang::ParmVarDecl **params, unsigned num_params); + + CompilerType CreateBlockPointerType(const CompilerType &function_type); + + //------------------------------------------------------------------ + // Array Types + //------------------------------------------------------------------ + + CompilerType CreateArrayType(const CompilerType &element_type, + size_t element_count, bool is_vector); + + //------------------------------------------------------------------ + // Enumeration Types + //------------------------------------------------------------------ + CompilerType CreateEnumerationType(const char *name, + clang::DeclContext *decl_ctx, + const Declaration &decl, + const CompilerType &integer_qual_type); + + //------------------------------------------------------------------ + // Integer type functions + //------------------------------------------------------------------ + + static CompilerType GetIntTypeFromBitSize(clang::ASTContext *ast, + size_t bit_size, bool is_signed); + + CompilerType GetPointerSizedIntType(bool is_signed) { + return GetPointerSizedIntType(getASTContext(), is_signed); + } + + static CompilerType GetPointerSizedIntType(clang::ASTContext *ast, + bool is_signed); + + //------------------------------------------------------------------ + // Floating point functions + //------------------------------------------------------------------ + + static CompilerType GetFloatTypeFromBitSize(clang::ASTContext *ast, + size_t bit_size); + + //------------------------------------------------------------------ + // TypeSystem methods + //------------------------------------------------------------------ + DWARFASTParser *GetDWARFParser() override; + PDBASTParser *GetPDBParser(); + + //------------------------------------------------------------------ + // ClangASTContext callbacks for external source lookups. + //------------------------------------------------------------------ + static void CompleteTagDecl(void *baton, clang::TagDecl *); + + static void CompleteObjCInterfaceDecl(void *baton, + clang::ObjCInterfaceDecl *); + + static bool LayoutRecordType( + void *baton, const clang::RecordDecl *record_decl, uint64_t &size, + uint64_t &alignment, + llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, + llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> + &base_offsets, + llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> + &vbase_offsets); + + //---------------------------------------------------------------------- + // CompilerDecl override functions + //---------------------------------------------------------------------- + ConstString DeclGetName(void *opaque_decl) override; + + ConstString DeclGetMangledName(void *opaque_decl) override; + + CompilerDeclContext DeclGetDeclContext(void *opaque_decl) override; + + CompilerType DeclGetFunctionReturnType(void *opaque_decl) override; + + size_t DeclGetFunctionNumArguments(void *opaque_decl) override; + + CompilerType DeclGetFunctionArgumentType(void *opaque_decl, + size_t arg_idx) override; + + //---------------------------------------------------------------------- + // CompilerDeclContext override functions + //---------------------------------------------------------------------- + + std::vector<CompilerDecl> + DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name, + const bool ignore_using_decls) override; + + bool DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) override; + + ConstString DeclContextGetName(void *opaque_decl_ctx) override; + + ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override; + + bool DeclContextIsClassMethod(void *opaque_decl_ctx, + lldb::LanguageType *language_ptr, + bool *is_instance_method_ptr, + ConstString *language_object_name_ptr) override; + + //---------------------------------------------------------------------- + // Clang specific clang::DeclContext functions + //---------------------------------------------------------------------- + + static clang::DeclContext * + DeclContextGetAsDeclContext(const CompilerDeclContext &dc); + + static clang::ObjCMethodDecl * + DeclContextGetAsObjCMethodDecl(const CompilerDeclContext &dc); + + static clang::CXXMethodDecl * + DeclContextGetAsCXXMethodDecl(const CompilerDeclContext &dc); + + static clang::FunctionDecl * + DeclContextGetAsFunctionDecl(const CompilerDeclContext &dc); + + static clang::NamespaceDecl * + DeclContextGetAsNamespaceDecl(const CompilerDeclContext &dc); + + static ClangASTMetadata *DeclContextGetMetaData(const CompilerDeclContext &dc, + const void *object); + + static clang::ASTContext * + DeclContextGetClangASTContext(const CompilerDeclContext &dc); + + //---------------------------------------------------------------------- + // Tests + //---------------------------------------------------------------------- + + bool IsArrayType(lldb::opaque_compiler_type_t type, + CompilerType *element_type, uint64_t *size, + bool *is_incomplete) override; + + bool IsVectorType(lldb::opaque_compiler_type_t type, + CompilerType *element_type, uint64_t *size) override; + + bool IsAggregateType(lldb::opaque_compiler_type_t type) override; + + bool IsAnonymousType(lldb::opaque_compiler_type_t type) override; + + bool IsBeingDefined(lldb::opaque_compiler_type_t type) override; + + bool IsCharType(lldb::opaque_compiler_type_t type) override; + + bool IsCompleteType(lldb::opaque_compiler_type_t type) override; + + bool IsConst(lldb::opaque_compiler_type_t type) override; + + bool IsCStringType(lldb::opaque_compiler_type_t type, + uint32_t &length) override; + + static bool IsCXXClassType(const CompilerType &type); + + bool IsDefined(lldb::opaque_compiler_type_t type) override; + + bool IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, + bool &is_complex) override; + + bool IsFunctionType(lldb::opaque_compiler_type_t type, + bool *is_variadic_ptr) override; + + uint32_t IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, + CompilerType *base_type_ptr) override; + + size_t + GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override; + + CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, + const size_t index) override; + + bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override; + + bool IsBlockPointerType(lldb::opaque_compiler_type_t type, + CompilerType *function_pointer_type_ptr) override; + + bool IsIntegerType(lldb::opaque_compiler_type_t type, + bool &is_signed) override; + + bool IsEnumerationType(lldb::opaque_compiler_type_t type, + bool &is_signed) override; + + static bool IsObjCClassType(const CompilerType &type); + + static bool IsObjCClassTypeAndHasIVars(const CompilerType &type, + bool check_superclass); + + static bool IsObjCObjectOrInterfaceType(const CompilerType &type); + + static bool IsObjCObjectPointerType(const CompilerType &type, + CompilerType *target_type = nullptr); + + bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override; + + static bool IsClassType(lldb::opaque_compiler_type_t type); + + static bool IsEnumType(lldb::opaque_compiler_type_t type); + + bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type, + CompilerType *target_type, // Can pass nullptr + bool check_cplusplus, bool check_objc) override; + + bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override; + + bool IsPointerType(lldb::opaque_compiler_type_t type, + CompilerType *pointee_type) override; + + bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, + CompilerType *pointee_type) override; + + bool IsReferenceType(lldb::opaque_compiler_type_t type, + CompilerType *pointee_type, bool *is_rvalue) override; + + bool IsScalarType(lldb::opaque_compiler_type_t type) override; + + bool IsTypedefType(lldb::opaque_compiler_type_t type) override; + + bool IsVoidType(lldb::opaque_compiler_type_t type) override; + + bool SupportsLanguage(lldb::LanguageType language) override; + + static bool GetCXXClassName(const CompilerType &type, + std::string &class_name); + + static bool GetObjCClassName(const CompilerType &type, + std::string &class_name); + + //---------------------------------------------------------------------- + // Type Completion + //---------------------------------------------------------------------- + + bool GetCompleteType(lldb::opaque_compiler_type_t type) override; + + //---------------------------------------------------------------------- + // Accessors + //---------------------------------------------------------------------- + + ConstString GetTypeName(lldb::opaque_compiler_type_t type) override; + + uint32_t GetTypeInfo(lldb::opaque_compiler_type_t type, + CompilerType *pointee_or_element_compiler_type) override; + + lldb::LanguageType + GetMinimumLanguage(lldb::opaque_compiler_type_t type) override; + + lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override; + + unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override; + + //---------------------------------------------------------------------- + // Creating related types + //---------------------------------------------------------------------- + + // Using the current type, create a new typedef to that type using + // "typedef_name" + // as the name and "decl_ctx" as the decl context. + static CompilerType + CreateTypedefType(const CompilerType &type, const char *typedef_name, + const CompilerDeclContext &compiler_decl_ctx); + + CompilerType GetArrayElementType(lldb::opaque_compiler_type_t type, + uint64_t *stride) override; + + CompilerType GetArrayType(lldb::opaque_compiler_type_t type, + uint64_t size) override; + + CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override; + + CompilerType + GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override; + + // Returns -1 if this isn't a function of if the function doesn't have a + // prototype + // Returns a value >= 0 if there is a prototype. + int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override; + + CompilerType GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, + size_t idx) override; + + CompilerType + GetFunctionReturnType(lldb::opaque_compiler_type_t type) override; + + size_t GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override; + + TypeMemberFunctionImpl + GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, + size_t idx) override; + + CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override; + + CompilerType GetPointeeType(lldb::opaque_compiler_type_t type) override; + + CompilerType GetPointerType(lldb::opaque_compiler_type_t type) override; + + CompilerType + GetLValueReferenceType(lldb::opaque_compiler_type_t type) override; + + CompilerType + GetRValueReferenceType(lldb::opaque_compiler_type_t type) override; + + CompilerType AddConstModifier(lldb::opaque_compiler_type_t type) override; + + CompilerType AddVolatileModifier(lldb::opaque_compiler_type_t type) override; + + CompilerType AddRestrictModifier(lldb::opaque_compiler_type_t type) override; + + CompilerType CreateTypedef(lldb::opaque_compiler_type_t type, const char *name, - bool omit_empty_base_classes) override; - - // Lookup a child member given a name. This function will match member names - // only and will descend into "clang_type" children in search for the first - // member in this class, or any base class that matches "name". - // TODO: Return all matches for a given name by returning a vector<vector<uint32_t>> - // so we catch all names that match a given child name, not just the first. - size_t - GetIndexOfChildMemberWithName (lldb::opaque_compiler_type_t type, + const CompilerDeclContext &decl_ctx) override; + + // If the current object represents a typedef type, get the underlying type + CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override; + + //---------------------------------------------------------------------- + // Create related types using the current type's AST + //---------------------------------------------------------------------- + CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override; + + //---------------------------------------------------------------------- + // Exploring the type + //---------------------------------------------------------------------- + + uint64_t GetByteSize(lldb::opaque_compiler_type_t type, + ExecutionContextScope *exe_scope) { + return (GetBitSize(type, exe_scope) + 7) / 8; + } + + uint64_t GetBitSize(lldb::opaque_compiler_type_t type, + ExecutionContextScope *exe_scope) override; + + lldb::Encoding GetEncoding(lldb::opaque_compiler_type_t type, + uint64_t &count) override; + + lldb::Format GetFormat(lldb::opaque_compiler_type_t type) override; + + size_t GetTypeBitAlign(lldb::opaque_compiler_type_t type) override; + + uint32_t GetNumChildren(lldb::opaque_compiler_type_t type, + bool omit_empty_base_classes) override; + + CompilerType GetBuiltinTypeByName(const ConstString &name) override; + + lldb::BasicType + GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override; + + static lldb::BasicType + GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type, + const ConstString &name); + + void ForEachEnumerator( + lldb::opaque_compiler_type_t type, + std::function<bool(const CompilerType &integer_type, + const ConstString &name, + const llvm::APSInt &value)> const &callback) override; + + uint32_t GetNumFields(lldb::opaque_compiler_type_t type) override; + + CompilerType GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx, + std::string &name, uint64_t *bit_offset_ptr, + uint32_t *bitfield_bit_size_ptr, + bool *is_bitfield_ptr) override; + + uint32_t GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override; + + uint32_t GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override; + + CompilerType GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, + size_t idx, + uint32_t *bit_offset_ptr) override; + + CompilerType GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, + size_t idx, + uint32_t *bit_offset_ptr) override; + + static uint32_t GetNumPointeeChildren(clang::QualType type); + + CompilerType GetChildCompilerTypeAtIndex( + lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx, + bool transparent_pointers, bool omit_empty_base_classes, + bool ignore_array_bounds, std::string &child_name, + uint32_t &child_byte_size, int32_t &child_byte_offset, + uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, + bool &child_is_base_class, bool &child_is_deref_of_parent, + ValueObject *valobj, uint64_t &language_flags) override; + + // Lookup a child given a name. This function will match base class names + // and member member names in "clang_type" only, not descendants. + uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, const char *name, - bool omit_empty_base_classes, - std::vector<uint32_t>& child_indexes) override; - - size_t - GetNumTemplateArguments (lldb::opaque_compiler_type_t type) override; - - CompilerType - GetTemplateArgument (lldb::opaque_compiler_type_t type, - size_t idx, - lldb::TemplateArgumentKind &kind) override; - - CompilerType - GetTypeForFormatters (void* type) override; - -#define LLDB_INVALID_DECL_LEVEL UINT32_MAX - // LLDB_INVALID_DECL_LEVEL is returned by CountDeclLevels if - // child_decl_ctx could not be found in decl_ctx. - uint32_t - CountDeclLevels (clang::DeclContext *frame_decl_ctx, - clang::DeclContext *child_decl_ctx, - ConstString *child_name = nullptr, - CompilerType *child_type = nullptr); - - //---------------------------------------------------------------------- - // Modifying RecordType - //---------------------------------------------------------------------- - static clang::FieldDecl * - AddFieldToRecordType (const CompilerType& type, - const char *name, - const CompilerType &field_type, - lldb::AccessType access, - uint32_t bitfield_bit_size); - - static void - BuildIndirectFields (const CompilerType& type); - - static void - SetIsPacked (const CompilerType& type); - - static clang::VarDecl * - AddVariableToRecordType (const CompilerType& type, - const char *name, - const CompilerType &var_type, - lldb::AccessType access); - - clang::CXXMethodDecl * - AddMethodToCXXRecordType (lldb::opaque_compiler_type_t type, - const char *name, - const CompilerType &method_type, - lldb::AccessType access, - bool is_virtual, - bool is_static, - bool is_inline, - bool is_explicit, - bool is_attr_used, - bool is_artificial); - - // C++ Base Classes - clang::CXXBaseSpecifier * - CreateBaseClassSpecifier (lldb::opaque_compiler_type_t type, - lldb::AccessType access, - bool is_virtual, - bool base_of_class); - - static void - DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, - unsigned num_base_classes); - - bool - SetBaseClassesForClassType (lldb::opaque_compiler_type_t type, - clang::CXXBaseSpecifier const * const *base_classes, - unsigned num_base_classes); - - static bool - SetObjCSuperClass (const CompilerType& type, - const CompilerType &superclass_compiler_type); - - static bool - AddObjCClassProperty (const CompilerType& type, - const char *property_name, - const CompilerType &property_compiler_type, - clang::ObjCIvarDecl *ivar_decl, - const char *property_setter_name, - const char *property_getter_name, - uint32_t property_attributes, - ClangASTMetadata *metadata); - - static clang::ObjCMethodDecl * - AddMethodToObjCObjectType (const CompilerType& type, - const char *name, // the full symbol name as seen in the symbol table (lldb::opaque_compiler_type_t type, "-[NString stringWithCString:]") - const CompilerType &method_compiler_type, - lldb::AccessType access, - bool is_artificial, - bool is_variadic); - - static bool - SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern); - - static bool - GetHasExternalStorage (const CompilerType &type); - //------------------------------------------------------------------ - // Tag Declarations - //------------------------------------------------------------------ - static bool - StartTagDeclarationDefinition (const CompilerType &type); - - static bool - CompleteTagDeclarationDefinition (const CompilerType &type); - - //---------------------------------------------------------------------- - // Modifying Enumeration types - //---------------------------------------------------------------------- - bool - AddEnumerationValueToEnumerationType (lldb::opaque_compiler_type_t type, - const CompilerType &enumerator_qual_type, - const Declaration &decl, - const char *name, - int64_t enum_value, - uint32_t enum_value_bit_size); - - CompilerType - GetEnumerationIntegerType (lldb::opaque_compiler_type_t type); - - //------------------------------------------------------------------ - // Pointers & References - //------------------------------------------------------------------ - - // Call this function using the class type when you want to make a - // member pointer type to pointee_type. - static CompilerType - CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type); - - // Converts "s" to a floating point value and place resulting floating - // point bytes in the "dst" buffer. - size_t - ConvertStringToFloatValue (lldb::opaque_compiler_type_t type, - const char *s, - uint8_t *dst, - size_t dst_size) override; - - //---------------------------------------------------------------------- - // Dumping types - //---------------------------------------------------------------------- - void - DumpValue (lldb::opaque_compiler_type_t type, - ExecutionContext *exe_ctx, - Stream *s, - lldb::Format format, - const DataExtractor &data, - lldb::offset_t data_offset, - size_t data_byte_size, - uint32_t bitfield_bit_size, - uint32_t bitfield_bit_offset, - bool show_types, - bool show_summary, - bool verbose, - uint32_t depth) override; - - bool - DumpTypeValue (lldb::opaque_compiler_type_t type, - Stream *s, - lldb::Format format, - const DataExtractor &data, - lldb::offset_t data_offset, - size_t data_byte_size, - uint32_t bitfield_bit_size, - uint32_t bitfield_bit_offset, - ExecutionContextScope *exe_scope) override; - - void - DumpSummary (lldb::opaque_compiler_type_t type, - ExecutionContext *exe_ctx, - Stream *s, - const DataExtractor &data, - lldb::offset_t data_offset, - size_t data_byte_size) override; - - void - DumpTypeDescription (lldb::opaque_compiler_type_t type) override; // Dump to stdout - - void - DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s) override; - - static void - DumpTypeName (const CompilerType &type); - - static clang::EnumDecl * - GetAsEnumDecl (const CompilerType& type); - - static clang::RecordDecl * - GetAsRecordDecl (const CompilerType& type); - - static clang::TagDecl * - GetAsTagDecl (const CompilerType& type); - - clang::CXXRecordDecl * - GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type); - - static clang::ObjCInterfaceDecl * - GetAsObjCInterfaceDecl (const CompilerType& type); - - clang::ClassTemplateDecl * - ParseClassTemplateDecl (clang::DeclContext *decl_ctx, - lldb::AccessType access_type, - const char *parent_name, - int tag_decl_kind, - const ClangASTContext::TemplateParameterInfos &template_param_infos); - - clang::BlockDecl * - CreateBlockDeclaration (clang::DeclContext *ctx); - - clang::UsingDirectiveDecl * - CreateUsingDirectiveDeclaration (clang::DeclContext *decl_ctx, clang::NamespaceDecl *ns_decl); - - clang::UsingDecl * - CreateUsingDeclaration (clang::DeclContext *current_decl_ctx, clang::NamedDecl *target); - - clang::VarDecl * - CreateVariableDeclaration (clang::DeclContext *decl_context, const char *name, clang::QualType type); - - static lldb::opaque_compiler_type_t - GetOpaqueCompilerType(clang::ASTContext *ast, lldb::BasicType basic_type); - - static clang::QualType - GetQualType(lldb::opaque_compiler_type_t type) - { - if (type) - return clang::QualType::getFromOpaquePtr(type); - return clang::QualType(); - } + bool omit_empty_base_classes) override; + + // Lookup a child member given a name. This function will match member names + // only and will descend into "clang_type" children in search for the first + // member in this class, or any base class that matches "name". + // TODO: Return all matches for a given name by returning a + // vector<vector<uint32_t>> + // so we catch all names that match a given child name, not just the first. + size_t + GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, + const char *name, bool omit_empty_base_classes, + std::vector<uint32_t> &child_indexes) override; + + size_t GetNumTemplateArguments(lldb::opaque_compiler_type_t type) override; + + CompilerType GetTemplateArgument(lldb::opaque_compiler_type_t type, + size_t idx, + lldb::TemplateArgumentKind &kind) override; + + CompilerType GetTypeForFormatters(void *type) override; + +#define LLDB_INVALID_DECL_LEVEL UINT32_MAX + // LLDB_INVALID_DECL_LEVEL is returned by CountDeclLevels if + // child_decl_ctx could not be found in decl_ctx. + uint32_t CountDeclLevels(clang::DeclContext *frame_decl_ctx, + clang::DeclContext *child_decl_ctx, + ConstString *child_name = nullptr, + CompilerType *child_type = nullptr); + + //---------------------------------------------------------------------- + // Modifying RecordType + //---------------------------------------------------------------------- + static clang::FieldDecl *AddFieldToRecordType(const CompilerType &type, + const char *name, + const CompilerType &field_type, + lldb::AccessType access, + uint32_t bitfield_bit_size); + + static void BuildIndirectFields(const CompilerType &type); + + static void SetIsPacked(const CompilerType &type); + + static clang::VarDecl *AddVariableToRecordType(const CompilerType &type, + const char *name, + const CompilerType &var_type, + lldb::AccessType access); + + clang::CXXMethodDecl * + AddMethodToCXXRecordType(lldb::opaque_compiler_type_t type, const char *name, + const CompilerType &method_type, + lldb::AccessType access, bool is_virtual, + bool is_static, bool is_inline, bool is_explicit, + bool is_attr_used, bool is_artificial); + + // C++ Base Classes + clang::CXXBaseSpecifier * + CreateBaseClassSpecifier(lldb::opaque_compiler_type_t type, + lldb::AccessType access, bool is_virtual, + bool base_of_class); + + static void DeleteBaseClassSpecifiers(clang::CXXBaseSpecifier **base_classes, + unsigned num_base_classes); + + bool + SetBaseClassesForClassType(lldb::opaque_compiler_type_t type, + clang::CXXBaseSpecifier const *const *base_classes, + unsigned num_base_classes); + + static bool SetObjCSuperClass(const CompilerType &type, + const CompilerType &superclass_compiler_type); + + static bool AddObjCClassProperty(const CompilerType &type, + const char *property_name, + const CompilerType &property_compiler_type, + clang::ObjCIvarDecl *ivar_decl, + const char *property_setter_name, + const char *property_getter_name, + uint32_t property_attributes, + ClangASTMetadata *metadata); + + static clang::ObjCMethodDecl *AddMethodToObjCObjectType( + const CompilerType &type, + const char *name, // the full symbol name as seen in the symbol table + // (lldb::opaque_compiler_type_t type, "-[NString + // stringWithCString:]") + const CompilerType &method_compiler_type, lldb::AccessType access, + bool is_artificial, bool is_variadic); + + static bool SetHasExternalStorage(lldb::opaque_compiler_type_t type, + bool has_extern); + + static bool GetHasExternalStorage(const CompilerType &type); + //------------------------------------------------------------------ + // Tag Declarations + //------------------------------------------------------------------ + static bool StartTagDeclarationDefinition(const CompilerType &type); + + static bool CompleteTagDeclarationDefinition(const CompilerType &type); + + //---------------------------------------------------------------------- + // Modifying Enumeration types + //---------------------------------------------------------------------- + bool AddEnumerationValueToEnumerationType( + lldb::opaque_compiler_type_t type, + const CompilerType &enumerator_qual_type, const Declaration &decl, + const char *name, int64_t enum_value, uint32_t enum_value_bit_size); + + CompilerType GetEnumerationIntegerType(lldb::opaque_compiler_type_t type); + + //------------------------------------------------------------------ + // Pointers & References + //------------------------------------------------------------------ + + // Call this function using the class type when you want to make a + // member pointer type to pointee_type. + static CompilerType CreateMemberPointerType(const CompilerType &type, + const CompilerType &pointee_type); + + // Converts "s" to a floating point value and place resulting floating + // point bytes in the "dst" buffer. + size_t ConvertStringToFloatValue(lldb::opaque_compiler_type_t type, + const char *s, uint8_t *dst, + size_t dst_size) override; + + //---------------------------------------------------------------------- + // Dumping types + //---------------------------------------------------------------------- + void DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, + Stream *s, lldb::Format format, const DataExtractor &data, + lldb::offset_t data_offset, size_t data_byte_size, + uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, + bool show_types, bool show_summary, bool verbose, + uint32_t depth) override; + + bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s, + lldb::Format format, const DataExtractor &data, + lldb::offset_t data_offset, size_t data_byte_size, + uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, + ExecutionContextScope *exe_scope) override; + + void DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, + Stream *s, const DataExtractor &data, + lldb::offset_t data_offset, size_t data_byte_size) override; + + void DumpTypeDescription( + lldb::opaque_compiler_type_t type) override; // Dump to stdout + + void DumpTypeDescription(lldb::opaque_compiler_type_t type, + Stream *s) override; + + static void DumpTypeName(const CompilerType &type); + + static clang::EnumDecl *GetAsEnumDecl(const CompilerType &type); + + static clang::RecordDecl *GetAsRecordDecl(const CompilerType &type); + + static clang::TagDecl *GetAsTagDecl(const CompilerType &type); + + clang::CXXRecordDecl *GetAsCXXRecordDecl(lldb::opaque_compiler_type_t type); + + static clang::ObjCInterfaceDecl * + GetAsObjCInterfaceDecl(const CompilerType &type); + + clang::ClassTemplateDecl *ParseClassTemplateDecl( + clang::DeclContext *decl_ctx, lldb::AccessType access_type, + const char *parent_name, int tag_decl_kind, + const ClangASTContext::TemplateParameterInfos &template_param_infos); + + clang::BlockDecl *CreateBlockDeclaration(clang::DeclContext *ctx); + + clang::UsingDirectiveDecl * + CreateUsingDirectiveDeclaration(clang::DeclContext *decl_ctx, + clang::NamespaceDecl *ns_decl); + + clang::UsingDecl *CreateUsingDeclaration(clang::DeclContext *current_decl_ctx, + clang::NamedDecl *target); + + clang::VarDecl *CreateVariableDeclaration(clang::DeclContext *decl_context, + const char *name, + clang::QualType type); + + static lldb::opaque_compiler_type_t + GetOpaqueCompilerType(clang::ASTContext *ast, lldb::BasicType basic_type); - static clang::QualType - GetCanonicalQualType(lldb::opaque_compiler_type_t type) - { - if (type) - return clang::QualType::getFromOpaquePtr(type).getCanonicalType(); - return clang::QualType(); - } + static clang::QualType GetQualType(lldb::opaque_compiler_type_t type) { + if (type) + return clang::QualType::getFromOpaquePtr(type); + return clang::QualType(); + } + + static clang::QualType + GetCanonicalQualType(lldb::opaque_compiler_type_t type) { + if (type) + return clang::QualType::getFromOpaquePtr(type).getCanonicalType(); + return clang::QualType(); + } + + clang::DeclarationName + GetDeclarationName(const char *name, const CompilerType &function_clang_type); protected: - //------------------------------------------------------------------ - // Classes that inherit from ClangASTContext can see and modify these - //------------------------------------------------------------------ - // clang-format off + //------------------------------------------------------------------ + // Classes that inherit from ClangASTContext can see and modify these + //------------------------------------------------------------------ + // clang-format off std::string m_target_triple; std::unique_ptr<clang::ASTContext> m_ast_ap; std::unique_ptr<clang::LangOptions> m_language_options_ap; @@ -1216,43 +994,46 @@ protected: uint32_t m_pointer_byte_size; bool m_ast_owned; bool m_can_evaluate_expressions; - // clang-format on + // clang-format on private: - //------------------------------------------------------------------ - // For ClangASTContext only - //------------------------------------------------------------------ - ClangASTContext(const ClangASTContext&); - const ClangASTContext& operator=(const ClangASTContext&); + //------------------------------------------------------------------ + // For ClangASTContext only + //------------------------------------------------------------------ + ClangASTContext(const ClangASTContext &); + const ClangASTContext &operator=(const ClangASTContext &); }; -class ClangASTContextForExpressions : public ClangASTContext -{ +class ClangASTContextForExpressions : public ClangASTContext { public: - ClangASTContextForExpressions (Target &target); - - ~ClangASTContextForExpressions() override = default; - - UserExpression * - GetUserExpression (const char *expr, - const char *expr_prefix, - lldb::LanguageType language, - Expression::ResultType desired_type, - const EvaluateExpressionOptions &options) override; - - FunctionCaller * - GetFunctionCaller (const CompilerType &return_type, - const Address& function_address, - const ValueList &arg_value_list, - const char *name) override; - - UtilityFunction * - GetUtilityFunction(const char *text, const char *name) override; - - PersistentExpressionState * - GetPersistentExpressionState() override; + ClangASTContextForExpressions(Target &target); + + ~ClangASTContextForExpressions() override = default; + + UserExpression * + GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix, + lldb::LanguageType language, + Expression::ResultType desired_type, + const EvaluateExpressionOptions &options) override; + + FunctionCaller *GetFunctionCaller(const CompilerType &return_type, + const Address &function_address, + const ValueList &arg_value_list, + const char *name) override; + + UtilityFunction *GetUtilityFunction(const char *text, + const char *name) override; + + PersistentExpressionState *GetPersistentExpressionState() override; + private: - lldb::TargetWP m_target_wp; - lldb::ClangPersistentVariablesUP m_persistent_variables; ///< These are the persistent variables associated with this process for the expression parser. + lldb::TargetWP m_target_wp; + lldb::ClangPersistentVariablesUP m_persistent_variables; ///< These are the + ///persistent + ///variables + ///associated with + ///this process for + ///the expression + ///parser. }; } // namespace lldb_private |