brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 1b0457b Raw
116 lines · cpp
1//===-- Derived.cpp -- derived type runtime API ---------------------------===//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/Derived.h"10#include "flang/Optimizer/Builder/FIRBuilder.h"11#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"12#include "flang/Optimizer/Support/FatalError.h"13#include "flang/Optimizer/Support/InternalNames.h"14#include "flang/Runtime/derived-api.h"15#include "flang/Runtime/pointer.h"16 17using namespace Fortran::runtime;18 19void fir::runtime::genDerivedTypeInitialize(fir::FirOpBuilder &builder,20                                            mlir::Location loc,21                                            mlir::Value box) {22  auto func = fir::runtime::getRuntimeFunc<mkRTKey(Initialize)>(loc, builder);23  auto fTy = func.getFunctionType();24  auto sourceFile = fir::factory::locationToFilename(builder, loc);25  auto sourceLine =26      fir::factory::locationToLineNo(builder, loc, fTy.getInput(2));27  auto args = fir::runtime::createArguments(builder, loc, fTy, box, sourceFile,28                                            sourceLine);29  fir::CallOp::create(builder, loc, func, args);30}31 32void fir::runtime::genDerivedTypeInitializeClone(fir::FirOpBuilder &builder,33                                                 mlir::Location loc,34                                                 mlir::Value newBox,35                                                 mlir::Value box) {36  auto func =37      fir::runtime::getRuntimeFunc<mkRTKey(InitializeClone)>(loc, builder);38  auto fTy = func.getFunctionType();39  auto sourceFile = fir::factory::locationToFilename(builder, loc);40  auto sourceLine =41      fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));42  auto args = fir::runtime::createArguments(builder, loc, fTy, newBox, box,43                                            sourceFile, sourceLine);44  fir::CallOp::create(builder, loc, func, args);45}46 47void fir::runtime::genDerivedTypeDestroy(fir::FirOpBuilder &builder,48                                         mlir::Location loc, mlir::Value box) {49  auto func = fir::runtime::getRuntimeFunc<mkRTKey(Destroy)>(loc, builder);50  auto fTy = func.getFunctionType();51  auto args = fir::runtime::createArguments(builder, loc, fTy, box);52  fir::CallOp::create(builder, loc, func, args);53}54 55void fir::runtime::genDerivedTypeFinalize(fir::FirOpBuilder &builder,56                                          mlir::Location loc, mlir::Value box) {57  auto func = fir::runtime::getRuntimeFunc<mkRTKey(Finalize)>(loc, builder);58  auto fTy = func.getFunctionType();59  auto sourceFile = fir::factory::locationToFilename(builder, loc);60  auto sourceLine =61      fir::factory::locationToLineNo(builder, loc, fTy.getInput(2));62  auto args = fir::runtime::createArguments(builder, loc, fTy, box, sourceFile,63                                            sourceLine);64  fir::CallOp::create(builder, loc, func, args);65}66 67void fir::runtime::genDerivedTypeDestroyWithoutFinalization(68    fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value box) {69  auto func = fir::runtime::getRuntimeFunc<mkRTKey(DestroyWithoutFinalization)>(70      loc, builder);71  auto fTy = func.getFunctionType();72  auto args = fir::runtime::createArguments(builder, loc, fTy, box);73  fir::CallOp::create(builder, loc, func, args);74}75 76void fir::runtime::genNullifyDerivedType(fir::FirOpBuilder &builder,77                                         mlir::Location loc, mlir::Value box,78                                         fir::RecordType derivedType,79                                         unsigned rank) {80  mlir::Value typeDesc =81      fir::TypeDescOp::create(builder, loc, mlir::TypeAttr::get(derivedType));82  mlir::func::FuncOp callee =83      fir::runtime::getRuntimeFunc<mkRTKey(PointerNullifyDerived)>(loc,84                                                                   builder);85  llvm::ArrayRef<mlir::Type> inputTypes = callee.getFunctionType().getInputs();86  llvm::SmallVector<mlir::Value> args;87  args.push_back(builder.createConvert(loc, inputTypes[0], box));88  args.push_back(builder.createConvert(loc, inputTypes[1], typeDesc));89  mlir::Value rankCst = builder.createIntegerConstant(loc, inputTypes[2], rank);90  mlir::Value c0 = builder.createIntegerConstant(loc, inputTypes[3], 0);91  args.push_back(rankCst);92  args.push_back(c0);93  fir::CallOp::create(builder, loc, callee, args);94}95 96mlir::Value fir::runtime::genSameTypeAs(fir::FirOpBuilder &builder,97                                        mlir::Location loc, mlir::Value a,98                                        mlir::Value b) {99  mlir::func::FuncOp sameTypeAsFunc =100      fir::runtime::getRuntimeFunc<mkRTKey(SameTypeAs)>(loc, builder);101  auto fTy = sameTypeAsFunc.getFunctionType();102  auto args = fir::runtime::createArguments(builder, loc, fTy, a, b);103  return fir::CallOp::create(builder, loc, sameTypeAsFunc, args).getResult(0);104}105 106mlir::Value fir::runtime::genExtendsTypeOf(fir::FirOpBuilder &builder,107                                           mlir::Location loc, mlir::Value a,108                                           mlir::Value mold) {109  mlir::func::FuncOp extendsTypeOfFunc =110      fir::runtime::getRuntimeFunc<mkRTKey(ExtendsTypeOf)>(loc, builder);111  auto fTy = extendsTypeOfFunc.getFunctionType();112  auto args = fir::runtime::createArguments(builder, loc, fTy, a, mold);113  return fir::CallOp::create(builder, loc, extendsTypeOfFunc, args)114      .getResult(0);115}116