xref: /llvm-project/flang/lib/Optimizer/Builder/Runtime/Command.cpp (revision 68413219dba47104fef388364a9973b584126f42)
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