================
@@ -287,9 +287,82 @@ void CIRGenModule::emitGlobalOpenACCDeclareDecl(const
OpenACCDeclareDecl *d) {
}
void CIRGenFunction::emitOpenACCRoutine(const OpenACCRoutineDecl &d) {
- getCIRGenModule().errorNYI(d.getSourceRange(), "OpenACC Routine Construct");
+ // Do nothing here. The OpenACCRoutineDeclAttr handles the implicit name
+ // cases, and the end-of-TU handling manages the named cases. This is
+ // necessary because these references aren't necessarily emitted themselves,
+ // but can be named anywhere.
}
void CIRGenModule::emitGlobalOpenACCRoutineDecl(const OpenACCRoutineDecl *d) {
- errorNYI(d->getSourceRange(), "OpenACC Global Routine Construct");
+ // Do nothing here. The OpenACCRoutineDeclAttr handles the implicit name
+ // cases, and the end-of-TU handling manages the named cases. This is
+ // necessary because these references aren't necessarily emitted themselves,
+ // but can be named anywhere.
+}
+
+namespace {
+class OpenACCRoutineClauseEmitter final
+ : public OpenACCClauseVisitor<OpenACCRoutineClauseEmitter> {
+ CIRGen::CIRGenBuilderTy &builder;
+ mlir::acc::RoutineOp routineOp;
+ llvm::SmallVector<mlir::acc::DeviceType> lastDeviceTypeValues;
+
+public:
+ OpenACCRoutineClauseEmitter(CIRGen::CIRGenBuilderTy &builder,
+ mlir::acc::RoutineOp routineOp)
+ : builder(builder), routineOp(routineOp) {}
+
+ void emitClauses(ArrayRef<const OpenACCClause *> clauses) {
+ this->VisitClauseList(clauses);
+ }
+
+ void VisitClause(const OpenACCClause &clause) {
+ llvm_unreachable("Invalid OpenACC clause on routine");
+ }
+
+ void VisitSeqClause(const OpenACCSeqClause &clause) {
+ routineOp.addSeq(builder.getContext(), lastDeviceTypeValues);
+ }
+};
+} // namespace
+
+void CIRGenModule::emitOpenACCRoutineDecl(
+ const clang::FunctionDecl *funcDecl, cir::FuncOp func,
+ SourceLocation pragmaLoc, ArrayRef<const OpenACCClause *> clauses) {
+ mlir::OpBuilder::InsertionGuard guardCase(builder);
+ // These need to appear at the global module.
+ builder.setInsertionPointToEnd(&getModule().getBodyRegion().front());
+
+ mlir::Location routineLoc = getLoc(pragmaLoc);
+
+ std::stringstream routineNameSS;
+ // This follows the same naming format as Flang.
+ routineNameSS << "acc_routine_" << routineCounter++;
+ std::string routineName = routineNameSS.str();
+
+ // There isn't a good constructor for RoutineOp that just takes a location +
----------------
razvanlupusoru wrote:
You're welcome to add it! :) Seems useful to me.
https://github.com/llvm/llvm-project/pull/170207
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits