210 lines · cpp
1//===-- FIRContext.cpp ----------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/10//11//===----------------------------------------------------------------------===//12 13#include "flang/Optimizer/Dialect/Support/FIRContext.h"14#include "flang/Optimizer/Dialect/Support/KindMapping.h"15#include "mlir/Dialect/LLVMIR/LLVMDialect.h"16#include "mlir/IR/BuiltinAttributes.h"17#include "mlir/IR/BuiltinOps.h"18#include "llvm/TargetParser/Host.h"19 20void fir::setTargetTriple(mlir::ModuleOp mod, llvm::StringRef triple) {21 auto target = fir::determineTargetTriple(triple);22 mod->setAttr(mlir::LLVM::LLVMDialect::getTargetTripleAttrName(),23 mlir::StringAttr::get(mod.getContext(), target));24}25 26llvm::Triple fir::getTargetTriple(mlir::ModuleOp mod) {27 if (auto target = mod->getAttrOfType<mlir::StringAttr>(28 mlir::LLVM::LLVMDialect::getTargetTripleAttrName()))29 return llvm::Triple(target.getValue());30 return llvm::Triple(llvm::sys::getDefaultTargetTriple());31}32 33static constexpr const char *kindMapName = "fir.kindmap";34static constexpr const char *defKindName = "fir.defaultkind";35 36void fir::setKindMapping(mlir::ModuleOp mod, fir::KindMapping &kindMap) {37 auto *ctx = mod.getContext();38 mod->setAttr(kindMapName, mlir::StringAttr::get(ctx, kindMap.mapToString()));39 auto defs = kindMap.defaultsToString();40 mod->setAttr(defKindName, mlir::StringAttr::get(ctx, defs));41}42 43fir::KindMapping fir::getKindMapping(mlir::ModuleOp mod) {44 auto *ctx = mod.getContext();45 if (auto defs = mod->getAttrOfType<mlir::StringAttr>(defKindName)) {46 auto defVals = fir::KindMapping::toDefaultKinds(defs.getValue());47 if (auto maps = mod->getAttrOfType<mlir::StringAttr>(kindMapName))48 return fir::KindMapping(ctx, maps.getValue(), defVals);49 return fir::KindMapping(ctx, defVals);50 }51 return fir::KindMapping(ctx);52}53 54fir::KindMapping fir::getKindMapping(mlir::Operation *op) {55 auto moduleOp = mlir::dyn_cast<mlir::ModuleOp>(op);56 if (moduleOp)57 return getKindMapping(moduleOp);58 59 moduleOp = op->getParentOfType<mlir::ModuleOp>();60 return getKindMapping(moduleOp);61}62 63static constexpr const char *targetCpuName = "fir.target_cpu";64 65void fir::setTargetCPU(mlir::ModuleOp mod, llvm::StringRef cpu) {66 if (cpu.empty())67 return;68 69 auto *ctx = mod.getContext();70 mod->setAttr(targetCpuName, mlir::StringAttr::get(ctx, cpu));71}72 73llvm::StringRef fir::getTargetCPU(mlir::ModuleOp mod) {74 if (auto attr = mod->getAttrOfType<mlir::StringAttr>(targetCpuName))75 return attr.getValue();76 77 return {};78}79 80static constexpr const char *tuneCpuName = "fir.tune_cpu";81 82void fir::setTuneCPU(mlir::ModuleOp mod, llvm::StringRef cpu) {83 if (cpu.empty())84 return;85 86 auto *ctx = mod.getContext();87 88 mod->setAttr(tuneCpuName, mlir::StringAttr::get(ctx, cpu));89}90 91static constexpr const char *atomicIgnoreDenormalModeName =92 "fir.atomic_ignore_denormal_mode";93 94void fir::setAtomicIgnoreDenormalMode(mlir::ModuleOp mod, bool value) {95 if (value) {96 auto *ctx = mod.getContext();97 mod->setAttr(atomicIgnoreDenormalModeName, mlir::UnitAttr::get(ctx));98 } else {99 if (mod->hasAttr(atomicIgnoreDenormalModeName))100 mod->removeAttr(atomicIgnoreDenormalModeName);101 }102}103 104bool fir::getAtomicIgnoreDenormalMode(mlir::ModuleOp mod) {105 return mod->hasAttr(atomicIgnoreDenormalModeName);106}107 108static constexpr const char *atomicFineGrainedMemoryName =109 "fir.atomic_fine_grained_memory";110 111void fir::setAtomicFineGrainedMemory(mlir::ModuleOp mod, bool value) {112 if (value) {113 auto *ctx = mod.getContext();114 mod->setAttr(atomicFineGrainedMemoryName, mlir::UnitAttr::get(ctx));115 } else {116 if (mod->hasAttr(atomicFineGrainedMemoryName))117 mod->removeAttr(atomicFineGrainedMemoryName);118 }119}120 121bool fir::getAtomicFineGrainedMemory(mlir::ModuleOp mod) {122 return mod->hasAttr(atomicFineGrainedMemoryName);123}124 125static constexpr const char *atomicRemoteMemoryName =126 "fir.atomic_remote_memory";127 128void fir::setAtomicRemoteMemory(mlir::ModuleOp mod, bool value) {129 if (value) {130 auto *ctx = mod.getContext();131 mod->setAttr(atomicRemoteMemoryName, mlir::UnitAttr::get(ctx));132 } else {133 if (mod->hasAttr(atomicRemoteMemoryName))134 mod->removeAttr(atomicRemoteMemoryName);135 }136}137 138bool fir::getAtomicRemoteMemory(mlir::ModuleOp mod) {139 return mod->hasAttr(atomicRemoteMemoryName);140}141 142llvm::StringRef fir::getTuneCPU(mlir::ModuleOp mod) {143 if (auto attr = mod->getAttrOfType<mlir::StringAttr>(tuneCpuName))144 return attr.getValue();145 146 return {};147}148 149static constexpr const char *targetFeaturesName = "fir.target_features";150 151void fir::setTargetFeatures(mlir::ModuleOp mod, llvm::StringRef features) {152 if (features.empty())153 return;154 155 auto *ctx = mod.getContext();156 mod->setAttr(targetFeaturesName,157 mlir::LLVM::TargetFeaturesAttr::get(ctx, features));158}159 160mlir::LLVM::TargetFeaturesAttr fir::getTargetFeatures(mlir::ModuleOp mod) {161 if (auto attr = mod->getAttrOfType<mlir::LLVM::TargetFeaturesAttr>(162 targetFeaturesName))163 return attr;164 165 return {};166}167 168void fir::setIdent(mlir::ModuleOp mod, llvm::StringRef ident) {169 if (ident.empty())170 return;171 172 mlir::MLIRContext *ctx = mod.getContext();173 mod->setAttr(mlir::LLVM::LLVMDialect::getIdentAttrName(),174 mlir::StringAttr::get(ctx, ident));175}176 177llvm::StringRef fir::getIdent(mlir::ModuleOp mod) {178 if (auto attr = mod->getAttrOfType<mlir::StringAttr>(179 mlir::LLVM::LLVMDialect::getIdentAttrName()))180 return attr;181 return {};182}183 184void fir::setCommandline(mlir::ModuleOp mod, llvm::StringRef cmdLine) {185 if (cmdLine.empty())186 return;187 188 mlir::MLIRContext *ctx = mod.getContext();189 mod->setAttr(mlir::LLVM::LLVMDialect::getCommandlineAttrName(),190 mlir::StringAttr::get(ctx, cmdLine));191}192 193llvm::StringRef fir::getCommandline(mlir::ModuleOp mod) {194 if (auto attr = mod->getAttrOfType<mlir::StringAttr>(195 mlir::LLVM::LLVMDialect::getCommandlineAttrName()))196 return attr;197 return {};198}199 200std::string fir::determineTargetTriple(llvm::StringRef triple) {201 // Treat "" or "default" as stand-ins for the default machine.202 if (triple.empty() || triple == "default")203 return llvm::sys::getDefaultTargetTriple();204 // Treat "native" as stand-in for the host machine.205 if (triple == "native")206 return llvm::sys::getProcessTriple();207 // TODO: normalize the triple?208 return triple.str();209}210