xref: /llvm-project/flang/lib/Optimizer/Builder/Runtime/Inquiry.cpp (revision 12ba74e181bd6641b532e271f3bfabf53066b1c0)
188ae0d61SValentin Clement //===-- Inquiry.h - generate inquiry runtime API calls ----------*- C++ -*-===//
288ae0d61SValentin Clement //
388ae0d61SValentin Clement // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
488ae0d61SValentin Clement // See https://llvm.org/LICENSE.txt for license information.
588ae0d61SValentin Clement // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
688ae0d61SValentin Clement //
788ae0d61SValentin Clement //===----------------------------------------------------------------------===//
888ae0d61SValentin Clement 
988ae0d61SValentin Clement #include "flang/Optimizer/Builder/Runtime/Inquiry.h"
1088ae0d61SValentin Clement #include "flang/Optimizer/Builder/FIRBuilder.h"
1188ae0d61SValentin Clement #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
1288ae0d61SValentin Clement #include "flang/Runtime/inquiry.h"
1340d9e93cSPeixin Qiao #include "flang/Runtime/support.h"
1488ae0d61SValentin Clement 
1588ae0d61SValentin Clement using namespace Fortran::runtime;
1688ae0d61SValentin Clement 
1788ae0d61SValentin Clement /// Generate call to `Lbound` runtime routine when the DIM argument is present.
1888ae0d61SValentin Clement mlir::Value fir::runtime::genLboundDim(fir::FirOpBuilder &builder,
1988ae0d61SValentin Clement                                        mlir::Location loc, mlir::Value array,
2088ae0d61SValentin Clement                                        mlir::Value dim) {
2158ceae95SRiver Riddle   mlir::func::FuncOp lboundFunc =
2288ae0d61SValentin Clement       fir::runtime::getRuntimeFunc<mkRTKey(LboundDim)>(loc, builder);
234a3460a7SRiver Riddle   auto fTy = lboundFunc.getFunctionType();
2488ae0d61SValentin Clement   auto sourceFile = fir::factory::locationToFilename(builder, loc);
2588ae0d61SValentin Clement   auto sourceLine =
2688ae0d61SValentin Clement       fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
2788ae0d61SValentin Clement   auto args = fir::runtime::createArguments(builder, loc, fTy, array, dim,
2888ae0d61SValentin Clement                                             sourceFile, sourceLine);
2988ae0d61SValentin Clement   return builder.create<fir::CallOp>(loc, lboundFunc, args).getResult(0);
3088ae0d61SValentin Clement }
3188ae0d61SValentin Clement 
324cff320eSjeanPerier void fir::runtime::genLbound(fir::FirOpBuilder &builder, mlir::Location loc,
334cff320eSjeanPerier                              mlir::Value resultAddr, mlir::Value array,
344cff320eSjeanPerier                              mlir::Value kind) {
354cff320eSjeanPerier   mlir::func::FuncOp func =
364cff320eSjeanPerier       fir::runtime::getRuntimeFunc<mkRTKey(Lbound)>(loc, builder);
374cff320eSjeanPerier   auto fTy = func.getFunctionType();
384cff320eSjeanPerier   auto sourceFile = fir::factory::locationToFilename(builder, loc);
394cff320eSjeanPerier   auto sourceLine =
404cff320eSjeanPerier       fir::factory::locationToLineNo(builder, loc, fTy.getInput(4));
414cff320eSjeanPerier   auto args = fir::runtime::createArguments(
424cff320eSjeanPerier       builder, loc, fTy, resultAddr, array, kind, sourceFile, sourceLine);
43*12ba74e1SValentin Clement (バレンタイン クレメン)   builder.create<fir::CallOp>(loc, func, args);
444cff320eSjeanPerier }
454cff320eSjeanPerier 
4688ae0d61SValentin Clement /// Generate call to `Ubound` runtime routine.  Calls to UBOUND with a DIM
4788ae0d61SValentin Clement /// argument get transformed into an expression equivalent to
4888ae0d61SValentin Clement /// SIZE() + LBOUND() - 1, so they don't have an intrinsic in the runtime.
4988ae0d61SValentin Clement void fir::runtime::genUbound(fir::FirOpBuilder &builder, mlir::Location loc,
5088ae0d61SValentin Clement                              mlir::Value resultBox, mlir::Value array,
5188ae0d61SValentin Clement                              mlir::Value kind) {
5258ceae95SRiver Riddle   mlir::func::FuncOp uboundFunc =
5388ae0d61SValentin Clement       fir::runtime::getRuntimeFunc<mkRTKey(Ubound)>(loc, builder);
544a3460a7SRiver Riddle   auto fTy = uboundFunc.getFunctionType();
5588ae0d61SValentin Clement   auto sourceFile = fir::factory::locationToFilename(builder, loc);
5688ae0d61SValentin Clement   auto sourceLine =
5788ae0d61SValentin Clement       fir::factory::locationToLineNo(builder, loc, fTy.getInput(2));
5888ae0d61SValentin Clement   auto args = fir::runtime::createArguments(builder, loc, fTy, resultBox, array,
5988ae0d61SValentin Clement                                             kind, sourceFile, sourceLine);
60*12ba74e1SValentin Clement (バレンタイン クレメン)   builder.create<fir::CallOp>(loc, uboundFunc, args);
6188ae0d61SValentin Clement }
6288ae0d61SValentin Clement 
6388ae0d61SValentin Clement /// Generate call to `Size` runtime routine. This routine is a version when
6488ae0d61SValentin Clement /// the DIM argument is present.
6588ae0d61SValentin Clement mlir::Value fir::runtime::genSizeDim(fir::FirOpBuilder &builder,
6688ae0d61SValentin Clement                                      mlir::Location loc, mlir::Value array,
6788ae0d61SValentin Clement                                      mlir::Value dim) {
6858ceae95SRiver Riddle   mlir::func::FuncOp sizeFunc =
6988ae0d61SValentin Clement       fir::runtime::getRuntimeFunc<mkRTKey(SizeDim)>(loc, builder);
704a3460a7SRiver Riddle   auto fTy = sizeFunc.getFunctionType();
7188ae0d61SValentin Clement   auto sourceFile = fir::factory::locationToFilename(builder, loc);
7288ae0d61SValentin Clement   auto sourceLine =
7388ae0d61SValentin Clement       fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
7488ae0d61SValentin Clement   auto args = fir::runtime::createArguments(builder, loc, fTy, array, dim,
7588ae0d61SValentin Clement                                             sourceFile, sourceLine);
7688ae0d61SValentin Clement   return builder.create<fir::CallOp>(loc, sizeFunc, args).getResult(0);
7788ae0d61SValentin Clement }
7888ae0d61SValentin Clement 
7988ae0d61SValentin Clement /// Generate call to `Size` runtime routine. This routine is a version when
8088ae0d61SValentin Clement /// the DIM argument is absent.
8188ae0d61SValentin Clement mlir::Value fir::runtime::genSize(fir::FirOpBuilder &builder,
8288ae0d61SValentin Clement                                   mlir::Location loc, mlir::Value array) {
8358ceae95SRiver Riddle   mlir::func::FuncOp sizeFunc =
8488ae0d61SValentin Clement       fir::runtime::getRuntimeFunc<mkRTKey(Size)>(loc, builder);
854a3460a7SRiver Riddle   auto fTy = sizeFunc.getFunctionType();
8688ae0d61SValentin Clement   auto sourceFile = fir::factory::locationToFilename(builder, loc);
8788ae0d61SValentin Clement   auto sourceLine =
8888ae0d61SValentin Clement       fir::factory::locationToLineNo(builder, loc, fTy.getInput(2));
8988ae0d61SValentin Clement   auto args = fir::runtime::createArguments(builder, loc, fTy, array,
9088ae0d61SValentin Clement                                             sourceFile, sourceLine);
9188ae0d61SValentin Clement   return builder.create<fir::CallOp>(loc, sizeFunc, args).getResult(0);
9288ae0d61SValentin Clement }
9340d9e93cSPeixin Qiao 
9440d9e93cSPeixin Qiao /// Generate call to `Is_contiguous` runtime routine.
9540d9e93cSPeixin Qiao mlir::Value fir::runtime::genIsContiguous(fir::FirOpBuilder &builder,
9640d9e93cSPeixin Qiao                                           mlir::Location loc,
9740d9e93cSPeixin Qiao                                           mlir::Value array) {
9840d9e93cSPeixin Qiao   mlir::func::FuncOp isContiguousFunc =
9940d9e93cSPeixin Qiao       fir::runtime::getRuntimeFunc<mkRTKey(IsContiguous)>(loc, builder);
10040d9e93cSPeixin Qiao   auto fTy = isContiguousFunc.getFunctionType();
10140d9e93cSPeixin Qiao   auto args = fir::runtime::createArguments(builder, loc, fTy, array);
10240d9e93cSPeixin Qiao   return builder.create<fir::CallOp>(loc, isContiguousFunc, args).getResult(0);
10340d9e93cSPeixin Qiao }
1040257f9cdSjeanPerier 
1050257f9cdSjeanPerier void fir::runtime::genShape(fir::FirOpBuilder &builder, mlir::Location loc,
1060257f9cdSjeanPerier                             mlir::Value resultAddr, mlir::Value array,
1070257f9cdSjeanPerier                             mlir::Value kind) {
1080257f9cdSjeanPerier   mlir::func::FuncOp func =
1090257f9cdSjeanPerier       fir::runtime::getRuntimeFunc<mkRTKey(Shape)>(loc, builder);
1100257f9cdSjeanPerier   auto fTy = func.getFunctionType();
1110257f9cdSjeanPerier   auto sourceFile = fir::factory::locationToFilename(builder, loc);
1120257f9cdSjeanPerier   auto sourceLine =
1130257f9cdSjeanPerier       fir::factory::locationToLineNo(builder, loc, fTy.getInput(4));
1140257f9cdSjeanPerier   auto args = fir::runtime::createArguments(
1150257f9cdSjeanPerier       builder, loc, fTy, resultAddr, array, kind, sourceFile, sourceLine);
116*12ba74e1SValentin Clement (バレンタイン クレメン)   builder.create<fir::CallOp>(loc, func, args);
1170257f9cdSjeanPerier }
118