aboutsummaryrefslogtreecommitdiff
path: root/flang
diff options
context:
space:
mode:
authorValentin Clement <clementval@gmail.com>2022-10-05 23:04:59 +0200
committerValentin Clement <clementval@gmail.com>2022-10-05 23:05:28 +0200
commit91dd872ea6cff9bf6d83285b9c36dba40d86d0dd (patch)
tree89a72e6e4359608732b5793458e579f0aeb3667a /flang
parent60b4b39f5a78661e2b9d222cf6ba7d9d5d7511ed (diff)
downloadllvm-91dd872ea6cff9bf6d83285b9c36dba40d86d0dd.zip
llvm-91dd872ea6cff9bf6d83285b9c36dba40d86d0dd.tar.gz
llvm-91dd872ea6cff9bf6d83285b9c36dba40d86d0dd.tar.bz2
[flang] Keep current polymorphic implementation under a flag
It is useful for couple of test suite like NAG to keep failing with a TODO until the polymorphic entities is implemented all the way done to codegen. This pass adds a flag to LoweringOptions for experimental development. This flag is off by default and can be enable in `bbc` with `-polymorphic-type`. Options can be added in the driver and tco when needed. Reviewed By: PeteSteinfeld Differential Revision: https://reviews.llvm.org/D135283
Diffstat (limited to 'flang')
-rw-r--r--flang/include/flang/Lower/LoweringOptions.h11
-rw-r--r--flang/lib/Lower/CallInterface.cpp6
-rw-r--r--flang/lib/Lower/ConvertType.cpp5
-rw-r--r--flang/test/Lower/polymorphic-types.f902
-rw-r--r--flang/tools/bbc/bbc.cpp6
5 files changed, 28 insertions, 2 deletions
diff --git a/flang/include/flang/Lower/LoweringOptions.h b/flang/include/flang/Lower/LoweringOptions.h
index 5b70e9e..5873656 100644
--- a/flang/include/flang/Lower/LoweringOptions.h
+++ b/flang/include/flang/Lower/LoweringOptions.h
@@ -21,14 +21,23 @@ class LoweringOptions {
/// If true, lower transpose without a runtime call.
unsigned optimizeTranspose : 1;
+ /// If true, enable polymorphic type lowering feature. Off by default.
+ unsigned polymorphicTypeImpl : 1;
+
public:
- LoweringOptions() : optimizeTranspose(true) {}
+ LoweringOptions() : optimizeTranspose(true), polymorphicTypeImpl(false) {}
bool getOptimizeTranspose() const { return optimizeTranspose; }
LoweringOptions &setOptimizeTranspose(bool v) {
optimizeTranspose = v;
return *this;
}
+
+ bool isPolymorphicTypeImplEnabled() const { return polymorphicTypeImpl; }
+ LoweringOptions &setPolymorphicTypeImpl(bool v) {
+ polymorphicTypeImpl = v;
+ return *this;
+ }
};
} // namespace Fortran::lower
diff --git a/flang/lib/Lower/CallInterface.cpp b/flang/lib/Lower/CallInterface.cpp
index 510cb60..d482859 100644
--- a/flang/lib/Lower/CallInterface.cpp
+++ b/flang/lib/Lower/CallInterface.cpp
@@ -797,6 +797,12 @@ private:
Fortran::common::TypeCategory cat = dynamicType.category();
// DERIVED
if (cat == Fortran::common::TypeCategory::Derived) {
+ // TODO is kept under experimental flag until feature is complete.
+ if (dynamicType.IsPolymorphic() &&
+ !getConverter().getLoweringOptions().isPolymorphicTypeImplEnabled())
+ TODO(interface.converter.getCurrentLocation(),
+ "support for polymorphic types");
+
if (dynamicType.IsUnlimitedPolymorphic())
return mlir::NoneType::get(&mlirContext);
return getConverter().genType(dynamicType.GetDerivedTypeSpec());
diff --git a/flang/lib/Lower/ConvertType.cpp b/flang/lib/Lower/ConvertType.cpp
index 2188f38..1d838df 100644
--- a/flang/lib/Lower/ConvertType.cpp
+++ b/flang/lib/Lower/ConvertType.cpp
@@ -233,6 +233,11 @@ struct TypeBuilder {
llvm::SmallVector<Fortran::lower::LenParameterTy> params;
translateLenParameters(params, tySpec->category(), ultimate);
ty = genFIRType(context, tySpec->category(), kind, params);
+ } else if (type->IsPolymorphic() &&
+ !converter.getLoweringOptions()
+ .isPolymorphicTypeImplEnabled()) {
+ // TODO is kept under experimental flag until feature is complete.
+ TODO(loc, "support for polymorphic types");
} else if (type->IsUnlimitedPolymorphic()) {
ty = mlir::NoneType::get(context);
} else if (const Fortran::semantics::DerivedTypeSpec *tySpec =
diff --git a/flang/test/Lower/polymorphic-types.f90 b/flang/test/Lower/polymorphic-types.f90
index bc4f34e..d0354f9 100644
--- a/flang/test/Lower/polymorphic-types.f90
+++ b/flang/test/Lower/polymorphic-types.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -emit-fir %s -o - | FileCheck %s
+! RUN: bbc -polymorphic-type -emit-fir %s -o - | FileCheck %s
! Tests the different possible type involving polymorphic entities.
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index ec778a4..5e84edd 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -126,6 +126,11 @@ static llvm::cl::opt<bool> enableOpenACC("fopenacc",
llvm::cl::desc("enable openacc"),
llvm::cl::init(false));
+static llvm::cl::opt<bool> enablePolymorphic(
+ "polymorphic-type",
+ llvm::cl::desc("enable polymorphic type lowering (experimental)"),
+ llvm::cl::init(false));
+
#define FLANG_EXCLUDE_CODEGEN
#include "flang/Tools/CLOptions.inc"
@@ -221,6 +226,7 @@ static mlir::LogicalResult convertFortranSourceToMLIR(
&ctx, llvm::ArrayRef<fir::KindTy>{fir::fromDefaultKinds(defKinds)});
// Use default lowering options for bbc.
Fortran::lower::LoweringOptions loweringOptions{};
+ loweringOptions.setPolymorphicTypeImpl(enablePolymorphic);
auto burnside = Fortran::lower::LoweringBridge::create(
ctx, semanticsContext, defKinds, semanticsContext.intrinsics(),
semanticsContext.targetCharacteristics(), parsing.allCooked(), "",