[clang] [CIR][OpenMP] Initial implementation of target region support (PR #195452)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 2 07:37:57 PDT 2026
================
@@ -0,0 +1,76 @@
+//===--- CIRGenOpenMPClause.h - OpenMP clause processor ---------*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_CIR_CODEGEN_CIRGENOPENMPCLAUSE_H
+#define LLVM_CLANG_LIB_CIR_CODEGEN_CIRGENOPENMPCLAUSE_H
+
+#include "CIRGenBuilder.h"
+#include "CIRGenModule.h"
+#include "mlir/Dialect/OpenMP/OpenMPClauseOperands.h"
+#include "clang/AST/OpenMPClause.h"
+#include "clang/AST/StmtOpenMP.h"
+#include "llvm/Frontend/OpenMP/OMPConstants.h"
+
+namespace clang::CIRGen {
+
+class CIRGenFunction;
+
+/// Processes OpenMP clauses for a directive, writing results into the
+/// auto-generated ClauseOps from the OMP dialect.
+class OpenMPClauseProcessor {
+ CIRGenFunction &cgf;
+ CIRGenModule &cgm;
+ CIRGenBuilderTy &builder;
+ mlir::Location loc;
+ llvm::ArrayRef<const OMPClause *> clauses;
+
+public:
+ OpenMPClauseProcessor(CIRGenFunction &cgf, CIRGenModule &cgm,
+ CIRGenBuilderTy &builder, mlir::Location loc,
+ llvm::ArrayRef<const OMPClause *> clauses)
+ : cgf(cgf), cgm(cgm), builder(builder), loc(loc), clauses(clauses) {}
+
+ bool processProcBind(mlir::omp::ProcBindClauseOps &result) const;
+
+ /// Process map clauses. The optional \p mapSyms parameter collects the
+ /// VarDecls corresponding to each map operand.
+ bool
+ processMap(mlir::omp::MapClauseOps &result,
+ llvm::SmallVectorImpl<const VarDecl *> *mapSyms = nullptr) const;
+
+ /// Emit an errorNYI for each clause of the given types if present.
+ template <typename... ClauseTypes>
+ void processTODO(llvm::omp::Directive directive) const;
+
+private:
+ template <typename ClauseType>
+ void processTODOClause(llvm::omp::Directive directive) const;
+};
+
+template <typename ClauseType>
+void OpenMPClauseProcessor::processTODOClause(
+ llvm::omp::Directive directive) const {
+ for (const OMPClause *c : clauses) {
+ if (isa<ClauseType>(c)) {
----------------
erichkeane wrote:
Actually... can we INVERT this logic? Have the `ClauseType`/`types` be ones that are supported? so a 'implemented' list, rather than a 'not implemented' list?
Its a little bit more template metaprogramming, but is less likely to have an element 'missed' and us just accepting code as a 'noop'.
https://github.com/llvm/llvm-project/pull/195452
More information about the cfe-commits
mailing list