diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index 4503d4754177..8c4540c2ce1c 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -182,6 +182,24 @@ public: bitfield_bit_size); } + static bool + AddMethodToCXXRecordType (clang::ASTContext *ast_context, + void *record_clang_type, + const char *name, + void *method_type); + + bool + AddMethodToCXXRecordType (void *record_clang_type, + const char *name, + void *method_type) + + { + return ClangASTContext::AddMethodToCXXRecordType(getASTContext(), + record_clang_type, + name, + method_type); + } + bool FieldIsBitfield (clang::FieldDecl* field, uint32_t& bitfield_bit_size); diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 7a868ecd9b08..39cfbccfe650 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -803,6 +803,57 @@ ClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl return ast_context->getTagDeclType(decl).getAsOpaquePtr(); } +bool +ClangASTContext::AddMethodToCXXRecordType +( + clang::ASTContext *ast_context, + void *record_clang_type, + const char *name, + void *method_type + ) +{ + if (!record_clang_type || !method_type || !name) + return false; + + assert(ast_context); + + IdentifierTable *identifier_table = &ast_context->Idents; + + assert(identifier_table); + + QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); + clang::Type *record_type(record_qual_type.getTypePtr()); + + if (!record_type) + return false; + + RecordType *record_recty(dyn_cast(record_type)); + + if (!record_recty) + return false; + + RecordDecl *record_decl = record_recty->getDecl(); + + if (!record_decl) + return false; + + CXXRecordDecl *cxx_record_decl = dyn_cast(record_decl); + + if (!cxx_record_decl) + return false; + + CXXMethodDecl *cxx_method_decl = CXXMethodDecl::Create(*ast_context, + cxx_record_decl, + SourceLocation(), + DeclarationName(&identifier_table->get(name)), + QualType::getFromOpaquePtr(method_type), + NULL); + + cxx_record_decl->addDecl(cxx_method_decl); + + return true; +} + bool ClangASTContext::AddFieldToRecordType (