]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIFunctionClassifier.cpp
Update clang to trunk r290819 and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / StaticAnalyzer / Checkers / MPI-Checker / MPIFunctionClassifier.cpp
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 "clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h"
16 #include "llvm/ADT/STLExtras.h"
17
18 namespace clang {
19 namespace ento {
20 namespace mpi {
21
22 void MPIFunctionClassifier::identifierInit(ASTContext &ASTCtx) {
23   // Initialize function identifiers.
24   initPointToPointIdentifiers(ASTCtx);
25   initCollectiveIdentifiers(ASTCtx);
26   initAdditionalIdentifiers(ASTCtx);
27 }
28
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
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
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
204 bool MPIFunctionClassifier::isMPIType(const IdentifierInfo *IdentInfo) const {
205   return llvm::is_contained(MPIType, IdentInfo);
206 }
207
208 bool MPIFunctionClassifier::isNonBlockingType(
209     const IdentifierInfo *IdentInfo) const {
210   return llvm::is_contained(MPINonBlockingTypes, IdentInfo);
211 }
212
213 // point-to-point identifiers
214 bool MPIFunctionClassifier::isPointToPointType(
215     const IdentifierInfo *IdentInfo) const {
216   return llvm::is_contained(MPIPointToPointTypes, IdentInfo);
217 }
218
219 // collective identifiers
220 bool MPIFunctionClassifier::isCollectiveType(
221     const IdentifierInfo *IdentInfo) const {
222   return llvm::is_contained(MPICollectiveTypes, IdentInfo);
223 }
224
225 bool MPIFunctionClassifier::isCollToColl(
226     const IdentifierInfo *IdentInfo) const {
227   return llvm::is_contained(MPICollToCollTypes, IdentInfo);
228 }
229
230 bool MPIFunctionClassifier::isScatterType(
231     const IdentifierInfo *IdentInfo) const {
232   return IdentInfo == IdentInfo_MPI_Scatter ||
233          IdentInfo == IdentInfo_MPI_Iscatter;
234 }
235
236 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
244 bool MPIFunctionClassifier::isAllgatherType(
245     const IdentifierInfo *IdentInfo) const {
246   return IdentInfo == IdentInfo_MPI_Allgather ||
247          IdentInfo == IdentInfo_MPI_Iallgather;
248 }
249
250 bool MPIFunctionClassifier::isAlltoallType(
251     const IdentifierInfo *IdentInfo) const {
252   return IdentInfo == IdentInfo_MPI_Alltoall ||
253          IdentInfo == IdentInfo_MPI_Ialltoall;
254 }
255
256 bool MPIFunctionClassifier::isBcastType(const IdentifierInfo *IdentInfo) const {
257   return IdentInfo == IdentInfo_MPI_Bcast || IdentInfo == IdentInfo_MPI_Ibcast;
258 }
259
260 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
269 bool MPIFunctionClassifier::isMPI_Wait(const IdentifierInfo *IdentInfo) const {
270   return IdentInfo == IdentInfo_MPI_Wait;
271 }
272
273 bool MPIFunctionClassifier::isMPI_Waitall(
274     const IdentifierInfo *IdentInfo) const {
275   return IdentInfo == IdentInfo_MPI_Waitall;
276 }
277
278 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