xref: /llvm-project/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp (revision c91ba04328e1ded6f284469a7828d181324d4e30)
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