Split some headers into headers for public and private declarations in preparation for #110217. Moving the runtime-private headers in runtime-private include directory will occur in #110298. * Do not use `sizeof(Descriptor)` in the compiler. The size of the descriptor is target-dependent while `sizeof(Descriptor)` is the size of the Descriptor for the host platform which might be too small when cross-compiling to a different platform. Another problem is that the emitted assembly ((cross-)compiling to the same target) is not identical between Flang's running on different systems. Moving the declaration of `class Descriptor` out of the included header will also reduce the amount of #included sources. * Do not use `sizeof(ArrayConstructorVector)` and `alignof(ArrayConstructorVector)` in the compiler. Same reason as with `Descriptor`. * Compute the descriptor's extra flags without instantiating a Descriptor. `Fortran::runtime::Descriptor` is defined in the runtime source, but not the compiler source. * Move `InquiryKeywordHashDecode` into runtime-private header. The function is defined in the runtime sources and trying to call it in the compiler would lead to a link-error. * Move allocator-kind magic numbers into common header. They are the only declarations out of `allocator-registry.h` in the compiler as well. This does not make Flang cross-compile ready yet, the main goal is to avoid transitive header dependencies from Flang to clang-rt. There are more assumptions that host platform is the same as the target platform.
80 lines
3.5 KiB
C++
80 lines
3.5 KiB
C++
//===- ArrayConstructor.cpp - array constructor runtime API calls ---------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "flang/Optimizer/Builder/Runtime/ArrayConstructor.h"
|
|
#include "flang/Optimizer/Builder/FIRBuilder.h"
|
|
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
|
|
#include "flang/Runtime/array-constructor-consts.h"
|
|
|
|
using namespace Fortran::runtime;
|
|
|
|
namespace fir::runtime {
|
|
template <>
|
|
constexpr TypeBuilderFunc
|
|
getModel<Fortran::runtime::ArrayConstructorVector &>() {
|
|
return getModel<void *>();
|
|
}
|
|
} // namespace fir::runtime
|
|
|
|
mlir::Value fir::runtime::genInitArrayConstructorVector(
|
|
mlir::Location loc, fir::FirOpBuilder &builder, mlir::Value toBox,
|
|
mlir::Value useValueLengthParameters) {
|
|
// Allocate storage for the runtime cookie for the array constructor vector.
|
|
// Use pessimistic values for size and alignment that are valid for all
|
|
// supported targets. Whether the actual ArrayConstructorVector object fits
|
|
// into the available MaxArrayConstructorVectorSizeInBytes is verified when
|
|
// building clang-rt.
|
|
std::size_t arrayVectorStructBitSize =
|
|
MaxArrayConstructorVectorSizeInBytes * 8;
|
|
std::size_t alignLike = MaxArrayConstructorVectorAlignInBytes * 8;
|
|
fir::SequenceType::Extent numElem =
|
|
(arrayVectorStructBitSize + alignLike - 1) / alignLike;
|
|
mlir::Type intType = builder.getIntegerType(alignLike);
|
|
mlir::Type seqType = fir::SequenceType::get({numElem}, intType);
|
|
mlir::Value cookie =
|
|
builder.createTemporary(loc, seqType, ".rt.arrayctor.vector");
|
|
|
|
mlir::func::FuncOp func =
|
|
fir::runtime::getRuntimeFunc<mkRTKey(InitArrayConstructorVector)>(
|
|
loc, builder);
|
|
mlir::FunctionType funcType = func.getFunctionType();
|
|
cookie = builder.createConvert(loc, funcType.getInput(0), cookie);
|
|
mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
|
|
mlir::Value sourceLine =
|
|
fir::factory::locationToLineNo(builder, loc, funcType.getInput(4));
|
|
auto args = fir::runtime::createArguments(builder, loc, funcType, cookie,
|
|
toBox, useValueLengthParameters,
|
|
sourceFile, sourceLine);
|
|
builder.create<fir::CallOp>(loc, func, args);
|
|
return cookie;
|
|
}
|
|
|
|
void fir::runtime::genPushArrayConstructorValue(
|
|
mlir::Location loc, fir::FirOpBuilder &builder,
|
|
mlir::Value arrayConstructorVector, mlir::Value fromBox) {
|
|
mlir::func::FuncOp func =
|
|
fir::runtime::getRuntimeFunc<mkRTKey(PushArrayConstructorValue)>(loc,
|
|
builder);
|
|
mlir::FunctionType funcType = func.getFunctionType();
|
|
auto args = fir::runtime::createArguments(builder, loc, funcType,
|
|
arrayConstructorVector, fromBox);
|
|
builder.create<fir::CallOp>(loc, func, args);
|
|
}
|
|
|
|
void fir::runtime::genPushArrayConstructorSimpleScalar(
|
|
mlir::Location loc, fir::FirOpBuilder &builder,
|
|
mlir::Value arrayConstructorVector, mlir::Value fromAddress) {
|
|
mlir::func::FuncOp func =
|
|
fir::runtime::getRuntimeFunc<mkRTKey(PushArrayConstructorSimpleScalar)>(
|
|
loc, builder);
|
|
mlir::FunctionType funcType = func.getFunctionType();
|
|
auto args = fir::runtime::createArguments(
|
|
builder, loc, funcType, arrayConstructorVector, fromAddress);
|
|
builder.create<fir::CallOp>(loc, func, args);
|
|
}
|