130 lines · cpp
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-exception6//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#include "flang/Runtime/support.h"14 15using namespace Fortran::runtime;16 17/// Generate call to `Lbound` runtime routine when the DIM argument is present.18mlir::Value fir::runtime::genLboundDim(fir::FirOpBuilder &builder,19 mlir::Location loc, mlir::Value array,20 mlir::Value dim) {21 mlir::func::FuncOp lboundFunc =22 fir::runtime::getRuntimeFunc<mkRTKey(LboundDim)>(loc, builder);23 auto fTy = lboundFunc.getFunctionType();24 auto sourceFile = fir::factory::locationToFilename(builder, loc);25 auto sourceLine =26 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));27 auto args = fir::runtime::createArguments(builder, loc, fTy, array, dim,28 sourceFile, sourceLine);29 return fir::CallOp::create(builder, loc, lboundFunc, args).getResult(0);30}31 32void fir::runtime::genLbound(fir::FirOpBuilder &builder, mlir::Location loc,33 mlir::Value resultAddr, mlir::Value array,34 mlir::Value kind) {35 mlir::func::FuncOp func =36 fir::runtime::getRuntimeFunc<mkRTKey(Lbound)>(loc, builder);37 auto fTy = func.getFunctionType();38 auto sourceFile = fir::factory::locationToFilename(builder, loc);39 auto sourceLine =40 fir::factory::locationToLineNo(builder, loc, fTy.getInput(4));41 auto args = fir::runtime::createArguments(42 builder, loc, fTy, resultAddr, array, kind, sourceFile, sourceLine);43 fir::CallOp::create(builder, loc, func, args);44}45 46/// Generate call to `Ubound` runtime routine. Calls to UBOUND with a DIM47/// argument get transformed into an expression equivalent to48/// SIZE() + LBOUND() - 1, so they don't have an intrinsic in the runtime.49void fir::runtime::genUbound(fir::FirOpBuilder &builder, mlir::Location loc,50 mlir::Value resultBox, mlir::Value array,51 mlir::Value kind) {52 mlir::func::FuncOp uboundFunc =53 fir::runtime::getRuntimeFunc<mkRTKey(Ubound)>(loc, builder);54 auto fTy = uboundFunc.getFunctionType();55 auto sourceFile = fir::factory::locationToFilename(builder, loc);56 auto sourceLine =57 fir::factory::locationToLineNo(builder, loc, fTy.getInput(2));58 auto args = fir::runtime::createArguments(builder, loc, fTy, resultBox, array,59 kind, sourceFile, sourceLine);60 fir::CallOp::create(builder, loc, uboundFunc, args);61}62 63/// Generate call to `Size` runtime routine. This routine is a version when64/// the DIM argument is present.65mlir::Value fir::runtime::genSizeDim(fir::FirOpBuilder &builder,66 mlir::Location loc, mlir::Value array,67 mlir::Value dim) {68 mlir::func::FuncOp sizeFunc =69 fir::runtime::getRuntimeFunc<mkRTKey(SizeDim)>(loc, builder);70 auto fTy = sizeFunc.getFunctionType();71 auto sourceFile = fir::factory::locationToFilename(builder, loc);72 auto sourceLine =73 fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));74 auto args = fir::runtime::createArguments(builder, loc, fTy, array, dim,75 sourceFile, sourceLine);76 return fir::CallOp::create(builder, loc, sizeFunc, args).getResult(0);77}78 79/// Generate call to `Size` runtime routine. This routine is a version when80/// the DIM argument is absent.81mlir::Value fir::runtime::genSize(fir::FirOpBuilder &builder,82 mlir::Location loc, mlir::Value array) {83 mlir::func::FuncOp sizeFunc =84 fir::runtime::getRuntimeFunc<mkRTKey(Size)>(loc, builder);85 auto fTy = sizeFunc.getFunctionType();86 auto sourceFile = fir::factory::locationToFilename(builder, loc);87 auto sourceLine =88 fir::factory::locationToLineNo(builder, loc, fTy.getInput(2));89 auto args = fir::runtime::createArguments(builder, loc, fTy, array,90 sourceFile, sourceLine);91 return fir::CallOp::create(builder, loc, sizeFunc, args).getResult(0);92}93 94/// Generate call to `IsContiguous` runtime routine.95mlir::Value fir::runtime::genIsContiguous(fir::FirOpBuilder &builder,96 mlir::Location loc,97 mlir::Value array) {98 mlir::func::FuncOp isContiguousFunc =99 fir::runtime::getRuntimeFunc<mkRTKey(IsContiguous)>(loc, builder);100 auto fTy = isContiguousFunc.getFunctionType();101 auto args = fir::runtime::createArguments(builder, loc, fTy, array);102 return fir::CallOp::create(builder, loc, isContiguousFunc, args).getResult(0);103}104 105/// Generate call to `IsContiguousUpTo` runtime routine.106mlir::Value fir::runtime::genIsContiguousUpTo(fir::FirOpBuilder &builder,107 mlir::Location loc,108 mlir::Value array,109 mlir::Value dim) {110 mlir::func::FuncOp isContiguousFunc =111 fir::runtime::getRuntimeFunc<mkRTKey(IsContiguousUpTo)>(loc, builder);112 auto fTy = isContiguousFunc.getFunctionType();113 auto args = fir::runtime::createArguments(builder, loc, fTy, array, dim);114 return fir::CallOp::create(builder, loc, isContiguousFunc, args).getResult(0);115}116 117void fir::runtime::genShape(fir::FirOpBuilder &builder, mlir::Location loc,118 mlir::Value resultAddr, mlir::Value array,119 mlir::Value kind) {120 mlir::func::FuncOp func =121 fir::runtime::getRuntimeFunc<mkRTKey(Shape)>(loc, builder);122 auto fTy = func.getFunctionType();123 auto sourceFile = fir::factory::locationToFilename(builder, loc);124 auto sourceLine =125 fir::factory::locationToLineNo(builder, loc, fTy.getInput(4));126 auto args = fir::runtime::createArguments(127 builder, loc, fTy, resultAddr, array, kind, sourceFile, sourceLine);128 fir::CallOp::create(builder, loc, func, args);129}130