1ddac11aeSJosh Mottley //===-- Command.cpp -- generate command line runtime API calls ------------===//
2ddac11aeSJosh Mottley //
3ddac11aeSJosh Mottley // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ddac11aeSJosh Mottley // See https://llvm.org/LICENSE.txt for license information.
5ddac11aeSJosh Mottley // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ddac11aeSJosh Mottley //
7ddac11aeSJosh Mottley //===----------------------------------------------------------------------===//
8ddac11aeSJosh Mottley
9ddac11aeSJosh Mottley #include "flang/Optimizer/Builder/Runtime/Command.h"
10ddac11aeSJosh Mottley #include "flang/Optimizer/Builder/FIRBuilder.h"
11ddac11aeSJosh Mottley #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
12ddac11aeSJosh Mottley #include "flang/Runtime/command.h"
13ddac11aeSJosh Mottley
14ddac11aeSJosh Mottley using namespace Fortran::runtime;
15ddac11aeSJosh Mottley
165ebbcfa0SJosh Mottley // Certain runtime intrinsics should only be run when select parameters of the
175ebbcfa0SJosh Mottley // intrisic are supplied. In certain cases one of these parameters may not be
185ebbcfa0SJosh Mottley // given, however the intrinsic needs to be run due to another required
195ebbcfa0SJosh Mottley // parameter being supplied. In this case the missing parameter is assigned to
205ebbcfa0SJosh Mottley // have an "absent" value. This typically happens in IntrinsicCall.cpp. For this
215ebbcfa0SJosh Mottley // reason the extra indirection with `isAbsent` is needed for testing whether a
225ebbcfa0SJosh Mottley // given parameter is actually present (so that parameters with "value" absent
235ebbcfa0SJosh Mottley // are not considered as present).
isAbsent(mlir::Value val)245ebbcfa0SJosh Mottley inline bool isAbsent(mlir::Value val) {
255ebbcfa0SJosh Mottley return mlir::isa_and_nonnull<fir::AbsentOp>(val.getDefiningOp());
265ebbcfa0SJosh Mottley }
275ebbcfa0SJosh Mottley
genCommandArgumentCount(fir::FirOpBuilder & builder,mlir::Location loc)28ddac11aeSJosh Mottley mlir::Value fir::runtime::genCommandArgumentCount(fir::FirOpBuilder &builder,
29ddac11aeSJosh Mottley mlir::Location loc) {
30ddac11aeSJosh Mottley auto argumentCountFunc =
31ddac11aeSJosh Mottley fir::runtime::getRuntimeFunc<mkRTKey(ArgumentCount)>(loc, builder);
32ddac11aeSJosh Mottley return builder.create<fir::CallOp>(loc, argumentCountFunc).getResult(0);
33ddac11aeSJosh Mottley }
3438073b06SJosh Mottley
genGetCommand(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value command,mlir::Value length,mlir::Value errmsg)356ed85a62SPeixin Qiao mlir::Value fir::runtime::genGetCommand(fir::FirOpBuilder &builder,
366ed85a62SPeixin Qiao mlir::Location loc, mlir::Value command,
376ed85a62SPeixin Qiao mlir::Value length,
386ed85a62SPeixin Qiao mlir::Value errmsg) {
396ed85a62SPeixin Qiao auto runtimeFunc =
406ed85a62SPeixin Qiao fir::runtime::getRuntimeFunc<mkRTKey(GetCommand)>(loc, builder);
416ed85a62SPeixin Qiao mlir::FunctionType runtimeFuncTy = runtimeFunc.getFunctionType();
426ed85a62SPeixin Qiao mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
436ed85a62SPeixin Qiao mlir::Value sourceLine =
446ed85a62SPeixin Qiao fir::factory::locationToLineNo(builder, loc, runtimeFuncTy.getInput(4));
456ed85a62SPeixin Qiao llvm::SmallVector<mlir::Value> args =
466ed85a62SPeixin Qiao fir::runtime::createArguments(builder, loc, runtimeFuncTy, command,
476ed85a62SPeixin Qiao length, errmsg, sourceFile, sourceLine);
486ed85a62SPeixin Qiao return builder.create<fir::CallOp>(loc, runtimeFunc, args).getResult(0);
496ed85a62SPeixin Qiao }
506ed85a62SPeixin Qiao
genGetPID(fir::FirOpBuilder & builder,mlir::Location loc)51de58aa83SYi Wu mlir::Value fir::runtime::genGetPID(fir::FirOpBuilder &builder,
52de58aa83SYi Wu mlir::Location loc) {
53de58aa83SYi Wu auto runtimeFunc =
54de58aa83SYi Wu fir::runtime::getRuntimeFunc<mkRTKey(GetPID)>(loc, builder);
55de58aa83SYi Wu
56de58aa83SYi Wu return builder.create<fir::CallOp>(loc, runtimeFunc).getResult(0);
57de58aa83SYi Wu }
58de58aa83SYi Wu
genGetCommandArgument(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value number,mlir::Value value,mlir::Value length,mlir::Value errmsg)59eb7a02eaSDiana Picus mlir::Value fir::runtime::genGetCommandArgument(
60eb7a02eaSDiana Picus fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value number,
61eb7a02eaSDiana Picus mlir::Value value, mlir::Value length, mlir::Value errmsg) {
62eb7a02eaSDiana Picus auto runtimeFunc =
63eb7a02eaSDiana Picus fir::runtime::getRuntimeFunc<mkRTKey(GetCommandArgument)>(loc, builder);
64eb7a02eaSDiana Picus mlir::FunctionType runtimeFuncTy = runtimeFunc.getFunctionType();
65eb7a02eaSDiana Picus mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
66eb7a02eaSDiana Picus mlir::Value sourceLine =
67eb7a02eaSDiana Picus fir::factory::locationToLineNo(builder, loc, runtimeFuncTy.getInput(5));
68eb7a02eaSDiana Picus llvm::SmallVector<mlir::Value> args =
69eb7a02eaSDiana Picus fir::runtime::createArguments(builder, loc, runtimeFuncTy, number, value,
70eb7a02eaSDiana Picus length, errmsg, sourceFile, sourceLine);
71eb7a02eaSDiana Picus return builder.create<fir::CallOp>(loc, runtimeFunc, args).getResult(0);
7238073b06SJosh Mottley }
735ebbcfa0SJosh Mottley
genGetEnvVariable(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value name,mlir::Value value,mlir::Value length,mlir::Value trimName,mlir::Value errmsg)7448b5a06dSLeandro Lupori mlir::Value fir::runtime::genGetEnvVariable(fir::FirOpBuilder &builder,
75189cb7dfSjeanPerier mlir::Location loc,
7648b5a06dSLeandro Lupori mlir::Value name, mlir::Value value,
7748b5a06dSLeandro Lupori mlir::Value length,
7848b5a06dSLeandro Lupori mlir::Value trimName,
7948b5a06dSLeandro Lupori mlir::Value errmsg) {
8048b5a06dSLeandro Lupori auto runtimeFunc =
8148b5a06dSLeandro Lupori fir::runtime::getRuntimeFunc<mkRTKey(GetEnvVariable)>(loc, builder);
8248b5a06dSLeandro Lupori mlir::FunctionType runtimeFuncTy = runtimeFunc.getFunctionType();
83189cb7dfSjeanPerier mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
84189cb7dfSjeanPerier mlir::Value sourceLine =
8548b5a06dSLeandro Lupori fir::factory::locationToLineNo(builder, loc, runtimeFuncTy.getInput(6));
865ebbcfa0SJosh Mottley llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
8748b5a06dSLeandro Lupori builder, loc, runtimeFuncTy, name, value, length, trimName, errmsg,
8848b5a06dSLeandro Lupori sourceFile, sourceLine);
8948b5a06dSLeandro Lupori return builder.create<fir::CallOp>(loc, runtimeFunc, args).getResult(0);
905ebbcfa0SJosh Mottley }
91*68413219Sjiajie zhang
genGetCwd(fir::FirOpBuilder & builder,mlir::Location loc,mlir::Value cwd)92*68413219Sjiajie zhang mlir::Value fir::runtime::genGetCwd(fir::FirOpBuilder &builder,
93*68413219Sjiajie zhang mlir::Location loc, mlir::Value cwd) {
94*68413219Sjiajie zhang mlir::func::FuncOp func =
95*68413219Sjiajie zhang fir::runtime::getRuntimeFunc<mkRTKey(GetCwd)>(loc, builder);
96*68413219Sjiajie zhang auto runtimeFuncTy = func.getFunctionType();
97*68413219Sjiajie zhang mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
98*68413219Sjiajie zhang mlir::Value sourceLine =
99*68413219Sjiajie zhang fir::factory::locationToLineNo(builder, loc, runtimeFuncTy.getInput(2));
100*68413219Sjiajie zhang llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
101*68413219Sjiajie zhang builder, loc, runtimeFuncTy, cwd, sourceFile, sourceLine);
102*68413219Sjiajie zhang return builder.create<fir::CallOp>(loc, func, args).getResult(0);
103*68413219Sjiajie zhang }
104