diff options
| -rw-r--r-- | lldb/include/lldb/Expression/ASTDumper.h | 160 | ||||
| -rw-r--r-- | lldb/include/lldb/Expression/ClangExpressionDeclMap.h | 2 | ||||
| -rw-r--r-- | lldb/source/Expression/ASTDumper.cpp | 542 | ||||
| -rw-r--r-- | lldb/source/Expression/ClangExpressionDeclMap.cpp | 90 |
4 files changed, 101 insertions, 693 deletions
diff --git a/lldb/include/lldb/Expression/ASTDumper.h b/lldb/include/lldb/Expression/ASTDumper.h index 0aecfab6555..e8a69a860e4 100644 --- a/lldb/include/lldb/Expression/ASTDumper.h +++ b/lldb/include/lldb/Expression/ASTDumper.h @@ -16,156 +16,22 @@ namespace lldb_private { - -//---------------------------------------------------------------------- -/// @class ASTDumper ASTDumper.h "lldb/Expression/ASTDumper.h" -/// @brief Encapsulates a recursive dumper for Clang AST nodes. -/// -/// ASTDumper contains a variety of methods for printing fields of Clang -/// AST structures, for debugging purposes. It prints the AST objects -/// hierarchically: -/// -/// --- -/// class : InheritedClass -/// someAccessor() : result -/// accessorReturningObject() : -/// class : ChildClass [object returned by accessorReturningObject] -/// ... -/// class : BaseClass [same object as InheritedClass] -/// baseAccessor() : result -/// -/// The output format is YAML. -//---------------------------------------------------------------------- -class ASTDumper : - public clang::DeclVisitor <ASTDumper, void>, - public clang::StmtVisitor <ASTDumper, void>, - public clang::TypeVisitor <ASTDumper, void> -{ -private: - ASTDumper (Stream &stream) : - m_stream(stream), - m_base_indentation(stream.GetIndentLevel()), - m_max_indentation(10) - { - } - - // MARK: Utility functions - - bool KeepDumping () - { - return (m_stream.GetIndentLevel() - m_base_indentation <= m_max_indentation); - } - - void PushIndent() - { - m_stream.IndentMore(1); - } - - void PopIndent() - { - m_stream.IndentLess(1); - } - - bool Visiting (const void *entity) - { - return m_visited_entities.count(entity); - } - - void WillVisit (const void *entity) - { - m_visited_entities.insert(entity); - } - - void DidVisit (const void *entity) - { - m_visited_entities.erase(entity); - } +class ASTDumper +{ public: - // MARK: DeclVisitor - - void VisitDecl (clang::Decl *decl); - void VisitTranslationUnitDecl (clang::TranslationUnitDecl *translation_unit_decl); - void VisitNamedDecl (clang::NamedDecl *named_decl); - void VisitNamespaceDecl (clang::NamespaceDecl *namespace_decl); - void VisitValueDecl (clang::ValueDecl *value_decl); - void VisitDeclaratorDecl (clang::DeclaratorDecl *declarator_decl); - void VisitVarDecl (clang::VarDecl *var_decl); - void VisitTypeDecl (clang::TypeDecl *type_decl); - void VisitTagDecl (clang::TagDecl *tag_decl); - void VisitRecordDecl (clang::RecordDecl *record_decl); - void VisitCXXRecordDecl (clang::CXXRecordDecl *cxx_record_decl); - - // MARK: StmtVisitor - - // MARK: TypeVisitor - - void VisitType (const clang::Type *type); - void VisitReferenceType (const clang::ReferenceType *reference_type); - void VisitLValueReferenceType (const clang::LValueReferenceType *lvalue_reference_type); - void VisitPointerType (const clang::PointerType *pointer_type); - void VisitTagType (const clang::TagType *tag_type); - void VisitRecordType (const clang::RecordType *record_type); - + ASTDumper (clang::Decl *decl); + ASTDumper (clang::DeclContext *decl_ctx); + ASTDumper (clang::Type *type); + ASTDumper (clang::QualType type); + ASTDumper (lldb::clang_type_t type); + + std::string AsString(); + void ToSTDERR(); + void ToLog(lldb::LogSP &log, const char *prefix); + void ToStream(lldb::StreamSP &stream); private: - llvm::DenseSet <const void *> m_visited_entities; ///< A set of all entities that have already been printed, to prevent loops - Stream &m_stream; ///< A stream to print output to - unsigned m_base_indentation; ///< The indentation of m_stream when the ASTDumper was entered - unsigned m_max_indentation; ///< The maximum depth of indentation (added to m_base_indentation) -public: - //------------------------------------------------------------------ - /// DumpDecl - Create an ASTDumper and use it to dump a Decl. - /// - /// @param[in] stream - /// The stream to use when printing output. - /// - /// @param[in] decl - /// The AST Decl to print. - //------------------------------------------------------------------ - static void DumpDecl (Stream &stream, clang::Decl *decl) - { - ASTDumper dumper(stream); - - stream.Printf("---\n"); - - dumper.::clang::DeclVisitor<ASTDumper, void>::Visit(decl); - } - - //------------------------------------------------------------------ - /// DumpDecl - Create an ASTDumper and use it to dump a Stmt. - /// - /// @param[in] stream - /// The stream to use when printing output. - /// - /// @param[in] stmt - /// The AST Stmt to print. - //------------------------------------------------------------------ - static void DumpStmt (Stream &stream, clang::Stmt *stmt) - { - ASTDumper dumper(stream); - - stream.Printf("---\n"); - - dumper.::clang::StmtVisitor<ASTDumper, void>::Visit(stmt); - } - - //------------------------------------------------------------------ - /// DumpDecl - Create an ASTDumper and use it to dump a Type. - /// - /// @param[in] stream - /// The stream to use when printing output. - /// - /// @param[in] type - /// The AST Type to print. - //------------------------------------------------------------------ - static void DumpType (Stream &stream, clang::Type *type) - { - ASTDumper dumper(stream); - - stream.Printf("---\n"); - - dumper.::clang::TypeVisitor<ASTDumper, void>::Visit(type); - } + std::string m_dump; }; } // namespace lldb_private diff --git a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h index 405cc73ab3f..51d5b8e629c 100644 --- a/lldb/include/lldb/Expression/ClangExpressionDeclMap.h +++ b/lldb/include/lldb/Expression/ClangExpressionDeclMap.h @@ -1076,7 +1076,7 @@ private: AddOneType (NameSearchContext &context, TypeFromUser &type, unsigned int current_id, - bool add_method = false); + bool add_method); //------------------------------------------------------------------ /// Actually do the task of materializing or dematerializing the struct. diff --git a/lldb/source/Expression/ASTDumper.cpp b/lldb/source/Expression/ASTDumper.cpp index 3f6104b7fde..eafd69f7aeb 100644 --- a/lldb/source/Expression/ASTDumper.cpp +++ b/lldb/source/Expression/ASTDumper.cpp @@ -7,538 +7,118 @@ // //===----------------------------------------------------------------------===// +#include "lldb/Core/Log.h" #include "lldb/Expression/ASTDumper.h" -using namespace lldb_private; -using namespace clang; - -// MARK: Utility functions +#include "llvm/Support/raw_ostream.h" -static const char* SfB (bool b) -{ - return b ? "True" : "False"; -} - -// MARK: DeclVisitor +using namespace lldb_private; -void ASTDumper::VisitDecl (clang::Decl *decl) +ASTDumper::ASTDumper (clang::Decl *decl) { - m_stream.Indent(); m_stream.Printf("class : Decl\n"); - m_stream.Indent(); m_stream.Printf("getDeclKindName() : %s\n", decl->getDeclKindName()); - m_stream.Indent(); m_stream.Printf("getTranslationUnitDecl() : "); + clang::DeclContext *decl_ctx = llvm::dyn_cast<clang::DeclContext>(decl); - TranslationUnitDecl *translation_unit_decl = decl->getTranslationUnitDecl(); + bool has_external_lexical_storage; + bool has_external_visible_storage; - if (translation_unit_decl) - { - if (KeepDumping() && !Visiting(translation_unit_decl)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(translation_unit_decl); - VisitTranslationUnitDecl(translation_unit_decl); - DidVisit(translation_unit_decl); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else - { - m_stream.Printf("~\n"); - } - - m_stream.Indent(); m_stream.Printf("getAccess() : "); - switch (decl->getAccess()) - { - default: m_stream.Printf("~\n"); - case AS_public: m_stream.Printf("AS_public\n"); - case AS_protected: m_stream.Printf("AS_protected\n"); - case AS_private: m_stream.Printf("AS_private\n"); - case AS_none: m_stream.Printf("AS_none\n"); - } - m_stream.Indent(); m_stream.Printf("getMaxAlignment() : %d\n", decl->getMaxAlignment()); - m_stream.Indent(); m_stream.Printf("isInvalidDecl() : %s\n", SfB(decl->isInvalidDecl())); - m_stream.Indent(); m_stream.Printf("isImplicit() : %s\n", SfB(decl->isImplicit())); - m_stream.Indent(); m_stream.Printf("isUsed() : %s\n", SfB(decl->isUsed())); - m_stream.Indent(); m_stream.Printf("isOutOfLine() : %s\n", SfB(decl->isOutOfLine())); - m_stream.Indent(); m_stream.Printf("isCanonicalDecl() : %s\n", SfB(decl->isCanonicalDecl())); - m_stream.Indent(); m_stream.Printf("hasBody() : %s\n", SfB(decl->hasBody())); - m_stream.Indent(); m_stream.Printf("isTemplateParameter() : %s\n", SfB(decl->isTemplateParameter())); - m_stream.Indent(); m_stream.Printf("isTemplateParameterPack() : %s\n", SfB(decl->isTemplateParameterPack())); - m_stream.Indent(); m_stream.Printf("isParameterPack() : %s\n", SfB(decl->isParameterPack())); - m_stream.Indent(); m_stream.Printf("isFunctionOrFunctionTemplate() : %s\n", SfB(decl->isFunctionOrFunctionTemplate())); - m_stream.Indent(); m_stream.Printf("getFriendObjectKind() : "); - switch (decl->getFriendObjectKind()) + if (decl_ctx) { - default: m_stream.Printf("~\n"); break; - case Decl::FOK_None: m_stream.Printf("FOK_None\n"); break; - case Decl::FOK_Declared: m_stream.Printf("FOK_Declared\n"); break; - case Decl::FOK_Undeclared: m_stream.Printf("FOK_Undeclared\n"); break; + has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage(); + has_external_visible_storage = decl_ctx->hasExternalVisibleStorage(); + decl_ctx->setHasExternalLexicalStorage(false); + decl_ctx->setHasExternalVisibleStorage(false); } -} - -void ASTDumper::VisitTranslationUnitDecl (clang::TranslationUnitDecl *translation_unit_decl) -{ - m_stream.Indent(); m_stream.Printf("class : TranslationUnitDecl\n"); - m_stream.Indent(); m_stream.Printf("getAnonymousNamespace() : "); - NamespaceDecl *anonymous_namespace = translation_unit_decl->getAnonymousNamespace(); + llvm::raw_string_ostream os(m_dump); + decl->print (os); + os.flush(); - if (anonymous_namespace) - { - if (KeepDumping() && !Visiting(anonymous_namespace)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(anonymous_namespace); - VisitNamespaceDecl(anonymous_namespace); - DidVisit(anonymous_namespace); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else + if (decl_ctx) { - m_stream.Printf("~\n"); + decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage); + decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage); } - - VisitDecl (translation_unit_decl); } -void ASTDumper::VisitNamedDecl (clang::NamedDecl *named_decl) +ASTDumper::ASTDumper (clang::DeclContext *decl_ctx) { - m_stream.Indent(); m_stream.Printf("class : NamedDecl\n"); - m_stream.Indent(); m_stream.Printf("getNameAsString() : %s\n", named_decl->getNameAsString().c_str()); - m_stream.Indent(); m_stream.Printf("hasLinkage() : %s\n", SfB(named_decl->hasLinkage())); - m_stream.Indent(); m_stream.Printf("isCXXClassMember() : %s\n", SfB(named_decl->isCXXClassMember())); - m_stream.Indent(); m_stream.Printf("isCXXInstanceMember() : %s\n", SfB(named_decl->isCXXClassMember())); - m_stream.Indent(); m_stream.Printf("getVisibility() : "); - switch (named_decl->getVisibility()) - { - default: m_stream.Printf("~\n"); break; - case HiddenVisibility: m_stream.Printf("HiddenVisibility\n"); break; - case ProtectedVisibility: m_stream.Printf("ProtectedVisibility\n"); break; - case DefaultVisibility: m_stream.Printf("DefaultVisibility\n"); break; - } - m_stream.Indent(); m_stream.Printf("getUnderlyingDecl() : "); + bool has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage(); + bool has_external_visible_storage = decl_ctx->hasExternalVisibleStorage(); - NamedDecl *underlying_decl = named_decl->getUnderlyingDecl(); + decl_ctx->setHasExternalLexicalStorage(false); + decl_ctx->setHasExternalVisibleStorage(false); - if (underlying_decl) + if (clang::Decl *decl = llvm::dyn_cast<clang::Decl>(decl_ctx)) { - if (KeepDumping() && !Visiting(underlying_decl)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(underlying_decl); - ::clang::DeclVisitor<ASTDumper, void>::Visit(underlying_decl); - DidVisit(underlying_decl); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } + llvm::raw_string_ostream os(m_dump); + decl->print (os); + os.flush(); } else { - m_stream.Printf("~\n"); + m_dump.assign("<DeclContext is not a Decl>"); } - VisitDecl (named_decl); -} - -void ASTDumper::VisitNamespaceDecl (clang::NamespaceDecl *namespace_decl) -{ - m_stream.Indent(); m_stream.Printf("class : NamespaceDecl\n"); - m_stream.Indent(); m_stream.Printf("isAnonymousNamespace() : %s\n", SfB(namespace_decl->isAnonymousNamespace())); - m_stream.Indent(); m_stream.Printf("isInline() : %s\n", SfB(namespace_decl->isInline())); - m_stream.Indent(); m_stream.Printf("isOriginalNamespace() : %s\n", SfB(namespace_decl->isOriginalNamespace())); - - VisitNamedDecl (namespace_decl); + decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage); + decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage); } -void ASTDumper::VisitValueDecl (clang::ValueDecl *value_decl) +ASTDumper::ASTDumper (clang::Type *type) { - m_stream.Indent(); m_stream.Printf("class : ValueDecl\n"); - m_stream.Indent(); m_stream.Printf("getType() : "); - if (value_decl->getType().getTypePtrOrNull()) - { - const clang::Type *type_ptr = value_decl->getType().getTypePtr(); - - if (KeepDumping() && !Visiting(type_ptr)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(type_ptr); - ::clang::TypeVisitor<ASTDumper, void>::Visit(type_ptr); - DidVisit(type_ptr); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else - { - m_stream.Printf("~\n"); - } - - VisitNamedDecl (value_decl); + m_dump = clang::QualType(type, 0).getAsString(); } -void ASTDumper::VisitDeclaratorDecl (clang::DeclaratorDecl *declarator_decl) +ASTDumper::ASTDumper (clang::QualType type) { - m_stream.Indent(); m_stream.Printf("class : DeclaratorDecl\n"); - VisitValueDecl (declarator_decl); + m_dump = type.getAsString(); } -void ASTDumper::VisitVarDecl (clang::VarDecl *var_decl) +ASTDumper::ASTDumper (lldb::clang_type_t type) { - m_stream.Indent(); m_stream.Printf("class : VarDecl\n"); - VisitDeclaratorDecl (var_decl); + m_dump = clang::QualType::getFromOpaquePtr(type).getAsString(); } - -void ASTDumper::VisitTypeDecl (clang::TypeDecl *type_decl) -{ - m_stream.Indent(); m_stream.Printf("class : TypeDecl\n"); - m_stream.Indent(); m_stream.Printf("getTypeForDecl() : "); - - const clang::Type *type_for_decl = type_decl->getTypeForDecl(); - - if (type_for_decl) - { - if (KeepDumping() && !Visiting(type_for_decl)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(type_for_decl); - ::clang::TypeVisitor<ASTDumper, void>::Visit(type_for_decl); - DidVisit(type_for_decl); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else - { - m_stream.Printf("~\n"); - } - VisitNamedDecl (type_decl); -} - -void ASTDumper::VisitTagDecl (clang::TagDecl *tag_decl) +std::string ASTDumper::AsString() { - m_stream.Indent(); m_stream.Printf("class : TagDecl\n"); - m_stream.Indent(); m_stream.Printf("getDefinition() : %s\n", SfB((bool)tag_decl->getDefinition())); - m_stream.Indent(); m_stream.Printf("isBeingDefined() : %s\n", SfB(tag_decl->isBeingDefined())); - m_stream.Indent(); m_stream.Printf("isEmbeddedInDeclarator() : %s\n", SfB(tag_decl->isEmbeddedInDeclarator())); - m_stream.Indent(); m_stream.Printf("isDependentType() : %s\n", SfB(tag_decl->isDependentType())); - m_stream.Indent(); m_stream.Printf("getDefinition() : "); - - TagDecl *definition = tag_decl->getDefinition(); - - if (definition) - { - if (KeepDumping() && !Visiting(definition)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(definition); - ::clang::DeclVisitor<ASTDumper, void>::Visit(tag_decl->getDefinition()); - DidVisit(definition); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else - { - m_stream.Printf("~\n"); - } - m_stream.Indent(); m_stream.Printf("getKindName() : %s\n", tag_decl->getKindName()); - - VisitTypeDecl(tag_decl); + return m_dump; } -void ASTDumper::VisitRecordDecl (clang::RecordDecl *record_decl) +void ASTDumper::ToSTDERR() { - m_stream.Indent(); m_stream.Printf("class : RecordDecl\n"); - m_stream.Indent(); m_stream.Printf("hasFlexibleArrayMember() : %s\n", SfB(record_decl->hasFlexibleArrayMember())); - m_stream.Indent(); m_stream.Printf("isAnonymousStructOrUnion() : %s\n", SfB(record_decl->isAnonymousStructOrUnion())); - m_stream.Indent(); m_stream.Printf("hasObjectMember() : %s\n", SfB(record_decl->hasObjectMember())); - m_stream.Indent(); m_stream.Printf("isInjectedClassName() : %s\n", SfB(record_decl->isInjectedClassName())); - m_stream.Indent(); m_stream.Printf("field_begin() ... field_end() : "); - if (KeepDumping()) - { - if (record_decl->field_empty()) - { - m_stream.Printf("~\n"); - } - else - { - m_stream.Printf("\n"); - PushIndent(); - for (RecordDecl::field_iterator iter = record_decl->field_begin(), end_iter = record_decl->field_end(); - iter != end_iter; - ++iter) - { - m_stream.Indent(); m_stream.Printf("- field:\n"); - PushIndent(); - if (Visiting (*iter)) - { - m_stream.Indent(); m_stream.Printf("capped\n"); - } - else - { - WillVisit(*iter); - ::clang::DeclVisitor<ASTDumper, void>::Visit(*iter); - DidVisit(*iter); - } - PopIndent(); - } - PopIndent(); - } - } - else - { - m_stream.Printf("capped\n"); - } - - VisitTagDecl (record_decl); + fprintf(stderr, "%s\n", m_dump.c_str()); } -void ASTDumper::VisitCXXRecordDecl (clang::CXXRecordDecl *cxx_record_decl) +void ASTDumper::ToLog(lldb::LogSP &log, const char *prefix) { - m_stream.Indent(); m_stream.Printf("class : CXXRecordDecl\n"); - m_stream.Indent(); m_stream.Printf("isDynamicClass() : %s\n", SfB(cxx_record_decl->isDynamicClass())); - m_stream.Indent(); m_stream.Printf("bases_begin() ... bases_end() : "); - if (KeepDumping()) - { - if (cxx_record_decl->bases_begin() == cxx_record_decl->bases_end()) - { - m_stream.Printf("~\n"); - } - else - { - m_stream.Printf("\n"); - PushIndent(); - for (CXXRecordDecl::base_class_iterator iter = cxx_record_decl->bases_begin(), end_iter = cxx_record_decl->bases_end(); - iter != end_iter; - ++iter) - { - m_stream.Indent(); m_stream.Printf("- CXXBaseSpecifier:\n"); - PushIndent(); - m_stream.Indent(); m_stream.Printf("isVirtual() : %s\n", SfB(iter->isVirtual())); - m_stream.Indent(); m_stream.Printf("isBaseOfClass() : %s\n", SfB(iter->isBaseOfClass())); - m_stream.Indent(); m_stream.Printf("isPackExpansion() : %s\n", SfB(iter->isPackExpansion())); - m_stream.Indent(); m_stream.Printf("getAccessSpecifier() : "); - switch (iter->getAccessSpecifier()) - { - default: m_stream.Printf("~\n"); break; - case clang::AS_none: m_stream.Printf("AS_none\n"); break; - case clang::AS_private: m_stream.Printf("AS_private\n"); break; - case clang::AS_protected: m_stream.Printf("AS_protected\n"); break; - case clang::AS_public: m_stream.Printf("AS_public\n"); break; - } - m_stream.Indent(); m_stream.Printf("getType() : "); - const clang::Type *base_type = iter->getType().getTypePtr(); - - if (Visiting(base_type)) - { - m_stream.Printf("capped\n"); - } - else - { - m_stream.Printf("\n"); - PushIndent(); - WillVisit(base_type); - ::clang::TypeVisitor<ASTDumper, void>::Visit(base_type); - DidVisit(base_type); - PopIndent(); - } - PopIndent(); - } - PopIndent(); - } - } - else - { - m_stream.Printf("capped\n"); - } + size_t len = m_dump.length() + 1; - VisitRecordDecl(cxx_record_decl); -} - -// MARK: TypeVisitor - -void ASTDumper::VisitType (const clang::Type *type) -{ - m_stream.Indent(); m_stream.Printf("class : Type\n"); - m_stream.Indent(); m_stream.Printf("getTypeClass() : "); - switch (type->getTypeClass()) - { - default: m_stream.Printf("~\n"); break; -#define TYPE(Class, Base) case clang::Type::Class: m_stream.Printf("%s\n", #Class); break; -#define ABSTRACT_TYPE(Class, Base) -#include "clang/AST/TypeNodes.def" - } - m_stream.Indent(); m_stream.Printf("isFromAST() : %s\n", SfB(type->isFromAST())); - m_stream.Indent(); m_stream.Printf("containsUnexpandedParameterPack() : %s\n", SfB(type->containsUnexpandedParameterPack())); - m_stream.Indent(); m_stream.Printf("isCanonicalUnqualified() : %s\n", SfB(type->isCanonicalUnqualified())); - m_stream.Indent(); m_stream.Printf("isIncompleteType() : %s\n", SfB(type->isIncompleteType())); - m_stream.Indent(); m_stream.Printf("isObjectType() : %s\n", SfB(type->isObjectType())); - m_stream.Indent(); m_stream.Printf("isLiteralType() : %s\n", SfB(type->isLiteralType())); - m_stream.Indent(); m_stream.Printf("isBuiltinType() : %s\n", SfB(type->isBuiltinType())); - m_stream.Indent(); m_stream.Printf("isPlaceholderType() : %s\n", SfB(type->isPlaceholderType())); - m_stream.Indent(); m_stream.Printf("isScalarType() : %s\n", SfB(type->isScalarType())); - m_stream.Indent(); m_stream.Printf("getScalarTypeKind() : "); - if (type->isScalarType()) - { - switch (type->getScalarTypeKind()) - { - default: m_stream.Printf("~\n"); break; - case clang::Type::STK_CPointer: m_stream.Printf("STK_CPointer\n"); break; - case clang::Type::STK_MemberPointer: m_stream.Printf("STK_MemberPointer\n"); break; - case clang::Type::STK_Bool: m_stream.Printf("STK_Bool\n"); break; - case clang::Type::STK_Integral: m_stream.Printf("STK_Integral\n"); break; - case clang::Type::STK_Floating: m_stream.Printf("STK_Floating\n"); break; - case clang::Type::STK_IntegralComplex: m_stream.Printf("STK_IntegralComplex\n"); break; - case clang::Type::STK_FloatingComplex: m_stream.Printf("STK_FloatingComplex\n"); break; - } - } - else - { - m_stream.Printf("~\n"); - } - // ... -} - -void ASTDumper::VisitReferenceType(const clang::ReferenceType *reference_type) -{ - m_stream.Indent(); m_stream.Printf("class : ReferenceType\n"); - m_stream.Indent(); m_stream.Printf("isSpelledAsLValue() : %s\n", SfB(reference_type->isSpelledAsLValue())); - m_stream.Indent(); m_stream.Printf("isInnerRef() : %s\n", SfB(reference_type->isInnerRef())); - m_stream.Indent(); m_stream.Printf("getPointeeType() : "); + char *alloc = (char*)malloc(len); + char *str = alloc; - const clang::Type *pointee_type = reference_type->getPointeeType().getTypePtrOrNull(); + memcpy(str, m_dump.c_str(), len); - if (pointee_type) - { - if (KeepDumping() && !Visiting(pointee_type)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(pointee_type); - ::clang::TypeVisitor<ASTDumper, void>::Visit(pointee_type); - DidVisit(pointee_type); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else - { - m_stream.Printf("~\n"); - } - VisitType(reference_type); -} - -void ASTDumper::VisitLValueReferenceType(const clang::LValueReferenceType *lvalue_reference_type) -{ - m_stream.Indent(); m_stream.Printf("class : LValueReferenceType\n"); - m_stream.Indent(); m_stream.Printf("isSugared() : %s\n", SfB(lvalue_reference_type->isSugared())); - VisitReferenceType(lvalue_reference_type); -} - -void ASTDumper::VisitPointerType(const clang::PointerType *pointer_type) -{ - m_stream.Indent(); m_stream.Printf("class : PointerType\n"); - m_stream.Indent(); m_stream.Printf("getPointeeType() : "); + char *end = NULL; - const clang::Type *pointee_type = pointer_type->getPointeeType().getTypePtrOrNull(); + end = strchr(str, '\n'); - if (pointee_type) - { - if (KeepDumping() && !Visiting(pointee_type)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(pointee_type); - ::clang::TypeVisitor<ASTDumper, void>::Visit(pointee_type); - DidVisit(pointee_type); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else + while (end) { - m_stream.Printf("~\n"); + *end = '\0'; + + log->Printf("%s%s", prefix, str); + + *end = '\n'; + + str = end + 1; + end = strchr(str, '\n'); } - m_stream.Indent(); m_stream.Printf("isSugared() : %s\n", SfB (pointer_type->isSugared())); - VisitType(pointer_type); -} - -void ASTDumper::VisitTagType(const clang::TagType *tag_type) -{ - m_stream.Indent(); m_stream.Printf("class : TagType\n"); - m_stream.Indent(); m_stream.Printf("getDecl() : "); - Decl *decl = tag_type->getDecl(); - - if (decl) - { - if (KeepDumping() && !Visiting(decl)) - { - m_stream.Printf("\n"); - - PushIndent(); - WillVisit(decl); - ::clang::DeclVisitor<ASTDumper, void>::Visit(decl); - DidVisit(decl); - PopIndent(); - } - else - { - m_stream.Printf("capped\n"); - } - } - else - { - m_stream.Printf("~\n"); - } - m_stream.Indent(); m_stream.Printf("isBeingDefined() : %s\n", SfB(tag_type->isBeingDefined())); - VisitType(tag_type); + log->Printf("%s%s", prefix, str); + + free(alloc); } -void ASTDumper::VisitRecordType(const clang::RecordType *record_type) +void ASTDumper::ToStream(lldb::StreamSP &stream) { - m_stream.Indent(); m_stream.Printf("class : RecordType\n"); - m_stream.Indent(); m_stream.Printf("hasConstFields() : %s\n", SfB(record_type->hasConstFields())); - VisitTagType(record_type); + stream->PutCString(m_dump.c_str()); } diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index fc2dce81eb2..d83613ed191 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -43,7 +43,6 @@ #include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" -#include "llvm/Support/raw_ostream.h" using namespace lldb; using namespace lldb_private; @@ -2181,13 +2180,11 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, if (log) { - StreamString type_stream; - class_user_type.DumpTypeCode(&type_stream); - type_stream.Flush(); - log->Printf(" FEVD[%u] Adding type for $__lldb_class: %s", current_id, type_stream.GetString().c_str()); + std::string type_string = ASTDumper(pointer_target_qual_type).AsString(); + log->Printf(" FEVD[%u] Adding type for $__lldb_class: %s", current_id, type_string.c_str()); } - AddOneType(context, class_user_type, true); + AddOneType(context, class_user_type, current_id, true); return; } @@ -2234,13 +2231,11 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, if (log) { - StreamString type_stream; - class_user_type.DumpTypeCode(&type_stream); - type_stream.Flush(); - log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, type_stream.GetString().c_str()); + std::string type_string = ASTDumper(pointer_target_type).AsString(); + log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, type_string.c_str()); } - AddOneType(context, class_user_type, false); + AddOneType(context, class_user_type, current_id, false); return; } @@ -2298,12 +2293,14 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, if (m_parser_vars->m_exe_ctx->GetRegisterContext()) { const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); - - if (log) - log->Printf(" FEVD[%u] Found register %s", current_id, reg_info->name); - + if (reg_info) + { + if (log) + log->Printf(" FEVD[%u] Found register %s", current_id, reg_info->name); + AddOneRegister(context, reg_info, current_id); + } } } else @@ -2512,7 +2509,7 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, TypeFromUser user_type(type_sp->GetClangFullType(), type_sp->GetClangAST()); - AddOneType(context, user_type, false); + AddOneType(context, user_type, current_id, false); } } @@ -2535,6 +2532,9 @@ ClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_contex static unsigned int invocation_id = 0; unsigned int current_id = invocation_id++; + if (current_id == 1686) + fprintf(stderr, "here\n"); + if (log) { if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl)) @@ -2566,12 +2566,9 @@ ClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_contex return ELR_Failure; if (log) - { - std::string decl_print_string; - llvm::raw_string_ostream decl_print_stream(decl_print_string); - original_decl->print(decl_print_stream); - decl_print_stream.flush(); - log->Printf(" FELD[%u] Original decl:\n%s", current_id, decl_print_string.c_str()); + { + log->Printf(" FELD[%u] Original decl:", current_id); + ASTDumper(original_decl).ToLog(log, " "); } if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl)) @@ -2597,10 +2594,7 @@ ClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_contex { if (log) { - std::string decl_print_string; - llvm::raw_string_ostream decl_print_stream(decl_print_string); - decl->print(decl_print_stream); - decl_print_stream.flush(); + std::string decl_print_string = ASTDumper(decl).AsString(); if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl)) log->Printf(" FELD[%d] Adding [to %s] lexical decl %s", current_id, context_named_decl->getNameAsString().c_str(), decl_print_string.c_str()); @@ -2785,19 +2779,9 @@ ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP v if (log) { - std::string var_decl_print_string; - llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); - var_decl->print(var_decl_print_stream); - var_decl_print_stream.flush(); + std::string var_decl_print_string = ASTDumper(var_decl).AsString(); log->Printf(" FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), var_decl_print_string.c_str()); - - //if (log->GetVerbose()) - //{ - // StreamString var_decl_dump_string; - // ASTDumper::DumpDecl(var_decl_dump_string, var_decl); - // log->Printf("%s\n", var_decl_dump_string.GetData()); - //} } } @@ -2825,10 +2809,7 @@ ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, if (log) { - std::string var_decl_print_string; - llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); - var_decl->print(var_decl_print_stream); - var_decl_print_stream.flush(); + std::string var_decl_print_string = ASTDumper(var_decl).AsString(); log->Printf(" FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), var_decl_print_string.c_str()); } @@ -2887,19 +2868,9 @@ ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, if (log) { - std::string var_decl_print_string; - llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); - var_decl->print(var_decl_print_stream); - var_decl_print_stream.flush(); + std::string var_decl_print_string = ASTDumper(var_decl).AsString(); log->Printf(" FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), var_decl_print_string.c_str()); - - //if (log->GetVerbose()) - //{ - // StreamString var_decl_dump_string; - // ASTDumper::DumpDecl(var_decl_dump_string, var_decl); - // log->Printf("%s\n", var_decl_dump_string.GetData()); - //} } } @@ -2931,10 +2902,7 @@ ClangExpressionDeclMap::ResolveUnknownTypes() if (log) { - std::string var_decl_print_string; - llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); - var_decl->print(var_decl_print_stream); - var_decl_print_stream.flush(); + std::string var_decl_print_string = ASTDumper((clang::Decl*)var_decl).AsString(); log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str()); } @@ -2997,10 +2965,7 @@ ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, if (log && log->GetVerbose()) { - std::string var_decl_print_string; - llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); - var_decl->print(var_decl_print_stream); - var_decl_print_stream.flush(); + std::string var_decl_print_string = ASTDumper(var_decl).AsString(); log->Printf(" FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str()); } @@ -3108,10 +3073,7 @@ ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, if (log) { - std::string fun_decl_print_string; - llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string); - fun_decl->print(fun_decl_print_stream); - fun_decl_print_stream.flush(); + std::string fun_decl_print_string = ASTDumper(fun_decl).AsString(); log->Printf(" FEVD[%u] Found %s function %s, returned %s", current_id, |

