13#ifndef FORTRAN_OPTIMIZER_DIALECT_FIRTYPE_H
14#define FORTRAN_OPTIMIZER_DIALECT_FIRTYPE_H
16#include "mlir/IR/BuiltinAttributes.h"
17#include "mlir/IR/BuiltinTypes.h"
18#include "mlir/Interfaces/DataLayoutInterfaces.h"
19#include "llvm/ADT/SmallVector.h"
20#include "llvm/IR/Type.h"
25using KindTy = unsigned;
42 using mlir::Type::Type;
45 enum class Attribute { None, Allocatable, Pointer };
59 mlir::Type getElementOrSequenceType()
const;
88 bool polymorphic)
const;
94 static bool classof(mlir::Type type);
99#define GET_TYPEDEF_CLASSES
100#include "flang/Optimizer/Dialect/FIROpsTypes.h.inc"
111class DialectAsmParser;
112class DialectAsmPrinter;
120struct RecordTypeStorage;
136 return mlir::isa<fir::ReferenceType, fir::PointerType, fir::HeapType,
137 fir::LLVMPointerType>(t);
142 return mlir::isa<fir::BaseBoxType, fir::BoxCharType, fir::BoxProcType>(t);
149 return mlir::isa<fir::ReferenceType, mlir::FunctionType>(t) ||
161inline bool isa_derived(mlir::Type t) {
return mlir::isa<fir::RecordType>(t); }
165 if (
auto recTy = mlir::dyn_cast_or_null<fir::RecordType>(t))
166 return recTy.getName().ends_with(
"T__builtin_event_type");
172 if (
auto recTy = mlir::dyn_cast_or_null<fir::RecordType>(t))
173 return recTy.getName().ends_with(
"T__builtin_c_ptr") ||
174 recTy.getName().ends_with(
"T__builtin_c_funptr") ||
175 recTy.getName().ends_with(
"T__builtin_c_devptr");
180inline bool isa_builtin_c_devptr_type(mlir::Type t) {
181 if (
auto recTy = mlir::dyn_cast_or_null<fir::RecordType>(t))
182 return recTy.getName().ends_with(
"T__builtin_c_devptr");
188 if (
auto recTy = mlir::dyn_cast_or_null<fir::RecordType>(t))
189 return recTy.getName().ends_with(
"T__builtin_c_devptr");
207inline bool isa_real(mlir::Type t) {
return mlir::isa<mlir::FloatType>(t); }
211 return mlir::isa<mlir::IndexType, mlir::IntegerType, fir::IntegerType>(t);
216 return mlir::isa<mlir::VectorType, fir::VectorType>(t);
219mlir::Type parseFirType(FIROpsDialect *, mlir::DialectAsmParser &parser);
221void printFirType(FIROpsDialect *, mlir::Type ty, mlir::DialectAsmPrinter &p);
229 return mlir::isa<mlir::ComplexType>(t) &&
230 mlir::isa<mlir::FloatType>(
231 mlir::cast<mlir::ComplexType>(t).getElementType());
235inline bool isa_char(mlir::Type t) {
return mlir::isa<fir::CharacterType>(t); }
241 mlir::isa<fir::LogicalType>(t);
246 if (
auto ct = mlir::dyn_cast_or_null<fir::CharacterType>(t))
247 return ct.getLen() != fir::CharacterType::singleton();
264 if (
auto charTy = mlir::dyn_cast<fir::CharacterType>(t))
265 return charTy.hasDynamicLen();
272 return seqTy.hasUnknownShape() || seqTy.hasDynamicExtents();
278inline unsigned getRankOfShapeType(mlir::Type t) {
279 if (
auto shTy = mlir::dyn_cast<fir::ShapeType>(t))
280 return shTy.getRank();
281 if (
auto shTy = mlir::dyn_cast<fir::ShapeShiftType>(t))
282 return shTy.getRank();
283 if (
auto shTy = mlir::dyn_cast<fir::ShiftType>(t))
284 return shTy.getRank();
291 if (!mlir::isa<fir::PointerType, fir::HeapType>(eleTy))
292 eleTy = fir::ReferenceType::get(t);
298 if (
auto seqTy = mlir::dyn_cast<fir::SequenceType>(t))
299 return seqTy.getEleTy();
306inline mlir::Type unwrapRefType(mlir::Type t) {
351 if (
auto seqTy = mlir::dyn_cast<fir::SequenceType>(t))
360 return mlir::dyn_cast<fir::RecordType>(
367 return recTy && recTy.getNumLenParams() > 0;
378inline bool singleIndirectionLevel(mlir::Type ty) {
453 if (
auto recTy = mlir::dyn_cast_or_null<fir::RecordType>(ty))
454 return recTy.isDependentType();
471mlir::Type
fromRealTypeID(mlir::MLIRContext *context, llvm::Type::TypeID typeID,
474int getTypeCode(mlir::Type ty,
const KindMapping &kindMap);
477 return mlir::isa<fir::BoxType, fir::ClassType>(type);
482 if (
auto seqTy = mlir::dyn_cast<fir::SequenceType>(type))
483 return mlir::isa<mlir::NoneType>(seqTy.getEleTy());
484 return mlir::isa<mlir::NoneType>(type);
490 bool isPolymorphic =
false,
492 unsigned corank = 0) {
494 return fir::ClassType::get(eleTy,
false, corank);
495 return fir::BoxType::get(eleTy,
false, corank);
509 if (
auto seqTy = mlir::dyn_cast<fir::SequenceType>(ty))
510 return fir::SequenceType::get(
512 if (
auto heapTy = mlir::dyn_cast<fir::HeapType>(ty))
513 return fir::HeapType::get(
515 if (
auto pointerTy = mlir::dyn_cast<fir::PointerType>(ty))
516 return fir::PointerType::get(
518 if (!mlir::isa<mlir::NoneType, fir::RecordType>(ty))
519 return mlir::NoneType::get(ty.getContext());
532 bool turnBoxIntoClass);
537 mlir::isa<fir::BaseBoxType>(fir::unwrapRefType(t));
542 return mlir::isa<fir::BaseBoxType>(fir::unwrapRefType(t));
548 return t && mlir::isa<fir::BoxProcType>(t);
551inline bool isRefOfConstantSizeAggregateType(mlir::Type t) {
554 mlir::isa<fir::CharacterType, fir::RecordType, fir::SequenceType>(t) &&
563 llvm::StringRef prefix =
"");
600std::pair<std::uint64_t, unsigned short>
602 const mlir::DataLayout &dl,
603 const fir::KindMapping &kindMap);
606std::optional<std::pair<uint64_t, unsigned short>>
608 const mlir::DataLayout &dl,
609 const fir::KindMapping &kindMap);
This class provides a shared interface for box and class types.
Definition FIRType.h:40
Attribute
Box attributes.
Definition FIRType.h:45
mlir::Type getBaseAddressType(bool dropHeapOrPtr=false) const
Definition FIRType.cpp:1490
BaseBoxType getBoxTypeWithNewAttr(Attribute attr) const
Return the same type, except for the attribute (fir.heap/fir.ptr).
Definition FIRType.cpp:1573
BaseBoxType getBoxTypeWithNewElementType(mlir::Type elementType, bool polymorphic) const
Definition FIRType.cpp:1566
bool isVolatile() const
Is this a box describing volatile memory?
Definition FIRType.cpp:1610
bool isPointer() const
Is this a box for a pointer?
Definition FIRType.cpp:1602
bool isAssumedRank() const
Is this the box for an assumed rank?
Definition FIRType.cpp:1595
mlir::Type unwrapInnerType() const
Unwrap element type from fir.heap, fir.ptr and fir.array.
Definition FIRType.cpp:1497
mlir::Type getEleTy() const
Returns the element type of this box type.
Definition FIRType.cpp:1484
bool isCoarray() const
Is this a box describing a coarray?
Definition FIRType.cpp:1616
bool isPointerOrAllocatable() const
Does this box for a pointer or allocatable?
Definition FIRType.cpp:1606
BaseBoxType getBoxTypeWithNewShape(mlir::Type shapeMold) const
Definition FIRType.cpp:1546
static bool classof(mlir::Type type)
Methods for support type inquiry through isa, cast, and dyn_cast.
Definition FIRType.h:476
bool isArray() const
Is this a box describing an array or assumed-rank?
Definition FIRType.cpp:1612
Definition KindMapping.h:48
Definition AbstractConverter.h:37
bool isa_box_type(mlir::Type t)
Is t a boxed type?
Definition FIRType.h:141
int getTypeCode(mlir::Type ty, const KindMapping &kindMap)
Return the ISO_C_BINDING intrinsic module value of type ty.
Definition FIRType.cpp:497
bool isScalarBoxedRecordType(mlir::Type ty)
Definition FIRType.cpp:358
bool isa_builtin_event_type(mlir::Type t)
Is t type(event_type) type?
Definition FIRType.h:164
mlir::Type applyPathToType(mlir::Type rootTy, mlir::ValueRange path)
Definition FIROps.cpp:6285
std::string getTypeAsString(mlir::Type ty, const KindMapping &kindMap, llvm::StringRef prefix="")
Definition FIRType.cpp:594
fir::SequenceType unwrapUntilSeqType(mlir::Type t)
Definition FIRType.h:343
bool sequenceWithNonConstantShape(fir::SequenceType seqTy)
Definition FIRType.h:271
bool isa_ref_type(mlir::Type t)
Is t a FIR dialect type that implies a memory (de)reference?
Definition FIRType.h:135
bool isBoxAddressOrValue(mlir::Type t)
Is t a fir.box or class address or value type?
Definition FIRType.h:541
bool conformsWithPassByRef(mlir::Type t)
Definition FIRType.h:156
bool isa_volatile_type(mlir::Type t)
Definition FIRType.cpp:768
bool isa_builtin_cdevptr_type(mlir::Type t)
Is t type(c_devptr)?
Definition FIRType.h:187
mlir::Type updateTypeWithVolatility(mlir::Type type, bool isVolatile)
Definition FIRType.cpp:244
mlir::Type fromRealTypeID(mlir::MLIRContext *context, llvm::Type::TypeID typeID, fir::KindTy kind)
Convert llvm::Type::TypeID to mlir::Type.
Definition FIRType.cpp:1458
bool isUnlimitedPolymorphicType(mlir::Type ty)
Definition FIRType.cpp:418
bool isa_vector(mlir::Type t)
Is t a vector type?
Definition FIRType.h:215
mlir::Type unwrapPassByRefType(mlir::Type t)
Definition FIRType.h:314
bool isDerivedType(fir::BaseBoxType boxTy)
Return true iff boxTy wraps a fir::RecordType.
Definition FIRType.h:371
bool isa_char(mlir::Type t)
Is t a CHARACTER type? Does not check the length.
Definition FIRType.h:235
bool isBoxedRecordType(mlir::Type ty)
Definition FIRType.cpp:337
bool isBoxNone(mlir::Type ty)
Return true iff ty is !fir.box<none>.
Definition FIRType.cpp:331
mlir::Type unwrapSeqOrBoxedSeqType(mlir::Type ty)
Definition FIRType.cpp:472
bool isBoxAddress(mlir::Type t)
Is t an address to fir.box or class type?
Definition FIRType.h:535
mlir::Type updateTypeForUnlimitedPolymorphic(mlir::Type ty)
Definition FIRType.h:508
bool isa_derived(mlir::Type t)
Is t a derived (record) type?
Definition FIRType.h:161
bool isa_aggregate(mlir::Type t)
Is t a FIR dialect aggregate type?
Definition FIRType.h:194
bool isDerivedTypeWithLenParams(fir::BaseBoxType boxTy)
Return true iff boxTy wraps a fir::RecordType with length parameters.
Definition FIRType.h:365
bool isAssumedShape(mlir::Type ty)
Return true iff ty is the type of an assumed shape array.
Definition FIRType.cpp:385
bool isCharacterProcedureTuple(mlir::Type type, bool acceptRawFunc=true)
Is this tuple type holding a character function and its result length?
Definition FIRType.cpp:1440
mlir::Type dyn_cast_ptrEleTy(mlir::Type t)
Definition FIRType.cpp:257
mlir::Type getDerivedType(mlir::Type ty)
Return the nested RecordType if one if found. Return ty otherwise.
Definition FIRType.cpp:233
bool isa_fir_or_std_type(mlir::Type t)
Is t any of the FIR dialect or Standard dialect types?
Definition FIRType.cpp:226
mlir::Type getFortranElementType(mlir::Type ty)
Definition FIRType.cpp:467
bool isNoneOrSeqNone(mlir::Type type)
Return true iff ty is none or fir.array<none>.
Definition FIRType.h:481
std::optional< std::pair< uint64_t, unsigned short > > getTypeSizeAndAlignment(mlir::Location loc, mlir::Type ty, const mlir::DataLayout &dl, const fir::KindMapping &kindMap)
This variant returns std::nullopt if an unsupported type is passed.
Definition FIRType.cpp:1644
fir::RecordType unwrapIfDerived(fir::BaseBoxType boxTy)
Definition FIRType.h:359
bool boxHasAddendum(fir::BaseBoxType boxTy)
Definition FIRType.h:433
bool isRecordWithAllocatableMember(mlir::Type ty)
Return true iff ty is a RecordType with members that are allocatable.
Definition FIRType.cpp:426
unsigned getBoxRank(mlir::Type boxTy)
Get the rank from a !fir.box type.
Definition FIRType.cpp:483
bool isClassStarType(mlir::Type ty)
Return true if CLASS(*)
Definition FIRType.cpp:349
mlir::Type wrapInClassOrBoxType(mlir::Type eleTy, bool isPolymorphic=false, bool isAssumedType=false, unsigned corank=0)
Definition FIRType.h:489
mlir::Type dyn_cast_ptrOrBoxEleTy(mlir::Type t)
Definition FIRType.cpp:264
bool isPointerType(mlir::Type ty)
Definition FIRType.cpp:315
bool isTypeWithDescriptor(mlir::Type ty)
Return true iff ty is a type that contains descriptor information.
Definition FIRType.cpp:404
bool characterWithDynamicLen(mlir::Type t)
Returns true iff t is a fir.char type and has an unknown length.
Definition FIRType.h:263
bool isAllocatableType(mlir::Type ty)
Return true iff ty is the type of an ALLOCATABLE entity or value.
Definition FIRType.cpp:323
mlir::Type changeElementType(mlir::Type type, mlir::Type newElementType, bool turnBoxIntoClass)
Definition FIRType.cpp:731
bool isPolymorphicType(mlir::Type ty)
Definition FIRType.cpp:410
bool isa_builtin_cptr_type(mlir::Type t)
Is t type(c_ptr), type(c_funptr), or type(c_devptr)?
Definition FIRType.h:171
mlir::Type unwrapAllRefAndSeqType(mlir::Type ty)
Definition FIRType.cpp:456
unsigned getBoxCorank(mlir::Type boxTy)
Get the corank from a !fir.box type.
Definition FIRType.cpp:490
bool hasAbstractResult(mlir::FunctionType ty)
Definition FIRType.cpp:1448
bool isAllocatableOrPointerArray(mlir::Type ty)
Return true iff ty is the type of an allocatable array.
Definition FIRType.cpp:392
bool isa_integer(mlir::Type t)
Is t an integral type?
Definition FIRType.h:210
mlir::Type extractSequenceType(mlir::Type ty)
Return the nested sequence type if any.
Definition FIRType.cpp:303
bool isa_char_string(mlir::Type t)
Is t a CHARACTER type with a LEN other than 1?
Definition FIRType.h:245
bool isRecordWithDescriptorMember(mlir::Type ty)
Definition FIRType.cpp:442
bool isBoxProcAddressType(mlir::Type t)
Is this a fir.boxproc address type?
Definition FIRType.h:546
bool isa_std_type(mlir::Type t)
Is t any of the Standard dialect types?
Definition FIRType.cpp:222
bool isa_passbyref_type(mlir::Type t)
Definition FIRType.h:148
std::pair< std::uint64_t, unsigned short > getTypeSizeAndAlignmentOrCrash(mlir::Location loc, mlir::Type ty, const mlir::DataLayout &dl, const fir::KindMapping &kindMap)
This variant terminates the compilation if an unsupported type is passed.
Definition FIRType.cpp:1727
bool hasDynamicSize(mlir::Type t)
Returns true iff the type t does not have a constant size.
Definition FIRType.cpp:290
mlir::Type boxMemRefType(fir::BaseBoxType t)
Get the memory reference type of the data pointer from the box type,.
Definition FIRType.h:289
bool isRecordWithTypeParameters(mlir::Type ty)
Return true iff ty is a RecordType with type parameters.
Definition FIRType.h:452
bool isAssumedType(mlir::Type ty)
Definition FIRType.cpp:372
void verifyIntegralType(mlir::Type type)
Definition FIRType.cpp:746
bool isa_complex(mlir::Type t)
Is t a floating point complex type?
Definition FIRType.h:228
bool isa_fir_type(mlir::Type t)
Is t any of the FIR dialect types?
Definition FIRType.cpp:218
bool isa_trivial(mlir::Type t)
Definition FIRType.h:239
mlir::Type unwrapSequenceType(mlir::Type t)
If t is a SequenceType return its element type, otherwise return t.
Definition FIRType.h:297
bool isa_unknown_size_box(mlir::Type t)
Definition FIRType.cpp:758
bool isa_real(mlir::Type t)
Is t a real type?
Definition FIRType.h:207
Definition AbstractConverter.h:32
Derived type storage.
Definition FIRType.cpp:157