aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergio Martins <smartins@kde.org>2019-06-07 14:54:15 +0100
committerSergio Martins <smartins@kde.org>2019-06-07 14:54:15 +0100
commit8586dd8c2a3cf1c30f1519e4f4f5425e0dc31afc (patch)
tree816ebc1b9f815132e696e8350a54892c8b85e663
parent22b8c12a447d60fe576c76094f6ede646dae3cdb (diff)
WIP
-rw-r--r--src/MiniAstDumper.cpp97
-rw-r--r--src/MiniAstDumper.h5
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;
};