19683a9c9SJean Perier //===- ArrayConstructor.cpp - array constructor runtime API calls ---------===// 29683a9c9SJean Perier // 39683a9c9SJean Perier // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 49683a9c9SJean Perier // See https://llvm.org/LICENSE.txt for license information. 59683a9c9SJean Perier // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69683a9c9SJean Perier // 79683a9c9SJean Perier //===----------------------------------------------------------------------===// 89683a9c9SJean Perier 99683a9c9SJean Perier #include "flang/Optimizer/Builder/Runtime/ArrayConstructor.h" 109683a9c9SJean Perier #include "flang/Optimizer/Builder/FIRBuilder.h" 119683a9c9SJean Perier #include "flang/Optimizer/Builder/Runtime/RTBuilder.h" 12*c91ba043SMichael Kruse #include "flang/Runtime/array-constructor-consts.h" 139683a9c9SJean Perier 149683a9c9SJean Perier using namespace Fortran::runtime; 159683a9c9SJean Perier 169683a9c9SJean Perier namespace fir::runtime { 179683a9c9SJean Perier template <> 189683a9c9SJean Perier constexpr TypeBuilderFunc 199683a9c9SJean Perier getModel<Fortran::runtime::ArrayConstructorVector &>() { 209683a9c9SJean Perier return getModel<void *>(); 219683a9c9SJean Perier } 229683a9c9SJean Perier } // namespace fir::runtime 239683a9c9SJean Perier 249683a9c9SJean Perier mlir::Value fir::runtime::genInitArrayConstructorVector( 259683a9c9SJean Perier mlir::Location loc, fir::FirOpBuilder &builder, mlir::Value toBox, 269683a9c9SJean Perier mlir::Value useValueLengthParameters) { 279683a9c9SJean Perier // Allocate storage for the runtime cookie for the array constructor vector. 28*c91ba043SMichael Kruse // Use pessimistic values for size and alignment that are valid for all 29*c91ba043SMichael Kruse // supported targets. Whether the actual ArrayConstructorVector object fits 30*c91ba043SMichael Kruse // into the available MaxArrayConstructorVectorSizeInBytes is verified when 31*c91ba043SMichael Kruse // building clang-rt. 329683a9c9SJean Perier std::size_t arrayVectorStructBitSize = 33*c91ba043SMichael Kruse MaxArrayConstructorVectorSizeInBytes * 8; 34*c91ba043SMichael Kruse std::size_t alignLike = MaxArrayConstructorVectorAlignInBytes * 8; 359683a9c9SJean Perier fir::SequenceType::Extent numElem = 369683a9c9SJean Perier (arrayVectorStructBitSize + alignLike - 1) / alignLike; 379683a9c9SJean Perier mlir::Type intType = builder.getIntegerType(alignLike); 389683a9c9SJean Perier mlir::Type seqType = fir::SequenceType::get({numElem}, intType); 399683a9c9SJean Perier mlir::Value cookie = 409683a9c9SJean Perier builder.createTemporary(loc, seqType, ".rt.arrayctor.vector"); 419683a9c9SJean Perier 429683a9c9SJean Perier mlir::func::FuncOp func = 439683a9c9SJean Perier fir::runtime::getRuntimeFunc<mkRTKey(InitArrayConstructorVector)>( 449683a9c9SJean Perier loc, builder); 459683a9c9SJean Perier mlir::FunctionType funcType = func.getFunctionType(); 469683a9c9SJean Perier cookie = builder.createConvert(loc, funcType.getInput(0), cookie); 479683a9c9SJean Perier mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc); 489683a9c9SJean Perier mlir::Value sourceLine = 49*c91ba043SMichael Kruse fir::factory::locationToLineNo(builder, loc, funcType.getInput(4)); 509683a9c9SJean Perier auto args = fir::runtime::createArguments(builder, loc, funcType, cookie, 519683a9c9SJean Perier toBox, useValueLengthParameters, 52*c91ba043SMichael Kruse sourceFile, sourceLine); 539683a9c9SJean Perier builder.create<fir::CallOp>(loc, func, args); 549683a9c9SJean Perier return cookie; 559683a9c9SJean Perier } 569683a9c9SJean Perier 579683a9c9SJean Perier void fir::runtime::genPushArrayConstructorValue( 589683a9c9SJean Perier mlir::Location loc, fir::FirOpBuilder &builder, 599683a9c9SJean Perier mlir::Value arrayConstructorVector, mlir::Value fromBox) { 609683a9c9SJean Perier mlir::func::FuncOp func = 619683a9c9SJean Perier fir::runtime::getRuntimeFunc<mkRTKey(PushArrayConstructorValue)>(loc, 629683a9c9SJean Perier builder); 639683a9c9SJean Perier mlir::FunctionType funcType = func.getFunctionType(); 649683a9c9SJean Perier auto args = fir::runtime::createArguments(builder, loc, funcType, 659683a9c9SJean Perier arrayConstructorVector, fromBox); 669683a9c9SJean Perier builder.create<fir::CallOp>(loc, func, args); 679683a9c9SJean Perier } 689683a9c9SJean Perier 699683a9c9SJean Perier void fir::runtime::genPushArrayConstructorSimpleScalar( 709683a9c9SJean Perier mlir::Location loc, fir::FirOpBuilder &builder, 719683a9c9SJean Perier mlir::Value arrayConstructorVector, mlir::Value fromAddress) { 729683a9c9SJean Perier mlir::func::FuncOp func = 739683a9c9SJean Perier fir::runtime::getRuntimeFunc<mkRTKey(PushArrayConstructorSimpleScalar)>( 749683a9c9SJean Perier loc, builder); 759683a9c9SJean Perier mlir::FunctionType funcType = func.getFunctionType(); 769683a9c9SJean Perier auto args = fir::runtime::createArguments( 779683a9c9SJean Perier builder, loc, funcType, arrayConstructorVector, fromAddress); 789683a9c9SJean Perier builder.create<fir::CallOp>(loc, func, args); 799683a9c9SJean Perier } 80