123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- //===--- DeclOpenMP.cpp - Declaration OpenMP AST Node Implementation ------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- /// \file
- /// This file implements OMPThreadPrivateDecl, OMPCapturedExprDecl
- /// classes.
- ///
- //===----------------------------------------------------------------------===//
- #include "clang/AST/ASTContext.h"
- #include "clang/AST/Decl.h"
- #include "clang/AST/DeclBase.h"
- #include "clang/AST/DeclOpenMP.h"
- #include "clang/AST/Expr.h"
- using namespace clang;
- //===----------------------------------------------------------------------===//
- // OMPThreadPrivateDecl Implementation.
- //===----------------------------------------------------------------------===//
- void OMPThreadPrivateDecl::anchor() { }
- OMPThreadPrivateDecl *OMPThreadPrivateDecl::Create(ASTContext &C,
- DeclContext *DC,
- SourceLocation L,
- ArrayRef<Expr *> VL) {
- OMPThreadPrivateDecl *D =
- new (C, DC, additionalSizeToAlloc<Expr *>(VL.size()))
- OMPThreadPrivateDecl(OMPThreadPrivate, DC, L);
- D->NumVars = VL.size();
- D->setVars(VL);
- return D;
- }
- OMPThreadPrivateDecl *OMPThreadPrivateDecl::CreateDeserialized(ASTContext &C,
- unsigned ID,
- unsigned N) {
- OMPThreadPrivateDecl *D = new (C, ID, additionalSizeToAlloc<Expr *>(N))
- OMPThreadPrivateDecl(OMPThreadPrivate, nullptr, SourceLocation());
- D->NumVars = N;
- return D;
- }
- void OMPThreadPrivateDecl::setVars(ArrayRef<Expr *> VL) {
- assert(VL.size() == NumVars &&
- "Number of variables is not the same as the preallocated buffer");
- std::uninitialized_copy(VL.begin(), VL.end(), getTrailingObjects<Expr *>());
- }
- //===----------------------------------------------------------------------===//
- // OMPAllocateDecl Implementation.
- //===----------------------------------------------------------------------===//
- void OMPAllocateDecl::anchor() { }
- OMPAllocateDecl *OMPAllocateDecl::Create(ASTContext &C, DeclContext *DC,
- SourceLocation L, ArrayRef<Expr *> VL,
- ArrayRef<OMPClause *> CL) {
- OMPAllocateDecl *D = new (
- C, DC, additionalSizeToAlloc<Expr *, OMPClause *>(VL.size(), CL.size()))
- OMPAllocateDecl(OMPAllocate, DC, L);
- D->NumVars = VL.size();
- D->setVars(VL);
- D->NumClauses = CL.size();
- D->setClauses(CL);
- return D;
- }
- OMPAllocateDecl *OMPAllocateDecl::CreateDeserialized(ASTContext &C, unsigned ID,
- unsigned NVars,
- unsigned NClauses) {
- OMPAllocateDecl *D =
- new (C, ID, additionalSizeToAlloc<Expr *, OMPClause *>(NVars, NClauses))
- OMPAllocateDecl(OMPAllocate, nullptr, SourceLocation());
- D->NumVars = NVars;
- D->NumClauses = NClauses;
- return D;
- }
- void OMPAllocateDecl::setVars(ArrayRef<Expr *> VL) {
- assert(VL.size() == NumVars &&
- "Number of variables is not the same as the preallocated buffer");
- std::uninitialized_copy(VL.begin(), VL.end(), getTrailingObjects<Expr *>());
- }
- void OMPAllocateDecl::setClauses(ArrayRef<OMPClause *> CL) {
- assert(CL.size() == NumClauses &&
- "Number of variables is not the same as the preallocated buffer");
- std::uninitialized_copy(CL.begin(), CL.end(),
- getTrailingObjects<OMPClause *>());
- }
- //===----------------------------------------------------------------------===//
- // OMPRequiresDecl Implementation.
- //===----------------------------------------------------------------------===//
- void OMPRequiresDecl::anchor() {}
- OMPRequiresDecl *OMPRequiresDecl::Create(ASTContext &C, DeclContext *DC,
- SourceLocation L,
- ArrayRef<OMPClause *> CL) {
- OMPRequiresDecl *D =
- new (C, DC, additionalSizeToAlloc<OMPClause *>(CL.size()))
- OMPRequiresDecl(OMPRequires, DC, L);
- D->NumClauses = CL.size();
- D->setClauses(CL);
- return D;
- }
- OMPRequiresDecl *OMPRequiresDecl::CreateDeserialized(ASTContext &C, unsigned ID,
- unsigned N) {
- OMPRequiresDecl *D = new (C, ID, additionalSizeToAlloc<OMPClause *>(N))
- OMPRequiresDecl(OMPRequires, nullptr, SourceLocation());
- D->NumClauses = N;
- return D;
- }
- void OMPRequiresDecl::setClauses(ArrayRef<OMPClause *> CL) {
- assert(CL.size() == NumClauses &&
- "Number of clauses is not the same as the preallocated buffer");
- std::uninitialized_copy(CL.begin(), CL.end(),
- getTrailingObjects<OMPClause *>());
- }
- //===----------------------------------------------------------------------===//
- // OMPDeclareReductionDecl Implementation.
- //===----------------------------------------------------------------------===//
- OMPDeclareReductionDecl::OMPDeclareReductionDecl(
- Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name,
- QualType Ty, OMPDeclareReductionDecl *PrevDeclInScope)
- : ValueDecl(DK, DC, L, Name, Ty), DeclContext(DK), Combiner(nullptr),
- PrevDeclInScope(PrevDeclInScope) {
- setInitializer(nullptr, CallInit);
- }
- void OMPDeclareReductionDecl::anchor() {}
- OMPDeclareReductionDecl *OMPDeclareReductionDecl::Create(
- ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
- QualType T, OMPDeclareReductionDecl *PrevDeclInScope) {
- return new (C, DC) OMPDeclareReductionDecl(OMPDeclareReduction, DC, L, Name,
- T, PrevDeclInScope);
- }
- OMPDeclareReductionDecl *
- OMPDeclareReductionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
- return new (C, ID) OMPDeclareReductionDecl(
- OMPDeclareReduction, /*DC=*/nullptr, SourceLocation(), DeclarationName(),
- QualType(), /*PrevDeclInScope=*/nullptr);
- }
- OMPDeclareReductionDecl *OMPDeclareReductionDecl::getPrevDeclInScope() {
- return cast_or_null<OMPDeclareReductionDecl>(
- PrevDeclInScope.get(getASTContext().getExternalSource()));
- }
- const OMPDeclareReductionDecl *
- OMPDeclareReductionDecl::getPrevDeclInScope() const {
- return cast_or_null<OMPDeclareReductionDecl>(
- PrevDeclInScope.get(getASTContext().getExternalSource()));
- }
- //===----------------------------------------------------------------------===//
- // OMPDeclareMapperDecl Implementation.
- //===----------------------------------------------------------------------===//
- void OMPDeclareMapperDecl::anchor() {}
- OMPDeclareMapperDecl *
- OMPDeclareMapperDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
- DeclarationName Name, QualType T,
- DeclarationName VarName,
- OMPDeclareMapperDecl *PrevDeclInScope) {
- return new (C, DC) OMPDeclareMapperDecl(OMPDeclareMapper, DC, L, Name, T,
- VarName, PrevDeclInScope);
- }
- OMPDeclareMapperDecl *OMPDeclareMapperDecl::CreateDeserialized(ASTContext &C,
- unsigned ID,
- unsigned N) {
- auto *D = new (C, ID)
- OMPDeclareMapperDecl(OMPDeclareMapper, /*DC=*/nullptr, SourceLocation(),
- DeclarationName(), QualType(), DeclarationName(),
- /*PrevDeclInScope=*/nullptr);
- if (N) {
- auto **ClauseStorage = C.Allocate<OMPClause *>(N);
- D->Clauses = llvm::makeMutableArrayRef<OMPClause *>(ClauseStorage, N);
- }
- return D;
- }
- /// Creates an array of clauses to this mapper declaration and intializes
- /// them. The space used to store clause pointers is dynamically allocated,
- /// because we do not know the number of clauses when creating
- /// OMPDeclareMapperDecl
- void OMPDeclareMapperDecl::CreateClauses(ASTContext &C,
- ArrayRef<OMPClause *> CL) {
- assert(Clauses.empty() && "Number of clauses should be 0 on initialization");
- size_t NumClauses = CL.size();
- if (NumClauses) {
- auto **ClauseStorage = C.Allocate<OMPClause *>(NumClauses);
- Clauses = llvm::makeMutableArrayRef<OMPClause *>(ClauseStorage, NumClauses);
- setClauses(CL);
- }
- }
- void OMPDeclareMapperDecl::setClauses(ArrayRef<OMPClause *> CL) {
- assert(CL.size() == Clauses.size() &&
- "Number of clauses is not the same as the preallocated buffer");
- std::uninitialized_copy(CL.begin(), CL.end(), Clauses.data());
- }
- OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() {
- return cast_or_null<OMPDeclareMapperDecl>(
- PrevDeclInScope.get(getASTContext().getExternalSource()));
- }
- const OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() const {
- return cast_or_null<OMPDeclareMapperDecl>(
- PrevDeclInScope.get(getASTContext().getExternalSource()));
- }
- //===----------------------------------------------------------------------===//
- // OMPCapturedExprDecl Implementation.
- //===----------------------------------------------------------------------===//
- void OMPCapturedExprDecl::anchor() {}
- OMPCapturedExprDecl *OMPCapturedExprDecl::Create(ASTContext &C, DeclContext *DC,
- IdentifierInfo *Id, QualType T,
- SourceLocation StartLoc) {
- return new (C, DC) OMPCapturedExprDecl(
- C, DC, Id, T, C.getTrivialTypeSourceInfo(T), StartLoc);
- }
- OMPCapturedExprDecl *OMPCapturedExprDecl::CreateDeserialized(ASTContext &C,
- unsigned ID) {
- return new (C, ID) OMPCapturedExprDecl(C, nullptr, nullptr, QualType(),
- /*TInfo=*/nullptr, SourceLocation());
- }
- SourceRange OMPCapturedExprDecl::getSourceRange() const {
- assert(hasInit());
- return SourceRange(getInit()->getBeginLoc(), getInit()->getEndLoc());
- }
|