16e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan//===-- ASTDumper.cpp -------------------------------------------*- C++ -*-===// 26e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan// 36e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan// The LLVM Compiler Infrastructure 46e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan// 56e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan// This file is distributed under the University of Illinois Open Source 66e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan// License. See LICENSE.TXT for details. 76e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan// 86e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan//===----------------------------------------------------------------------===// 96e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 10e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan#include "lldb/Core/Log.h" 116e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h" 1252f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "lldb/Symbol/ClangASTType.h" 136e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 14e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan#include "llvm/Support/raw_ostream.h" 156e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 16e3737fdca55be5c078534cc49fb38db409d12e32Sean Callananusing namespace lldb_private; 176e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 18e3737fdca55be5c078534cc49fb38db409d12e32Sean CallananASTDumper::ASTDumper (clang::Decl *decl) 196e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 20e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan clang::DeclContext *decl_ctx = llvm::dyn_cast<clang::DeclContext>(decl); 216e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 22e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan bool has_external_lexical_storage; 23e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan bool has_external_visible_storage; 246e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 25e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (decl_ctx) 266e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan { 27e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage(); 28e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan has_external_visible_storage = decl_ctx->hasExternalVisibleStorage(); 29e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalLexicalStorage(false); 30e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalVisibleStorage(false); 316e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan } 326e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 33e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan llvm::raw_string_ostream os(m_dump); 34e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl->print (os); 35e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan os.flush(); 366e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 37e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (decl_ctx) 386e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan { 39e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage); 40e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage); 416e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan } 426e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 436e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 44e3737fdca55be5c078534cc49fb38db409d12e32Sean CallananASTDumper::ASTDumper (clang::DeclContext *decl_ctx) 456e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 46e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan bool has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage(); 47e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan bool has_external_visible_storage = decl_ctx->hasExternalVisibleStorage(); 486e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 49e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalLexicalStorage(false); 50e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalVisibleStorage(false); 516e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 52e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (clang::Decl *decl = llvm::dyn_cast<clang::Decl>(decl_ctx)) 536e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan { 54e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan llvm::raw_string_ostream os(m_dump); 55e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl->print (os); 56e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan os.flush(); 576e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan } 586e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan else 596e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan { 60e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan m_dump.assign("<DeclContext is not a Decl>"); 616e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan } 626e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 63e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage); 64e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage); 656e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 666e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 67e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean CallananASTDumper::ASTDumper (const clang::Type *type) 686e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 69e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan m_dump = clang::QualType(type, 0).getAsString(); 706e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 716e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 72e3737fdca55be5c078534cc49fb38db409d12e32Sean CallananASTDumper::ASTDumper (clang::QualType type) 736e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 74e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan m_dump = type.getAsString(); 756e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 766e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 77e3737fdca55be5c078534cc49fb38db409d12e32Sean CallananASTDumper::ASTDumper (lldb::clang_type_t type) 786e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 79e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan m_dump = clang::QualType::getFromOpaquePtr(type).getAsString(); 806e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 8152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 8252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonASTDumper::ASTDumper (const ClangASTType &clang_type) 8352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 8452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_dump = clang_type.GetQualType().getAsString(); 8552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 8652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 8752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 88a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Claytonconst char * 89a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg ClaytonASTDumper::GetCString() 906e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 91a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton return m_dump.c_str(); 926e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 936e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 94e3737fdca55be5c078534cc49fb38db409d12e32Sean Callananvoid ASTDumper::ToSTDERR() 956e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 96e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan fprintf(stderr, "%s\n", m_dump.c_str()); 976e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 986e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 99952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Claytonvoid ASTDumper::ToLog(Log *log, const char *prefix) 1006e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 101e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan size_t len = m_dump.length() + 1; 1026e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 103e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan char *alloc = (char*)malloc(len); 104e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan char *str = alloc; 1056e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 106e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan memcpy(str, m_dump.c_str(), len); 1076e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 108e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan char *end = NULL; 1096e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 110e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan end = strchr(str, '\n'); 1116e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 112e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan while (end) 1136e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan { 114e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan *end = '\0'; 115e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 116e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan log->Printf("%s%s", prefix, str); 117e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 118e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan *end = '\n'; 119e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 120e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan str = end + 1; 121e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan end = strchr(str, '\n'); 1226e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan } 1236e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 124e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan log->Printf("%s%s", prefix, str); 125e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 126e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan free(alloc); 1276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 1286e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 129e3737fdca55be5c078534cc49fb38db409d12e32Sean Callananvoid ASTDumper::ToStream(lldb::StreamSP &stream) 1306e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan{ 131e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan stream->PutCString(m_dump.c_str()); 1326e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan} 133