forked from OSchip/llvm-project
[fir] Add fir derived type runtime builder
This patch adds the builder to generate derived type runtime API calls. This patch is part of the upstreaming effort from fir-dev branch. Reviewed By: rovka Differential Revision: https://reviews.llvm.org/D114472 Co-authored-by: Peter Klausler <pklausler@nvidia.com> Co-authored-by: Jean Perier <jperier@nvidia.com>
This commit is contained in:
parent
b29b6f92af
commit
c32421c925
|
@ -0,0 +1,34 @@
|
|||
//===-- Derived.h - generate derived type runtime API calls -*- C++ -----*-===//
|
||||
//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef FORTRAN_OPTIMIZER_BUILDER_RUNTIME_DERIVED_H
|
||||
#define FORTRAN_OPTIMIZER_BUILDER_RUNTIME_DERIVED_H
|
||||
|
||||
namespace mlir {
|
||||
class Value;
|
||||
class Location;
|
||||
} // namespace mlir
|
||||
|
||||
namespace fir {
|
||||
class FirOpBuilder;
|
||||
}
|
||||
|
||||
namespace fir::runtime {
|
||||
|
||||
/// Generate call to derived type initialization runtime routine to
|
||||
/// default initialize \p box.
|
||||
void genDerivedTypeInitialize(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||
mlir::Value box);
|
||||
|
||||
/// Generate call to derived type destruction runtime routine to
|
||||
/// destroy \p box.
|
||||
void genDerivedTypeDestroy(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||
mlir::Value box);
|
||||
|
||||
} // namespace fir::runtime
|
||||
#endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_DERIVED_H
|
|
@ -8,6 +8,7 @@ add_flang_library(FIRBuilder
|
|||
FIRBuilder.cpp
|
||||
MutableBox.cpp
|
||||
Runtime/Assign.cpp
|
||||
Runtime/Derived.cpp
|
||||
Runtime/Numeric.cpp
|
||||
Runtime/Reduction.cpp
|
||||
Runtime/Transformational.cpp
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
//===-- Derived.cpp -- derived type runtime API ---------------------------===//
|
||||
//
|
||||
// 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/Derived.h"
|
||||
#include "flang/Optimizer/Builder/FIRBuilder.h"
|
||||
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
|
||||
#include "flang/Runtime/derived-api.h"
|
||||
|
||||
using namespace Fortran::runtime;
|
||||
|
||||
void fir::runtime::genDerivedTypeInitialize(fir::FirOpBuilder &builder,
|
||||
mlir::Location loc,
|
||||
mlir::Value box) {
|
||||
auto func = fir::runtime::getRuntimeFunc<mkRTKey(Initialize)>(loc, builder);
|
||||
auto fTy = func.getType();
|
||||
auto sourceFile = fir::factory::locationToFilename(builder, loc);
|
||||
auto sourceLine =
|
||||
fir::factory::locationToLineNo(builder, loc, fTy.getInput(2));
|
||||
auto args = fir::runtime::createArguments(builder, loc, fTy, box, sourceFile,
|
||||
sourceLine);
|
||||
builder.create<fir::CallOp>(loc, func, args);
|
||||
}
|
||||
|
||||
void fir::runtime::genDerivedTypeDestroy(fir::FirOpBuilder &builder,
|
||||
mlir::Location loc, mlir::Value box) {
|
||||
auto func = fir::runtime::getRuntimeFunc<mkRTKey(Destroy)>(loc, builder);
|
||||
auto fTy = func.getType();
|
||||
auto args = fir::runtime::createArguments(builder, loc, fTy, box);
|
||||
builder.create<fir::CallOp>(loc, func, args);
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
//===- DerivedTest.cpp -- Derived type runtime builder unit tests ---------===//
|
||||
//
|
||||
// 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/Derived.h"
|
||||
#include "RuntimeCallTestBase.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
TEST_F(RuntimeCallTest, genDerivedTypeInitialize) {
|
||||
auto loc = firBuilder->getUnknownLoc();
|
||||
mlir::Type seqTy =
|
||||
fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
|
||||
mlir::Value box = firBuilder->create<fir::UndefOp>(loc, seqTy);
|
||||
fir::runtime::genDerivedTypeInitialize(*firBuilder, loc, box);
|
||||
checkCallOpFromResultBox(box, "_FortranAInitialize", 1);
|
||||
}
|
||||
|
||||
TEST_F(RuntimeCallTest, genDerivedTypeDestroy) {
|
||||
auto loc = firBuilder->getUnknownLoc();
|
||||
mlir::Type seqTy =
|
||||
fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
|
||||
mlir::Value box = firBuilder->create<fir::UndefOp>(loc, seqTy);
|
||||
fir::runtime::genDerivedTypeDestroy(*firBuilder, loc, box);
|
||||
checkCallOpFromResultBox(box, "_FortranADestroy", 1, /*addLocArg=*/false);
|
||||
}
|
|
@ -14,6 +14,7 @@ add_flang_unittest(FlangOptimizerTests
|
|||
Builder/DoLoopHelperTest.cpp
|
||||
Builder/FIRBuilderTest.cpp
|
||||
Builder/Runtime/AssignTest.cpp
|
||||
Builder/Runtime/DerivedTest.cpp
|
||||
Builder/Runtime/NumericTest.cpp
|
||||
Builder/Runtime/ReductionTest.cpp
|
||||
Builder/Runtime/TransformationalTest.cpp
|
||||
|
|
Loading…
Reference in New Issue