brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.5 KiB · 277b3ed Raw
284 lines · cpp
1//===-- MPIFunctionClassifier.cpp - classifies MPI functions ----*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file defines functionality to identify and classify MPI functions.11///12//===----------------------------------------------------------------------===//13 14#include "clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h"15#include "llvm/ADT/STLExtras.h"16 17namespace clang {18namespace ento {19namespace mpi {20 21void MPIFunctionClassifier::identifierInit(ASTContext &ASTCtx) {22  // Initialize function identifiers.23  initPointToPointIdentifiers(ASTCtx);24  initCollectiveIdentifiers(ASTCtx);25  initAdditionalIdentifiers(ASTCtx);26}27 28void MPIFunctionClassifier::initPointToPointIdentifiers(ASTContext &ASTCtx) {29  // Copy identifiers into the correct classification containers.30  IdentInfo_MPI_Send = &ASTCtx.Idents.get("MPI_Send");31  MPIPointToPointTypes.push_back(IdentInfo_MPI_Send);32  MPIType.push_back(IdentInfo_MPI_Send);33  assert(IdentInfo_MPI_Send);34 35  IdentInfo_MPI_Isend = &ASTCtx.Idents.get("MPI_Isend");36  MPIPointToPointTypes.push_back(IdentInfo_MPI_Isend);37  MPINonBlockingTypes.push_back(IdentInfo_MPI_Isend);38  MPIType.push_back(IdentInfo_MPI_Isend);39  assert(IdentInfo_MPI_Isend);40 41  IdentInfo_MPI_Ssend = &ASTCtx.Idents.get("MPI_Ssend");42  MPIPointToPointTypes.push_back(IdentInfo_MPI_Ssend);43  MPIType.push_back(IdentInfo_MPI_Ssend);44  assert(IdentInfo_MPI_Ssend);45 46  IdentInfo_MPI_Issend = &ASTCtx.Idents.get("MPI_Issend");47  MPIPointToPointTypes.push_back(IdentInfo_MPI_Issend);48  MPINonBlockingTypes.push_back(IdentInfo_MPI_Issend);49  MPIType.push_back(IdentInfo_MPI_Issend);50  assert(IdentInfo_MPI_Issend);51 52  IdentInfo_MPI_Bsend = &ASTCtx.Idents.get("MPI_Bsend");53  MPIPointToPointTypes.push_back(IdentInfo_MPI_Bsend);54  MPIType.push_back(IdentInfo_MPI_Bsend);55  assert(IdentInfo_MPI_Bsend);56 57  IdentInfo_MPI_Ibsend = &ASTCtx.Idents.get("MPI_Ibsend");58  MPIPointToPointTypes.push_back(IdentInfo_MPI_Ibsend);59  MPINonBlockingTypes.push_back(IdentInfo_MPI_Ibsend);60  MPIType.push_back(IdentInfo_MPI_Ibsend);61  assert(IdentInfo_MPI_Ibsend);62 63  IdentInfo_MPI_Rsend = &ASTCtx.Idents.get("MPI_Rsend");64  MPIPointToPointTypes.push_back(IdentInfo_MPI_Rsend);65  MPIType.push_back(IdentInfo_MPI_Rsend);66  assert(IdentInfo_MPI_Rsend);67 68  IdentInfo_MPI_Irsend = &ASTCtx.Idents.get("MPI_Irsend");69  MPIPointToPointTypes.push_back(IdentInfo_MPI_Irsend);70  MPIType.push_back(IdentInfo_MPI_Irsend);71  assert(IdentInfo_MPI_Irsend);72 73  IdentInfo_MPI_Recv = &ASTCtx.Idents.get("MPI_Recv");74  MPIPointToPointTypes.push_back(IdentInfo_MPI_Recv);75  MPIType.push_back(IdentInfo_MPI_Recv);76  assert(IdentInfo_MPI_Recv);77 78  IdentInfo_MPI_Irecv = &ASTCtx.Idents.get("MPI_Irecv");79  MPIPointToPointTypes.push_back(IdentInfo_MPI_Irecv);80  MPINonBlockingTypes.push_back(IdentInfo_MPI_Irecv);81  MPIType.push_back(IdentInfo_MPI_Irecv);82  assert(IdentInfo_MPI_Irecv);83}84 85void MPIFunctionClassifier::initCollectiveIdentifiers(ASTContext &ASTCtx) {86  // Copy identifiers into the correct classification containers.87  IdentInfo_MPI_Scatter = &ASTCtx.Idents.get("MPI_Scatter");88  MPICollectiveTypes.push_back(IdentInfo_MPI_Scatter);89  MPIPointToCollTypes.push_back(IdentInfo_MPI_Scatter);90  MPIType.push_back(IdentInfo_MPI_Scatter);91  assert(IdentInfo_MPI_Scatter);92 93  IdentInfo_MPI_Iscatter = &ASTCtx.Idents.get("MPI_Iscatter");94  MPICollectiveTypes.push_back(IdentInfo_MPI_Iscatter);95  MPIPointToCollTypes.push_back(IdentInfo_MPI_Iscatter);96  MPINonBlockingTypes.push_back(IdentInfo_MPI_Iscatter);97  MPIType.push_back(IdentInfo_MPI_Iscatter);98  assert(IdentInfo_MPI_Iscatter);99 100  IdentInfo_MPI_Gather = &ASTCtx.Idents.get("MPI_Gather");101  MPICollectiveTypes.push_back(IdentInfo_MPI_Gather);102  MPICollToPointTypes.push_back(IdentInfo_MPI_Gather);103  MPIType.push_back(IdentInfo_MPI_Gather);104  assert(IdentInfo_MPI_Gather);105 106  IdentInfo_MPI_Igather = &ASTCtx.Idents.get("MPI_Igather");107  MPICollectiveTypes.push_back(IdentInfo_MPI_Igather);108  MPICollToPointTypes.push_back(IdentInfo_MPI_Igather);109  MPINonBlockingTypes.push_back(IdentInfo_MPI_Igather);110  MPIType.push_back(IdentInfo_MPI_Igather);111  assert(IdentInfo_MPI_Igather);112 113  IdentInfo_MPI_Allgather = &ASTCtx.Idents.get("MPI_Allgather");114  MPICollectiveTypes.push_back(IdentInfo_MPI_Allgather);115  MPICollToCollTypes.push_back(IdentInfo_MPI_Allgather);116  MPIType.push_back(IdentInfo_MPI_Allgather);117  assert(IdentInfo_MPI_Allgather);118 119  IdentInfo_MPI_Iallgather = &ASTCtx.Idents.get("MPI_Iallgather");120  MPICollectiveTypes.push_back(IdentInfo_MPI_Iallgather);121  MPICollToCollTypes.push_back(IdentInfo_MPI_Iallgather);122  MPINonBlockingTypes.push_back(IdentInfo_MPI_Iallgather);123  MPIType.push_back(IdentInfo_MPI_Iallgather);124  assert(IdentInfo_MPI_Iallgather);125 126  IdentInfo_MPI_Bcast = &ASTCtx.Idents.get("MPI_Bcast");127  MPICollectiveTypes.push_back(IdentInfo_MPI_Bcast);128  MPIPointToCollTypes.push_back(IdentInfo_MPI_Bcast);129  MPIType.push_back(IdentInfo_MPI_Bcast);130  assert(IdentInfo_MPI_Bcast);131 132  IdentInfo_MPI_Ibcast = &ASTCtx.Idents.get("MPI_Ibcast");133  MPICollectiveTypes.push_back(IdentInfo_MPI_Ibcast);134  MPIPointToCollTypes.push_back(IdentInfo_MPI_Ibcast);135  MPINonBlockingTypes.push_back(IdentInfo_MPI_Ibcast);136  MPIType.push_back(IdentInfo_MPI_Ibcast);137  assert(IdentInfo_MPI_Ibcast);138 139  IdentInfo_MPI_Reduce = &ASTCtx.Idents.get("MPI_Reduce");140  MPICollectiveTypes.push_back(IdentInfo_MPI_Reduce);141  MPICollToPointTypes.push_back(IdentInfo_MPI_Reduce);142  MPIType.push_back(IdentInfo_MPI_Reduce);143  assert(IdentInfo_MPI_Reduce);144 145  IdentInfo_MPI_Ireduce = &ASTCtx.Idents.get("MPI_Ireduce");146  MPICollectiveTypes.push_back(IdentInfo_MPI_Ireduce);147  MPICollToPointTypes.push_back(IdentInfo_MPI_Ireduce);148  MPINonBlockingTypes.push_back(IdentInfo_MPI_Ireduce);149  MPIType.push_back(IdentInfo_MPI_Ireduce);150  assert(IdentInfo_MPI_Ireduce);151 152  IdentInfo_MPI_Allreduce = &ASTCtx.Idents.get("MPI_Allreduce");153  MPICollectiveTypes.push_back(IdentInfo_MPI_Allreduce);154  MPICollToCollTypes.push_back(IdentInfo_MPI_Allreduce);155  MPIType.push_back(IdentInfo_MPI_Allreduce);156  assert(IdentInfo_MPI_Allreduce);157 158  IdentInfo_MPI_Iallreduce = &ASTCtx.Idents.get("MPI_Iallreduce");159  MPICollectiveTypes.push_back(IdentInfo_MPI_Iallreduce);160  MPICollToCollTypes.push_back(IdentInfo_MPI_Iallreduce);161  MPINonBlockingTypes.push_back(IdentInfo_MPI_Iallreduce);162  MPIType.push_back(IdentInfo_MPI_Iallreduce);163  assert(IdentInfo_MPI_Iallreduce);164 165  IdentInfo_MPI_Alltoall = &ASTCtx.Idents.get("MPI_Alltoall");166  MPICollectiveTypes.push_back(IdentInfo_MPI_Alltoall);167  MPICollToCollTypes.push_back(IdentInfo_MPI_Alltoall);168  MPIType.push_back(IdentInfo_MPI_Alltoall);169  assert(IdentInfo_MPI_Alltoall);170 171  IdentInfo_MPI_Ialltoall = &ASTCtx.Idents.get("MPI_Ialltoall");172  MPICollectiveTypes.push_back(IdentInfo_MPI_Ialltoall);173  MPICollToCollTypes.push_back(IdentInfo_MPI_Ialltoall);174  MPINonBlockingTypes.push_back(IdentInfo_MPI_Ialltoall);175  MPIType.push_back(IdentInfo_MPI_Ialltoall);176  assert(IdentInfo_MPI_Ialltoall);177}178 179void MPIFunctionClassifier::initAdditionalIdentifiers(ASTContext &ASTCtx) {180  IdentInfo_MPI_Comm_rank = &ASTCtx.Idents.get("MPI_Comm_rank");181  MPIType.push_back(IdentInfo_MPI_Comm_rank);182  assert(IdentInfo_MPI_Comm_rank);183 184  IdentInfo_MPI_Comm_size = &ASTCtx.Idents.get("MPI_Comm_size");185  MPIType.push_back(IdentInfo_MPI_Comm_size);186  assert(IdentInfo_MPI_Comm_size);187 188  IdentInfo_MPI_Wait = &ASTCtx.Idents.get("MPI_Wait");189  MPIType.push_back(IdentInfo_MPI_Wait);190  assert(IdentInfo_MPI_Wait);191 192  IdentInfo_MPI_Waitall = &ASTCtx.Idents.get("MPI_Waitall");193  MPIType.push_back(IdentInfo_MPI_Waitall);194  assert(IdentInfo_MPI_Waitall);195 196  IdentInfo_MPI_Barrier = &ASTCtx.Idents.get("MPI_Barrier");197  MPICollectiveTypes.push_back(IdentInfo_MPI_Barrier);198  MPIType.push_back(IdentInfo_MPI_Barrier);199  assert(IdentInfo_MPI_Barrier);200}201 202// general identifiers203bool MPIFunctionClassifier::isMPIType(const IdentifierInfo *IdentInfo) const {204  return llvm::is_contained(MPIType, IdentInfo);205}206 207bool MPIFunctionClassifier::isNonBlockingType(208    const IdentifierInfo *IdentInfo) const {209  return llvm::is_contained(MPINonBlockingTypes, IdentInfo);210}211 212// point-to-point identifiers213bool MPIFunctionClassifier::isPointToPointType(214    const IdentifierInfo *IdentInfo) const {215  return llvm::is_contained(MPIPointToPointTypes, IdentInfo);216}217 218// collective identifiers219bool MPIFunctionClassifier::isCollectiveType(220    const IdentifierInfo *IdentInfo) const {221  return llvm::is_contained(MPICollectiveTypes, IdentInfo);222}223 224bool MPIFunctionClassifier::isCollToColl(225    const IdentifierInfo *IdentInfo) const {226  return llvm::is_contained(MPICollToCollTypes, IdentInfo);227}228 229bool MPIFunctionClassifier::isScatterType(230    const IdentifierInfo *IdentInfo) const {231  return IdentInfo == IdentInfo_MPI_Scatter ||232         IdentInfo == IdentInfo_MPI_Iscatter;233}234 235bool MPIFunctionClassifier::isGatherType(236    const IdentifierInfo *IdentInfo) const {237  return IdentInfo == IdentInfo_MPI_Gather ||238         IdentInfo == IdentInfo_MPI_Igather ||239         IdentInfo == IdentInfo_MPI_Allgather ||240         IdentInfo == IdentInfo_MPI_Iallgather;241}242 243bool MPIFunctionClassifier::isAllgatherType(244    const IdentifierInfo *IdentInfo) const {245  return IdentInfo == IdentInfo_MPI_Allgather ||246         IdentInfo == IdentInfo_MPI_Iallgather;247}248 249bool MPIFunctionClassifier::isAlltoallType(250    const IdentifierInfo *IdentInfo) const {251  return IdentInfo == IdentInfo_MPI_Alltoall ||252         IdentInfo == IdentInfo_MPI_Ialltoall;253}254 255bool MPIFunctionClassifier::isBcastType(const IdentifierInfo *IdentInfo) const {256  return IdentInfo == IdentInfo_MPI_Bcast || IdentInfo == IdentInfo_MPI_Ibcast;257}258 259bool MPIFunctionClassifier::isReduceType(260    const IdentifierInfo *IdentInfo) const {261  return IdentInfo == IdentInfo_MPI_Reduce ||262         IdentInfo == IdentInfo_MPI_Ireduce ||263         IdentInfo == IdentInfo_MPI_Allreduce ||264         IdentInfo == IdentInfo_MPI_Iallreduce;265}266 267// additional identifiers268bool MPIFunctionClassifier::isMPI_Wait(const IdentifierInfo *IdentInfo) const {269  return IdentInfo == IdentInfo_MPI_Wait;270}271 272bool MPIFunctionClassifier::isMPI_Waitall(273    const IdentifierInfo *IdentInfo) const {274  return IdentInfo == IdentInfo_MPI_Waitall;275}276 277bool MPIFunctionClassifier::isWaitType(const IdentifierInfo *IdentInfo) const {278  return IdentInfo == IdentInfo_MPI_Wait || IdentInfo == IdentInfo_MPI_Waitall;279}280 281} // end of namespace: mpi282} // end of namespace: ento283} // end of namespace: clang284