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