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