13#ifndef FORTRAN_LOWER_ABSTRACTCONVERTER_H
14#define FORTRAN_LOWER_ABSTRACTCONVERTER_H
17#include "flang/Lower/PFTDefs.h"
18#include "flang/Lower/Support/Utils.h"
19#include "flang/Optimizer/Builder/BoxValue.h"
20#include "flang/Optimizer/Dialect/FIRAttr.h"
21#include "flang/Semantics/symbol.h"
22#include "flang/Support/Fortran.h"
23#include "mlir/IR/Builders.h"
24#include "mlir/IR/BuiltinOps.h"
25#include "mlir/IR/Operation.h"
26#include "llvm/ADT/ArrayRef.h"
27#include "llvm/ADT/DenseMap.h"
70using SomeExpr = Fortran::evaluate::Expr<Fortran::evaluate::SomeType>;
71using SymbolRef = Fortran::common::Reference<const Fortran::semantics::Symbol>;
72using TypeConstructionStack =
73 llvm::DenseMap<const Fortran::semantics::Scope *, mlir::Type>;
76using ExprToValueMap = llvm::DenseMap<const SomeExpr *, mlir::Value>;
85class AbstractConverter {
136 virtual const ExprToValueMap *getExprOverrides() = 0;
150 bool skipDefaultInit) = 0;
165 mlir::OpBuilder::InsertPoint *copyAssignIP =
nullptr,
166 bool hostIsSource =
true) = 0;
168 virtual void copyVar(mlir::Location loc, mlir::Value dst, mlir::Value src,
169 fir::FortranVariableFlagsEnum attrs) = 0;
185 llvm::SetVector<const Fortran::semantics::Symbol *> &symbolSet,
186 Fortran::semantics::Symbol::Flag flag,
bool collectSymbols =
true,
187 bool collectHostAssociatedSymbols =
false) = 0;
195 virtual llvm::StringRef
197 std::unique_ptr<Fortran::lower::SomeExpr> expression,
198 mlir::Type eleTy) = 0;
210 mlir::Location *locPtr =
nullptr) = 0;
225 mlir::Location *locPtr =
nullptr) = 0;
241 const SomeExpr &expr,
248 const SomeExpr &expr) = 0;
286 virtual mlir::Type
genType(
const SomeExpr &) = 0;
290 virtual mlir::Type
genType(Fortran::common::TypeCategory tc) = 0;
293 genType(Fortran::common::TypeCategory tc,
int kind,
305 fir::RecordType type) = 0;
355 : loweringOptions(loweringOptions) {}
364 bool unstructuredContext =
true) = 0;
368 return loweringOptions;
389 virtual mlir::StateStack &getStateStack() = 0;
Definition AbstractConverter.h:85
virtual mlir::Value impliedDoBinding(llvm::StringRef name)=0
Get the binding of an implied do variable by name.
virtual void copyHostAssociateVar(const Fortran::semantics::Symbol &sym, mlir::OpBuilder::InsertPoint *copyAssignIP=nullptr, bool hostIsSource=true)=0
virtual Fortran::lower::SymMap & getSymbolMap()=0
virtual mlir::Location genLocation(const Fortran::parser::CharBlock &)=0
Generate the location as converted from a CharBlock.
virtual pft::Evaluation * lookupLabel(pft::Label label)=0
Get the code defined by a label.
virtual mlir::MLIRContext & getMLIRContext()=0
Get the MLIRContext.
virtual fir::MutableBoxValue genExprMutableBox(mlir::Location loc, const SomeExpr &expr)=0
fir::ExtendedValue genExprAddr(mlir::Location loc, const SomeExpr *expr, StatementContext &stmtCtx)
Generate the address of the location holding the expression, expr.
Definition AbstractConverter.h:213
virtual mlir::Value getSymbolAddress(SymbolRef sym)=0
Get the mlir instance of a symbol.
virtual Fortran::lower::SymbolBox shallowLookupSymbol(const Fortran::semantics::Symbol &sym)=0
Find the symbol in the inner-most level of the local map or return null.
virtual mlir::Location getCurrentLocation()=0
Get the converter's current location.
virtual Fortran::lower::SymbolBox lookupOneLevelUpSymbol(const Fortran::semantics::Symbol &sym)=0
virtual llvm::StringRef getUniqueLitName(mlir::Location loc, std::unique_ptr< Fortran::lower::SomeExpr > expression, mlir::Type eleTy)=0
virtual void checkCoarrayEnabled()=0
Check support of Multi-image features if -fcoarray is provided.
virtual std::string mangleName(std::string &)=0
Unique a compiler generated name (add a containing scope specific prefix)
virtual mlir::Location genUnknownLocation()=0
Generate a dummy location.
virtual mlir::ModuleOp getModuleOp()=0
Get the ModuleOp.
virtual Fortran::lower::SymMap::StorageDesc getSymbolStorage(SymbolRef sym)=0
virtual bool createHostAssociateVarClone(const Fortran::semantics::Symbol &sym, bool skipDefaultInit)=0
virtual mlir::Type genType(const SomeExpr &)=0
Generate the type of an Expr.
virtual bool isPresentShallowLookup(const Fortran::semantics::Symbol &sym)=0
virtual fir::ExtendedValue genExprValue(const SomeExpr &expr, StatementContext &context, mlir::Location *locPtr=nullptr)=0
Generate the computations of the expression to produce a value.
virtual fir::ExtendedValue genExprBox(mlir::Location loc, const SomeExpr &expr, StatementContext &stmtCtx)=0
virtual void overrideExprValues(const ExprToValueMap *)=0
virtual void bindSymbolStorage(SymbolRef sym, Fortran::lower::SymMap::StorageDesc storage)=0
virtual fir::FirOpBuilder & getFirOpBuilder()=0
Get the OpBuilder.
virtual mlir::Type genType(SymbolRef)=0
Generate the type of a Symbol.
virtual void registerTypeInfo(mlir::Location loc, SymbolRef typeInfoSym, const Fortran::semantics::DerivedTypeSpec &typeSpec, fir::RecordType type)=0
virtual mlir::Type genType(const pft::Variable &)=0
Generate the type from a Variable.
virtual const Fortran::semantics::Scope & getCurrentScope()=0
Get the converter's current scope.
virtual mlir::Type genType(Fortran::common::TypeCategory tc, int kind, llvm::ArrayRef< std::int64_t > lenParameters={})=0
Generate the type from a category and kind and length parameters.
virtual std::string getRecordTypeFieldName(const Fortran::semantics::Symbol &component)=0
virtual void genEval(pft::Evaluation &eval, bool unstructuredContext=true)=0
Generate IR for Evaluation eval.
virtual TypeConstructionStack & getTypeConstructionStack()=0
virtual void bindHostAssocTuple(mlir::Value val)=0
virtual const Fortran::lower::pft::FunctionLikeUnit * getCurrentFunctionUnit() const =0
Returns the FunctionLikeUnit being lowered, if any.
virtual mlir::Value hostAssocTupleValue()=0
virtual void copySymbolBinding(SymbolRef src, SymbolRef target)=0
Copy the binding of src to target symbol.
virtual Fortran::evaluate::FoldingContext & getFoldingContext()=0
virtual std::string mangleName(std::string &, const semantics::Scope &)=0
Unique a compiler generated name (add a provided scope specific prefix)
virtual void bindSymbol(SymbolRef sym, const fir::ExtendedValue &exval)=0
virtual mlir::SymbolTable * getMLIRSymbolTable()=0
virtual mlir::Type genType(const Fortran::semantics::DerivedTypeSpec &)=0
Generate the type from a DerivedTypeSpec.
virtual mlir::Type genType(Fortran::common::TypeCategory tc)=0
Generate the type from a category.
virtual mlir::Value dummyArgsScopeValue() const =0
virtual void collectSymbolSet(pft::Evaluation &eval, llvm::SetVector< const Fortran::semantics::Symbol * > &symbolSet, Fortran::semantics::Symbol::Flag flag, bool collectSymbols=true, bool collectHostAssociatedSymbols=false)=0
virtual fir::ExtendedValue genExprAddr(const SomeExpr &expr, StatementContext &context, mlir::Location *locPtr=nullptr)=0
virtual bool isRegisteredDummySymbol(Fortran::semantics::SymbolRef symRef) const =0
fir::ExtendedValue genExprValue(mlir::Location loc, const SomeExpr *expr, StatementContext &stmtCtx)
Generate the computations of the expression, expr, to produce a value.
Definition AbstractConverter.h:228
virtual std::string mangleName(const Fortran::semantics::DerivedTypeSpec &)=0
Unique a derived type (add a containing scope specific prefix)
const Fortran::lower::LoweringOptions & getLoweringOptions() const
Return options controlling lowering behavior.
Definition AbstractConverter.h:367
virtual bool lookupLabelSet(SymbolRef sym, pft::LabelSet &labelSet)=0
Get the label set associated with a symbol.
virtual std::string mangleName(const Fortran::semantics::Symbol &)=0
Unique a symbol (add a containing scope specific prefix)
virtual const fir::KindMapping & getKindMap()=0
Get the KindMap.
Definition LoweringOptions.h:34
Definition StatementContext.h:46
Definition SymbolMap.h:146
std::pair< mlir::Value, std::uint64_t > StorageDesc
Definition SymbolMap.h:151
Definition char-block.h:28
Definition BoxValue.h:478
Definition FIRBuilder.h:55
Definition KindMapping.h:48
Definition BoxValue.h:360
Definition ParserActions.h:24
Definition check-expression.h:19
Definition bit-population-count.h:20
Definition AbstractConverter.h:34
Definition AbstractConverter.h:29
Definition variable.h:284
Definition SymbolMap.h:52
Definition PFTBuilder.h:221
Definition PFTBuilder.h:615
Definition PFTBuilder.h:410