Index: cfe/trunk/include/clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h =================================================================== --- cfe/trunk/include/clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h +++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h @@ -0,0 +1,97 @@ +//===-- MPIFunctionClassifier.h - classifies MPI functions ----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file defines functionality to identify and classify MPI functions. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPIFUNCTIONCLASSIFIER_H +#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPIFUNCTIONCLASSIFIER_H + +#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" + +namespace clang { +namespace ento { +namespace mpi { + +class MPIFunctionClassifier { +public: + MPIFunctionClassifier(ASTContext &ASTCtx) { identifierInit(ASTCtx); } + + // general identifiers + bool isMPIType(const IdentifierInfo *const IdentInfo) const; + bool isNonBlockingType(const IdentifierInfo *const IdentInfo) const; + + // point-to-point identifiers + bool isPointToPointType(const IdentifierInfo *const IdentInfo) const; + + // collective identifiers + bool isCollectiveType(const IdentifierInfo *const IdentInfo) const; + bool isCollToColl(const IdentifierInfo *const IdentInfo) const; + bool isScatterType(const IdentifierInfo *const IdentInfo) const; + bool isGatherType(const IdentifierInfo *const IdentInfo) const; + bool isAllgatherType(const IdentifierInfo *const IdentInfo) const; + bool isAlltoallType(const IdentifierInfo *const IdentInfo) const; + bool isReduceType(const IdentifierInfo *const IdentInfo) const; + bool isBcastType(const IdentifierInfo *const IdentInfo) const; + + // additional identifiers + bool isMPI_Wait(const IdentifierInfo *const IdentInfo) const; + bool isMPI_Waitall(const IdentifierInfo *const IdentInfo) const; + bool isWaitType(const IdentifierInfo *const IdentInfo) const; + +private: + // Initializes function identifiers, to recognize them during analysis. + void identifierInit(ASTContext &ASTCtx); + void initPointToPointIdentifiers(ASTContext &ASTCtx); + void initCollectiveIdentifiers(ASTContext &ASTCtx); + void initAdditionalIdentifiers(ASTContext &ASTCtx); + + // The containers are used, to enable classification of MPI-functions during + // analysis. + llvm::SmallVector MPINonBlockingTypes; + + llvm::SmallVector MPIPointToPointTypes; + llvm::SmallVector MPICollectiveTypes; + + llvm::SmallVector MPIPointToCollTypes; + llvm::SmallVector MPICollToPointTypes; + llvm::SmallVector MPICollToCollTypes; + + llvm::SmallVector MPIType; + + // point-to-point functions + IdentifierInfo *IdentInfo_MPI_Send = nullptr, *IdentInfo_MPI_Isend = nullptr, + *IdentInfo_MPI_Ssend = nullptr, *IdentInfo_MPI_Issend = nullptr, + *IdentInfo_MPI_Bsend = nullptr, *IdentInfo_MPI_Ibsend = nullptr, + *IdentInfo_MPI_Rsend = nullptr, *IdentInfo_MPI_Irsend = nullptr, + *IdentInfo_MPI_Recv = nullptr, *IdentInfo_MPI_Irecv = nullptr; + + // collective functions + IdentifierInfo *IdentInfo_MPI_Scatter = nullptr, + *IdentInfo_MPI_Iscatter = nullptr, *IdentInfo_MPI_Gather = nullptr, + *IdentInfo_MPI_Igather = nullptr, *IdentInfo_MPI_Allgather = nullptr, + *IdentInfo_MPI_Iallgather = nullptr, *IdentInfo_MPI_Bcast = nullptr, + *IdentInfo_MPI_Ibcast = nullptr, *IdentInfo_MPI_Reduce = nullptr, + *IdentInfo_MPI_Ireduce = nullptr, *IdentInfo_MPI_Allreduce = nullptr, + *IdentInfo_MPI_Iallreduce = nullptr, *IdentInfo_MPI_Alltoall = nullptr, + *IdentInfo_MPI_Ialltoall = nullptr, *IdentInfo_MPI_Barrier = nullptr; + + // additional functions + IdentifierInfo *IdentInfo_MPI_Comm_rank = nullptr, + *IdentInfo_MPI_Comm_size = nullptr, *IdentInfo_MPI_Wait = nullptr, + *IdentInfo_MPI_Waitall = nullptr; +}; + +} // end of namespace: mpi +} // end of namespace: ento +} // end of namespace: clang + +#endif Index: cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.h =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.h +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.h @@ -19,8 +19,8 @@ #define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPICHECKER_H #include "MPIBugReporter.h" -#include "MPIFunctionClassifier.h" #include "MPITypes.h" +#include "clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" @@ -30,7 +30,7 @@ class MPIChecker : public Checker { public: - MPIChecker() : BReporter(*this) { } + MPIChecker() : BReporter(*this) {} // path-sensitive callbacks void checkPreCall(const CallEvent &CE, CheckerContext &Ctx) const { @@ -49,7 +49,6 @@ return; const_cast &>(FuncClassifier) .reset(new MPIFunctionClassifier{Ctx.getASTContext()}); - } /// Checks if a request is used by nonblocking calls multiple times Index: cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.cpp +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.cpp @@ -43,7 +43,8 @@ // double nonblocking detected if (Req && Req->CurrentState == Request::State::Nonblocking) { ExplodedNode *ErrorNode = Ctx.generateNonFatalErrorNode(); - BReporter.reportDoubleNonblocking(PreCallEvent, *Req, MR, ErrorNode, Ctx.getBugReporter()); + BReporter.reportDoubleNonblocking(PreCallEvent, *Req, MR, ErrorNode, + Ctx.getBugReporter()); Ctx.addTransition(ErrorNode->getState(), ErrorNode); } // no error @@ -85,7 +86,8 @@ State = ErrorNode->getState(); } // A wait has no matching nonblocking call. - BReporter.reportUnmatchedWait(PreCallEvent, ReqRegion, ErrorNode, Ctx.getBugReporter()); + BReporter.reportUnmatchedWait(PreCallEvent, ReqRegion, ErrorNode, + Ctx.getBugReporter()); } } @@ -118,7 +120,8 @@ ErrorNode = Ctx.generateNonFatalErrorNode(State, &Tag); State = ErrorNode->getState(); } - BReporter.reportMissingWait(Req.second, Req.first, ErrorNode, Ctx.getBugReporter()); + BReporter.reportMissingWait(Req.second, Req.first, ErrorNode, + Ctx.getBugReporter()); } State = State->remove(Req.first); } Index: cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIFunctionClassifier.h =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIFunctionClassifier.h +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIFunctionClassifier.h @@ -1,97 +0,0 @@ -//===-- MPIFunctionClassifier.h - classifies MPI functions ----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// -/// \file -/// This file defines functionality to identify and classify MPI functions. -/// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPIFUNCTIONCLASSIFIER_H -#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPIFUNCTIONCLASSIFIER_H - -#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" - -namespace clang { -namespace ento { -namespace mpi { - -class MPIFunctionClassifier { -public: - MPIFunctionClassifier(ASTContext &ASTCtx) { identifierInit(ASTCtx); } - - // general identifiers - bool isMPIType(const IdentifierInfo *const IdentInfo) const; - bool isNonBlockingType(const IdentifierInfo *const IdentInfo) const; - - // point-to-point identifiers - bool isPointToPointType(const IdentifierInfo *const IdentInfo) const; - - // collective identifiers - bool isCollectiveType(const IdentifierInfo *const IdentInfo) const; - bool isCollToColl(const IdentifierInfo *const IdentInfo) const; - bool isScatterType(const IdentifierInfo *const IdentInfo) const; - bool isGatherType(const IdentifierInfo *const IdentInfo) const; - bool isAllgatherType(const IdentifierInfo *const IdentInfo) const; - bool isAlltoallType(const IdentifierInfo *const IdentInfo) const; - bool isReduceType(const IdentifierInfo *const IdentInfo) const; - bool isBcastType(const IdentifierInfo *const IdentInfo) const; - - // additional identifiers - bool isMPI_Wait(const IdentifierInfo *const IdentInfo) const; - bool isMPI_Waitall(const IdentifierInfo *const IdentInfo) const; - bool isWaitType(const IdentifierInfo *const IdentInfo) const; - -private: - // Initializes function identifiers, to recognize them during analysis. - void identifierInit(ASTContext &ASTCtx); - void initPointToPointIdentifiers(ASTContext &ASTCtx); - void initCollectiveIdentifiers(ASTContext &ASTCtx); - void initAdditionalIdentifiers(ASTContext &ASTCtx); - - // The containers are used, to enable classification of MPI-functions during - // analysis. - llvm::SmallVector MPINonBlockingTypes; - - llvm::SmallVector MPIPointToPointTypes; - llvm::SmallVector MPICollectiveTypes; - - llvm::SmallVector MPIPointToCollTypes; - llvm::SmallVector MPICollToPointTypes; - llvm::SmallVector MPICollToCollTypes; - - llvm::SmallVector MPIType; - - // point-to-point functions - IdentifierInfo *IdentInfo_MPI_Send = nullptr, *IdentInfo_MPI_Isend = nullptr, - *IdentInfo_MPI_Ssend = nullptr, *IdentInfo_MPI_Issend = nullptr, - *IdentInfo_MPI_Bsend = nullptr, *IdentInfo_MPI_Ibsend = nullptr, - *IdentInfo_MPI_Rsend = nullptr, *IdentInfo_MPI_Irsend = nullptr, - *IdentInfo_MPI_Recv = nullptr, *IdentInfo_MPI_Irecv = nullptr; - - // collective functions - IdentifierInfo *IdentInfo_MPI_Scatter = nullptr, - *IdentInfo_MPI_Iscatter = nullptr, *IdentInfo_MPI_Gather = nullptr, - *IdentInfo_MPI_Igather = nullptr, *IdentInfo_MPI_Allgather = nullptr, - *IdentInfo_MPI_Iallgather = nullptr, *IdentInfo_MPI_Bcast = nullptr, - *IdentInfo_MPI_Ibcast = nullptr, *IdentInfo_MPI_Reduce = nullptr, - *IdentInfo_MPI_Ireduce = nullptr, *IdentInfo_MPI_Allreduce = nullptr, - *IdentInfo_MPI_Iallreduce = nullptr, *IdentInfo_MPI_Alltoall = nullptr, - *IdentInfo_MPI_Ialltoall = nullptr, *IdentInfo_MPI_Barrier = nullptr; - - // additional functions - IdentifierInfo *IdentInfo_MPI_Comm_rank = nullptr, - *IdentInfo_MPI_Comm_size = nullptr, *IdentInfo_MPI_Wait = nullptr, - *IdentInfo_MPI_Waitall = nullptr; -}; - -} // end of namespace: mpi -} // end of namespace: ento -} // end of namespace: clang - -#endif Index: cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIFunctionClassifier.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIFunctionClassifier.cpp +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIFunctionClassifier.cpp @@ -12,7 +12,7 @@ /// //===----------------------------------------------------------------------===// -#include "MPIFunctionClassifier.h" +#include "clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h" #include "llvm/ADT/STLExtras.h" namespace clang { Index: cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPITypes.h =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPITypes.h +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MPI-Checker/MPITypes.h @@ -17,7 +17,7 @@ #ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPITYPES_H #define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPITYPES_H -#include "MPIFunctionClassifier.h" +#include "clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" #include "llvm/ADT/SmallSet.h" @@ -53,7 +53,6 @@ } // end of namespace: mpi - template <> struct ProgramStateTrait : public ProgramStatePartialTrait {