1303233Sdim//===-- MPITypes.h - Functionality to model MPI concepts --------*- C++ -*-===// 2303233Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6303233Sdim// 7303233Sdim//===----------------------------------------------------------------------===// 8303233Sdim/// 9303233Sdim/// \file 10303233Sdim/// This file provides definitions to model concepts of MPI. The mpi::Request 11303233Sdim/// class defines a wrapper class, in order to make MPI requests trackable for 12303233Sdim/// path-sensitive analysis. 13303233Sdim/// 14303233Sdim//===----------------------------------------------------------------------===// 15303233Sdim 16303233Sdim#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPITYPES_H 17303233Sdim#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPITYPES_H 18303233Sdim 19314564Sdim#include "clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h" 20303233Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" 21303233Sdim#include "llvm/ADT/SmallSet.h" 22303233Sdim 23303233Sdimnamespace clang { 24303233Sdimnamespace ento { 25303233Sdimnamespace mpi { 26303233Sdim 27303233Sdimclass Request { 28303233Sdimpublic: 29303233Sdim enum State : unsigned char { Nonblocking, Wait }; 30303233Sdim 31303233Sdim Request(State S) : CurrentState{S} {} 32303233Sdim 33303233Sdim void Profile(llvm::FoldingSetNodeID &Id) const { 34303233Sdim Id.AddInteger(CurrentState); 35303233Sdim } 36303233Sdim 37303233Sdim bool operator==(const Request &ToCompare) const { 38303233Sdim return CurrentState == ToCompare.CurrentState; 39303233Sdim } 40303233Sdim 41303233Sdim const State CurrentState; 42303233Sdim}; 43303233Sdim 44303233Sdim// The RequestMap stores MPI requests which are identified by their memory 45303233Sdim// region. Requests are used in MPI to complete nonblocking operations with wait 46303233Sdim// operations. A custom map implementation is used, in order to make it 47303233Sdim// available in an arbitrary amount of translation units. 48303233Sdimstruct RequestMap {}; 49303233Sdimtypedef llvm::ImmutableMap<const clang::ento::MemRegion *, 50303233Sdim clang::ento::mpi::Request> 51303233Sdim RequestMapImpl; 52303233Sdim 53303233Sdim} // end of namespace: mpi 54303233Sdim 55303233Sdimtemplate <> 56303233Sdimstruct ProgramStateTrait<mpi::RequestMap> 57303233Sdim : public ProgramStatePartialTrait<mpi::RequestMapImpl> { 58303233Sdim static void *GDMIndex() { 59303233Sdim static int index = 0; 60303233Sdim return &index; 61303233Sdim } 62303233Sdim}; 63303233Sdim 64303233Sdim} // end of namespace: ento 65303233Sdim} // end of namespace: clang 66303233Sdim#endif 67