diff options
Diffstat (limited to 'flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp')
| -rw-r--r-- | flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp b/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp index c786bef5cb1c..0d56cd2edc99 100644 --- a/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp @@ -9,7 +9,7 @@ #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.h" +#include "flang/Runtime/array-constructor-consts.h" using namespace Fortran::runtime; @@ -25,12 +25,13 @@ 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 the "host" size and alignment, but double them to be safe regardless of - // the target. The "cookieSize" argument is used to validate this wild - // assumption until runtime interfaces are improved. + // 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 = - 2 * sizeof(Fortran::runtime::ArrayConstructorVector) * 8; - std::size_t alignLike = alignof(Fortran::runtime::ArrayConstructorVector) * 8; + MaxArrayConstructorVectorSizeInBytes * 8; + std::size_t alignLike = MaxArrayConstructorVectorAlignInBytes * 8; fir::SequenceType::Extent numElem = (arrayVectorStructBitSize + alignLike - 1) / alignLike; mlir::Type intType = builder.getIntegerType(alignLike); @@ -43,14 +44,12 @@ mlir::Value fir::runtime::genInitArrayConstructorVector( loc, builder); mlir::FunctionType funcType = func.getFunctionType(); cookie = builder.createConvert(loc, funcType.getInput(0), cookie); - mlir::Value cookieSize = builder.createIntegerConstant( - loc, funcType.getInput(3), numElem * alignLike / 8); mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc); mlir::Value sourceLine = - fir::factory::locationToLineNo(builder, loc, funcType.getInput(5)); + fir::factory::locationToLineNo(builder, loc, funcType.getInput(4)); auto args = fir::runtime::createArguments(builder, loc, funcType, cookie, toBox, useValueLengthParameters, - cookieSize, sourceFile, sourceLine); + sourceFile, sourceLine); builder.create<fir::CallOp>(loc, func, args); return cookie; } |
