annotate clang/lib/AST/DeclOpenMP.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- DeclOpenMP.cpp - Declaration OpenMP AST Node Implementation ------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 /// \file
anatofuz
parents:
diff changeset
9 /// This file implements OMPThreadPrivateDecl, OMPCapturedExprDecl
anatofuz
parents:
diff changeset
10 /// classes.
anatofuz
parents:
diff changeset
11 ///
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
15 #include "clang/AST/Decl.h"
anatofuz
parents:
diff changeset
16 #include "clang/AST/DeclBase.h"
anatofuz
parents:
diff changeset
17 #include "clang/AST/DeclOpenMP.h"
anatofuz
parents:
diff changeset
18 #include "clang/AST/Expr.h"
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 using namespace clang;
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
23 // OMPThreadPrivateDecl Implementation.
anatofuz
parents:
diff changeset
24 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 void OMPThreadPrivateDecl::anchor() { }
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 OMPThreadPrivateDecl *OMPThreadPrivateDecl::Create(ASTContext &C,
anatofuz
parents:
diff changeset
29 DeclContext *DC,
anatofuz
parents:
diff changeset
30 SourceLocation L,
anatofuz
parents:
diff changeset
31 ArrayRef<Expr *> VL) {
anatofuz
parents:
diff changeset
32 OMPThreadPrivateDecl *D =
anatofuz
parents:
diff changeset
33 new (C, DC, additionalSizeToAlloc<Expr *>(VL.size()))
anatofuz
parents:
diff changeset
34 OMPThreadPrivateDecl(OMPThreadPrivate, DC, L);
anatofuz
parents:
diff changeset
35 D->NumVars = VL.size();
anatofuz
parents:
diff changeset
36 D->setVars(VL);
anatofuz
parents:
diff changeset
37 return D;
anatofuz
parents:
diff changeset
38 }
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 OMPThreadPrivateDecl *OMPThreadPrivateDecl::CreateDeserialized(ASTContext &C,
anatofuz
parents:
diff changeset
41 unsigned ID,
anatofuz
parents:
diff changeset
42 unsigned N) {
anatofuz
parents:
diff changeset
43 OMPThreadPrivateDecl *D = new (C, ID, additionalSizeToAlloc<Expr *>(N))
anatofuz
parents:
diff changeset
44 OMPThreadPrivateDecl(OMPThreadPrivate, nullptr, SourceLocation());
anatofuz
parents:
diff changeset
45 D->NumVars = N;
anatofuz
parents:
diff changeset
46 return D;
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 void OMPThreadPrivateDecl::setVars(ArrayRef<Expr *> VL) {
anatofuz
parents:
diff changeset
50 assert(VL.size() == NumVars &&
anatofuz
parents:
diff changeset
51 "Number of variables is not the same as the preallocated buffer");
anatofuz
parents:
diff changeset
52 std::uninitialized_copy(VL.begin(), VL.end(), getTrailingObjects<Expr *>());
anatofuz
parents:
diff changeset
53 }
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
56 // OMPAllocateDecl Implementation.
anatofuz
parents:
diff changeset
57 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 void OMPAllocateDecl::anchor() { }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 OMPAllocateDecl *OMPAllocateDecl::Create(ASTContext &C, DeclContext *DC,
anatofuz
parents:
diff changeset
62 SourceLocation L, ArrayRef<Expr *> VL,
anatofuz
parents:
diff changeset
63 ArrayRef<OMPClause *> CL) {
anatofuz
parents:
diff changeset
64 OMPAllocateDecl *D = new (
anatofuz
parents:
diff changeset
65 C, DC, additionalSizeToAlloc<Expr *, OMPClause *>(VL.size(), CL.size()))
anatofuz
parents:
diff changeset
66 OMPAllocateDecl(OMPAllocate, DC, L);
anatofuz
parents:
diff changeset
67 D->NumVars = VL.size();
anatofuz
parents:
diff changeset
68 D->setVars(VL);
anatofuz
parents:
diff changeset
69 D->NumClauses = CL.size();
anatofuz
parents:
diff changeset
70 D->setClauses(CL);
anatofuz
parents:
diff changeset
71 return D;
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 OMPAllocateDecl *OMPAllocateDecl::CreateDeserialized(ASTContext &C, unsigned ID,
anatofuz
parents:
diff changeset
75 unsigned NVars,
anatofuz
parents:
diff changeset
76 unsigned NClauses) {
anatofuz
parents:
diff changeset
77 OMPAllocateDecl *D =
anatofuz
parents:
diff changeset
78 new (C, ID, additionalSizeToAlloc<Expr *, OMPClause *>(NVars, NClauses))
anatofuz
parents:
diff changeset
79 OMPAllocateDecl(OMPAllocate, nullptr, SourceLocation());
anatofuz
parents:
diff changeset
80 D->NumVars = NVars;
anatofuz
parents:
diff changeset
81 D->NumClauses = NClauses;
anatofuz
parents:
diff changeset
82 return D;
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 void OMPAllocateDecl::setVars(ArrayRef<Expr *> VL) {
anatofuz
parents:
diff changeset
86 assert(VL.size() == NumVars &&
anatofuz
parents:
diff changeset
87 "Number of variables is not the same as the preallocated buffer");
anatofuz
parents:
diff changeset
88 std::uninitialized_copy(VL.begin(), VL.end(), getTrailingObjects<Expr *>());
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 void OMPAllocateDecl::setClauses(ArrayRef<OMPClause *> CL) {
anatofuz
parents:
diff changeset
92 assert(CL.size() == NumClauses &&
anatofuz
parents:
diff changeset
93 "Number of variables is not the same as the preallocated buffer");
anatofuz
parents:
diff changeset
94 std::uninitialized_copy(CL.begin(), CL.end(),
anatofuz
parents:
diff changeset
95 getTrailingObjects<OMPClause *>());
anatofuz
parents:
diff changeset
96 }
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
99 // OMPRequiresDecl Implementation.
anatofuz
parents:
diff changeset
100 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
101
anatofuz
parents:
diff changeset
102 void OMPRequiresDecl::anchor() {}
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 OMPRequiresDecl *OMPRequiresDecl::Create(ASTContext &C, DeclContext *DC,
anatofuz
parents:
diff changeset
105 SourceLocation L,
anatofuz
parents:
diff changeset
106 ArrayRef<OMPClause *> CL) {
anatofuz
parents:
diff changeset
107 OMPRequiresDecl *D =
anatofuz
parents:
diff changeset
108 new (C, DC, additionalSizeToAlloc<OMPClause *>(CL.size()))
anatofuz
parents:
diff changeset
109 OMPRequiresDecl(OMPRequires, DC, L);
anatofuz
parents:
diff changeset
110 D->NumClauses = CL.size();
anatofuz
parents:
diff changeset
111 D->setClauses(CL);
anatofuz
parents:
diff changeset
112 return D;
anatofuz
parents:
diff changeset
113 }
anatofuz
parents:
diff changeset
114
anatofuz
parents:
diff changeset
115 OMPRequiresDecl *OMPRequiresDecl::CreateDeserialized(ASTContext &C, unsigned ID,
anatofuz
parents:
diff changeset
116 unsigned N) {
anatofuz
parents:
diff changeset
117 OMPRequiresDecl *D = new (C, ID, additionalSizeToAlloc<OMPClause *>(N))
anatofuz
parents:
diff changeset
118 OMPRequiresDecl(OMPRequires, nullptr, SourceLocation());
anatofuz
parents:
diff changeset
119 D->NumClauses = N;
anatofuz
parents:
diff changeset
120 return D;
anatofuz
parents:
diff changeset
121 }
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 void OMPRequiresDecl::setClauses(ArrayRef<OMPClause *> CL) {
anatofuz
parents:
diff changeset
124 assert(CL.size() == NumClauses &&
anatofuz
parents:
diff changeset
125 "Number of clauses is not the same as the preallocated buffer");
anatofuz
parents:
diff changeset
126 std::uninitialized_copy(CL.begin(), CL.end(),
anatofuz
parents:
diff changeset
127 getTrailingObjects<OMPClause *>());
anatofuz
parents:
diff changeset
128 }
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
131 // OMPDeclareReductionDecl Implementation.
anatofuz
parents:
diff changeset
132 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 OMPDeclareReductionDecl::OMPDeclareReductionDecl(
anatofuz
parents:
diff changeset
135 Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name,
anatofuz
parents:
diff changeset
136 QualType Ty, OMPDeclareReductionDecl *PrevDeclInScope)
anatofuz
parents:
diff changeset
137 : ValueDecl(DK, DC, L, Name, Ty), DeclContext(DK), Combiner(nullptr),
anatofuz
parents:
diff changeset
138 PrevDeclInScope(PrevDeclInScope) {
anatofuz
parents:
diff changeset
139 setInitializer(nullptr, CallInit);
anatofuz
parents:
diff changeset
140 }
anatofuz
parents:
diff changeset
141
anatofuz
parents:
diff changeset
142 void OMPDeclareReductionDecl::anchor() {}
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 OMPDeclareReductionDecl *OMPDeclareReductionDecl::Create(
anatofuz
parents:
diff changeset
145 ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
anatofuz
parents:
diff changeset
146 QualType T, OMPDeclareReductionDecl *PrevDeclInScope) {
anatofuz
parents:
diff changeset
147 return new (C, DC) OMPDeclareReductionDecl(OMPDeclareReduction, DC, L, Name,
anatofuz
parents:
diff changeset
148 T, PrevDeclInScope);
anatofuz
parents:
diff changeset
149 }
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 OMPDeclareReductionDecl *
anatofuz
parents:
diff changeset
152 OMPDeclareReductionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
anatofuz
parents:
diff changeset
153 return new (C, ID) OMPDeclareReductionDecl(
anatofuz
parents:
diff changeset
154 OMPDeclareReduction, /*DC=*/nullptr, SourceLocation(), DeclarationName(),
anatofuz
parents:
diff changeset
155 QualType(), /*PrevDeclInScope=*/nullptr);
anatofuz
parents:
diff changeset
156 }
anatofuz
parents:
diff changeset
157
anatofuz
parents:
diff changeset
158 OMPDeclareReductionDecl *OMPDeclareReductionDecl::getPrevDeclInScope() {
anatofuz
parents:
diff changeset
159 return cast_or_null<OMPDeclareReductionDecl>(
anatofuz
parents:
diff changeset
160 PrevDeclInScope.get(getASTContext().getExternalSource()));
anatofuz
parents:
diff changeset
161 }
anatofuz
parents:
diff changeset
162 const OMPDeclareReductionDecl *
anatofuz
parents:
diff changeset
163 OMPDeclareReductionDecl::getPrevDeclInScope() const {
anatofuz
parents:
diff changeset
164 return cast_or_null<OMPDeclareReductionDecl>(
anatofuz
parents:
diff changeset
165 PrevDeclInScope.get(getASTContext().getExternalSource()));
anatofuz
parents:
diff changeset
166 }
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
169 // OMPDeclareMapperDecl Implementation.
anatofuz
parents:
diff changeset
170 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
171
anatofuz
parents:
diff changeset
172 void OMPDeclareMapperDecl::anchor() {}
anatofuz
parents:
diff changeset
173
anatofuz
parents:
diff changeset
174 OMPDeclareMapperDecl *
anatofuz
parents:
diff changeset
175 OMPDeclareMapperDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
anatofuz
parents:
diff changeset
176 DeclarationName Name, QualType T,
anatofuz
parents:
diff changeset
177 DeclarationName VarName,
anatofuz
parents:
diff changeset
178 OMPDeclareMapperDecl *PrevDeclInScope) {
anatofuz
parents:
diff changeset
179 return new (C, DC) OMPDeclareMapperDecl(OMPDeclareMapper, DC, L, Name, T,
anatofuz
parents:
diff changeset
180 VarName, PrevDeclInScope);
anatofuz
parents:
diff changeset
181 }
anatofuz
parents:
diff changeset
182
anatofuz
parents:
diff changeset
183 OMPDeclareMapperDecl *OMPDeclareMapperDecl::CreateDeserialized(ASTContext &C,
anatofuz
parents:
diff changeset
184 unsigned ID,
anatofuz
parents:
diff changeset
185 unsigned N) {
anatofuz
parents:
diff changeset
186 auto *D = new (C, ID)
anatofuz
parents:
diff changeset
187 OMPDeclareMapperDecl(OMPDeclareMapper, /*DC=*/nullptr, SourceLocation(),
anatofuz
parents:
diff changeset
188 DeclarationName(), QualType(), DeclarationName(),
anatofuz
parents:
diff changeset
189 /*PrevDeclInScope=*/nullptr);
anatofuz
parents:
diff changeset
190 if (N) {
anatofuz
parents:
diff changeset
191 auto **ClauseStorage = C.Allocate<OMPClause *>(N);
anatofuz
parents:
diff changeset
192 D->Clauses = llvm::makeMutableArrayRef<OMPClause *>(ClauseStorage, N);
anatofuz
parents:
diff changeset
193 }
anatofuz
parents:
diff changeset
194 return D;
anatofuz
parents:
diff changeset
195 }
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 /// Creates an array of clauses to this mapper declaration and intializes
anatofuz
parents:
diff changeset
198 /// them. The space used to store clause pointers is dynamically allocated,
anatofuz
parents:
diff changeset
199 /// because we do not know the number of clauses when creating
anatofuz
parents:
diff changeset
200 /// OMPDeclareMapperDecl
anatofuz
parents:
diff changeset
201 void OMPDeclareMapperDecl::CreateClauses(ASTContext &C,
anatofuz
parents:
diff changeset
202 ArrayRef<OMPClause *> CL) {
anatofuz
parents:
diff changeset
203 assert(Clauses.empty() && "Number of clauses should be 0 on initialization");
anatofuz
parents:
diff changeset
204 size_t NumClauses = CL.size();
anatofuz
parents:
diff changeset
205 if (NumClauses) {
anatofuz
parents:
diff changeset
206 auto **ClauseStorage = C.Allocate<OMPClause *>(NumClauses);
anatofuz
parents:
diff changeset
207 Clauses = llvm::makeMutableArrayRef<OMPClause *>(ClauseStorage, NumClauses);
anatofuz
parents:
diff changeset
208 setClauses(CL);
anatofuz
parents:
diff changeset
209 }
anatofuz
parents:
diff changeset
210 }
anatofuz
parents:
diff changeset
211
anatofuz
parents:
diff changeset
212 void OMPDeclareMapperDecl::setClauses(ArrayRef<OMPClause *> CL) {
anatofuz
parents:
diff changeset
213 assert(CL.size() == Clauses.size() &&
anatofuz
parents:
diff changeset
214 "Number of clauses is not the same as the preallocated buffer");
anatofuz
parents:
diff changeset
215 std::uninitialized_copy(CL.begin(), CL.end(), Clauses.data());
anatofuz
parents:
diff changeset
216 }
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() {
anatofuz
parents:
diff changeset
219 return cast_or_null<OMPDeclareMapperDecl>(
anatofuz
parents:
diff changeset
220 PrevDeclInScope.get(getASTContext().getExternalSource()));
anatofuz
parents:
diff changeset
221 }
anatofuz
parents:
diff changeset
222
anatofuz
parents:
diff changeset
223 const OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() const {
anatofuz
parents:
diff changeset
224 return cast_or_null<OMPDeclareMapperDecl>(
anatofuz
parents:
diff changeset
225 PrevDeclInScope.get(getASTContext().getExternalSource()));
anatofuz
parents:
diff changeset
226 }
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
229 // OMPCapturedExprDecl Implementation.
anatofuz
parents:
diff changeset
230 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
231
anatofuz
parents:
diff changeset
232 void OMPCapturedExprDecl::anchor() {}
anatofuz
parents:
diff changeset
233
anatofuz
parents:
diff changeset
234 OMPCapturedExprDecl *OMPCapturedExprDecl::Create(ASTContext &C, DeclContext *DC,
anatofuz
parents:
diff changeset
235 IdentifierInfo *Id, QualType T,
anatofuz
parents:
diff changeset
236 SourceLocation StartLoc) {
anatofuz
parents:
diff changeset
237 return new (C, DC) OMPCapturedExprDecl(
anatofuz
parents:
diff changeset
238 C, DC, Id, T, C.getTrivialTypeSourceInfo(T), StartLoc);
anatofuz
parents:
diff changeset
239 }
anatofuz
parents:
diff changeset
240
anatofuz
parents:
diff changeset
241 OMPCapturedExprDecl *OMPCapturedExprDecl::CreateDeserialized(ASTContext &C,
anatofuz
parents:
diff changeset
242 unsigned ID) {
anatofuz
parents:
diff changeset
243 return new (C, ID) OMPCapturedExprDecl(C, nullptr, nullptr, QualType(),
anatofuz
parents:
diff changeset
244 /*TInfo=*/nullptr, SourceLocation());
anatofuz
parents:
diff changeset
245 }
anatofuz
parents:
diff changeset
246
anatofuz
parents:
diff changeset
247 SourceRange OMPCapturedExprDecl::getSourceRange() const {
anatofuz
parents:
diff changeset
248 assert(hasInit());
anatofuz
parents:
diff changeset
249 return SourceRange(getInit()->getBeginLoc(), getInit()->getEndLoc());
anatofuz
parents:
diff changeset
250 }