1 //===-- Inquiry.h - generate inquiry runtime API calls ----------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "flang/Optimizer/Builder/Runtime/Inquiry.h" 10 #include "flang/Optimizer/Builder/FIRBuilder.h" 11 #include "flang/Optimizer/Builder/Runtime/RTBuilder.h" 12 #include "flang/Runtime/inquiry.h" 13 14 using namespace Fortran::runtime; 15 16 /// Generate call to `Lbound` runtime routine when the DIM argument is present. 17 mlir::Value fir::runtime::genLboundDim(fir::FirOpBuilder &builder, 18 mlir::Location loc, mlir::Value array, 19 mlir::Value dim) { 20 mlir::FuncOp lboundFunc = 21 fir::runtime::getRuntimeFunc<mkRTKey(LboundDim)>(loc, builder); 22 auto fTy = lboundFunc.getType(); 23 auto sourceFile = fir::factory::locationToFilename(builder, loc); 24 auto sourceLine = 25 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3)); 26 auto args = fir::runtime::createArguments(builder, loc, fTy, array, dim, 27 sourceFile, sourceLine); 28 return builder.create<fir::CallOp>(loc, lboundFunc, args).getResult(0); 29 } 30 31 /// Generate call to `Ubound` runtime routine. Calls to UBOUND with a DIM 32 /// argument get transformed into an expression equivalent to 33 /// SIZE() + LBOUND() - 1, so they don't have an intrinsic in the runtime. 34 void fir::runtime::genUbound(fir::FirOpBuilder &builder, mlir::Location loc, 35 mlir::Value resultBox, mlir::Value array, 36 mlir::Value kind) { 37 mlir::FuncOp uboundFunc = 38 fir::runtime::getRuntimeFunc<mkRTKey(Ubound)>(loc, builder); 39 auto fTy = uboundFunc.getType(); 40 auto sourceFile = fir::factory::locationToFilename(builder, loc); 41 auto sourceLine = 42 fir::factory::locationToLineNo(builder, loc, fTy.getInput(2)); 43 auto args = fir::runtime::createArguments(builder, loc, fTy, resultBox, array, 44 kind, sourceFile, sourceLine); 45 builder.create<fir::CallOp>(loc, uboundFunc, args).getResult(0); 46 } 47 48 /// Generate call to `Size` runtime routine. This routine is a version when 49 /// the DIM argument is present. 50 mlir::Value fir::runtime::genSizeDim(fir::FirOpBuilder &builder, 51 mlir::Location loc, mlir::Value array, 52 mlir::Value dim) { 53 mlir::FuncOp sizeFunc = 54 fir::runtime::getRuntimeFunc<mkRTKey(SizeDim)>(loc, builder); 55 auto fTy = sizeFunc.getType(); 56 auto sourceFile = fir::factory::locationToFilename(builder, loc); 57 auto sourceLine = 58 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3)); 59 auto args = fir::runtime::createArguments(builder, loc, fTy, array, dim, 60 sourceFile, sourceLine); 61 return builder.create<fir::CallOp>(loc, sizeFunc, args).getResult(0); 62 } 63 64 /// Generate call to `Size` runtime routine. This routine is a version when 65 /// the DIM argument is absent. 66 mlir::Value fir::runtime::genSize(fir::FirOpBuilder &builder, 67 mlir::Location loc, mlir::Value array) { 68 mlir::FuncOp sizeFunc = 69 fir::runtime::getRuntimeFunc<mkRTKey(Size)>(loc, builder); 70 auto fTy = sizeFunc.getType(); 71 auto sourceFile = fir::factory::locationToFilename(builder, loc); 72 auto sourceLine = 73 fir::factory::locationToLineNo(builder, loc, fTy.getInput(2)); 74 auto args = fir::runtime::createArguments(builder, loc, fTy, array, 75 sourceFile, sourceLine); 76 return builder.create<fir::CallOp>(loc, sizeFunc, args).getResult(0); 77 } 78