Files
gps/tools/local/circt/include/mlir/Dialect/OpenMP/OpenMPOffloadUtils.h
T
2026-07-12 11:01:51 +03:00

106 lines
4.2 KiB
C++

//===- OpenMPOffloadUtils.h - OpenMP offload utilities ----------*- 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
//
//===----------------------------------------------------------------------===//
//
/// \file
/// Shared utilities for setting OpenMP offload module interface attributes.
/// These are used by both Flang and Clang (CIR) frontends.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_DIALECT_OPENMP_OPENMPOFFLOADUTILS_H_
#define MLIR_DIALECT_OPENMP_OPENMPOFFLOADUTILS_H_
#include "mlir/Dialect/OpenMP/OpenMPInterfaces.h"
#include "mlir/Dialect/OpenMP/OpenMPOpsAttributes.h"
#include "mlir/IR/BuiltinOps.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/TargetParser/Triple.h"
#include <cstdint>
#include <string>
#include <vector>
namespace mlir::omp {
struct OffloadModuleOpts {
OffloadModuleOpts() = default;
OffloadModuleOpts(uint32_t openMPTargetDebug, bool openMPTeamSubscription,
bool openMPThreadSubscription, bool openMPNoThreadState,
bool openMPNoNestedParallelism, bool openMPIsTargetDevice,
bool openMPIsGPU, bool openMPForceUSM,
uint32_t openMPVersion, std::string ompHostIRFile = {},
const std::vector<llvm::Triple> &ompTargetTriples = {},
bool noGPULib = false)
: OpenMPTargetDebug(openMPTargetDebug),
OpenMPTeamSubscription(openMPTeamSubscription),
OpenMPThreadSubscription(openMPThreadSubscription),
OpenMPNoThreadState(openMPNoThreadState),
OpenMPNoNestedParallelism(openMPNoNestedParallelism),
OpenMPIsTargetDevice(openMPIsTargetDevice), OpenMPIsGPU(openMPIsGPU),
OpenMPForceUSM(openMPForceUSM), OpenMPVersion(openMPVersion),
OMPHostIRFile(std::move(ompHostIRFile)),
OMPTargetTriples(ompTargetTriples.begin(), ompTargetTriples.end()),
NoGPULib(noGPULib) {}
uint32_t OpenMPTargetDebug = 0;
bool OpenMPTeamSubscription = false;
bool OpenMPThreadSubscription = false;
bool OpenMPNoThreadState = false;
bool OpenMPNoNestedParallelism = false;
bool OpenMPIsTargetDevice = false;
bool OpenMPIsGPU = false;
bool OpenMPForceUSM = false;
uint32_t OpenMPVersion = 31;
std::string OMPHostIRFile = {};
std::vector<llvm::Triple> OMPTargetTriples = {};
bool NoGPULib = false;
};
/// Sets OpenMP offload module interface attributes on a ModuleOp, shared
/// between Flang and Clang (CIR) frontends.
[[maybe_unused]] static void
setOffloadModuleInterfaceAttributes(ModuleOp module, OffloadModuleOpts opts) {
if (auto offloadMod =
llvm::dyn_cast<OffloadModuleInterface>(module.getOperation())) {
offloadMod.setIsTargetDevice(opts.OpenMPIsTargetDevice);
offloadMod.setIsGPU(opts.OpenMPIsGPU);
if (opts.OpenMPForceUSM)
offloadMod.setRequires(ClauseRequires::unified_shared_memory);
if (opts.OpenMPIsTargetDevice) {
offloadMod.setFlags(
opts.OpenMPTargetDebug, opts.OpenMPTeamSubscription,
opts.OpenMPThreadSubscription, opts.OpenMPNoThreadState,
opts.OpenMPNoNestedParallelism, opts.OpenMPVersion, opts.NoGPULib);
if (!opts.OMPHostIRFile.empty())
offloadMod.setHostIRFilePath(opts.OMPHostIRFile);
}
auto strTriples = llvm::to_vector(
llvm::map_range(opts.OMPTargetTriples, [](llvm::Triple triple) {
return triple.normalize();
}));
offloadMod.setTargetTriples(strTriples);
}
}
[[maybe_unused]] static void setOpenMPVersionAttribute(ModuleOp module,
int64_t version) {
module.getOperation()->setAttr(
StringAttr::get(module.getContext(), llvm::Twine{"omp.version"}),
VersionAttr::get(module.getContext(), version));
}
[[maybe_unused]] static int64_t
getOpenMPVersionAttribute(ModuleOp module, int64_t fallback = -1) {
if (Attribute verAttr = module->getAttr("omp.version"))
return llvm::cast<VersionAttr>(verAttr).getVersion();
return fallback;
}
} // namespace mlir::omp
#endif // MLIR_DIALECT_OPENMP_OPENMPOFFLOADUTILS_H_