553 lines
23 KiB
C++
553 lines
23 KiB
C++
//===---- OpenACCClause.cpp - Classes for OpenACC Clauses ----------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the subclasses of the OpenACCClause class declared in
|
|
// OpenACCClause.h
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/AST/OpenACCClause.h"
|
|
#include "clang/AST/ASTContext.h"
|
|
#include "clang/AST/Expr.h"
|
|
|
|
using namespace clang;
|
|
|
|
bool OpenACCClauseWithParams::classof(const OpenACCClause *C) {
|
|
return OpenACCDeviceTypeClause::classof(C) ||
|
|
OpenACCClauseWithCondition::classof(C) ||
|
|
OpenACCClauseWithExprs::classof(C);
|
|
}
|
|
bool OpenACCClauseWithExprs::classof(const OpenACCClause *C) {
|
|
return OpenACCWaitClause::classof(C) || OpenACCNumGangsClause::classof(C) ||
|
|
OpenACCClauseWithSingleIntExpr::classof(C) ||
|
|
OpenACCClauseWithVarList::classof(C);
|
|
}
|
|
bool OpenACCClauseWithVarList::classof(const OpenACCClause *C) {
|
|
return OpenACCPrivateClause::classof(C) ||
|
|
OpenACCFirstPrivateClause::classof(C) ||
|
|
OpenACCDevicePtrClause::classof(C) ||
|
|
OpenACCDevicePtrClause::classof(C) ||
|
|
OpenACCAttachClause::classof(C) || OpenACCNoCreateClause::classof(C) ||
|
|
OpenACCPresentClause::classof(C) || OpenACCCopyClause::classof(C) ||
|
|
OpenACCCopyInClause::classof(C) || OpenACCCopyOutClause::classof(C) ||
|
|
OpenACCReductionClause::classof(C) || OpenACCCreateClause::classof(C);
|
|
}
|
|
bool OpenACCClauseWithCondition::classof(const OpenACCClause *C) {
|
|
return OpenACCIfClause::classof(C) || OpenACCSelfClause::classof(C);
|
|
}
|
|
bool OpenACCClauseWithSingleIntExpr::classof(const OpenACCClause *C) {
|
|
return OpenACCNumWorkersClause::classof(C) ||
|
|
OpenACCVectorLengthClause::classof(C) ||
|
|
OpenACCAsyncClause::classof(C);
|
|
}
|
|
OpenACCDefaultClause *OpenACCDefaultClause::Create(const ASTContext &C,
|
|
OpenACCDefaultClauseKind K,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
SourceLocation EndLoc) {
|
|
void *Mem =
|
|
C.Allocate(sizeof(OpenACCDefaultClause), alignof(OpenACCDefaultClause));
|
|
|
|
return new (Mem) OpenACCDefaultClause(K, BeginLoc, LParenLoc, EndLoc);
|
|
}
|
|
|
|
OpenACCIfClause *OpenACCIfClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
Expr *ConditionExpr,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCIfClause), alignof(OpenACCIfClause));
|
|
return new (Mem) OpenACCIfClause(BeginLoc, LParenLoc, ConditionExpr, EndLoc);
|
|
}
|
|
|
|
OpenACCIfClause::OpenACCIfClause(SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc, Expr *ConditionExpr,
|
|
SourceLocation EndLoc)
|
|
: OpenACCClauseWithCondition(OpenACCClauseKind::If, BeginLoc, LParenLoc,
|
|
ConditionExpr, EndLoc) {
|
|
assert(ConditionExpr && "if clause requires condition expr");
|
|
assert((ConditionExpr->isInstantiationDependent() ||
|
|
ConditionExpr->getType()->isScalarType()) &&
|
|
"Condition expression type not scalar/dependent");
|
|
}
|
|
|
|
OpenACCSelfClause *OpenACCSelfClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
Expr *ConditionExpr,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCIfClause), alignof(OpenACCIfClause));
|
|
return new (Mem)
|
|
OpenACCSelfClause(BeginLoc, LParenLoc, ConditionExpr, EndLoc);
|
|
}
|
|
|
|
OpenACCSelfClause::OpenACCSelfClause(SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
Expr *ConditionExpr, SourceLocation EndLoc)
|
|
: OpenACCClauseWithCondition(OpenACCClauseKind::Self, BeginLoc, LParenLoc,
|
|
ConditionExpr, EndLoc) {
|
|
assert((!ConditionExpr || ConditionExpr->isInstantiationDependent() ||
|
|
ConditionExpr->getType()->isScalarType()) &&
|
|
"Condition expression type not scalar/dependent");
|
|
}
|
|
|
|
OpenACCClause::child_range OpenACCClause::children() {
|
|
switch (getClauseKind()) {
|
|
default:
|
|
assert(false && "Clause children function not implemented");
|
|
break;
|
|
#define VISIT_CLAUSE(CLAUSE_NAME) \
|
|
case OpenACCClauseKind::CLAUSE_NAME: \
|
|
return cast<OpenACC##CLAUSE_NAME##Clause>(this)->children();
|
|
#define CLAUSE_ALIAS(ALIAS_NAME, CLAUSE_NAME, DEPRECATED) \
|
|
case OpenACCClauseKind::ALIAS_NAME: \
|
|
return cast<OpenACC##CLAUSE_NAME##Clause>(this)->children();
|
|
|
|
#include "clang/Basic/OpenACCClauses.def"
|
|
}
|
|
return child_range(child_iterator(), child_iterator());
|
|
}
|
|
|
|
OpenACCNumWorkersClause::OpenACCNumWorkersClause(SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
Expr *IntExpr,
|
|
SourceLocation EndLoc)
|
|
: OpenACCClauseWithSingleIntExpr(OpenACCClauseKind::NumWorkers, BeginLoc,
|
|
LParenLoc, IntExpr, EndLoc) {
|
|
assert((!IntExpr || IntExpr->isInstantiationDependent() ||
|
|
IntExpr->getType()->isIntegerType()) &&
|
|
"Condition expression type not scalar/dependent");
|
|
}
|
|
|
|
OpenACCNumWorkersClause *
|
|
OpenACCNumWorkersClause::Create(const ASTContext &C, SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc, Expr *IntExpr,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCNumWorkersClause),
|
|
alignof(OpenACCNumWorkersClause));
|
|
return new (Mem)
|
|
OpenACCNumWorkersClause(BeginLoc, LParenLoc, IntExpr, EndLoc);
|
|
}
|
|
|
|
OpenACCVectorLengthClause::OpenACCVectorLengthClause(SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
Expr *IntExpr,
|
|
SourceLocation EndLoc)
|
|
: OpenACCClauseWithSingleIntExpr(OpenACCClauseKind::VectorLength, BeginLoc,
|
|
LParenLoc, IntExpr, EndLoc) {
|
|
assert((!IntExpr || IntExpr->isInstantiationDependent() ||
|
|
IntExpr->getType()->isIntegerType()) &&
|
|
"Condition expression type not scalar/dependent");
|
|
}
|
|
|
|
OpenACCVectorLengthClause *
|
|
OpenACCVectorLengthClause::Create(const ASTContext &C, SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc, Expr *IntExpr,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCVectorLengthClause),
|
|
alignof(OpenACCVectorLengthClause));
|
|
return new (Mem)
|
|
OpenACCVectorLengthClause(BeginLoc, LParenLoc, IntExpr, EndLoc);
|
|
}
|
|
|
|
OpenACCAsyncClause::OpenACCAsyncClause(SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc, Expr *IntExpr,
|
|
SourceLocation EndLoc)
|
|
: OpenACCClauseWithSingleIntExpr(OpenACCClauseKind::Async, BeginLoc,
|
|
LParenLoc, IntExpr, EndLoc) {
|
|
assert((!IntExpr || IntExpr->isInstantiationDependent() ||
|
|
IntExpr->getType()->isIntegerType()) &&
|
|
"Condition expression type not scalar/dependent");
|
|
}
|
|
|
|
OpenACCAsyncClause *OpenACCAsyncClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
Expr *IntExpr,
|
|
SourceLocation EndLoc) {
|
|
void *Mem =
|
|
C.Allocate(sizeof(OpenACCAsyncClause), alignof(OpenACCAsyncClause));
|
|
return new (Mem) OpenACCAsyncClause(BeginLoc, LParenLoc, IntExpr, EndLoc);
|
|
}
|
|
|
|
OpenACCWaitClause *OpenACCWaitClause::Create(
|
|
const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc,
|
|
Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef<Expr *> QueueIdExprs,
|
|
SourceLocation EndLoc) {
|
|
// Allocates enough room in trailing storage for all the int-exprs, plus a
|
|
// placeholder for the devnum.
|
|
void *Mem = C.Allocate(
|
|
OpenACCWaitClause::totalSizeToAlloc<Expr *>(QueueIdExprs.size() + 1));
|
|
return new (Mem) OpenACCWaitClause(BeginLoc, LParenLoc, DevNumExpr, QueuesLoc,
|
|
QueueIdExprs, EndLoc);
|
|
}
|
|
|
|
OpenACCNumGangsClause *OpenACCNumGangsClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> IntExprs,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCNumGangsClause::totalSizeToAlloc<Expr *>(IntExprs.size()));
|
|
return new (Mem) OpenACCNumGangsClause(BeginLoc, LParenLoc, IntExprs, EndLoc);
|
|
}
|
|
|
|
OpenACCPrivateClause *OpenACCPrivateClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCPrivateClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCPrivateClause(BeginLoc, LParenLoc, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCFirstPrivateClause *OpenACCFirstPrivateClause::Create(
|
|
const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> VarList, SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCFirstPrivateClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem)
|
|
OpenACCFirstPrivateClause(BeginLoc, LParenLoc, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCAttachClause *OpenACCAttachClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem =
|
|
C.Allocate(OpenACCAttachClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCAttachClause(BeginLoc, LParenLoc, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCDevicePtrClause *OpenACCDevicePtrClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCDevicePtrClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCDevicePtrClause(BeginLoc, LParenLoc, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCNoCreateClause *OpenACCNoCreateClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCNoCreateClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCNoCreateClause(BeginLoc, LParenLoc, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCPresentClause *OpenACCPresentClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCPresentClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCPresentClause(BeginLoc, LParenLoc, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCCopyClause *
|
|
OpenACCCopyClause::Create(const ASTContext &C, OpenACCClauseKind Spelling,
|
|
SourceLocation BeginLoc, SourceLocation LParenLoc,
|
|
ArrayRef<Expr *> VarList, SourceLocation EndLoc) {
|
|
void *Mem =
|
|
C.Allocate(OpenACCCopyClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem)
|
|
OpenACCCopyClause(Spelling, BeginLoc, LParenLoc, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCCopyInClause *
|
|
OpenACCCopyInClause::Create(const ASTContext &C, OpenACCClauseKind Spelling,
|
|
SourceLocation BeginLoc, SourceLocation LParenLoc,
|
|
bool IsReadOnly, ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem =
|
|
C.Allocate(OpenACCCopyInClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCCopyInClause(Spelling, BeginLoc, LParenLoc,
|
|
IsReadOnly, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCCopyOutClause *
|
|
OpenACCCopyOutClause::Create(const ASTContext &C, OpenACCClauseKind Spelling,
|
|
SourceLocation BeginLoc, SourceLocation LParenLoc,
|
|
bool IsZero, ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCCopyOutClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCCopyOutClause(Spelling, BeginLoc, LParenLoc, IsZero,
|
|
VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCCreateClause *
|
|
OpenACCCreateClause::Create(const ASTContext &C, OpenACCClauseKind Spelling,
|
|
SourceLocation BeginLoc, SourceLocation LParenLoc,
|
|
bool IsZero, ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem =
|
|
C.Allocate(OpenACCCreateClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem) OpenACCCreateClause(Spelling, BeginLoc, LParenLoc, IsZero,
|
|
VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCDeviceTypeClause *OpenACCDeviceTypeClause::Create(
|
|
const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc,
|
|
SourceLocation LParenLoc, ArrayRef<DeviceTypeArgument> Archs,
|
|
SourceLocation EndLoc) {
|
|
void *Mem =
|
|
C.Allocate(OpenACCDeviceTypeClause::totalSizeToAlloc<DeviceTypeArgument>(
|
|
Archs.size()));
|
|
return new (Mem)
|
|
OpenACCDeviceTypeClause(K, BeginLoc, LParenLoc, Archs, EndLoc);
|
|
}
|
|
|
|
OpenACCReductionClause *OpenACCReductionClause::Create(
|
|
const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc,
|
|
OpenACCReductionOperator Operator, ArrayRef<Expr *> VarList,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(
|
|
OpenACCReductionClause::totalSizeToAlloc<Expr *>(VarList.size()));
|
|
return new (Mem)
|
|
OpenACCReductionClause(BeginLoc, LParenLoc, Operator, VarList, EndLoc);
|
|
}
|
|
|
|
OpenACCAutoClause *OpenACCAutoClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCAutoClause));
|
|
return new (Mem) OpenACCAutoClause(BeginLoc, EndLoc);
|
|
}
|
|
|
|
OpenACCIndependentClause *
|
|
OpenACCIndependentClause::Create(const ASTContext &C, SourceLocation BeginLoc,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCIndependentClause));
|
|
return new (Mem) OpenACCIndependentClause(BeginLoc, EndLoc);
|
|
}
|
|
|
|
OpenACCSeqClause *OpenACCSeqClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCSeqClause));
|
|
return new (Mem) OpenACCSeqClause(BeginLoc, EndLoc);
|
|
}
|
|
|
|
OpenACCGangClause *OpenACCGangClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCGangClause));
|
|
return new (Mem) OpenACCGangClause(BeginLoc, EndLoc);
|
|
}
|
|
|
|
OpenACCWorkerClause *OpenACCWorkerClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCWorkerClause));
|
|
return new (Mem) OpenACCWorkerClause(BeginLoc, EndLoc);
|
|
}
|
|
|
|
OpenACCVectorClause *OpenACCVectorClause::Create(const ASTContext &C,
|
|
SourceLocation BeginLoc,
|
|
SourceLocation EndLoc) {
|
|
void *Mem = C.Allocate(sizeof(OpenACCVectorClause));
|
|
return new (Mem) OpenACCVectorClause(BeginLoc, EndLoc);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// OpenACC clauses printing methods
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
void OpenACCClausePrinter::printExpr(const Expr *E) {
|
|
E->printPretty(OS, nullptr, Policy, 0);
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitDefaultClause(const OpenACCDefaultClause &C) {
|
|
OS << "default(" << C.getDefaultClauseKind() << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitIfClause(const OpenACCIfClause &C) {
|
|
OS << "if(";
|
|
printExpr(C.getConditionExpr());
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitSelfClause(const OpenACCSelfClause &C) {
|
|
OS << "self";
|
|
if (const Expr *CondExpr = C.getConditionExpr()) {
|
|
OS << "(";
|
|
printExpr(CondExpr);
|
|
OS << ")";
|
|
}
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitNumGangsClause(const OpenACCNumGangsClause &C) {
|
|
OS << "num_gangs(";
|
|
llvm::interleaveComma(C.getIntExprs(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitNumWorkersClause(
|
|
const OpenACCNumWorkersClause &C) {
|
|
OS << "num_workers(";
|
|
printExpr(C.getIntExpr());
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitVectorLengthClause(
|
|
const OpenACCVectorLengthClause &C) {
|
|
OS << "vector_length(";
|
|
printExpr(C.getIntExpr());
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitAsyncClause(const OpenACCAsyncClause &C) {
|
|
OS << "async";
|
|
if (C.hasIntExpr()) {
|
|
OS << "(";
|
|
printExpr(C.getIntExpr());
|
|
OS << ")";
|
|
}
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitPrivateClause(const OpenACCPrivateClause &C) {
|
|
OS << "private(";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitFirstPrivateClause(
|
|
const OpenACCFirstPrivateClause &C) {
|
|
OS << "firstprivate(";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitAttachClause(const OpenACCAttachClause &C) {
|
|
OS << "attach(";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitDevicePtrClause(
|
|
const OpenACCDevicePtrClause &C) {
|
|
OS << "deviceptr(";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitNoCreateClause(const OpenACCNoCreateClause &C) {
|
|
OS << "no_create(";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitPresentClause(const OpenACCPresentClause &C) {
|
|
OS << "present(";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitCopyClause(const OpenACCCopyClause &C) {
|
|
OS << C.getClauseKind() << '(';
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitCopyInClause(const OpenACCCopyInClause &C) {
|
|
OS << C.getClauseKind() << '(';
|
|
if (C.isReadOnly())
|
|
OS << "readonly: ";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitCopyOutClause(const OpenACCCopyOutClause &C) {
|
|
OS << C.getClauseKind() << '(';
|
|
if (C.isZero())
|
|
OS << "zero: ";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitCreateClause(const OpenACCCreateClause &C) {
|
|
OS << C.getClauseKind() << '(';
|
|
if (C.isZero())
|
|
OS << "zero: ";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitReductionClause(
|
|
const OpenACCReductionClause &C) {
|
|
OS << "reduction(" << C.getReductionOp() << ": ";
|
|
llvm::interleaveComma(C.getVarList(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitWaitClause(const OpenACCWaitClause &C) {
|
|
OS << "wait";
|
|
if (!C.getLParenLoc().isInvalid()) {
|
|
OS << "(";
|
|
if (C.hasDevNumExpr()) {
|
|
OS << "devnum: ";
|
|
printExpr(C.getDevNumExpr());
|
|
OS << " : ";
|
|
}
|
|
|
|
if (C.hasQueuesTag())
|
|
OS << "queues: ";
|
|
|
|
llvm::interleaveComma(C.getQueueIdExprs(), OS,
|
|
[&](const Expr *E) { printExpr(E); });
|
|
OS << ")";
|
|
}
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitDeviceTypeClause(
|
|
const OpenACCDeviceTypeClause &C) {
|
|
OS << C.getClauseKind();
|
|
OS << "(";
|
|
llvm::interleaveComma(C.getArchitectures(), OS,
|
|
[&](const DeviceTypeArgument &Arch) {
|
|
if (Arch.first == nullptr)
|
|
OS << "*";
|
|
else
|
|
OS << Arch.first->getName();
|
|
});
|
|
OS << ")";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitAutoClause(const OpenACCAutoClause &C) {
|
|
OS << "auto";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitIndependentClause(
|
|
const OpenACCIndependentClause &C) {
|
|
OS << "independent";
|
|
}
|
|
|
|
void OpenACCClausePrinter::VisitSeqClause(const OpenACCSeqClause &C) {
|
|
OS << "seq";
|
|
}
|