98 lines · cpp
1//===-- Assign.cpp -- generate assignment runtime API calls ---------------===//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#include "flang/Optimizer/Builder/Runtime/Assign.h"10#include "flang/Optimizer/Builder/FIRBuilder.h"11#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"12#include "flang/Runtime/assign.h"13 14using namespace Fortran::runtime;15 16void fir::runtime::genAssign(fir::FirOpBuilder &builder, mlir::Location loc,17 mlir::Value destBox, mlir::Value sourceBox) {18 auto func = fir::runtime::getRuntimeFunc<mkRTKey(Assign)>(loc, builder);19 auto fTy = func.getFunctionType();20 auto sourceFile = fir::factory::locationToFilename(builder, loc);21 auto sourceLine =22 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));23 auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,24 sourceBox, sourceFile, sourceLine);25 fir::CallOp::create(builder, loc, func, args);26}27 28void fir::runtime::genAssignPolymorphic(fir::FirOpBuilder &builder,29 mlir::Location loc, mlir::Value destBox,30 mlir::Value sourceBox) {31 auto func =32 fir::runtime::getRuntimeFunc<mkRTKey(AssignPolymorphic)>(loc, builder);33 auto fTy = func.getFunctionType();34 auto sourceFile = fir::factory::locationToFilename(builder, loc);35 auto sourceLine =36 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));37 auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,38 sourceBox, sourceFile, sourceLine);39 fir::CallOp::create(builder, loc, func, args);40}41 42void fir::runtime::genAssignExplicitLengthCharacter(fir::FirOpBuilder &builder,43 mlir::Location loc,44 mlir::Value destBox,45 mlir::Value sourceBox) {46 auto func =47 fir::runtime::getRuntimeFunc<mkRTKey(AssignExplicitLengthCharacter)>(48 loc, builder);49 auto fTy = func.getFunctionType();50 auto sourceFile = fir::factory::locationToFilename(builder, loc);51 auto sourceLine =52 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));53 auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,54 sourceBox, sourceFile, sourceLine);55 fir::CallOp::create(builder, loc, func, args);56}57 58void fir::runtime::genAssignTemporary(fir::FirOpBuilder &builder,59 mlir::Location loc, mlir::Value destBox,60 mlir::Value sourceBox) {61 auto func =62 fir::runtime::getRuntimeFunc<mkRTKey(AssignTemporary)>(loc, builder);63 auto fTy = func.getFunctionType();64 auto sourceFile = fir::factory::locationToFilename(builder, loc);65 auto sourceLine =66 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));67 auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,68 sourceBox, sourceFile, sourceLine);69 fir::CallOp::create(builder, loc, func, args);70}71 72void fir::runtime::genCopyInAssign(fir::FirOpBuilder &builder,73 mlir::Location loc, mlir::Value destBox,74 mlir::Value sourceBox) {75 auto func = fir::runtime::getRuntimeFunc<mkRTKey(CopyInAssign)>(loc, builder);76 auto fTy = func.getFunctionType();77 auto sourceFile = fir::factory::locationToFilename(builder, loc);78 auto sourceLine =79 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));80 auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,81 sourceBox, sourceFile, sourceLine);82 fir::CallOp::create(builder, loc, func, args);83}84 85void fir::runtime::genCopyOutAssign(fir::FirOpBuilder &builder,86 mlir::Location loc, mlir::Value destBox,87 mlir::Value sourceBox) {88 auto func =89 fir::runtime::getRuntimeFunc<mkRTKey(CopyOutAssign)>(loc, builder);90 auto fTy = func.getFunctionType();91 auto sourceFile = fir::factory::locationToFilename(builder, loc);92 auto sourceLine =93 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));94 auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,95 sourceBox, sourceFile, sourceLine);96 fir::CallOp::create(builder, loc, func, args);97}98