diff options
author | Sergio Martins <smartins@kde.org> | 2019-06-07 14:54:15 +0100 |
---|---|---|
committer | Sergio Martins <smartins@kde.org> | 2019-06-07 14:54:15 +0100 |
commit | 8586dd8c2a3cf1c30f1519e4f4f5425e0dc31afc (patch) | |
tree | 816ebc1b9f815132e696e8350a54892c8b85e663 | |
parent | 22b8c12a447d60fe576c76094f6ede646dae3cdb (diff) |
WIP
-rw-r--r-- | src/MiniAstDumper.cpp | 97 | ||||
-rw-r--r-- | src/MiniAstDumper.h | 5 |
2 files changed, 76 insertions, 26 deletions
diff --git a/src/MiniAstDumper.cpp b/src/MiniAstDumper.cpp index a62064e2..04538707 100644 --- a/src/MiniAstDumper.cpp +++ b/src/MiniAstDumper.cpp @@ -22,7 +22,8 @@ #include "MiniAstDumper.h" #include "SourceCompatibilityHelpers.h" - +#include "clazy_stl.h" +#include "StringUtils.h" #include <clang/Frontend/CompilerInstance.h> #include <clang/Frontend/FrontendPluginRegistry.h> @@ -52,7 +53,7 @@ MiniASTDumperConsumer::MiniASTDumperConsumer(CompilerInstance &ci) auto &sm = m_ci.getASTContext().getSourceManager(); const FileEntry *fileEntry = sm.getFileEntryForID(sm.getMainFileID()); - m_cborBuf = (uint8_t*)malloc(m_bufferSize); + m_cborBuf = reinterpret_cast<uint8_t*>(malloc(m_bufferSize)); const std::string currentCppFile = fileEntry->getName(); @@ -73,9 +74,7 @@ MiniASTDumperConsumer::~MiniASTDumperConsumer() std::ofstream myFile ("data.bin", std::ios::out | ios::binary); myFile.write(reinterpret_cast<char*>(m_cborBuf), long(size)); - - llvm::errs() << "Finished " << m_bufferSize << "\n"; - + delete m_cborBuf; } bool MiniASTDumperConsumer::VisitDecl(Decl *decl) @@ -93,23 +92,7 @@ bool MiniASTDumperConsumer::VisitDecl(Decl *decl) return true; } - CborEncoder recordMap; - cbor_encoder_create_map(&m_cborStuffArray, &recordMap, 4); - - cborEncodeString(recordMap, "type"); - cborEncodeInt(recordMap, rec->getDeclKind()); - - cborEncodeString(recordMap, "name"); - cborEncodeString(recordMap, rec->getQualifiedNameAsString().c_str()); - - cborEncodeString(recordMap, "id"); - cborEncodeInt(recordMap, int64_t(rec)); - - cborEncodeString(recordMap, "loc"); - cborEncodeString(recordMap, clazy::getLocStart(rec).printToString(m_ci.getSourceManager()).c_str()); - - cbor_encoder_close_container(&m_cborStuffArray, &recordMap); - + dumpCXXRecordDecl(rec, &m_cborStuffArray); } else if (auto ctd = dyn_cast<ClassTemplateDecl>(decl)) { llvm::errs() << "Found template: " << ctd->getNameAsString() << "; this=" << ctd @@ -123,15 +106,17 @@ bool MiniASTDumperConsumer::VisitDecl(Decl *decl) llvm::errs() << "\n"; } } - } else if () { - } return true; } -bool MiniASTDumperConsumer::VisitStmt(Stmt *) +bool MiniASTDumperConsumer::VisitStmt(Stmt *stmt) { + if (auto callExpr = dyn_cast<CallExpr>(stmt)) { + dumpCallExpr(callExpr, &m_cborStuffArray); + } + return true; } @@ -140,6 +125,68 @@ void MiniASTDumperConsumer::HandleTranslationUnit(ASTContext &ctx) TraverseDecl(ctx.getTranslationUnitDecl()); } +void MiniASTDumperConsumer::dumpCXXMethodDecl(CXXMethodDecl *method, CborEncoder *encoder) +{ + CborEncoder recordMap; + cbor_encoder_create_map(encoder, &recordMap, 5); + + //cborEncodeString(recordMap, "type"); + //cborEncodeInt(recordMap, method->getDeclKind()); + + cborEncodeString(recordMap, "name"); + cborEncodeString(recordMap, method->getQualifiedNameAsString().c_str()); + + cborEncodeString(recordMap, "id"); + cborEncodeInt(recordMap, int64_t(method)); + + //cborEncodeString(recordMap, "loc"); + //cborEncodeString(recordMap, clazy::getLocStart(method).printToString(m_ci.getSourceManager()).c_str()); + + cbor_encoder_close_container(encoder, &recordMap); +} + +void MiniASTDumperConsumer::dumpCXXRecordDecl(CXXRecordDecl *rec, CborEncoder *encoder) +{ + CborEncoder recordMap; + cbor_encoder_create_map(encoder, &recordMap, 4); + + cborEncodeString(recordMap, "type"); + cborEncodeInt(recordMap, rec->getDeclKind()); + + cborEncodeString(recordMap, "name"); + cborEncodeString(recordMap, rec->getQualifiedNameAsString().c_str()); + + cborEncodeString(recordMap, "id"); + cborEncodeInt(recordMap, int64_t(rec)); + + cborEncodeString(recordMap, "loc"); // TODO: replace with file id + cborEncodeString(recordMap, clazy::getLocStart(rec).printToString(m_ci.getSourceManager()).c_str()); + + cbor_encoder_close_container(&m_cborStuffArray, &recordMap); + + CborEncoder cborMethodList; + cbor_encoder_create_array(encoder, &cborMethodList, CborIndefiniteLength); + for (auto method : rec->methods()) { + dumpCXXMethodDecl(method, &cborMethodList); + } + cbor_encoder_close_container(encoder, &cborMethodList); + +} + +void MiniASTDumperConsumer::dumpCallExpr(CallExpr *callExpr, CborEncoder *encoder) +{ + if (!callExpr->getDirectCallee()) + return; + + CborEncoder callMap; + cbor_encoder_create_map(encoder, &callMap, 1); + + cborEncodeString(callMap, "calleeName"); // TODO: replace with ID + cborEncodeString(callMap, clazy::name(callExpr->getDirectCallee()).str().c_str()); + + cbor_encoder_close_container(encoder, &callMap); +} + void MiniASTDumperConsumer::cborEncodeString(CborEncoder &enc, const char *str) { cbor_encode_text_stringz(&enc, str); diff --git a/src/MiniAstDumper.h b/src/MiniAstDumper.h index ad7ceda4..73f6e0fa 100644 --- a/src/MiniAstDumper.h +++ b/src/MiniAstDumper.h @@ -65,11 +65,14 @@ public: private: MiniASTDumperConsumer(const MiniASTDumperConsumer &) = delete; + void dumpCXXMethodDecl(clang::CXXMethodDecl *, CborEncoder *encoder); + void dumpCXXRecordDecl(clang::CXXRecordDecl *, CborEncoder *encoder); + void dumpCallExpr(clang::CallExpr *, CborEncoder *encoder); void cborEncodeString(CborEncoder&, const char *); void cborEncodeInt(CborEncoder&, int64_t); uint8_t *m_cborBuf = nullptr; - int m_bufferSize = 1024 * 1024 * 20; // 20MB to start with + size_t m_bufferSize = 1024 * 1024 * 20; // 20MB to start with CborEncoder m_cborEncoder, m_cborRootMapEncoder, m_cborStuffArray; clang::CompilerInstance &m_ci; }; |