diff options
Diffstat (limited to 'bruiser')
| -rw-r--r-- | bruiser/bruiser.cpp | 156 | ||||
| -rw-r--r-- | bruiser/bruiser.h | 50 | 
2 files changed, 197 insertions, 9 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 <string>  #include <iostream> -#include <cassert>  /*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<clang::Expr>(); + +  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<clang::UnaryOperator>("uno") != nullptr) +      { +        const clang::UnaryOperator* UO = MR.Nodes.getNodeAs<clang::UnaryOperator>("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<clang::Expr>(*EXP); +        bruiser::TypeInfo TIProto(&DynNode); + +        const clang::Type* CTP = TIProto.getTypeInfo(MR.Context); + +        //Matcher.addMatcher(); +      } + +      if (MR.Nodes.getNodeAs<clang::BinaryOperator>("dous") != nullptr) +      { +        const clang::BinaryOperator* BO = MR.Nodes.getNodeAs<clang::BinaryOperator>("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<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef file) override { +  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef file) override  +  {      TheRewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts());      return llvm::make_unique<MyASTConsumer>(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<MyFrontendAction>().get());  }  /*last line interntionally left blank.*/ diff --git a/bruiser/bruiser.h b/bruiser/bruiser.h index cf22e5e..fcfcaec 100644 --- a/bruiser/bruiser.h +++ b/bruiser/bruiser.h @@ -27,9 +27,57 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*  /*included modules*/  /*project headers*/  /*standard library headers*/ +#include <string> +#include <fstream> +/*clang headers*/ +#include "clang/AST/ASTContext.h" +#include "clang/AST/Expr.h" +#include "clang/AST/Type.h" +#include "clang/AST/ASTTypeTraits.h" +/*llvm headers*/ + +/**********************************************************************************************************************/ +/*using*/ +using namespace llvm; +using namespace clang; +/**********************************************************************************************************************/ +namespace bruiser +{ +/**********************************************************************************************************************/ +/** + * @brief This class hanhles the logging for bruiser. + */ +class BruiserReport +{ +  public: +    BruiserReport (); + +    ~BruiserReport(); + +    bool PrintToLog(std::string __in_arg); + +  private: +    std::ofstream BruiserLog; +}; +/**********************************************************************************************************************/ +/** + * @brief looks through types. + */ +class TypeInfo +{ +  public: +    explicit TypeInfo(const clang::ast_type_traits::DynTypedNode* __dtn); + +    ~TypeInfo(); + +    const clang::Type* getTypeInfo(clang::ASTContext* __astc); + +  private: +    const clang::ast_type_traits::DynTypedNode* DTN; +};  /**********************************************************************************************************************/ -/*externals*/  /**********************************************************************************************************************/ +} // end of namespace bruiser  #endif  /*last line intentionally left balnk.*/ | 
