1 //===--- DeclOpenMP.cpp - Declaration OpenMP AST Node Implementation ------===//
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 /// \file
9 /// This file implements OMPThreadPrivateDecl, OMPCapturedExprDecl
10 /// classes.
11 ///
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/Decl.h"
16 #include "clang/AST/DeclBase.h"
17 #include "clang/AST/DeclOpenMP.h"
18 #include "clang/AST/Expr.h"
19
20 using namespace clang;
21
22 //===----------------------------------------------------------------------===//
23 // OMPThreadPrivateDecl Implementation.
24 //===----------------------------------------------------------------------===//
25
anchor()26 void OMPThreadPrivateDecl::anchor() {}
27
Create(ASTContext & C,DeclContext * DC,SourceLocation L,ArrayRef<Expr * > VL)28 OMPThreadPrivateDecl *OMPThreadPrivateDecl::Create(ASTContext &C,
29 DeclContext *DC,
30 SourceLocation L,
31 ArrayRef<Expr *> VL) {
32 auto *D = OMPDeclarativeDirective::createDirective<OMPThreadPrivateDecl>(
33 C, DC, std::nullopt, VL.size(), L);
34 D->setVars(VL);
35 return D;
36 }
37
CreateDeserialized(ASTContext & C,GlobalDeclID ID,unsigned N)38 OMPThreadPrivateDecl *OMPThreadPrivateDecl::CreateDeserialized(ASTContext &C,
39 GlobalDeclID ID,
40 unsigned N) {
41 return OMPDeclarativeDirective::createEmptyDirective<OMPThreadPrivateDecl>(
42 C, ID, 0, N);
43 }
44
setVars(ArrayRef<Expr * > VL)45 void OMPThreadPrivateDecl::setVars(ArrayRef<Expr *> VL) {
46 assert(VL.size() == Data->getNumChildren() &&
47 "Number of variables is not the same as the preallocated buffer");
48 llvm::copy(VL, getVars().begin());
49 }
50
51 //===----------------------------------------------------------------------===//
52 // OMPAllocateDecl Implementation.
53 //===----------------------------------------------------------------------===//
54
anchor()55 void OMPAllocateDecl::anchor() { }
56
Create(ASTContext & C,DeclContext * DC,SourceLocation L,ArrayRef<Expr * > VL,ArrayRef<OMPClause * > CL)57 OMPAllocateDecl *OMPAllocateDecl::Create(ASTContext &C, DeclContext *DC,
58 SourceLocation L, ArrayRef<Expr *> VL,
59 ArrayRef<OMPClause *> CL) {
60 auto *D = OMPDeclarativeDirective::createDirective<OMPAllocateDecl>(
61 C, DC, CL, VL.size(), L);
62 D->setVars(VL);
63 return D;
64 }
65
CreateDeserialized(ASTContext & C,GlobalDeclID ID,unsigned NVars,unsigned NClauses)66 OMPAllocateDecl *OMPAllocateDecl::CreateDeserialized(ASTContext &C,
67 GlobalDeclID ID,
68 unsigned NVars,
69 unsigned NClauses) {
70 return OMPDeclarativeDirective::createEmptyDirective<OMPAllocateDecl>(
71 C, ID, NClauses, NVars, SourceLocation());
72 }
73
setVars(ArrayRef<Expr * > VL)74 void OMPAllocateDecl::setVars(ArrayRef<Expr *> VL) {
75 assert(VL.size() == Data->getNumChildren() &&
76 "Number of variables is not the same as the preallocated buffer");
77 llvm::copy(VL, getVars().begin());
78 }
79
80 //===----------------------------------------------------------------------===//
81 // OMPRequiresDecl Implementation.
82 //===----------------------------------------------------------------------===//
83
anchor()84 void OMPRequiresDecl::anchor() {}
85
Create(ASTContext & C,DeclContext * DC,SourceLocation L,ArrayRef<OMPClause * > CL)86 OMPRequiresDecl *OMPRequiresDecl::Create(ASTContext &C, DeclContext *DC,
87 SourceLocation L,
88 ArrayRef<OMPClause *> CL) {
89 return OMPDeclarativeDirective::createDirective<OMPRequiresDecl>(C, DC, CL, 0,
90 L);
91 }
92
CreateDeserialized(ASTContext & C,GlobalDeclID ID,unsigned N)93 OMPRequiresDecl *OMPRequiresDecl::CreateDeserialized(ASTContext &C,
94 GlobalDeclID ID,
95 unsigned N) {
96 return OMPDeclarativeDirective::createEmptyDirective<OMPRequiresDecl>(
97 C, ID, N, 0, SourceLocation());
98 }
99
100 //===----------------------------------------------------------------------===//
101 // OMPDeclareReductionDecl Implementation.
102 //===----------------------------------------------------------------------===//
103
OMPDeclareReductionDecl(Kind DK,DeclContext * DC,SourceLocation L,DeclarationName Name,QualType Ty,OMPDeclareReductionDecl * PrevDeclInScope)104 OMPDeclareReductionDecl::OMPDeclareReductionDecl(
105 Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name,
106 QualType Ty, OMPDeclareReductionDecl *PrevDeclInScope)
107 : ValueDecl(DK, DC, L, Name, Ty), DeclContext(DK), Combiner(nullptr),
108 PrevDeclInScope(PrevDeclInScope) {
109 setInitializer(nullptr, OMPDeclareReductionInitKind::Call);
110 }
111
anchor()112 void OMPDeclareReductionDecl::anchor() {}
113
Create(ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName Name,QualType T,OMPDeclareReductionDecl * PrevDeclInScope)114 OMPDeclareReductionDecl *OMPDeclareReductionDecl::Create(
115 ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
116 QualType T, OMPDeclareReductionDecl *PrevDeclInScope) {
117 return new (C, DC) OMPDeclareReductionDecl(OMPDeclareReduction, DC, L, Name,
118 T, PrevDeclInScope);
119 }
120
121 OMPDeclareReductionDecl *
CreateDeserialized(ASTContext & C,GlobalDeclID ID)122 OMPDeclareReductionDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
123 return new (C, ID) OMPDeclareReductionDecl(
124 OMPDeclareReduction, /*DC=*/nullptr, SourceLocation(), DeclarationName(),
125 QualType(), /*PrevDeclInScope=*/nullptr);
126 }
127
getPrevDeclInScope()128 OMPDeclareReductionDecl *OMPDeclareReductionDecl::getPrevDeclInScope() {
129 return cast_or_null<OMPDeclareReductionDecl>(
130 PrevDeclInScope.get(getASTContext().getExternalSource()));
131 }
132 const OMPDeclareReductionDecl *
getPrevDeclInScope() const133 OMPDeclareReductionDecl::getPrevDeclInScope() const {
134 return cast_or_null<OMPDeclareReductionDecl>(
135 PrevDeclInScope.get(getASTContext().getExternalSource()));
136 }
137
138 //===----------------------------------------------------------------------===//
139 // OMPDeclareMapperDecl Implementation.
140 //===----------------------------------------------------------------------===//
141
anchor()142 void OMPDeclareMapperDecl::anchor() {}
143
Create(ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName Name,QualType T,DeclarationName VarName,ArrayRef<OMPClause * > Clauses,OMPDeclareMapperDecl * PrevDeclInScope)144 OMPDeclareMapperDecl *OMPDeclareMapperDecl::Create(
145 ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
146 QualType T, DeclarationName VarName, ArrayRef<OMPClause *> Clauses,
147 OMPDeclareMapperDecl *PrevDeclInScope) {
148 return OMPDeclarativeDirective::createDirective<OMPDeclareMapperDecl>(
149 C, DC, Clauses, 1, L, Name, T, VarName, PrevDeclInScope);
150 }
151
CreateDeserialized(ASTContext & C,GlobalDeclID ID,unsigned N)152 OMPDeclareMapperDecl *OMPDeclareMapperDecl::CreateDeserialized(ASTContext &C,
153 GlobalDeclID ID,
154 unsigned N) {
155 return OMPDeclarativeDirective::createEmptyDirective<OMPDeclareMapperDecl>(
156 C, ID, N, 1, SourceLocation(), DeclarationName(), QualType(),
157 DeclarationName(), /*PrevDeclInScope=*/nullptr);
158 }
159
getPrevDeclInScope()160 OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() {
161 return cast_or_null<OMPDeclareMapperDecl>(
162 PrevDeclInScope.get(getASTContext().getExternalSource()));
163 }
164
getPrevDeclInScope() const165 const OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() const {
166 return cast_or_null<OMPDeclareMapperDecl>(
167 PrevDeclInScope.get(getASTContext().getExternalSource()));
168 }
169
170 //===----------------------------------------------------------------------===//
171 // OMPCapturedExprDecl Implementation.
172 //===----------------------------------------------------------------------===//
173
anchor()174 void OMPCapturedExprDecl::anchor() {}
175
Create(ASTContext & C,DeclContext * DC,IdentifierInfo * Id,QualType T,SourceLocation StartLoc)176 OMPCapturedExprDecl *OMPCapturedExprDecl::Create(ASTContext &C, DeclContext *DC,
177 IdentifierInfo *Id, QualType T,
178 SourceLocation StartLoc) {
179 return new (C, DC) OMPCapturedExprDecl(
180 C, DC, Id, T, C.getTrivialTypeSourceInfo(T), StartLoc);
181 }
182
CreateDeserialized(ASTContext & C,GlobalDeclID ID)183 OMPCapturedExprDecl *OMPCapturedExprDecl::CreateDeserialized(ASTContext &C,
184 GlobalDeclID ID) {
185 return new (C, ID) OMPCapturedExprDecl(C, nullptr, nullptr, QualType(),
186 /*TInfo=*/nullptr, SourceLocation());
187 }
188
getSourceRange() const189 SourceRange OMPCapturedExprDecl::getSourceRange() const {
190 assert(hasInit());
191 return SourceRange(getInit()->getBeginLoc(), getInit()->getEndLoc());
192 }
193