brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · c2e0afe Raw
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