151e2c8c9SValentin Clement //===-- Assign.cpp -- generate assignment runtime API calls ---------------===//
251e2c8c9SValentin Clement //
351e2c8c9SValentin Clement // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
451e2c8c9SValentin Clement // See https://llvm.org/LICENSE.txt for license information.
551e2c8c9SValentin Clement // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
651e2c8c9SValentin Clement //
751e2c8c9SValentin Clement //===----------------------------------------------------------------------===//
851e2c8c9SValentin Clement
951e2c8c9SValentin Clement #include "flang/Optimizer/Builder/Runtime/Assign.h"
1051e2c8c9SValentin Clement #include "flang/Optimizer/Builder/FIRBuilder.h"
1151e2c8c9SValentin Clement #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
1251e2c8c9SValentin Clement #include "flang/Runtime/assign.h"
1351e2c8c9SValentin Clement
1451e2c8c9SValentin Clement using namespace Fortran::runtime;
1551e2c8c9SValentin Clement
genAssign(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value destBox,mlir::Value sourceBox)1651e2c8c9SValentin Clement void fir::runtime::genAssign(fir::FirOpBuilder &builder, mlir::Location loc,
1751e2c8c9SValentin Clement mlir::Value destBox, mlir::Value sourceBox) {
1851e2c8c9SValentin Clement auto func = fir::runtime::getRuntimeFunc<mkRTKey(Assign)>(loc, builder);
194a3460a7SRiver Riddle auto fTy = func.getFunctionType();
2051e2c8c9SValentin Clement auto sourceFile = fir::factory::locationToFilename(builder, loc);
2151e2c8c9SValentin Clement auto sourceLine =
2251e2c8c9SValentin Clement fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
2351e2c8c9SValentin Clement auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,
2451e2c8c9SValentin Clement sourceBox, sourceFile, sourceLine);
2551e2c8c9SValentin Clement builder.create<fir::CallOp>(loc, func, args);
2651e2c8c9SValentin Clement }
274f3c9854SValentin Clement
genAssignPolymorphic(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value destBox,mlir::Value sourceBox)284f3c9854SValentin Clement void fir::runtime::genAssignPolymorphic(fir::FirOpBuilder &builder,
294f3c9854SValentin Clement mlir::Location loc, mlir::Value destBox,
304f3c9854SValentin Clement mlir::Value sourceBox) {
314f3c9854SValentin Clement auto func =
324f3c9854SValentin Clement fir::runtime::getRuntimeFunc<mkRTKey(AssignPolymorphic)>(loc, builder);
334f3c9854SValentin Clement auto fTy = func.getFunctionType();
344f3c9854SValentin Clement auto sourceFile = fir::factory::locationToFilename(builder, loc);
354f3c9854SValentin Clement auto sourceLine =
364f3c9854SValentin Clement fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
374f3c9854SValentin Clement auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,
384f3c9854SValentin Clement sourceBox, sourceFile, sourceLine);
394f3c9854SValentin Clement builder.create<fir::CallOp>(loc, func, args);
404f3c9854SValentin Clement }
414aec70c0SJean Perier
genAssignExplicitLengthCharacter(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value destBox,mlir::Value sourceBox)424aec70c0SJean Perier void fir::runtime::genAssignExplicitLengthCharacter(fir::FirOpBuilder &builder,
434aec70c0SJean Perier mlir::Location loc,
444aec70c0SJean Perier mlir::Value destBox,
454aec70c0SJean Perier mlir::Value sourceBox) {
464aec70c0SJean Perier auto func =
474aec70c0SJean Perier fir::runtime::getRuntimeFunc<mkRTKey(AssignExplicitLengthCharacter)>(
484aec70c0SJean Perier loc, builder);
494aec70c0SJean Perier auto fTy = func.getFunctionType();
504aec70c0SJean Perier auto sourceFile = fir::factory::locationToFilename(builder, loc);
514aec70c0SJean Perier auto sourceLine =
524aec70c0SJean Perier fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
534aec70c0SJean Perier auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,
544aec70c0SJean Perier sourceBox, sourceFile, sourceLine);
554aec70c0SJean Perier builder.create<fir::CallOp>(loc, func, args);
564aec70c0SJean Perier }
57da60b9e7SSlava Zakharin
genAssignTemporary(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value destBox,mlir::Value sourceBox)58da60b9e7SSlava Zakharin void fir::runtime::genAssignTemporary(fir::FirOpBuilder &builder,
59da60b9e7SSlava Zakharin mlir::Location loc, mlir::Value destBox,
60da60b9e7SSlava Zakharin mlir::Value sourceBox) {
61da60b9e7SSlava Zakharin auto func =
62da60b9e7SSlava Zakharin fir::runtime::getRuntimeFunc<mkRTKey(AssignTemporary)>(loc, builder);
63da60b9e7SSlava Zakharin auto fTy = func.getFunctionType();
64da60b9e7SSlava Zakharin auto sourceFile = fir::factory::locationToFilename(builder, loc);
65da60b9e7SSlava Zakharin auto sourceLine =
66da60b9e7SSlava Zakharin fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
67da60b9e7SSlava Zakharin auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,
68da60b9e7SSlava Zakharin sourceBox, sourceFile, sourceLine);
69da60b9e7SSlava Zakharin builder.create<fir::CallOp>(loc, func, args);
70da60b9e7SSlava Zakharin }
71da60b9e7SSlava Zakharin
genCopyInAssign(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value destBox,mlir::Value sourceBox)72*9f44d5d9SjeanPerier void fir::runtime::genCopyInAssign(fir::FirOpBuilder &builder,
73*9f44d5d9SjeanPerier mlir::Location loc, mlir::Value destBox,
74*9f44d5d9SjeanPerier mlir::Value sourceBox) {
75*9f44d5d9SjeanPerier auto func = fir::runtime::getRuntimeFunc<mkRTKey(CopyInAssign)>(loc, builder);
76*9f44d5d9SjeanPerier auto fTy = func.getFunctionType();
77*9f44d5d9SjeanPerier auto sourceFile = fir::factory::locationToFilename(builder, loc);
78*9f44d5d9SjeanPerier auto sourceLine =
79*9f44d5d9SjeanPerier fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
80*9f44d5d9SjeanPerier auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,
81*9f44d5d9SjeanPerier sourceBox, sourceFile, sourceLine);
82*9f44d5d9SjeanPerier builder.create<fir::CallOp>(loc, func, args);
83*9f44d5d9SjeanPerier }
84*9f44d5d9SjeanPerier
genCopyOutAssign(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value destBox,mlir::Value sourceBox)85da60b9e7SSlava Zakharin void fir::runtime::genCopyOutAssign(fir::FirOpBuilder &builder,
86da60b9e7SSlava Zakharin mlir::Location loc, mlir::Value destBox,
87*9f44d5d9SjeanPerier mlir::Value sourceBox) {
88da60b9e7SSlava Zakharin auto func =
89da60b9e7SSlava Zakharin fir::runtime::getRuntimeFunc<mkRTKey(CopyOutAssign)>(loc, builder);
90da60b9e7SSlava Zakharin auto fTy = func.getFunctionType();
91da60b9e7SSlava Zakharin auto sourceFile = fir::factory::locationToFilename(builder, loc);
92da60b9e7SSlava Zakharin auto sourceLine =
93*9f44d5d9SjeanPerier fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
94*9f44d5d9SjeanPerier auto args = fir::runtime::createArguments(builder, loc, fTy, destBox,
95*9f44d5d9SjeanPerier sourceBox, sourceFile, sourceLine);
96da60b9e7SSlava Zakharin builder.create<fir::CallOp>(loc, func, args);
97da60b9e7SSlava Zakharin }
98