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(-) (limited to 'bruiser/bruiser.cpp') 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 From 11d22f7d8b9ae021c234b581adcbc273ea8a1208 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Thu, 13 Apr 2017 23:31:38 +0430 Subject: added some more experimental stuff. right now bruiser can only hijack the main. --- bruiser/bruiser.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 84 insertions(+), 15 deletions(-) (limited to 'bruiser/bruiser.cpp') diff --git a/bruiser/bruiser.cpp b/bruiser/bruiser.cpp index 4371e25..439605b 100644 --- a/bruiser/bruiser.cpp +++ b/bruiser/bruiser.cpp @@ -98,7 +98,7 @@ class AbstractMatcherHandler : public virtual MatchFinder::MatchCallback class MatcherHandlerLVL0 : public AbstractMatcherHandler { public: - MatcherHandlerLVL0 (Rewriter &Rewrite) : AbstractMatcherHandler(Rewrite) {} + explicit MatcherHandlerLVL0 (Rewriter &Rewrite) : AbstractMatcherHandler(Rewrite) {} virtual void run(const MatchFinder::MatchResult &MR) override { @@ -111,21 +111,45 @@ class MatcherHandlerLVL0 : public AbstractMatcherHandler class NameFinder { public: - NameFinder (Rewriter &Rewrite) : Rewrite(Rewrite) {} + NameFinder () {} - virtual void runDeclRefExprMatcher(const llvm::StringRef __sr) - { - //Matcher.addMatcher(); - } - - virtual void runDeclMatcher(const llvm::StringRef __sr) - { - - } + class runDeclRefExprMatcher + { + public: + runDeclRefExprMatcher (Rewriter &__rwrt) : LVL0Proto(__rwrt), __rwrt(__rwrt) {} + + virtual void runMatcher(const StringRef __sr, ASTContext &__ctx) + { + Matcher.addMatcher(declRefExpr(to(namedDecl(hasName(__sr.str())))).bind("declrefexpbyname"), &LVL0Proto); + Matcher.matchAST(__ctx); + } + + private: + MatchFinder Matcher; + MatcherHandlerLVL0 LVL0Proto; + Rewriter __rwrt; + StringRef __sr; + }; + + class runNamedDeclMatcher + { + public: + runNamedDeclMatcher (Rewriter &__rwrt) : LVL0Proto(__rwrt), __rwrt(__rwrt) {} + + virtual void runMatcher(const StringRef __sr, ASTContext &__ctx) + { + Matcher.addMatcher(declRefExpr(to(namedDecl(hasName(__sr.str())))).bind("nameddeclbyname"), &LVL0Proto); + Matcher.matchAST(__ctx); + } + + private: + MatchFinder Matcher; + MatcherHandlerLVL0 LVL0Proto; + Rewriter __rwrt; + StringRef __sr; + }; private: - Rewriter &Rewrite; - MatchFinder Matcher; }; /**********************************************************************************************************************/ /**********************************************************************************************************************/ @@ -151,7 +175,6 @@ class IfBreaker : public MatchFinder::MatchCallback const clang::Type* CTP = TIProto.getTypeInfo(MR.Context); - //Matcher.addMatcher(); } if (MR.Nodes.getNodeAs("dous") != nullptr) @@ -181,22 +204,68 @@ class IfBreaker : public MatchFinder::MatchCallback MatchFinder Matcher; }; /**********************************************************************************************************************/ +/** + * @brief Hijacks the main main and replaces it with bruiser's main. + */ +class MainWrapper : public MatchFinder::MatchCallback +{ +public: + MainWrapper (Rewriter &Rewrite) : Rewrite(Rewrite) {} + + virtual void run(const MatchFinder::MatchResult &MR) + { + if (MR.Nodes.getNodeAs("mainwrapper") != nullptr) + { + const FunctionDecl* FD = MR.Nodes.getNodeAs("mainwrapper"); + + SourceLocation SL = FD->getLocStart(); + CheckSLValidity(SL); + SL = Devi::SourceLocationHasMacro(SL, Rewrite); + + SourceLocation SLE = FD->getLocEnd(); + CheckSLValidity(SLE); + SLE = Devi::SourceLocationHasMacro(SLE, Rewrite); + + SourceRange SR(SL, SLE); + + std::string MainSig = Rewrite.getRewrittenText(SR); + + size_t mainbegin = MainSig.find("main"); + + StringRef __sr("sub_main"); + + Rewrite.ReplaceText(SL.getLocWithOffset(mainbegin), 4U, __sr); + + Rewrite.InsertTextAfter(SLE.getLocWithOffset(1U), StringRef("\n\nint main(int argc, const char **argv)\n{\n\tsub_main(argc, argv);\n}")); + + //ruiseRep << "changed main main's name.\n" + } + } + + private: + Rewriter &Rewrite; +}; +/**********************************************************************************************************************/ +/**********************************************************************************************************************/ /**********************************************************************************************************************/ class MyASTConsumer : public ASTConsumer { public: - MyASTConsumer(Rewriter &R) : HIfBreaker(R) + MyASTConsumer(Rewriter &R) : HIfBreaker(R), HMainWrapper(R) {} void HandleTranslationUnit(ASTContext &Context) override { Matcher.addMatcher(ifStmt(hasDescendant(expr(anyOf(unaryOperator().bind("uno"), binaryOperator().bind("dous"))))), &HIfBreaker); + Matcher.addMatcher(functionDecl(hasName("main")).bind("mainwrapper"), &HMainWrapper); + Matcher.matchAST(Context); } private: IfBreaker HIfBreaker; + MainWrapper HMainWrapper; MatchFinder Matcher; Rewriter R; }; -- cgit v1.2.3