From 73ea45d58be4aac298795bc810f5429ccf90c8f0 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Thu, 13 Apr 2017 13:43:49 +0430 Subject: adding some infrastructure.wip. --- bruiser/bruiser.cpp | 156 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 148 insertions(+), 8 deletions(-) diff --git a/bruiser/bruiser.cpp b/bruiser/bruiser.cpp index a7df7ca..4371e25 100644 --- a/bruiser/bruiser.cpp +++ b/bruiser/bruiser.cpp @@ -26,7 +26,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /*standard headers*/ #include #include -#include /*LLVM headers*/ #include "clang/AST/AST.h" #include "clang/AST/ASTConsumer.h" @@ -49,32 +48,170 @@ using namespace clang::driver; using namespace clang::tooling; /**********************************************************************************************************************/ /*global vars*/ - static llvm::cl::OptionCategory BruiserCategory("Empty"); /**********************************************************************************************************************/ +/*the implementation of the bruiser logger.*/ +bruiser::BruiserReport::BruiserReport () +{ + BruiserLog.open("bruiser.log"); +} + +bruiser::BruiserReport::~BruiserReport() +{ + BruiserLog.close(); +} + +bool bruiser::BruiserReport::PrintToLog(std::string __in_arg) +{ + BruiserLog << __in_arg << "\n"; + return !BruiserLog.bad(); +} +/**********************************************************************************************************************/ +bruiser::TypeInfo::TypeInfo(const clang::ast_type_traits::DynTypedNode* __dtn) : DTN(__dtn) {}; + +bruiser::TypeInfo::~TypeInfo() {}; + +const clang::Type* bruiser::TypeInfo::getTypeInfo(clang::ASTContext* __astc) +{ + const clang::Expr* EXP = DTN->get(); + + const clang::Type* TP = EXP->getType().getTypePtr(); + + return __astc->getCanonicalType(TP); +} +/**********************************************************************************************************************/ +class AbstractMatcherHandler : public virtual MatchFinder::MatchCallback +{ + public: + AbstractMatcherHandler (Rewriter &Rewrite) : R(Rewrite) {} + + public: + virtual void run(const MatchFinder::MatchResult &MR) + { + + } + + private: + Rewriter &R; +}; +/**********************************************************************************************************************/ +class MatcherHandlerLVL0 : public AbstractMatcherHandler +{ + public: + MatcherHandlerLVL0 (Rewriter &Rewrite) : AbstractMatcherHandler(Rewrite) {} + + virtual void run(const MatchFinder::MatchResult &MR) override + { + + } + + private: +}; +/**********************************************************************************************************************/ +class NameFinder +{ + public: + NameFinder (Rewriter &Rewrite) : Rewrite(Rewrite) {} + + virtual void runDeclRefExprMatcher(const llvm::StringRef __sr) + { + //Matcher.addMatcher(); + } + + virtual void runDeclMatcher(const llvm::StringRef __sr) + { + + } + + private: + Rewriter &Rewrite; + MatchFinder Matcher; +}; +/**********************************************************************************************************************/ +/**********************************************************************************************************************/ +/**********************************************************************************************************************/ +class IfBreaker : public MatchFinder::MatchCallback +{ + public: + IfBreaker (Rewriter &Rewrite) : Rewrite(Rewrite) {} + + virtual void run(const MatchFinder::MatchResult &MR) + { + if (MR.Nodes.getNodeAs("uno") != nullptr) + { + const clang::UnaryOperator* UO = MR.Nodes.getNodeAs("uno"); + + SourceLocation SL = UO->getLocStart(); + CheckSLValidity(SL); + SL = Devi::SourceLocationHasMacro(SL, Rewrite); + + const Expr* EXP = UO->getSubExpr(); + const ast_type_traits::DynTypedNode DynNode = ast_type_traits::DynTypedNode::create(*EXP); + bruiser::TypeInfo TIProto(&DynNode); + + const clang::Type* CTP = TIProto.getTypeInfo(MR.Context); + + //Matcher.addMatcher(); + } + + if (MR.Nodes.getNodeAs("dous") != nullptr) + { + const clang::BinaryOperator* BO = MR.Nodes.getNodeAs("dous"); + + SourceLocation SL = BO->getLocStart(); + CheckSLValidity(SL); + SL = Devi::SourceLocationHasMacro(SL, Rewrite); + + const Expr* LHS = BO->getLHS(); + const Expr* RHS = BO->getRHS(); + + QualType LQT = LHS->getType(); + QualType RQT = RHS->getType(); + + const clang::Type* LTP = LQT.getTypePtr(); + const clang::Type* RTP = RQT.getTypePtr(); + + const clang::Type* CLTP = MR.Context->getCanonicalType(LTP); + const clang::Type* CRTP = MR.Context->getCanonicalType(RTP); + } + } + + private: + Rewriter &Rewrite; + MatchFinder Matcher; +}; /**********************************************************************************************************************/ /**********************************************************************************************************************/ class MyASTConsumer : public ASTConsumer { public: - MyASTConsumer(Rewriter &R) {} + MyASTConsumer(Rewriter &R) : HIfBreaker(R) + {} + + void HandleTranslationUnit(ASTContext &Context) override + { + Matcher.addMatcher(ifStmt(hasDescendant(expr(anyOf(unaryOperator().bind("uno"), binaryOperator().bind("dous"))))), &HIfBreaker); - void HandleTranslationUnit(ASTContext &Context) override { Matcher.matchAST(Context); } private: + IfBreaker HIfBreaker; MatchFinder Matcher; + Rewriter R; }; /**********************************************************************************************************************/ -class MyFrontendAction : public ASTFrontendAction { +class MyFrontendAction : public ASTFrontendAction +{ public: MyFrontendAction() {} - void EndSourceFileAction() override { + void EndSourceFileAction() override + { TheRewriter.getEditBuffer(TheRewriter.getSourceMgr().getMainFileID()).write(llvm::outs()); } - std::unique_ptr CreateASTConsumer(CompilerInstance &CI, StringRef file) override { + std::unique_ptr CreateASTConsumer(CompilerInstance &CI, StringRef file) override + { TheRewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts()); return llvm::make_unique(TheRewriter); } @@ -84,10 +221,13 @@ private: }; /**********************************************************************************************************************/ /*Main*/ -int main(int argc, const char **argv) { +int main(int argc, const char **argv) +{ CommonOptionsParser op(argc, argv, BruiserCategory); ClangTool Tool(op.getCompilations(), op.getSourcePathList()); + bruiser::BruiserReport BruiseRep; + return Tool.run(newFrontendActionFactory().get()); } /*last line interntionally left blank.*/ -- cgit v1.2.3