diff --git a/flang/include/flang/Optimizer/Builder/Runtime/Derived.h b/flang/include/flang/Optimizer/Builder/Runtime/Derived.h new file mode 100644 --- /dev/null +++ b/flang/include/flang/Optimizer/Builder/Runtime/Derived.h @@ -0,0 +1,39 @@ +//===-- 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); + +/// Generate call to derived type assignment runtime routine to +/// assign \p sourceBox to \p destinationBox. +void genDerivedTypeAssign(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value destinationBox, mlir::Value sourceBox); + +} // namespace fir::runtime +#endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_DERIVED_H diff --git a/flang/lib/Optimizer/Builder/CMakeLists.txt b/flang/lib/Optimizer/Builder/CMakeLists.txt --- a/flang/lib/Optimizer/Builder/CMakeLists.txt +++ b/flang/lib/Optimizer/Builder/CMakeLists.txt @@ -7,6 +7,7 @@ DoLoopHelper.cpp FIRBuilder.cpp MutableBox.cpp + Runtime/Derived.cpp DEPENDS FIRDialect diff --git a/flang/lib/Optimizer/Builder/Runtime/Derived.cpp b/flang/lib/Optimizer/Builder/Runtime/Derived.cpp new file mode 100644 --- /dev/null +++ b/flang/lib/Optimizer/Builder/Runtime/Derived.cpp @@ -0,0 +1,49 @@ +//===-- 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(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(loc, func, args); +} + +void fir::runtime::genDerivedTypeDestroy(fir::FirOpBuilder &builder, + mlir::Location loc, mlir::Value box) { + auto func = fir::runtime::getRuntimeFunc(loc, builder); + auto fTy = func.getType(); + auto args = fir::runtime::createArguments(builder, loc, fTy, box); + builder.create(loc, func, args); +} + +void fir::runtime::genDerivedTypeAssign(fir::FirOpBuilder &builder, + mlir::Location loc, + mlir::Value destinationBox, + mlir::Value sourceBox) { + auto func = fir::runtime::getRuntimeFunc(loc, builder); + auto fTy = func.getType(); + auto sourceFile = fir::factory::locationToFilename(builder, loc); + auto sourceLine = + fir::factory::locationToLineNo(builder, loc, fTy.getInput(3)); + auto args = fir::runtime::createArguments(builder, loc, fTy, destinationBox, + sourceBox, sourceFile, sourceLine); + builder.create(loc, func, args); +} diff --git a/flang/unittests/Optimizer/Builder/Runtime/DerivedTest.cpp b/flang/unittests/Optimizer/Builder/Runtime/DerivedTest.cpp new file mode 100644 --- /dev/null +++ b/flang/unittests/Optimizer/Builder/Runtime/DerivedTest.cpp @@ -0,0 +1,39 @@ +//===- 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(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(loc, seqTy); + fir::runtime::genDerivedTypeDestroy(*firBuilder, loc, box); + checkCallOpFromResultBox(box, "_FortranADestroy", 1, /*addLocArg=*/false); +} + +TEST_F(RuntimeCallTest, genDerivedTypeAssign) { + auto loc = firBuilder->getUnknownLoc(); + mlir::Type seqTy = + fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty); + mlir::Value source = firBuilder->create(loc, seqTy); + mlir::Value dest = firBuilder->create(loc, seqTy); + fir::runtime::genDerivedTypeAssign(*firBuilder, loc, dest, source); + checkCallOpFromResultBox(dest, "_FortranAAssign", 2); +} diff --git a/flang/unittests/Optimizer/CMakeLists.txt b/flang/unittests/Optimizer/CMakeLists.txt --- a/flang/unittests/Optimizer/CMakeLists.txt +++ b/flang/unittests/Optimizer/CMakeLists.txt @@ -13,6 +13,7 @@ Builder/ComplexTest.cpp Builder/DoLoopHelperTest.cpp Builder/FIRBuilderTest.cpp + Builder/Runtime/DerivedTest.cpp FIRContextTest.cpp InternalNamesTest.cpp KindMappingTest.cpp