aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergio Martins <sergio.martins@kdab.com>2019-06-06 21:43:46 +0100
committerSergio Martins <sergio.martins@kdab.com>2019-06-06 21:43:46 +0100
commit849343a794b21e37fa97133c92267ddb4137086b (patch)
tree9b6e370b62385364a8668c187ea5a3f5951c385d
parentc9abcd5ee9e9887ebef93cec4a32f45826742e5e (diff)
WIP
-rw-r--r--src/MiniAstDumper.cpp67
-rw-r--r--src/MiniAstDumper.h8
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