OldStyleParameter, ComplexConstructor, PercentLOC, SignedPrimary, FileName,
Convert, Dispose, IOListLeadingComma, AbbreviatedEditDescriptor,
ProgramParentheses, PercentRefAndVal, OmitFunctionDummies, CrayPointer,
- Hollerith, ArithmeticIF, Assign, AssignedGOTO, Pause, OpenACC, OpenMP,
+ Hollerith, ArithmeticIF, Assign, AssignedGOTO, Pause, OpenMP,
CruftAfterAmpersand, ClassicCComments, AdditionalFormats, BigIntLiterals,
RealDoControls, EquivalenceNumericWithCharacter, AdditionalIntrinsics,
AnonymousParents, OldLabelDoEndStatements, LogicalIntegerAssignment,
LanguageFeatureControl() {
// These features must be explicitly enabled by command line options.
disable_.set(LanguageFeature::OldDebugLines);
- disable_.set(LanguageFeature::OpenACC);
disable_.set(LanguageFeature::OpenMP);
// These features, if enabled, conflict with valid standard usage,
// so there are disabled here by default.
void WarnOnAllNonstandard(bool yes = true) { warnAll_ = yes; }
bool IsEnabled(LanguageFeature f) const { return !disable_.test(f); }
bool ShouldWarn(LanguageFeature f) const {
- return (warnAll_ && f != LanguageFeature::OpenMP &&
- f != LanguageFeature::OpenACC) ||
- warn_.test(f);
+ return (warnAll_ && f != LanguageFeature::OpenMP) || warn_.test(f);
}
// Return all spellings of operators names, depending on features enabled
std::vector<const char *> GetNames(LogicalOperator) const;
NODE(format, IntrinsicTypeDataEditDesc)
NODE(format::IntrinsicTypeDataEditDesc, Kind)
NODE(parser, Abstract)
- NODE(parser, AccAtomicCapture)
- NODE(AccAtomicCapture, Stmt1)
- NODE(AccAtomicCapture, Stmt2)
- NODE(parser, AccAtomicRead)
- NODE(parser, AccAtomicUpdate)
- NODE(parser, AccAtomicWrite)
- NODE(parser, AccBeginBlockDirective)
- NODE(parser, AccBeginCombinedDirective)
- NODE(parser, AccBeginLoopDirective)
- NODE(parser, AccBlockDirective)
- NODE(parser, AccClause)
- NODE(AccClause, Auto)
- NODE(AccClause, Async)
- NODE(AccClause, Attach)
- NODE(AccClause, Bind)
- NODE(AccClause, Capture)
- NODE(AccClause, Collapse)
- NODE(AccClause, Copy)
- NODE(AccClause, Copyin)
- NODE(AccClause, Copyout)
- NODE(AccClause, Create)
- NODE(AccClause, Default)
- NODE(AccClause, DefaultAsync)
- NODE(AccClause, Delete)
- NODE(AccClause, Detach)
- NODE(AccClause, Device)
- NODE(AccClause, DeviceNum)
- NODE(AccClause, DevicePtr)
- NODE(AccClause, DeviceResident)
- NODE(AccClause, DeviceType)
- NODE(AccClause, Finalize)
- NODE(AccClause, FirstPrivate)
- NODE(AccClause, Gang)
- NODE(AccClause, Host)
- NODE(AccClause, If)
- NODE(AccClause, IfPresent)
- NODE(AccClause, Independent)
- NODE(AccClause, Link)
- NODE(AccClause, NoCreate)
- NODE(AccClause, NoHost)
- NODE(AccClause, NumGangs)
- NODE(AccClause, NumWorkers)
- NODE(AccClause, Present)
- NODE(AccClause, Private)
- NODE(AccClause, Tile)
- NODE(AccClause, UseDevice)
- NODE(AccClause, Read)
- NODE(AccClause, Reduction)
- NODE(AccClause, Self)
- NODE(AccClause, Seq)
- NODE(AccClause, Vector)
- NODE(AccClause, VectorLength)
- NODE(AccClause, Wait)
- NODE(AccClause, Worker)
- NODE(AccClause, Write)
- NODE(AccClause, Unknown)
- NODE(parser, AccDefaultClause)
- NODE_ENUM(parser::AccDefaultClause, Arg)
- NODE(parser, AccClauseList)
- NODE(parser, AccCombinedDirective)
- NODE(parser, AccDataModifier)
- NODE_ENUM(parser::AccDataModifier, Modifier)
- NODE(parser, AccDeclarativeDirective)
- NODE(parser, AccEndAtomic)
- NODE(parser, AccEndBlockDirective)
- NODE(parser, AccEndCombinedDirective)
- NODE(parser, AccGangArgument)
- NODE(parser, AccObject)
- NODE(parser, AccObjectList)
- NODE(parser, AccObjectListWithModifier)
- NODE(parser, AccObjectListWithReduction)
- NODE(parser, AccReductionOperator)
- NODE(parser, AccSizeExpr)
- NODE(parser, AccSizeExprList)
- NODE(parser, AccStandaloneDirective)
- NODE(parser, AccLoopDirective)
- NODE(parser, AccWaitArgument)
- static std::string GetNodeName(const llvm::acc::Directive &x) {
- return llvm::Twine(
- "llvm::acc::Directive = ", llvm::acc::getOpenACCDirectiveName(x))
- .str();
- }
NODE(parser, AcImpliedDo)
NODE(parser, AcImpliedDoControl)
NODE(parser, AcValue)
NODE(parser, OmpSectionsDirective)
NODE(parser, OmpSimpleStandaloneDirective)
NODE(parser, Only)
- NODE(parser, OpenACCAtomicConstruct)
- NODE(parser, OpenACCBlockConstruct)
- NODE(parser, OpenACCCacheConstruct)
- NODE(parser, OpenACCCombinedConstruct)
- NODE(parser, OpenACCConstruct)
- NODE(parser, OpenACCDeclarativeConstruct)
- NODE(parser, OpenACCLoopConstruct)
- NODE(parser, OpenACCRoutineConstruct)
- NODE(parser, OpenACCStandaloneDeclarativeConstruct)
- NODE(parser, OpenACCStandaloneConstruct)
- NODE(parser, OpenACCWaitConstruct)
NODE(parser, OpenMPAtomicConstruct)
NODE(parser, OpenMPBlockConstruct)
NODE(parser, OpenMPCancelConstruct)
#include "flang/Common/Fortran.h"
#include "flang/Common/idioms.h"
#include "flang/Common/indirection.h"
-#include "llvm/Frontend/OpenACC/ACC.h.inc"
#include "llvm/Frontend/OpenMP/OMPConstants.h"
#include <cinttypes>
#include <list>
struct AssignStmt;
struct AssignedGotoStmt;
struct PauseStmt;
-struct OpenACCConstruct;
-struct OpenACCDeclarativeConstruct;
struct OpenMPConstruct;
struct OpenMPDeclarativeConstruct;
struct OmpEndLoopDirective;
Statement<OtherSpecificationStmt>,
Statement<common::Indirection<TypeDeclarationStmt>>,
common::Indirection<StructureDef>,
- common::Indirection<OpenACCDeclarativeConstruct>,
common::Indirection<OpenMPDeclarativeConstruct>,
common::Indirection<CompilerDirective>>
u;
// from the implicit part to the declaration constructs
struct SpecificationPart {
TUPLE_CLASS_BOILERPLATE(SpecificationPart);
- std::tuple<std::list<OpenACCDeclarativeConstruct>,
- std::list<OpenMPDeclarativeConstruct>,
+ std::tuple<std::list<OpenMPDeclarativeConstruct>,
std::list<Statement<common::Indirection<UseStmt>>>,
std::list<Statement<common::Indirection<ImportStmt>>>, ImplicitPart,
std::list<DeclarationConstruct>>
common::Indirection<SelectTypeConstruct>,
common::Indirection<WhereConstruct>, common::Indirection<ForallConstruct>,
common::Indirection<CompilerDirective>,
- common::Indirection<OpenACCConstruct>,
common::Indirection<OpenMPConstruct>,
common::Indirection<OmpEndLoopDirective>>
u;
OpenMPCriticalConstruct>
u;
};
-
-// Parse tree nodes for OpenACC 3.0 directives and clauses
-
-struct AccObject {
- UNION_CLASS_BOILERPLATE(AccObject);
- std::variant<Designator, /*common block*/ Name> u;
-};
-
-WRAPPER_CLASS(AccObjectList, std::list<AccObject>);
-
-// OpenACC directive beginning or ending a block
-struct AccBlockDirective {
- WRAPPER_CLASS_BOILERPLATE(AccBlockDirective, llvm::acc::Directive);
- CharBlock source;
-};
-
-struct AccLoopDirective {
- WRAPPER_CLASS_BOILERPLATE(AccLoopDirective, llvm::acc::Directive);
- CharBlock source;
-};
-
-struct AccStandaloneDirective {
- WRAPPER_CLASS_BOILERPLATE(AccStandaloneDirective, llvm::acc::Directive);
- CharBlock source;
-};
-
-// 2.11 Combined constructs
-struct AccCombinedDirective {
- WRAPPER_CLASS_BOILERPLATE(AccCombinedDirective, llvm::acc::Directive);
- CharBlock source;
-};
-
-struct AccDeclarativeDirective {
- WRAPPER_CLASS_BOILERPLATE(AccDeclarativeDirective, llvm::acc::Directive);
- CharBlock source;
-};
-
-// OpenACC Clauses
-struct AccDefaultClause {
- ENUM_CLASS(Arg, None, Present)
- WRAPPER_CLASS_BOILERPLATE(AccDefaultClause, Arg);
- CharBlock source;
-};
-
-struct AccDataModifier {
- ENUM_CLASS(Modifier, ReadOnly, Zero)
- WRAPPER_CLASS_BOILERPLATE(AccDataModifier, Modifier);
- CharBlock source;
-};
-
-struct AccObjectListWithModifier {
- TUPLE_CLASS_BOILERPLATE(AccObjectListWithModifier);
- std::tuple<std::optional<AccDataModifier>, AccObjectList> t;
-};
-
-// 2.5.13: + | * | max | min | iand | ior | ieor | .and. | .or. | .eqv. | .neqv.
-struct AccReductionOperator {
- UNION_CLASS_BOILERPLATE(AccReductionOperator);
- std::variant<DefinedOperator, ProcedureDesignator> u;
-};
-
-struct AccObjectListWithReduction {
- TUPLE_CLASS_BOILERPLATE(AccObjectListWithReduction);
- std::tuple<AccReductionOperator, AccObjectList> t;
-};
-
-struct AccWaitArgument {
- TUPLE_CLASS_BOILERPLATE(AccWaitArgument);
- std::tuple<std::optional<ScalarIntExpr>, std::list<ScalarIntExpr>> t;
-};
-
-struct AccSizeExpr {
- TUPLE_CLASS_BOILERPLATE(AccSizeExpr);
- CharBlock source;
- std::tuple<std::optional<ScalarIntExpr>> t; // if null then *
-};
-
-struct AccSizeExprList {
- WRAPPER_CLASS_BOILERPLATE(AccSizeExprList, std::list<AccSizeExpr>);
-};
-
-struct AccGangArgument {
- TUPLE_CLASS_BOILERPLATE(AccGangArgument);
- std::tuple<std::optional<ScalarIntExpr>, std::optional<AccSizeExpr>> t;
-};
-
-struct AccClause {
- UNION_CLASS_BOILERPLATE(AccClause);
-
- EMPTY_CLASS(Auto);
- WRAPPER_CLASS(Async, std::optional<ScalarIntExpr>);
- WRAPPER_CLASS(Attach, AccObjectList);
- WRAPPER_CLASS(Bind, Name);
- EMPTY_CLASS(Capture);
- WRAPPER_CLASS(Collapse, ScalarIntConstantExpr);
- WRAPPER_CLASS(Copy, AccObjectList);
- WRAPPER_CLASS(Copyin, AccObjectListWithModifier);
- WRAPPER_CLASS(Copyout, AccObjectListWithModifier);
- WRAPPER_CLASS(Create, AccObjectListWithModifier);
- WRAPPER_CLASS(Default, AccDefaultClause);
- WRAPPER_CLASS(DefaultAsync, ScalarIntExpr);
- WRAPPER_CLASS(Delete, AccObjectList);
- WRAPPER_CLASS(Detach, AccObjectList);
- WRAPPER_CLASS(Device, AccObjectList);
- WRAPPER_CLASS(DeviceNum, ScalarIntConstantExpr);
- WRAPPER_CLASS(DevicePtr, AccObjectList);
- WRAPPER_CLASS(DeviceResident, AccObjectList);
- WRAPPER_CLASS(DeviceType, std::optional<std::list<Name>>);
- EMPTY_CLASS(Finalize);
- WRAPPER_CLASS(FirstPrivate, AccObjectList);
- WRAPPER_CLASS(Gang, std::optional<AccGangArgument>);
- WRAPPER_CLASS(Host, AccObjectList);
- WRAPPER_CLASS(If, ScalarLogicalExpr);
- EMPTY_CLASS(IfPresent);
- EMPTY_CLASS(Independent);
- WRAPPER_CLASS(Link, AccObjectList);
- WRAPPER_CLASS(NoCreate, AccObjectList);
- EMPTY_CLASS(NoHost);
- WRAPPER_CLASS(NumGangs, ScalarIntExpr);
- WRAPPER_CLASS(NumWorkers, ScalarIntExpr);
- WRAPPER_CLASS(Present, AccObjectList);
- WRAPPER_CLASS(Private, AccObjectList);
- WRAPPER_CLASS(Tile, AccSizeExprList);
- WRAPPER_CLASS(UseDevice, AccObjectList);
- EMPTY_CLASS(Read);
- WRAPPER_CLASS(Reduction, AccObjectListWithReduction);
- WRAPPER_CLASS(Self, std::optional<ScalarLogicalExpr>);
- EMPTY_CLASS(Seq);
- WRAPPER_CLASS(Vector, std::optional<ScalarIntExpr>);
- WRAPPER_CLASS(VectorLength, ScalarIntExpr);
- WRAPPER_CLASS(Wait, std::optional<AccWaitArgument>);
- WRAPPER_CLASS(Worker, std::optional<ScalarIntExpr>);
- EMPTY_CLASS(Write);
- EMPTY_CLASS(Unknown);
-
- CharBlock source;
-
- std::variant<Auto, Async, Attach, Bind, Capture, Collapse, Copy, Copyin,
- Copyout, Create, Default, DefaultAsync, Delete, Detach, Device, DeviceNum,
- DevicePtr, DeviceResident, DeviceType, Finalize, FirstPrivate, Gang, Host,
- If, IfPresent, Independent, Link, NoCreate, NoHost, NumGangs, NumWorkers,
- Present, Private, Tile, UseDevice, Read, Reduction, Self, Seq, Vector,
- VectorLength, Wait, Worker, Write, Unknown>
- u;
-};
-
-struct AccClauseList {
- WRAPPER_CLASS_BOILERPLATE(AccClauseList, std::list<AccClause>);
- CharBlock source;
-};
-
-struct OpenACCRoutineConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCRoutineConstruct);
- CharBlock source;
- std::tuple<Verbatim, std::optional<Name>, AccClauseList> t;
-};
-
-struct OpenACCCacheConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCCacheConstruct);
- CharBlock source;
- std::tuple<Verbatim, AccObjectListWithModifier> t;
-};
-
-struct OpenACCWaitConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCWaitConstruct);
- CharBlock source;
- std::tuple<Verbatim, std::optional<AccWaitArgument>, AccClauseList> t;
-};
-
-struct AccBeginLoopDirective {
- TUPLE_CLASS_BOILERPLATE(AccBeginLoopDirective);
- std::tuple<AccLoopDirective, AccClauseList> t;
- CharBlock source;
-};
-
-struct AccBeginBlockDirective {
- TUPLE_CLASS_BOILERPLATE(AccBeginBlockDirective);
- CharBlock source;
- std::tuple<AccBlockDirective, AccClauseList> t;
-};
-
-struct AccEndBlockDirective {
- CharBlock source;
- WRAPPER_CLASS_BOILERPLATE(AccEndBlockDirective, AccBlockDirective);
-};
-
-// ACC END ATOMIC
-EMPTY_CLASS(AccEndAtomic);
-
-// ACC ATOMIC READ
-struct AccAtomicRead {
- TUPLE_CLASS_BOILERPLATE(AccAtomicRead);
- std::tuple<Verbatim, Statement<AssignmentStmt>, std::optional<AccEndAtomic>>
- t;
-};
-
-// ACC ATOMIC WRITE
-struct AccAtomicWrite {
- TUPLE_CLASS_BOILERPLATE(AccAtomicWrite);
- std::tuple<Verbatim, Statement<AssignmentStmt>, std::optional<AccEndAtomic>>
- t;
-};
-
-// ACC ATOMIC UPDATE
-struct AccAtomicUpdate {
- TUPLE_CLASS_BOILERPLATE(AccAtomicUpdate);
- std::tuple<std::optional<Verbatim>, Statement<AssignmentStmt>,
- std::optional<AccEndAtomic>>
- t;
-};
-
-// ACC ATOMIC CAPTURE
-struct AccAtomicCapture {
- TUPLE_CLASS_BOILERPLATE(AccAtomicCapture);
- WRAPPER_CLASS(Stmt1, Statement<AssignmentStmt>);
- WRAPPER_CLASS(Stmt2, Statement<AssignmentStmt>);
- std::tuple<Verbatim, Stmt1, Stmt2, AccEndAtomic> t;
-};
-
-struct OpenACCAtomicConstruct {
- UNION_CLASS_BOILERPLATE(OpenACCAtomicConstruct);
- std::variant<AccAtomicRead, AccAtomicWrite, AccAtomicCapture, AccAtomicUpdate>
- u;
-};
-
-struct OpenACCBlockConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCBlockConstruct);
- std::tuple<AccBeginBlockDirective, Block, AccEndBlockDirective> t;
-};
-
-struct OpenACCStandaloneDeclarativeConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCStandaloneDeclarativeConstruct);
- CharBlock source;
- std::tuple<AccDeclarativeDirective, AccClauseList> t;
-};
-
-struct AccBeginCombinedDirective {
- TUPLE_CLASS_BOILERPLATE(AccBeginCombinedDirective);
- std::tuple<AccCombinedDirective, AccClauseList> t;
-};
-
-struct AccEndCombinedDirective {
- WRAPPER_CLASS_BOILERPLATE(AccEndCombinedDirective, AccCombinedDirective);
- CharBlock source;
-};
-
-struct OpenACCCombinedConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCCombinedConstruct);
- CharBlock source;
- std::tuple<AccBeginCombinedDirective, Block,
- std::optional<AccEndCombinedDirective>>
- t;
-};
-
-struct OpenACCDeclarativeConstruct {
- UNION_CLASS_BOILERPLATE(OpenACCDeclarativeConstruct);
- CharBlock source;
- std::variant<OpenACCStandaloneDeclarativeConstruct> u;
-};
-
-// OpenACC directives enclosing do loop
-struct OpenACCLoopConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCLoopConstruct);
- OpenACCLoopConstruct(AccBeginLoopDirective &&a)
- : t({std::move(a), std::nullopt}) {}
- std::tuple<AccBeginLoopDirective, std::optional<DoConstruct>> t;
-};
-
-struct OpenACCStandaloneConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenACCStandaloneConstruct);
- CharBlock source;
- std::tuple<AccStandaloneDirective, AccClauseList> t;
-};
-
-struct OpenACCConstruct {
- UNION_CLASS_BOILERPLATE(OpenACCConstruct);
- std::variant<OpenACCBlockConstruct, OpenACCCombinedConstruct,
- OpenACCLoopConstruct, OpenACCStandaloneConstruct, OpenACCRoutineConstruct,
- OpenACCCacheConstruct, OpenACCWaitConstruct, OpenACCAtomicConstruct>
- u;
-};
-
} // namespace Fortran::parser
#endif // FORTRAN_PARSER_PARSE_TREE_H_
instrumented-parser.cpp
io-parsers.cpp
message.cpp
- openacc-parsers.cpp
openmp-parsers.cpp
parse-tree.cpp
parsing.cpp
DEPENDS
omp_gen
- acc_gen
)
construct<ExecutableConstruct>(indirect(whereConstruct)),
construct<ExecutableConstruct>(indirect(forallConstruct)),
construct<ExecutableConstruct>(indirect(ompEndLoopDirective)),
- construct<ExecutableConstruct>(indirect(openaccConstruct)),
construct<ExecutableConstruct>(indirect(openmpConstruct)),
construct<ExecutableConstruct>(indirect(compilerDirective)))};
+++ /dev/null
-//===-- lib/Parser/openacc-parsers.cpp ------------------------------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-// Top-level grammar specification for OpenACC 3.0.
-
-#include "basic-parsers.h"
-#include "expr-parsers.h"
-#include "misc-parsers.h"
-#include "stmt-parser.h"
-#include "token-parsers.h"
-#include "type-parser-implementation.h"
-#include "flang/Parser/parse-tree.h"
-
-// OpenACC Directives and Clauses
-namespace Fortran::parser {
-
-constexpr auto startAccLine = skipStuffBeforeStatement >> "!$ACC "_sptok;
-constexpr auto endAccLine = space >> endOfLine;
-
-// Basic clauses
-TYPE_PARSER("AUTO" >> construct<AccClause>(construct<AccClause::Auto>()) ||
- "ASYNC" >> construct<AccClause>(construct<AccClause::Async>(
- maybe(parenthesized(scalarIntExpr)))) ||
- "ATTACH" >> construct<AccClause>(construct<AccClause::Attach>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "BIND" >> construct<AccClause>(construct<AccClause::Bind>(
- parenthesized(name))) ||
- "CAPTURE" >> construct<AccClause>(construct<AccClause::Capture>()) ||
- "COLLAPSE" >> construct<AccClause>(construct<AccClause::Collapse>(
- parenthesized(scalarIntConstantExpr))) ||
- ("COPY"_tok || "PRESENT_OR_COPY"_tok || "PCOPY"_tok) >>
- construct<AccClause>(construct<AccClause::Copy>(
- parenthesized(Parser<AccObjectList>{}))) ||
- ("COPYIN"_tok || "PRESENT_OR_COPYIN"_tok || "PCOPYIN"_tok) >>
- construct<AccClause>(construct<AccClause::Copyin>(
- parenthesized(Parser<AccObjectListWithModifier>{}))) ||
- ("COPYOUT"_tok || "PRESENT_OR_COPYOUT"_tok || "PCOPYOUT"_tok) >>
- construct<AccClause>(construct<AccClause::Copyout>(
- parenthesized(Parser<AccObjectListWithModifier>{}))) ||
- ("CREATE"_tok || "PRESENT_OR_CREATE"_tok || "PCREATE"_tok) >>
- construct<AccClause>(construct<AccClause::Create>(
- parenthesized(Parser<AccObjectListWithModifier>{}))) ||
- "DEFAULT" >> construct<AccClause>(construct<AccClause::Default>(
- Parser<AccDefaultClause>{})) ||
- "DEFAULT_ASYNC" >> construct<AccClause>(construct<AccClause::DefaultAsync>(
- parenthesized(scalarIntExpr))) ||
- "DELETE" >> construct<AccClause>(construct<AccClause::Delete>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "DETACH" >> construct<AccClause>(construct<AccClause::Detach>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "DEVICE" >> construct<AccClause>(construct<AccClause::Device>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "DEVICEPTR" >> construct<AccClause>(construct<AccClause::DevicePtr>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "DEVICENUM" >> construct<AccClause>(construct<AccClause::DeviceNum>(
- parenthesized(scalarIntConstantExpr))) ||
- "DEVICE_RESIDENT" >>
- construct<AccClause>(construct<AccClause::DeviceResident>(
- parenthesized(Parser<AccObjectList>{}))) ||
- ("DEVICE_TYPE"_tok || "DTYPE"_tok) >> construct<AccClause>(
- construct<AccClause::DeviceType>(parenthesized(
- "*" >> construct<std::optional<std::list<Name>>>()))) ||
- ("DEVICE_TYPE"_tok || "DTYPE"_tok) >> construct<AccClause>(
- construct<AccClause::DeviceType>(
- parenthesized(maybe(nonemptyList(name))))) ||
- "FINALIZE" >> construct<AccClause>(construct<AccClause::Finalize>()) ||
- "FIRSTPRIVATE" >> construct<AccClause>(construct<AccClause::FirstPrivate>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "GANG" >> construct<AccClause>(construct<AccClause::Gang>(
- maybe(parenthesized(Parser<AccGangArgument>{})))) ||
- "HOST" >> construct<AccClause>(construct<AccClause::Host>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "IF" >> construct<AccClause>(
- construct<AccClause::If>(parenthesized(scalarLogicalExpr))) ||
- "IF_PRESENT" >> construct<AccClause>(construct<AccClause::IfPresent>()) ||
- "INDEPENDENT" >> construct<AccClause>(
- construct<AccClause::Independent>()) ||
- "LINK" >> construct<AccClause>(construct<AccClause::Link>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "NO_CREATE" >> construct<AccClause>(construct<AccClause::NoCreate>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "NOHOST" >> construct<AccClause>(construct<AccClause::NoHost>()) ||
- "NUM_GANGS" >> construct<AccClause>(construct<AccClause::NumGangs>(
- parenthesized(scalarIntExpr))) ||
- "NUM_WORKERS" >> construct<AccClause>(construct<AccClause::NumWorkers>(
- parenthesized(scalarIntExpr))) ||
- "PRESENT" >> construct<AccClause>(construct<AccClause::Present>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "PRIVATE" >> construct<AccClause>(construct<AccClause::Private>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "READ" >> construct<AccClause>(construct<AccClause::Read>()) ||
- "REDUCTION" >> construct<AccClause>(construct<AccClause::Reduction>(
- parenthesized(construct<AccObjectListWithReduction>(
- Parser<AccReductionOperator>{} / ":",
- Parser<AccObjectList>{})))) ||
- "SELF" >> construct<AccClause>(construct<AccClause::Self>(
- maybe(parenthesized(scalarLogicalExpr)))) ||
- "SEQ" >> construct<AccClause>(construct<AccClause::Seq>()) ||
- "TILE" >> construct<AccClause>(construct<AccClause::Tile>(
- parenthesized(Parser<AccSizeExprList>{}))) ||
- "USE_DEVICE" >> construct<AccClause>(construct<AccClause::UseDevice>(
- parenthesized(Parser<AccObjectList>{}))) ||
- "VECTOR_LENGTH" >> construct<AccClause>(construct<AccClause::VectorLength>(
- parenthesized(scalarIntExpr))) ||
- "VECTOR" >> construct<AccClause>(construct<AccClause::Vector>(maybe(
- parenthesized(("LENGTH:" >> scalarIntExpr || scalarIntExpr))))) ||
- "WAIT" >> construct<AccClause>(construct<AccClause::Wait>(
- maybe(Parser<AccWaitArgument>{}))) ||
- "WORKER" >> construct<AccClause>(construct<AccClause::Worker>(maybe(
- parenthesized(("NUM:" >> scalarIntExpr || scalarIntExpr))))) ||
- "WRITE" >> construct<AccClause>(construct<AccClause::Auto>()))
-
-TYPE_PARSER(
- construct<AccObject>(designator) || construct<AccObject>("/" >> name / "/"))
-
-TYPE_PARSER(construct<AccObjectList>(nonemptyList(Parser<AccObject>{})))
-
-TYPE_PARSER(construct<AccObjectListWithModifier>(
- maybe(Parser<AccDataModifier>{}), Parser<AccObjectList>{}))
-
-TYPE_PARSER(construct<AccWaitArgument>(
- maybe("DEVNUM:" >> scalarIntExpr / ":"), nonemptyList(scalarIntExpr)))
-
-// 2.9 (1609) size-expr is one of:
-// int-expr
-TYPE_PARSER(construct<AccSizeExpr>(scalarIntExpr) ||
- construct<AccSizeExpr>("*" >> maybe(scalarIntExpr)))
-TYPE_PARSER(construct<AccSizeExprList>(nonemptyList(Parser<AccSizeExpr>{})))
-
-// 2.9 (1607) gang-arg is one of:
-// [num:]int-expr
-// static:size-expr
-TYPE_PARSER(construct<AccGangArgument>(maybe(scalarIntExpr),
- maybe(","_tok / "STATIC:" >> Parser<AccSizeExpr>{})) ||
- construct<AccGangArgument>(maybe("NUM:" >> scalarIntExpr),
- maybe(","_tok / "STATIC:" >> Parser<AccSizeExpr>{})))
-
-// 2.5.13 Reduction
-TYPE_PARSER(construct<AccReductionOperator>(Parser<DefinedOperator>{}) ||
- construct<AccReductionOperator>(Parser<ProcedureDesignator>{}))
-
-// 2.5.14 Default clause
-TYPE_PARSER(construct<AccDefaultClause>(
- parenthesized(first("NONE" >> pure(AccDefaultClause::Arg::None),
- "PRESENT" >> pure(AccDefaultClause::Arg::Present)))))
-
-// Modifier for copyin, copyout, cache and create
-TYPE_PARSER(construct<AccDataModifier>(
- first("ZERO:" >> pure(AccDataModifier::Modifier::Zero),
- "READONLY:" >> pure(AccDataModifier::Modifier::ReadOnly))))
-
-// Combined directives
-TYPE_PARSER(sourced(construct<AccCombinedDirective>(
- first("KERNELS LOOP" >> pure(llvm::acc::Directive::ACCD_kernels_loop),
- "PARALLEL LOOP" >> pure(llvm::acc::Directive::ACCD_parallel_loop),
- "SERIAL LOOP" >> pure(llvm::acc::Directive::ACCD_serial_loop)))))
-
-// Block directives
-TYPE_PARSER(sourced(construct<AccBlockDirective>(
- first("DATA" >> pure(llvm::acc::Directive::ACCD_data),
- "HOST_DATA" >> pure(llvm::acc::Directive::ACCD_host_data),
- "KERNELS" >> pure(llvm::acc::Directive::ACCD_kernels),
- "PARALLEL" >> pure(llvm::acc::Directive::ACCD_parallel),
- "SERIAL" >> pure(llvm::acc::Directive::ACCD_serial)))))
-
-// Standalone directives
-TYPE_PARSER(sourced(construct<AccStandaloneDirective>(
- first("ENTER DATA" >> pure(llvm::acc::Directive::ACCD_enter_data),
- "EXIT DATA" >> pure(llvm::acc::Directive::ACCD_exit_data),
- "INIT" >> pure(llvm::acc::Directive::ACCD_init),
- "SHUTDOWN" >> pure(llvm::acc::Directive::ACCD_shutdown),
- "SET" >> pure(llvm::acc::Directive::ACCD_set),
- "UPDATE" >> pure(llvm::acc::Directive::ACCD_update)))))
-
-// Loop directives
-TYPE_PARSER(sourced(construct<AccLoopDirective>(
- first("LOOP" >> pure(llvm::acc::Directive::ACCD_loop)))))
-
-TYPE_PARSER(construct<AccBeginLoopDirective>(
- sourced(Parser<AccLoopDirective>{}), Parser<AccClauseList>{}))
-
-TYPE_PARSER(
- construct<OpenACCLoopConstruct>(sourced(Parser<AccBeginLoopDirective>{})))
-
-// 2.15.1 Routine directive
-TYPE_PARSER(sourced(construct<OpenACCRoutineConstruct>(verbatim("ROUTINE"_tok),
- maybe(parenthesized(name)), Parser<AccClauseList>{})))
-
-// 2.10 Cache directive
-TYPE_PARSER(sourced(
- construct<OpenACCCacheConstruct>(sourced(construct<Verbatim>("CACHE"_tok)),
- parenthesized(Parser<AccObjectListWithModifier>{}))))
-
-// 2.11 Combined constructs
-TYPE_PARSER(startAccLine >> construct<AccEndCombinedDirective>(sourced(
- "END"_tok >> Parser<AccCombinedDirective>{})))
-
-TYPE_PARSER(construct<AccBeginCombinedDirective>(
- sourced(Parser<AccCombinedDirective>{}), Parser<AccClauseList>{}))
-
-TYPE_PARSER(construct<OpenACCCombinedConstruct>(
- Parser<AccBeginCombinedDirective>{} / endAccLine, block,
- maybe(Parser<AccEndCombinedDirective>{} / endAccLine)))
-
-// 2.12 Atomic constructs
-TYPE_PARSER(construct<AccEndAtomic>(startAccLine >> "END ATOMIC"_tok))
-
-TYPE_PARSER("ATOMIC" >>
- construct<AccAtomicRead>(verbatim("READ"_tok) / endAccLine,
- statement(assignmentStmt), maybe(Parser<AccEndAtomic>{} / endAccLine)))
-
-TYPE_PARSER("ATOMIC" >>
- construct<AccAtomicWrite>(verbatim("WRITE"_tok) / endAccLine,
- statement(assignmentStmt), maybe(Parser<AccEndAtomic>{} / endAccLine)))
-
-TYPE_PARSER("ATOMIC" >>
- construct<AccAtomicUpdate>(maybe(verbatim("UPDATE"_tok)) / endAccLine,
- statement(assignmentStmt), maybe(Parser<AccEndAtomic>{} / endAccLine)))
-
-TYPE_PARSER("ATOMIC" >>
- construct<AccAtomicCapture>(verbatim("CAPTURE"_tok) / endAccLine,
- statement(assignmentStmt), statement(assignmentStmt),
- Parser<AccEndAtomic>{} / endAccLine))
-
-TYPE_PARSER(construct<OpenACCAtomicConstruct>(Parser<AccAtomicRead>{}) ||
- construct<OpenACCAtomicConstruct>(Parser<AccAtomicCapture>{}) ||
- construct<OpenACCAtomicConstruct>(Parser<AccAtomicWrite>{}) ||
- construct<OpenACCAtomicConstruct>(Parser<AccAtomicUpdate>{}))
-
-// 2.13 Declare constructs
-TYPE_PARSER(sourced(construct<AccDeclarativeDirective>(
- first("DECLARE" >> pure(llvm::acc::Directive::ACCD_declare)))))
-
-// [Clause, [Clause], ...]
-TYPE_PARSER(sourced(construct<AccClauseList>(
- many(maybe(","_tok) >> sourced(Parser<AccClause>{})))))
-
-// 2.16.3 Wait directive
-TYPE_PARSER(sourced(construct<OpenACCWaitConstruct>(
- sourced(construct<Verbatim>("WAIT"_tok)),
- maybe(parenthesized(Parser<AccWaitArgument>{})), Parser<AccClauseList>{})))
-
-// Block Constructs
-TYPE_PARSER(sourced(construct<AccBeginBlockDirective>(
- sourced(Parser<AccBlockDirective>{}), Parser<AccClauseList>{})))
-
-TYPE_PARSER(startAccLine >> sourced(construct<AccEndBlockDirective>("END"_tok >>
- sourced(Parser<AccBlockDirective>{}))))
-
-TYPE_PARSER(construct<OpenACCBlockConstruct>(
- Parser<AccBeginBlockDirective>{} / endAccLine, block,
- Parser<AccEndBlockDirective>{} / endAccLine))
-
-// Standalone constructs
-TYPE_PARSER(construct<OpenACCStandaloneConstruct>(
- sourced(Parser<AccStandaloneDirective>{}), Parser<AccClauseList>{}))
-
-// Standalone declarative constructs
-TYPE_PARSER(construct<OpenACCStandaloneDeclarativeConstruct>(
- sourced(Parser<AccDeclarativeDirective>{}), Parser<AccClauseList>{}))
-
-TYPE_PARSER(
- startAccLine >> sourced(construct<OpenACCDeclarativeConstruct>(
- Parser<OpenACCStandaloneDeclarativeConstruct>{})))
-
-// OpenACC constructs
-TYPE_CONTEXT_PARSER("OpenACC construct"_en_US,
- startAccLine >>
- first(construct<OpenACCConstruct>(Parser<OpenACCBlockConstruct>{}),
- construct<OpenACCConstruct>(Parser<OpenACCCombinedConstruct>{}),
- construct<OpenACCConstruct>(Parser<OpenACCLoopConstruct>{}),
- construct<OpenACCConstruct>(Parser<OpenACCStandaloneConstruct>{}),
- construct<OpenACCConstruct>(Parser<OpenACCRoutineConstruct>{}),
- construct<OpenACCConstruct>(Parser<OpenACCCacheConstruct>{}),
- construct<OpenACCConstruct>(Parser<OpenACCWaitConstruct>{}),
- construct<OpenACCConstruct>(Parser<OpenACCAtomicConstruct>{})))
-} // namespace Fortran::parser
constexpr auto startOmpLine = skipStuffBeforeStatement >> "!$OMP "_sptok;
constexpr auto endOmpLine = space >> endOfLine;
+template <typename A> constexpr decltype(auto) verbatim(A x) {
+ return sourced(construct<Verbatim>(x));
+}
+
// OpenMP Clauses
// 2.15.3.1 DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE)
TYPE_PARSER(construct<OmpDefaultClause>(
prescanner.set_fixedForm(options.isFixedForm)
.set_fixedFormColumnLimit(options.fixedFormColumns)
.AddCompilerDirectiveSentinel("dir$");
- if (options.features.IsEnabled(LanguageFeature::OpenACC)) {
- prescanner.AddCompilerDirectiveSentinel("$acc");
- }
if (options.features.IsEnabled(LanguageFeature::OpenMP)) {
prescanner.AddCompilerDirectiveSentinel("$omp");
prescanner.AddCompilerDirectiveSentinel("$"); // OMP conditional line
// [use-stmt]... [import-stmt]... [implicit-part]
// [declaration-construct]...
TYPE_CONTEXT_PARSER("specification part"_en_US,
- construct<SpecificationPart>(many(openaccDeclarativeConstruct),
- many(openmpDeclarativeConstruct),
+ construct<SpecificationPart>(many(openmpDeclarativeConstruct),
many(statement(indirect(Parser<UseStmt>{}))),
many(unambiguousStatement(indirect(Parser<ImportStmt>{}))),
implicitPart, many(declarationConstruct)))
// are in contexts that impose constraints on the kinds of statements that
// are allowed, and so we have a variant production for declaration-construct
// that implements those constraints.
-constexpr auto execPartLookAhead{first(actionStmt >> ok,
- ompEndLoopDirective >> ok, openaccConstruct >> ok, openmpConstruct >> ok,
- "ASSOCIATE ("_tok, "BLOCK"_tok, "SELECT"_tok, "CHANGE TEAM"_sptok,
- "CRITICAL"_tok, "DO"_tok, "IF ("_tok, "WHERE ("_tok, "FORALL ("_tok)};
+constexpr auto execPartLookAhead{
+ first(actionStmt >> ok, ompEndLoopDirective >> ok, openmpConstruct >> ok,
+ "ASSOCIATE ("_tok, "BLOCK"_tok, "SELECT"_tok, "CHANGE TEAM"_sptok,
+ "CRITICAL"_tok, "DO"_tok, "IF ("_tok, "WHERE ("_tok, "FORALL ("_tok)};
constexpr auto declErrorRecovery{
stmtErrorRecoveryStart >> !execPartLookAhead >> skipStmtErrorRecovery};
constexpr auto misplacedSpecificationStmt{Parser<UseStmt>{} >>
// specialized error recovery in the event of a spurious executable
// statement.
constexpr auto limitedSpecificationPart{inContext("specification part"_en_US,
- construct<SpecificationPart>(many(openaccDeclarativeConstruct),
- many(openmpDeclarativeConstruct),
+ construct<SpecificationPart>(many(openmpDeclarativeConstruct),
many(statement(indirect(Parser<UseStmt>{}))),
many(unambiguousStatement(indirect(Parser<ImportStmt>{}))),
implicitPart, many(limitedDeclarationConstruct)))};
construct<SpecificationConstruct>(
statement(indirect(typeDeclarationStmt))),
construct<SpecificationConstruct>(indirect(Parser<StructureDef>{})),
- construct<SpecificationConstruct>(
- indirect(openaccDeclarativeConstruct)),
construct<SpecificationConstruct>(indirect(openmpDeclarativeConstruct)),
construct<SpecificationConstruct>(indirect(compilerDirective))))
constexpr auto executionPartErrorRecovery{stmtErrorRecoveryStart >>
!"END"_tok >> !"CONTAINS"_tok >> !"ELSE"_tok >> !"CASE"_tok >>
!"TYPE IS"_tok >> !"CLASS"_tok >> !"RANK"_tok >>
- !("!$ACC "_sptok >> "END"_tok) >>
!("!$OMP "_sptok >> ("END"_tok || "SECTION"_id)) >> skipBadLine};
// END statement error recovery
constexpr auto rawHollerithLiteral{
deprecated<LanguageFeature::Hollerith>(HollerithLiteral{})};
-
-template <typename A> constexpr decltype(auto) verbatim(A x) {
- return sourced(construct<Verbatim>(x));
-}
-
} // namespace Fortran::parser
#endif // FORTRAN_PARSER_TOKEN_PARSERS_H_
constexpr Parser<EntryStmt> entryStmt; // R1541
constexpr Parser<ContainsStmt> containsStmt; // R1543
constexpr Parser<CompilerDirective> compilerDirective;
-constexpr Parser<OpenACCConstruct> openaccConstruct;
-constexpr Parser<OpenACCDeclarativeConstruct> openaccDeclarativeConstruct;
constexpr Parser<OpenMPConstruct> openmpConstruct;
constexpr Parser<OpenMPDeclarativeConstruct> openmpDeclarativeConstruct;
constexpr Parser<OmpEndLoopDirective> ompEndLoopDirective;
}
Walk(std::get<Name>(x.t));
}
-
- // OpenACC Directives & Clauses
- void Unparse(const AccAtomicCapture &x) {
- BeginOpenACC();
- Word("!$ACC CAPTURE");
- Put("\n");
- EndOpenACC();
- Walk(std::get<AccAtomicCapture::Stmt1>(x.t));
- Put("\n");
- Walk(std::get<AccAtomicCapture::Stmt2>(x.t));
- BeginOpenACC();
- Word("!$ACC END ATOMIC\n");
- EndOpenACC();
- }
- void Unparse(const AccAtomicRead &x) {
- BeginOpenACC();
- Word("!$ACC ATOMIC READ");
- Put("\n");
- EndOpenACC();
- Walk(std::get<Statement<AssignmentStmt>>(x.t));
- BeginOpenACC();
- Walk(std::get<std::optional<AccEndAtomic>>(x.t), "!$ACC END ATOMIC\n");
- EndOpenACC();
- }
- void Unparse(const AccAtomicWrite &x) {
- BeginOpenACC();
- Word("!$ACC ATOMIC WRITE");
- Put("\n");
- EndOpenACC();
- Walk(std::get<Statement<AssignmentStmt>>(x.t));
- BeginOpenACC();
- Walk(std::get<std::optional<AccEndAtomic>>(x.t), "!$ACC END ATOMIC\n");
- EndOpenACC();
- }
- void Unparse(const AccAtomicUpdate &x) {
- BeginOpenACC();
- Word("!$ACC ATOMIC UPDATE");
- Put("\n");
- EndOpenACC();
- Walk(std::get<Statement<AssignmentStmt>>(x.t));
- BeginOpenACC();
- Walk(std::get<std::optional<AccEndAtomic>>(x.t), "!$ACC END ATOMIC\n");
- EndOpenACC();
- }
- void Unparse(const llvm::acc::Directive &x) {
- Word(llvm::acc::getOpenACCDirectiveName(x).str());
- }
- void Before(const AccClause::Auto &) { Word("AUTO"); }
- void Before(const AccClause::Capture &) { Word("CAPTURE"); }
- void Before(const AccClause::Finalize &) { Word("FINALIZE"); }
- void Before(const AccClause::IfPresent &) { Word("IF_PRESENT"); }
- void Before(const AccClause::Independent &) { Word("INDEPENDENT"); }
- void Before(const AccClause::NoHost &) { Word("NOHOST"); }
- void Before(const AccClause::Read &) { Word("READ"); }
- void Before(const AccClause::Seq &) { Word("SEQ"); }
- void Before(const AccClause::Write &) { Word("WRITE"); }
- void Before(const AccClause::Unknown &) { Word("UNKNOWN"); }
- void Unparse(const AccClause::Attach &x) {
- Word("ATTACH");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Bind &x) {
- Word("BIND");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Collapse &x) {
- Word("COLLAPSE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Copy &x) {
- Word("COPY");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Copyin &x) {
- Word("COPYIN");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Copyout &x) {
- Word("COPYOUT");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Create &x) {
- Word("CREATE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Default &x) {
- Word("DEFAULT");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Delete &x) {
- Word("DELETE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Detach &x) {
- Word("DETACH");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Device &x) {
- Word("DEVICE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::DevicePtr &x) {
- Word("DEVICEPTR");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::DeviceResident &x) {
- Word("DEVICE_RESIDENT");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::FirstPrivate &x) {
- Word("FIRSTPRIVATE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Host &x) {
- Word("HOST");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::If &x) {
- Word("IF");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Link &x) {
- Word("LINK");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::NumGangs &x) {
- Word("NUM_GANGS");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::NumWorkers &x) {
- Word("NUM_WORKERS");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Present &x) {
- Word("PRESENT");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Private &x) {
- Word("PRIVATE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Reduction &x) {
- Word("REDUCTION");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::VectorLength &x) {
- Word("VECTOR_LENGTH");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Async &x) {
- Word("ASYNC");
- Walk("(", x.v, ")");
- }
- void Unparse(const AccClause::DefaultAsync &x) {
- Word("DEFAULT_ASYNC");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::DeviceNum &x) {
- Word("DEVICE_NUM");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Gang &x) {
- Word("GANG");
- Walk("(", x.v, ")");
- }
- void Unparse(const AccClause::NoCreate &x) {
- Word("NO_CREATE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::UseDevice &x) {
- Word("USE_DEVICE");
- Put("(");
- Walk(x.v);
- Put(")");
- }
- void Unparse(const AccClause::Self &x) {
- Word("SELF");
- Walk("(", x.v, ")");
- }
- void Unparse(const AccClause::Vector &x) {
- Word("VECTOR");
- Walk("(", x.v, ")");
- }
- void Unparse(const AccClause::Wait &x) {
- Word("WAIT");
- Walk("(", x.v, ")");
- }
- void Unparse(const AccClause::Worker &x) {
- Word("WORKER");
- Walk("(", x.v, ")");
- }
- void Unparse(const AccClause::DeviceType &x) {
- Word("DEVICE_TYPE");
- Put("(");
- if (x.v.has_value())
- Walk(x.v);
- else
- Put("*");
- Put(")");
- }
- void Unparse(const AccObjectListWithModifier &x) {
- Walk(std::get<std::optional<AccDataModifier>>(x.t), ":");
- Walk(std::get<AccObjectList>(x.t));
- }
- void Unparse(const AccDataModifier::Modifier &x) {
- Word(AccDataModifier::EnumToString(x));
- }
- void Unparse(const AccDefaultClause &x) {
- switch (x.v) {
- case AccDefaultClause::Arg::None:
- Put("NONE");
- break;
- case AccDefaultClause::Arg::Present:
- Put("PRESENT");
- break;
- }
- }
- void Unparse(const AccClauseList &x) { Walk(" ", x.v, " "); }
- void Unparse(const AccGangArgument &x) {
- Walk("NUM:", std::get<std::optional<ScalarIntExpr>>(x.t));
- Walk(", STATIC:", std::get<std::optional<AccSizeExpr>>(x.t));
- }
- void Unparse(const OpenACCBlockConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ");
- Walk(std::get<AccBeginBlockDirective>(x.t));
- Put("\n");
- EndOpenACC();
- Walk(std::get<Block>(x.t), "");
- BeginOpenACC();
- Word("!$ACC END ");
- Walk(std::get<AccEndBlockDirective>(x.t));
- Put("\n");
- EndOpenACC();
- }
- void Unparse(const OpenACCLoopConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ");
- Walk(std::get<AccBeginLoopDirective>(x.t));
- Put("\n");
- EndOpenACC();
- Walk(std::get<std::optional<DoConstruct>>(x.t));
- }
- void Unparse(const AccBeginLoopDirective &x) {
- Walk(std::get<AccLoopDirective>(x.t));
- Walk(std::get<AccClauseList>(x.t));
- }
- void Unparse(const OpenACCStandaloneConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ");
- Walk(std::get<AccStandaloneDirective>(x.t));
- Walk(std::get<AccClauseList>(x.t));
- Put("\n");
- EndOpenACC();
- }
- void Unparse(const OpenACCStandaloneDeclarativeConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ");
- Walk(std::get<AccDeclarativeDirective>(x.t));
- Walk(std::get<AccClauseList>(x.t));
- Put("\n");
- EndOpenACC();
- }
- void Unparse(const OpenACCCombinedConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ");
- Walk(std::get<AccBeginCombinedDirective>(x.t));
- Put("\n");
- EndOpenACC();
- Walk(std::get<Block>(x.t), "");
- BeginOpenACC();
- Word("!$ACC END ");
- Walk(std::get<std::optional<AccEndCombinedDirective>>(x.t));
- Put("\n");
- EndOpenACC();
- }
- void Unparse(const OpenACCRoutineConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ROUTINE");
- Walk("(", std::get<std::optional<Name>>(x.t), ")");
- Walk(std::get<AccClauseList>(x.t));
- Put("\n");
- EndOpenACC();
- }
- void Unparse(const AccObject &x) {
- std::visit(common::visitors{
- [&](const Designator &y) { Walk(y); },
- [&](const Name &y) { Put("/"), Walk(y), Put("/"); },
- },
- x.u);
- }
- void Unparse(const AccObjectList &x) { Walk(x.v, ","); }
- void Unparse(const AccObjectListWithReduction &x) {
- Walk(std::get<AccReductionOperator>(x.t));
- Put(":");
- Walk(std::get<AccObjectList>(x.t));
- }
- void Unparse(const OpenACCCacheConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ");
- Word("CACHE(");
- Walk(std::get<AccObjectListWithModifier>(x.t));
- Put(")");
- Put("\n");
- EndOpenACC();
- }
- void Unparse(const OpenACCWaitConstruct &x) {
- BeginOpenACC();
- Word("!$ACC ");
- Word("WAIT(");
- Walk(std::get<std::optional<AccWaitArgument>>(x.t));
- Walk(std::get<AccClauseList>(x.t));
- Put(")");
- Put("\n");
- EndOpenACC();
- }
-
// OpenMP Clauses & Directives
void Unparse(const OmpObject &x) {
std::visit(common::visitors{
}
void BeginOpenMP() { openmpDirective_ = true; }
void EndOpenMP() { openmpDirective_ = false; }
- void BeginOpenACC() { openaccDirective_ = true; }
- void EndOpenACC() { openaccDirective_ = false; }
// Call back to the traversal framework.
template <typename T> void Walk(const T &x) {
std::set<CharBlock> structureComponents_;
Encoding encoding_{Encoding::UTF_8};
bool capitalizeKeywords_{true};
- bool openaccDirective_{false};
bool openmpDirective_{false};
bool backslashEscapes_{false};
preStatementType *preStatement_{nullptr};
void UnparseVisitor::Put(char ch) {
int sav = indent_;
- if (openmpDirective_ || openaccDirective_) {
+ if (openmpDirective_) {
indent_ = 0;
}
if (column_ <= 1) {
if (openmpDirective_) {
out_ << "!$OMP&";
column_ = 8;
- } else if (openaccDirective_) {
- out_ << "!$ACC&";
- column_ = 8;
} else {
out_ << '&';
column_ = indent_ + 3;
}
}
out_ << ch;
- if (openmpDirective_ || openaccDirective_) {
+ if (openmpDirective_) {
indent_ = sav;
}
}
Walk(std::get<1>(x.t));
Walk(std::get<2>(x.t));
Walk(std::get<3>(x.t));
- Walk(std::get<4>(x.t));
- const std::list<parser::DeclarationConstruct> &decls{std::get<5>(x.t)};
+ const std::list<parser::DeclarationConstruct> &decls{std::get<4>(x.t)};
for (const auto &decl : decls) {
if (const auto *spec{
std::get_if<parser::SpecificationConstruct>(&decl.u)}) {
+++ /dev/null
-! RUN: %S/test_errors.sh %s %t %f18 -fopenacc
-
-! Check OpenACC clause validity for the following construct and directive:
-! 2.6.5 Data
-! 2.5.1 Parallel
-! 2.5.2 Kernels
-! 2.5.3 Serial
-! 2.15.1 Routine
-! 2.11 Parallel Loop
-! 2.11 Kernels Loop
-! 2.11 Serial Loop
-
-program openacc_clause_validity
-
- implicit none
-
- integer :: i, j
- integer :: N = 256
-
- !$acc declare
- real(8) :: a(256)
-
- !$acc enter data
-
- !$acc enter data copyin(zero: i)
-
- !$acc enter data create(readonly: i)
-
- !$acc data copyout(readonly: i)
- !$acc end data
-
- !$acc enter data copyin(i) copyout(i)
-
- !$acc data copy(i) if(.true.) if(.true.)
- !$acc end data
-
- !$acc exit data
-
- !$acc host_data
- !$acc end host_data
-
- !$acc set
-
- !$acc data
- !$acc end data
-
- !$acc data copyin(i)
- !$acc end data
-
- !$acc data copyin(i)
-
- !$acc end parallel
-
- !$acc update device(i) device_type(*) async
-
-
- !$acc update device(i) device_type(*) if(.TRUE.)
-
- !$acc parallel
-
- !$acc loop seq independent
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end parallel
-
- !$acc parallel device_type(*) num_gangs(2)
- !$acc loop
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end parallel
-
- !$acc parallel
-
- !$acc loop collapse(-1)
- do i = 1, N
- do j = 1, N
- a(i) = 3.14 + j
- end do
- end do
- !$acc end parallel
-
- !$acc parallel
-
- !$acc loop device_type(*) private(i)
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end parallel
-
- !$acc parallel
-
- !$acc loop gang seq
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end parallel
-
-
- !$acc parallel device_type(*) if(.TRUE.)
- !$acc loop
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end parallel
-
-
- !$acc parallel loop device_type(*) if(.TRUE.)
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end parallel loop
-
- !$acc kernels device_type(*) async
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end kernels
-
-
- !$acc kernels device_type(*) if(.TRUE.)
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end kernels
-
-
- !$acc kernels loop device_type(*) if(.TRUE.)
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end kernels loop
-
- !$acc serial device_type(*) async
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end serial
-
-
- !$acc serial device_type(*) if(.TRUE.)
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end serial
-
-
- !$acc serial loop device_type(*) if(.TRUE.)
- do i = 1, N
- a(i) = 3.14
- end do
- !$acc end serial loop
-
- contains
-
- subroutine sub1(a)
- real :: a(:)
-
- !$acc routine
- end subroutine sub1
-
- subroutine sub2(a)
- real :: a(:)
-
- !$acc routine seq device_type(*) nohost
- end subroutine sub2
-
-end program openacc_clause_validity
\ No newline at end of file
set(LLVM_LINK_COMPONENTS
- FrontendOpenACC
FrontendOpenMP
)
set(LLVM_LINK_COMPONENTS
- FrontendOpenACC
FrontendOpenMP
Support
)
set(FLANG_INTRINSIC_MODULES_DIR ${FLANG_BINARY_DIR}/include/flang)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/flang.sh.in ${CMAKE_BINARY_DIR}/tools/flang/bin/flang @ONLY)
-file(COPY ${CMAKE_BINARY_DIR}/tools/flang/bin/flang DESTINATION ${CMAKE_BINARY_DIR}/bin FILE_PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE)
+file(COPY ${CMAKE_BINARY_DIR}/tools/flang/bin/flang DESTINATION ${CMAKE_BINARY_DIR}/bin FILE_PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE)
# The flang script to be installed needs a different path to the headers.
set(FLANG_INTRINSIC_MODULES_DIR ${CMAKE_INSTALL_PREFIX}/include/flang)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/flang.sh.in ${FLANG_BINARY_DIR}/bin/flang-install.sh @ONLY)
} else if (arg == "-Mstandard" || arg == "-std=f95" ||
arg == "-std=f2003" || arg == "-std=f2008" || arg == "-std=legacy") {
driver.warnOnNonstandardUsage = true;
- } else if (arg == "-fopenacc") {
- options.features.Enable(Fortran::common::LanguageFeature::OpenACC);
- options.predefinitions.emplace_back("_OPENACC", "201911");
} else if (arg == "-fopenmp") {
options.features.Enable(Fortran::common::LanguageFeature::OpenMP);
options.predefinitions.emplace_back("_OPENMP", "201511");
add_subdirectory(IR)
add_subdirectory(Support)
-add_subdirectory(Frontend)
+add_subdirectory(Frontend/OpenMP)
# If we're doing an out-of-tree build, copy a module map for generated
# header files into the build area.
+++ /dev/null
-add_subdirectory(OpenACC)
-add_subdirectory(OpenMP)
// Optional class holding value of the clause in clang AST.
string clangClass = ?;
- // Optional class holding value of the clause in flang AST.
- string flangClass = ?;
-
// Is clause implicit? If clause is set as implicit, the default kind will
// be return in get<LanguageName>ClauseKind instead of their own kind.
bit isImplicit = 0;
+++ /dev/null
-//===-- ACC.td - OpenACC directive definition file ---------*- tablegen -*-===//
-//
-// 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 is the definition file for OpenACC directives and clauses.
-//
-//===----------------------------------------------------------------------===//
-
-include "llvm/Frontend/Directive/DirectiveBase.td"
-
-//===----------------------------------------------------------------------===//
-// Definition of general OpenACC information
-//===----------------------------------------------------------------------===//
-
-def OpenACC : DirectiveLanguage {
- let name = "OpenACC";
- let cppNamespace = "acc"; // final namespace will be llvm::acc
- let directivePrefix = "ACCD_";
- let clausePrefix = "ACCC_";
- let makeEnumAvailableInNamespace = 1;
- let enableBitmaskEnumInNamespace = 1;
- let includeHeader = "llvm/Frontend/OpenACC/ACC.h.inc";
- let clauseEnumSetClass = "AccClauseSet";
-}
-
-//===----------------------------------------------------------------------===//
-// Definition of OpenACC clauses
-//===----------------------------------------------------------------------===//
-
-// 2.9.6
-def ACCC_Auto : Clause<"auto"> {}
-
-// 2.16.1
-def ACCC_Async : Clause<"async"> {
- let flangClass = "std::optional<ScalarIntExpr>";
-}
-
-// 2.7.11
-def ACCC_Attach : Clause<"attach"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.15.1
-def ACCC_Bind : Clause<"bind"> {
- let flangClass = "Name";
-}
-
-// 2.12
-def ACCC_Capture : Clause<"capture"> {
-}
-
-// 2.9.1
-def ACCC_Collapse : Clause<"collapse"> {
- let flangClass = "ScalarIntConstantExpr";
-}
-
-// 2.7.5
-def ACCC_Copy : Clause<"copy"> {
- let flangClass = "AccObjectList";
-}
-// 2.7.6
-def ACCC_Copyin : Clause<"copyin"> {
- let flangClass = "AccObjectListWithModifier";
-}
-
-// 2.7.7
-def ACCC_Copyout : Clause<"copyout"> {
- let flangClass = "AccObjectListWithModifier";
-}
-
-// 2.7.8
-def ACCC_Create : Clause<"create"> {
- let flangClass = "AccObjectListWithModifier";
-}
-
-// 2.5.14
-def ACCC_Default : Clause<"default"> {
- let flangClass = "AccDefaultClause";
-}
-
-// 2.4.12
-def ACCC_DefaultAsync : Clause<"default_async"> {
- let flangClass = "ScalarIntExpr";
-}
-
-// 2.7.10
-def ACCC_Delete : Clause<"delete"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.7.12
-def ACCC_Detach : Clause<"detach"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.14.4
-def ACCC_Device : Clause<"device"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.14.1
-def ACCC_DeviceNum : Clause<"devicenum"> {
- let flangClass = "ScalarIntConstantExpr";
-}
-
-// 2.7.3
-def ACCC_DevicePtr : Clause<"deviceptr"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.13
-def ACCC_DeviceResident : Clause<"device_resident"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.4
-def ACCC_DeviceType : Clause<"device_type"> {
- // (DeviceType, "*"
- let flangClass = "std::optional<std::list<Name>>";
-}
-
-// 2.6.6
-def ACCC_Finalize : Clause<"finalize"> {}
-
-// 2.5.12
-def ACCC_FirstPrivate : Clause<"firstprivate"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.9.2
-def ACCC_Gang : Clause<"gang"> {
- let flangClass = "std::optional<AccGangArgument>";
-}
-
-// 2.14.4
-def ACCC_Host : Clause<"host"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.5.4
-def ACCC_If : Clause <"if"> {
- let flangClass = "ScalarLogicalExpr";
-}
-
-// 2.14.4
-def ACCC_IfPresent : Clause<"if_present"> {}
-
-// 2.9.9
-def ACCC_Independent : Clause<"independent"> {}
-
-// 2.13
-def ACCC_Link : Clause<"link"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.7.9
-def ACCC_NoCreate : Clause<"no_create"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.15.1
-def ACCC_NoHost : Clause<"nohost"> {}
-
-// 2.5.8
-def ACCC_NumGangs : Clause<"num_gangs"> {
- let flangClass = "ScalarIntExpr";
-}
-
-// 2.5.9
-def ACCC_NumWorkers : Clause<"num_workers"> {
- let flangClass = "ScalarIntExpr";
-}
-
-// 2.7.4
-def ACCC_Present : Clause<"present"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.5.11
-def ACCC_Private : Clause<"private"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.9.7
-def ACCC_Tile : Clause <"tile"> {
- let flangClass = "AccSizeExprList";
-}
-
-// 2.8.1
-def ACCC_UseDevice : Clause <"use_device"> {
- let flangClass = "AccObjectList";
-}
-
-// 2.12
-def ACCC_Read : Clause<"read"> {}
-
-// 2.5.13
-def ACCC_Reduction : Clause<"reduction"> {
- let flangClass = "AccObjectListWithReduction";
-}
-
-// 2.5.5
-def ACCC_Self : Clause<"self"> {
- let flangClass = "std::optional<ScalarLogicalExpr>";
-}
-
-// 2.9.5
-def ACCC_Seq : Clause<"seq"> {}
-
-// 2.9.4
-def ACCC_Vector : Clause<"vector"> {
- let flangClass = "std::optional<ScalarIntExpr>";
-}
-
-// 2.5.10
-def ACCC_VectorLength : Clause<"vector_length"> {
- let flangClass = "ScalarIntExpr";
-}
-
-// 2.16.2
-def ACCC_Wait : Clause<"wait"> {
- let flangClass = "std::optional<AccWaitArgument>";
-}
-
-// 2.9.3
-def ACCC_Worker: Clause<"worker"> {
- let flangClass = "std::optional<ScalarIntExpr>";
-}
-
-// 2.12
-def ACCC_Write : Clause<"write"> {}
-
-def ACCC_Unknown : Clause<"unknown"> {
- let isDefault = 1;
-}
-
-//===----------------------------------------------------------------------===//
-// Definition of OpenACC directives
-//===----------------------------------------------------------------------===//
-
-// 2.12
-def ACC_Atomic : Directive<"atomic"> {}
-
-// 2.6.5
-def ACC_Data : Directive<"data"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_If>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_Attach>,
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_Default>,
- VersionedClause<ACCC_DevicePtr>,
- VersionedClause<ACCC_NoCreate>,
- VersionedClause<ACCC_Present>
- ];
-}
-
-// 2.13
-def ACC_Declare : Directive<"declare"> {
- let allowedClauses = [
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_Present>,
- VersionedClause<ACCC_DevicePtr>,
- VersionedClause<ACCC_DeviceResident>,
- VersionedClause<ACCC_Link>
- ];
-}
-
-// 2.5.2
-def ACC_Kernels : Directive<"kernels"> {
- let allowedClauses = [
- VersionedClause<ACCC_Attach>,
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_NoCreate>,
- VersionedClause<ACCC_Present>,
- VersionedClause<ACCC_DevicePtr>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_Default>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_NumGangs>,
- VersionedClause<ACCC_NumWorkers>,
- VersionedClause<ACCC_Self>,
- VersionedClause<ACCC_VectorLength>,
- VersionedClause<ACCC_Wait>
- ];
-}
-
-// 2.5.1
-def ACC_Parallel : Directive<"parallel"> {
- let allowedClauses = [
- VersionedClause<ACCC_Attach>,
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_DevicePtr>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_NoCreate>,
- VersionedClause<ACCC_Present>,
- VersionedClause<ACCC_Private>,
- VersionedClause<ACCC_FirstPrivate>,
- VersionedClause<ACCC_Wait>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_Default>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_NumGangs>,
- VersionedClause<ACCC_NumWorkers>,
- VersionedClause<ACCC_Reduction>,
- VersionedClause<ACCC_Self>,
- VersionedClause<ACCC_VectorLength>
- ];
-}
-
-// 2.5.3
-def ACC_Serial : Directive<"serial"> {
- let allowedClauses = [
- VersionedClause<ACCC_Attach>,
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_DevicePtr>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_FirstPrivate>,
- VersionedClause<ACCC_NoCreate>,
- VersionedClause<ACCC_Present>,
- VersionedClause<ACCC_Private>,
- VersionedClause<ACCC_Wait>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_Default>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_Reduction>,
- VersionedClause<ACCC_Self>
- ];
-}
-
-// 2.9
-def ACC_Loop : Directive<"loop"> {
- let allowedClauses = [
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_Private>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Collapse>,
- VersionedClause<ACCC_Gang>,
- VersionedClause<ACCC_Reduction>,
- VersionedClause<ACCC_Tile>,
- VersionedClause<ACCC_Vector>,
- VersionedClause<ACCC_Worker>
- ];
- let allowedExclusiveClauses = [
- VersionedClause<ACCC_Auto>,
- VersionedClause<ACCC_Independent>,
- VersionedClause<ACCC_Seq>
- ];
-}
-
-// 2.10
-def ACC_Cache : Directive<"cache"> {}
-
-// 2.14.1
-def ACC_Init : Directive<"init"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_DeviceNum>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_If>
- ];
-}
-
-// 2.15.1
-def ACC_Routine : Directive<"routine"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_Bind>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_NoHost>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_Gang>,
- VersionedClause<ACCC_Seq>,
- VersionedClause<ACCC_Vector>,
- VersionedClause<ACCC_Worker>
- ];
-}
-
-// 2.14.3
-def ACC_Set : Directive<"set"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_If>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_DefaultAsync>,
- VersionedClause<ACCC_DeviceNum>,
- VersionedClause<ACCC_DeviceType>
- ];
-}
-
-// 2.14.2
-def ACC_Shutdown : Directive<"shutdown"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_DeviceNum>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_If>
- ];
-}
-
-// 2.14.4
-def ACC_Update : Directive<"update"> {
- let allowedClauses = [
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_Wait>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_IfPresent>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_Device>,
- VersionedClause<ACCC_Host>,
- VersionedClause<ACCC_Self>
- ];
-}
-
-// 2.16.3
-def ACC_Wait : Directive<"wait"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_If>
- ];
-}
-
-// 2.14.6
-def ACC_EnterData : Directive<"enter data"> {
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_Wait>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_Attach>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_Copyin>
- ];
-}
-
-// 2.14.7
-def ACC_ExitData : Directive<"exit data"> {
- let allowedClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_Wait>,
- VersionedClause<ACCC_Finalize>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Delete>,
- VersionedClause<ACCC_Detach>
- ];
-}
-def ACC_HostData : Directive<"host_data"> {
- let allowedClauses = [
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_IfPresent>
- ];
- let requiredClauses = [
- VersionedClause<ACCC_UseDevice>
- ];
-}
-
-// 2.11
-def ACC_KernelsLoop : Directive<"kernels loop"> {
- let allowedClauses = [
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_NoCreate>,
- VersionedClause<ACCC_Present>,
- VersionedClause<ACCC_Private>,
- VersionedClause<ACCC_DevicePtr>,
- VersionedClause<ACCC_Attach>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_Collapse>,
- VersionedClause<ACCC_Default>,
- VersionedClause<ACCC_Gang>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_Independent>,
- VersionedClause<ACCC_NumGangs>,
- VersionedClause<ACCC_NumWorkers>,
- VersionedClause<ACCC_Reduction>,
- VersionedClause<ACCC_Self>,
- VersionedClause<ACCC_Tile>,
- VersionedClause<ACCC_Vector>,
- VersionedClause<ACCC_VectorLength>,
- VersionedClause<ACCC_Wait>,
- VersionedClause<ACCC_Worker>
- ];
- let allowedExclusiveClauses = [
- VersionedClause<ACCC_Auto>,
- VersionedClause<ACCC_Independent>,
- VersionedClause<ACCC_Seq>
- ];
-}
-
-// 2.11
-def ACC_ParallelLoop : Directive<"parallel loop"> {
- let allowedClauses = [
- VersionedClause<ACCC_Attach>,
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_DevicePtr>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_FirstPrivate>,
- VersionedClause<ACCC_NoCreate>,
- VersionedClause<ACCC_Present>,
- VersionedClause<ACCC_Private>,
- VersionedClause<ACCC_Tile>,
- VersionedClause<ACCC_Wait>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_Collapse>,
- VersionedClause<ACCC_Default>,
- VersionedClause<ACCC_Gang>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_NumGangs>,
- VersionedClause<ACCC_NumWorkers>,
- VersionedClause<ACCC_Reduction>,
- VersionedClause<ACCC_Self>,
- VersionedClause<ACCC_Vector>,
- VersionedClause<ACCC_VectorLength>,
- VersionedClause<ACCC_Worker>
- ];
- let allowedExclusiveClauses = [
- VersionedClause<ACCC_Auto>,
- VersionedClause<ACCC_Independent>,
- VersionedClause<ACCC_Seq>
- ];
-}
-
-// 2.11
-def ACC_SerialLoop : Directive<"serial loop"> {
- let allowedClauses = [
- VersionedClause<ACCC_Attach>,
- VersionedClause<ACCC_Copy>,
- VersionedClause<ACCC_Copyin>,
- VersionedClause<ACCC_Copyout>,
- VersionedClause<ACCC_Create>,
- VersionedClause<ACCC_DevicePtr>,
- VersionedClause<ACCC_DeviceType>,
- VersionedClause<ACCC_FirstPrivate>,
- VersionedClause<ACCC_NoCreate>,
- VersionedClause<ACCC_Present>,
- VersionedClause<ACCC_Private>,
- VersionedClause<ACCC_Wait>
- ];
- let allowedOnceClauses = [
- VersionedClause<ACCC_Async>,
- VersionedClause<ACCC_Collapse>,
- VersionedClause<ACCC_Default>,
- VersionedClause<ACCC_Gang>,
- VersionedClause<ACCC_If>,
- VersionedClause<ACCC_Reduction>,
- VersionedClause<ACCC_Self>,
- VersionedClause<ACCC_Tile>,
- VersionedClause<ACCC_Vector>,
- VersionedClause<ACCC_Worker>
- ];
- let allowedExclusiveClauses = [
- VersionedClause<ACCC_Auto>,
- VersionedClause<ACCC_Independent>,
- VersionedClause<ACCC_Seq>
- ];
-}
-
-def ACC_Unknown : Directive<"unknown"> {
- let isDefault = 1;
-}
\ No newline at end of file
+++ /dev/null
-set(LLVM_TARGET_DEFINITIONS ACC.td)
-tablegen(LLVM ACC.h.inc --gen-directive-decl)
-tablegen(LLVM ACC.cpp.inc --gen-directive-impl)
-add_public_tablegen_target(acc_gen)
-add_subdirectory(OpenACC)
add_subdirectory(OpenMP)
+++ /dev/null
-set(LLVM_TARGET_DEFINITIONS ${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend/OpenACC/ACC.td)
-tablegen(LLVM ACC.cpp --gen-directive-impl)
-add_public_tablegen_target(acc_cpp)
-
-add_llvm_component_library(LLVMFrontendOpenACC
- ACC.cpp # Generated by tablegen above
-
- ADDITIONAL_HEADER_DIRS
- ${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend
- ${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend/OpenACC
-
- LINK_COMPONENTS
- Support
-
- DEPENDS
- acc_gen
- acc_cpp
-)