diff options
author | Sergio Martins <sergio.martins@kdab.com> | 2019-06-06 21:43:46 +0100 |
---|---|---|
committer | Sergio Martins <sergio.martins@kdab.com> | 2019-06-06 21:43:46 +0100 |
commit | 849343a794b21e37fa97133c92267ddb4137086b (patch) | |
tree | 9b6e370b62385364a8668c187ea5a3f5951c385d | |
parent | c9abcd5ee9e9887ebef93cec4a32f45826742e5e (diff) |
WIP
-rw-r--r-- | src/MiniAstDumper.cpp | 67 | ||||
-rw-r--r-- | src/MiniAstDumper.h | 8 |
2 files changed, 66 insertions, 9 deletions
diff --git a/src/MiniAstDumper.cpp b/src/MiniAstDumper.cpp index 47661749..af5a9034 100644 --- a/src/MiniAstDumper.cpp +++ b/src/MiniAstDumper.cpp @@ -25,6 +25,8 @@ #include <clang/Frontend/CompilerInstance.h> #include <clang/Frontend/FrontendPluginRegistry.h> +#include <fstream> + using namespace clang; using namespace std; @@ -37,23 +39,75 @@ bool MiniAstDumperASTAction::ParseArgs(const CompilerInstance &, const std::vect return true; } -std::unique_ptr<ASTConsumer> MiniAstDumperASTAction::CreateASTConsumer(CompilerInstance &, llvm::StringRef) +std::unique_ptr<ASTConsumer> MiniAstDumperASTAction::CreateASTConsumer(CompilerInstance &ci, llvm::StringRef) { - return std::unique_ptr<MiniASTDumperConsumer>(new MiniASTDumperConsumer()); + return std::unique_ptr<MiniASTDumperConsumer>(new MiniASTDumperConsumer(ci)); } -MiniASTDumperConsumer::MiniASTDumperConsumer() +MiniASTDumperConsumer::MiniASTDumperConsumer(CompilerInstance &ci) + : m_ci(ci) { + auto &sm = m_ci.getASTContext().getSourceManager(); + const FileEntry *fileEntry = sm.getFileEntryForID(sm.getMainFileID()); + + llvm::errs() << "Found TU: " << fileEntry->getName() << "\n"; + + const std::string currentCppFile = fileEntry->getName(); + + + cbor_encoder_init(&m_cborEncoder, m_cborBuf, sizeof(m_cborBuf), 0); + cbor_encoder_create_map(&m_cborEncoder, &m_cborRootMapEncoder, 2); + cbor_encode_text_stringz(&m_cborRootMapEncoder, "tu"); + cbor_encode_text_stringz(&m_cborRootMapEncoder, currentCppFile.c_str()); + cbor_encode_text_stringz(&m_cborRootMapEncoder, "stuff"); + cbor_encoder_create_array(&m_cborRootMapEncoder, &m_cborStuffArray, CborIndefiniteLength); + + + //cbor_encode_boolean(&m_cborRootMapEncoder, some_value); + // } MiniASTDumperConsumer::~MiniASTDumperConsumer() { + cbor_encoder_close_container(&m_cborRootMapEncoder, &m_cborRootMapEncoder); + cbor_encoder_close_container(&m_cborEncoder, &m_cborStuffArray); + + size_t size = cbor_encoder_get_buffer_size(&m_cborEncoder, m_cborBuf); + + std::ofstream myFile ("data.bin", std::ios::out | ios::binary); + myFile.write(reinterpret_cast<char*>(m_cborBuf), long(size)); } bool MiniASTDumperConsumer::VisitDecl(Decl *decl) { - if (auto rec = dyn_cast<CXXRecordDecl>(decl)) { - llvm::errs() << "Found record: " << rec->getQualifiedNameAsString() << "\n"; + if (auto tsd = dyn_cast<ClassTemplateSpecializationDecl>(decl)) { + llvm::errs() << "ClassTemplateSpecializationDecl: " + tsd->getQualifiedNameAsString() + "\n"; + } else if (auto rec = dyn_cast<CXXRecordDecl>(decl)) { + if (!rec->isThisDeclarationADefinition()) { + // No forward-declarations + return true; + } + + if (rec->getDescribedClassTemplate()) { + // This is a template. We'll rather print it's specializations when catching ClassTemplateDecl + return true; + } + llvm::errs() << "Found record: " << rec->getQualifiedNameAsString() + << "; this=" << rec + << "\n"; + } else if (auto ctd = dyn_cast<ClassTemplateDecl>(decl)) { + llvm::errs() << "Found template: " << ctd->getNameAsString() + << "; this=" << ctd + << "\n"; + for (auto s : ctd->specializations()) { + llvm::errs() << "Found specialization: " << s->getQualifiedNameAsString() << "\n"; + auto &args = s->getTemplateArgs(); + const unsigned int count = args.size(); + for (unsigned int i = 0; i < count; ++i) { + args.get(i).print(PrintingPolicy({}), llvm::errs()); + llvm::errs() << "\n"; + } + } } return true; @@ -66,9 +120,6 @@ bool MiniASTDumperConsumer::VisitStmt(Stmt *) void MiniASTDumperConsumer::HandleTranslationUnit(ASTContext &ctx) { - auto &sm = ctx.getSourceManager(); - const FileEntry *fileEntry = sm.getFileEntryForID(sm.getMainFileID()); - llvm::errs() << "Found TU: " << fileEntry->getName() << "\n"; TraverseDecl(ctx.getTranslationUnitDecl()); } diff --git a/src/MiniAstDumper.h b/src/MiniAstDumper.h index 0f467065..257db74d 100644 --- a/src/MiniAstDumper.h +++ b/src/MiniAstDumper.h @@ -23,6 +23,8 @@ #ifndef CLAZY_MINI_AST_DUMPER #define CLAZY_MINI_AST_DUMPER +#include "cbor.h" + #include <clang/AST/ASTConsumer.h> #include <clang/Frontend/FrontendAction.h> #include <clang/AST/RecursiveASTVisitor.h> @@ -54,7 +56,7 @@ class MiniASTDumperConsumer , public clang::RecursiveASTVisitor<MiniASTDumperConsumer> { public: - explicit MiniASTDumperConsumer(); + explicit MiniASTDumperConsumer(clang::CompilerInstance &ci); ~MiniASTDumperConsumer() override; bool VisitDecl(clang::Decl *decl); @@ -63,6 +65,10 @@ public: private: MiniASTDumperConsumer(const MiniASTDumperConsumer &) = delete; + + uint8_t m_cborBuf[1600]; + CborEncoder m_cborEncoder, m_cborRootMapEncoder, m_cborStuffArray; + clang::CompilerInstance &m_ci; }; #endif |