clang  20.0.0git
DeclOpenMP.cpp
Go to the documentation of this file.
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 
26 void OMPThreadPrivateDecl::anchor() {}
27 
29  DeclContext *DC,
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 
40  unsigned N) {
41  return OMPDeclarativeDirective::createEmptyDirective<OMPThreadPrivateDecl>(
42  C, ID, 0, N);
43 }
44 
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 
55 void OMPAllocateDecl::anchor() { }
56 
60  auto *D = OMPDeclarativeDirective::createDirective<OMPAllocateDecl>(
61  C, DC, CL, VL.size(), L);
62  D->setVars(VL);
63  return D;
64 }
65 
68  unsigned NVars,
69  unsigned NClauses) {
70  return OMPDeclarativeDirective::createEmptyDirective<OMPAllocateDecl>(
71  C, ID, NClauses, NVars, SourceLocation());
72 }
73 
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 
84 void OMPRequiresDecl::anchor() {}
85 
89  return OMPDeclarativeDirective::createDirective<OMPRequiresDecl>(C, DC, CL, 0,
90  L);
91 }
92 
95  unsigned N) {
96  return OMPDeclarativeDirective::createEmptyDirective<OMPRequiresDecl>(
97  C, ID, N, 0, SourceLocation());
98 }
99 
100 //===----------------------------------------------------------------------===//
101 // OMPDeclareReductionDecl Implementation.
102 //===----------------------------------------------------------------------===//
103 
104 OMPDeclareReductionDecl::OMPDeclareReductionDecl(
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 
112 void OMPDeclareReductionDecl::anchor() {}
113 
116  QualType T, OMPDeclareReductionDecl *PrevDeclInScope) {
117  return new (C, DC) OMPDeclareReductionDecl(OMPDeclareReduction, DC, L, Name,
118  T, PrevDeclInScope);
119 }
120 
123  return new (C, ID) OMPDeclareReductionDecl(
124  OMPDeclareReduction, /*DC=*/nullptr, SourceLocation(), DeclarationName(),
125  QualType(), /*PrevDeclInScope=*/nullptr);
126 }
127 
129  return cast_or_null<OMPDeclareReductionDecl>(
130  PrevDeclInScope.get(getASTContext().getExternalSource()));
131 }
134  return cast_or_null<OMPDeclareReductionDecl>(
135  PrevDeclInScope.get(getASTContext().getExternalSource()));
136 }
137 
138 //===----------------------------------------------------------------------===//
139 // OMPDeclareMapperDecl Implementation.
140 //===----------------------------------------------------------------------===//
141 
142 void OMPDeclareMapperDecl::anchor() {}
143 
147  OMPDeclareMapperDecl *PrevDeclInScope) {
148  return OMPDeclarativeDirective::createDirective<OMPDeclareMapperDecl>(
149  C, DC, Clauses, 1, L, Name, T, VarName, PrevDeclInScope);
150 }
151 
154  unsigned N) {
155  return OMPDeclarativeDirective::createEmptyDirective<OMPDeclareMapperDecl>(
156  C, ID, N, 1, SourceLocation(), DeclarationName(), QualType(),
157  DeclarationName(), /*PrevDeclInScope=*/nullptr);
158 }
159 
161  return cast_or_null<OMPDeclareMapperDecl>(
162  PrevDeclInScope.get(getASTContext().getExternalSource()));
163 }
164 
166  return cast_or_null<OMPDeclareMapperDecl>(
167  PrevDeclInScope.get(getASTContext().getExternalSource()));
168 }
169 
170 //===----------------------------------------------------------------------===//
171 // OMPCapturedExprDecl Implementation.
172 //===----------------------------------------------------------------------===//
173 
174 void OMPCapturedExprDecl::anchor() {}
175 
178  SourceLocation StartLoc) {
179  return new (C, DC) OMPCapturedExprDecl(
180  C, DC, Id, T, C.getTrivialTypeSourceInfo(T), StartLoc);
181 }
182 
184  GlobalDeclID ID) {
185  return new (C, ID) OMPCapturedExprDecl(C, nullptr, nullptr, QualType(),
186  /*TInfo=*/nullptr, SourceLocation());
187 }
188 
190  assert(hasInit());
191  return SourceRange(getInit()->getBeginLoc(), getInit()->getEndLoc());
192 }
Defines the clang::ASTContext interface.
static char ID
Definition: Arena.cpp:183
const Decl * D
enum clang::sema::@1659::IndirectLocalPathEntry::EntryKind Kind
This file defines OpenMP nodes for declarative directives.
uint32_t Id
Definition: SemaARM.cpp:1144
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:187
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
SourceLocation getEndLoc() const LLVM_READONLY
Definition: DeclBase.h:442
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:523
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Decl.h:784
One of these records is kept for each identifier that is lexed.
This represents '#pragma omp allocate ...' directive.
Definition: DeclOpenMP.h:474
static OMPAllocateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, ArrayRef< Expr * > VL, ArrayRef< OMPClause * > CL)
Definition: DeclOpenMP.cpp:57
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Definition: DeclOpenMP.cpp:66
Pseudo declaration for capturing expressions.
Definition: DeclOpenMP.h:383
static OMPCapturedExprDecl * Create(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, QualType T, SourceLocation StartLoc)
Definition: DeclOpenMP.cpp:176
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclOpenMP.cpp:183
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: DeclOpenMP.cpp:189
unsigned getNumChildren() const
OMPChildren * Data
Data, associated with the directive.
Definition: DeclOpenMP.h:43
This represents '#pragma omp declare mapper ...' directive.
Definition: DeclOpenMP.h:287
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
Definition: DeclOpenMP.cpp:152
OMPDeclareMapperDecl * getPrevDeclInScope()
Get reference to previous declare mapper construct in the same scope with the same name.
Definition: DeclOpenMP.cpp:160
static OMPDeclareMapperDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, QualType T, DeclarationName VarName, ArrayRef< OMPClause * > Clauses, OMPDeclareMapperDecl *PrevDeclInScope)
Creates declare mapper node.
Definition: DeclOpenMP.cpp:144
This represents '#pragma omp declare reduction ...' directive.
Definition: DeclOpenMP.h:177
static OMPDeclareReductionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, QualType T, OMPDeclareReductionDecl *PrevDeclInScope)
Create declare reduction node.
Definition: DeclOpenMP.cpp:114
OMPDeclareReductionDecl * getPrevDeclInScope()
Get reference to previous declare reduction construct in the same scope with the same name.
Definition: DeclOpenMP.cpp:128
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
Definition: DeclOpenMP.cpp:122
This represents '#pragma omp requires...' directive.
Definition: DeclOpenMP.h:417
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
Definition: DeclOpenMP.cpp:93
static OMPRequiresDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, ArrayRef< OMPClause * > CL)
Create requires node.
Definition: DeclOpenMP.cpp:86
This represents '#pragma omp threadprivate ...' directive.
Definition: DeclOpenMP.h:110
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Definition: DeclOpenMP.cpp:38
static OMPThreadPrivateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, ArrayRef< Expr * > VL)
Definition: DeclOpenMP.cpp:28
A (possibly-)qualified type.
Definition: Type.h:941
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:668
bool hasInit() const
Definition: Decl.cpp:2384
const Expr * getInit() const
Definition: Decl.h:1317
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.