clang 10.0.0git

MPIFunctionClassifier.cpp
Go to the documentation of this file.
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// 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
17 namespace clang {
18 namespace ento {
19 namespace mpi {
20
21 void MPIFunctionClassifier::identifierInit(ASTContext &ASTCtx) {
22 // Initialize function identifiers.
23 initPointToPointIdentifiers(ASTCtx);
24 initCollectiveIdentifiers(ASTCtx);
25 initAdditionalIdentifiers(ASTCtx);
26 }
27
28 void 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
85 void 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
179 void 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 identifiers
203 bool MPIFunctionClassifier::isMPIType(const IdentifierInfo *IdentInfo) const {
204 return llvm::is_contained(MPIType, IdentInfo);
205 }
206
207 bool MPIFunctionClassifier::isNonBlockingType(
208 const IdentifierInfo *IdentInfo) const {
209 return llvm::is_contained(MPINonBlockingTypes, IdentInfo);
210 }
211
212 // point-to-point identifiers
213 bool MPIFunctionClassifier::isPointToPointType(
214 const IdentifierInfo *IdentInfo) const {
215 return llvm::is_contained(MPIPointToPointTypes, IdentInfo);
216 }
217
218 // collective identifiers
219 bool MPIFunctionClassifier::isCollectiveType(
220 const IdentifierInfo *IdentInfo) const {
221 return llvm::is_contained(MPICollectiveTypes, IdentInfo);
222 }
223
224 bool MPIFunctionClassifier::isCollToColl(
225 const IdentifierInfo *IdentInfo) const {
226 return llvm::is_contained(MPICollToCollTypes, IdentInfo);
227 }
228
229 bool MPIFunctionClassifier::isScatterType(
230 const IdentifierInfo *IdentInfo) const {
231 return IdentInfo == IdentInfo_MPI_Scatter ||
232 IdentInfo == IdentInfo_MPI_Iscatter;
233 }
234
235 bool 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
243 bool MPIFunctionClassifier::isAllgatherType(
244 const IdentifierInfo *IdentInfo) const {
245 return IdentInfo == IdentInfo_MPI_Allgather ||
246 IdentInfo == IdentInfo_MPI_Iallgather;
247 }
248
249 bool MPIFunctionClassifier::isAlltoallType(
250 const IdentifierInfo *IdentInfo) const {
251 return IdentInfo == IdentInfo_MPI_Alltoall ||
252 IdentInfo == IdentInfo_MPI_Ialltoall;
253 }
254
255 bool MPIFunctionClassifier::isBcastType(const IdentifierInfo *IdentInfo) const {
256 return IdentInfo == IdentInfo_MPI_Bcast || IdentInfo == IdentInfo_MPI_Ibcast;
257 }
258
259 bool 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 identifiers
268 bool MPIFunctionClassifier::isMPI_Wait(const IdentifierInfo *IdentInfo) const {
269 return IdentInfo == IdentInfo_MPI_Wait;
270 }
271
272 bool MPIFunctionClassifier::isMPI_Waitall(
273 const IdentifierInfo *IdentInfo) const {
274 return IdentInfo == IdentInfo_MPI_Waitall;
275 }
276
277 bool MPIFunctionClassifier::isWaitType(const IdentifierInfo *IdentInfo) const {
278 return IdentInfo == IdentInfo_MPI_Wait || IdentInfo == IdentInfo_MPI_Waitall;
279 }
280
281 } // end of namespace: mpi
282 } // end of namespace: ento
283 } // end of namespace: clang
ento
clang::ento::mpi::MPIFunctionClassifier::isCollectiveType
bool isCollectiveType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:219
clang::ento::mpi::MPIFunctionClassifier::isAlltoallType
bool isAlltoallType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:249
clang::IdentifierInfo
One of these records is kept for each identifier that is lexed.
Definition: IdentifierTable.h:57
clang::ento::mpi::MPIFunctionClassifier::isAllgatherType
bool isAllgatherType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:243
clang::ento::mpi::MPIFunctionClassifier::isNonBlockingType
bool isNonBlockingType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:207
clang::ento::mpi::MPIFunctionClassifier::isBcastType
bool isBcastType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:255
clang::ento::mpi::MPIFunctionClassifier::isMPI_Waitall
bool isMPI_Waitall(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:272
MPIFunctionClassifier.h
This file defines functionality to identify and classify MPI functions.
clang::ento::mpi::MPIFunctionClassifier::isMPI_Wait
bool isMPI_Wait(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:268
clang::ento::mpi::MPIFunctionClassifier::isScatterType
bool isScatterType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:229
clang::ento::mpi::MPIFunctionClassifier::isReduceType
bool isReduceType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:259
clang::ento::mpi::MPIFunctionClassifier::isWaitType
bool isWaitType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:277
clang
Dataflow Directional Tag Classes.
Definition: CFGReachabilityAnalysis.h:21
clang::ento::mpi::MPIFunctionClassifier::isPointToPointType
bool isPointToPointType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:213
clang::ento::mpi::MPIFunctionClassifier::isGatherType
bool isGatherType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:235
clang::ento::mpi::MPIFunctionClassifier::isCollToColl
bool isCollToColl(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:224
clang::ento::mpi::MPIFunctionClassifier::isMPIType
bool isMPIType(const IdentifierInfo *const IdentInfo) const
Definition: MPIFunctionClassifier.cpp:203