27#ifndef FORTRAN_LOWER_CALLINTERFACE_H
28#define FORTRAN_LOWER_CALLINTERFACE_H
30#include "flang/Common/reference.h"
31#include "flang/Evaluate/characteristics.h"
32#include "mlir/Dialect/Func/IR/FuncOps.h"
35namespace Fortran::semantics {
44class FortranProcedureFlagsEnumAttr;
72 std::optional<common::Reference<const semantics::Symbol>>;
73 using FirValue = mlir::Value;
113 CharBoxValueAttribute,
139 struct FirPlaceHolder {
140 FirPlaceHolder(mlir::Type t,
int passedPosition,
Property p,
149 static constexpr int resultEntityPosition = -1;
167 bool testTKR(Fortran::common::IgnoreTKR flag)
const;
191 FirValue firArgument;
204 std::size_t getNumFIRResults()
const {
return outputs.size(); }
211 return passedArguments;
242 fir::FortranProcedureFlagsEnumAttr
248 T &
side() {
return *
static_cast<T *
>(
this); }
249 const T &
side()
const {
return *
static_cast<const T *
>(
this); }
256 void mapBackInputToPassedEntity(
const FirPlaceHolder &, FirValue);
260 mlir::func::FuncOp func;
262 std::optional<PassedEntity> passedResult;
263 bool saveResult =
false;
280class CallerInterface :
public CallInterface<CallerInterface> {
284 : CallInterface{c}, procRef{p} {
292 std::string getMangledName()
const;
293 mlir::Location getCalleeLocation()
const;
304 bool isMainProgram()
const {
return false; }
335 void placeInput(
const PassedEntity &passedEntity, mlir::Value arg);
336 void placeAddressAndLengthInput(
const PassedEntity &passedEntity,
337 mlir::Value addr, mlir::Value len);
340 mlir::Value
getInput(
const PassedEntity &passedEntity);
348 if (!verifyActualInputs())
349 llvm::report_fatal_error(
"lowered arguments are incomplete");
397 static constexpr bool hasHostAssociated() {
return false; }
398 mlir::Type getHostAssociatedTy()
const {
399 llvm_unreachable(
"getting host associated type in CallerInterface");
402 std::optional<mlir::Value> getOriginalPassArg()
const {
403 return originalPassArg;
405 void setOriginalPassArg(mlir::Value x) { originalPassArg = x; }
409 bool verifyActualInputs()
const;
410 const Fortran::evaluate::ProcedureRef &procRef;
411 llvm::SmallVector<mlir::Value> actualInputs;
412 std::optional<mlir::Value> originalPassArg;
421class CalleeInterface :
public CallInterface<CalleeInterface> {
425 : CallInterface{c}, funit{f} {
429 bool hasAlternateReturns()
const;
430 std::string getMangledName()
const;
431 mlir::Location getCalleeLocation()
const;
433 bool isMainProgram()
const;
455 bool hasHostAssociated()
const;
456 mlir::Type getHostAssociatedTy()
const;
457 mlir::Value getHostAssociatedTuple()
const;
Definition AbstractConverter.h:87
Implementation helper.
Definition CallInterface.cpp:896
Definition CallInterface.h:95
void declare()
Definition CallInterface.cpp:749
bool mustPassResult() const
Is the Fortran result passed as an extra MLIR argument ?
Definition CallInterface.h:231
llvm::SmallVector< mlir::Type > getResultType() const
Return the MLIR output types.
Definition CallInterface.cpp:1627
llvm::ArrayRef< PassedEntity > getPassedArguments() const
Definition CallInterface.h:210
bool callerAllocateResult() const
Does the caller need to allocate storage for the result ?
Definition CallInterface.h:226
std::size_t getNumFIRArguments() const
Number of MLIR inputs/outputs of the created FuncOp.
Definition CallInterface.h:203
std::optional< Fortran::evaluate::characteristics::Procedure > characteristic
Definition CallInterface.h:268
void mapPassedEntities()
Definition CallInterface.cpp:811
mlir::func::FuncOp getFuncOp() const
Definition CallInterface.h:201
T & side()
CRTP handle.
Definition CallInterface.h:248
bool canBeCalledViaImplicitInterface() const
Can the associated procedure be called via an implicit interface?
Definition CallInterface.h:236
void determineInterface(bool isImplicit, const Fortran::evaluate::characteristics::Procedure &)
Definition CallInterface.cpp:1596
PassEntityBy
Enum the different ways an entity can be passed-by.
Definition CallInterface.h:100
@ BaseAddressValueAttribute
ValueAttribute means dummy has the Fortran VALUE attribute.
Definition CallInterface.h:112
@ Value
Definition CallInterface.h:110
mlir::FunctionType genFunctionType()
Returns the mlir function type.
Definition CallInterface.cpp:1614
bool mustSaveResult() const
Must the MLIR result be saved with a fir.save_result ?
Definition CallInterface.h:233
Property
Definition CallInterface.h:122
std::optional< PassedEntity > getPassedResult() const
Definition CallInterface.h:215
fir::FortranProcedureFlagsEnumAttr getProcedureAttrs(mlir::MLIRContext *) const
Definition CallInterface.cpp:1636
Definition CallInterface.h:421
mlir::func::FuncOp addEntryBlockAndMapArguments()
Definition CallInterface.cpp:615
const Fortran::semantics::Symbol * getProcedureSymbol() const
Definition CallInterface.cpp:587
bool isIndirectCall() const
Definition CallInterface.h:441
bool requireDispatchCall() const
Definition CallInterface.h:445
Definition CallInterface.h:280
std::function< void(evaluate::Expr< evaluate::SomeType >, bool)> ExprVisitor
Definition CallInterface.h:364
const Fortran::semantics::SubprogramDetails * getInterfaceDetails() const
Definition CallInterface.cpp:563
mlir::Value getIfPassedArg() const
Definition CallInterface.cpp:172
bool mustMapInterfaceSymbolsForResult() const
Definition CallInterface.cpp:477
mlir::Type getDummyArgumentType(const PassedEntity &) const
Return FIR type of argument.
Definition CallInterface.cpp:546
mlir::Value getInput(const PassedEntity &passedEntity)
Get lowered FIR argument given the Fortran argument.
Definition CallInterface.cpp:379
void walkDummyArgumentExtents(const PassedEntity &, const ExprVisitor &) const
Walk non-deferred extent specification expressions of a dummy argument.
Definition CallInterface.cpp:466
void walkDummyArgumentLengths(const PassedEntity &, const ExprVisitor &) const
Walk non-deferred length specification expressions of a dummy argument.
Definition CallInterface.cpp:414
bool requireDispatchCall() const
Definition CallInterface.cpp:126
const Fortran::evaluate::ProcedureDesignator * getIfIndirectCall() const
Definition CallInterface.cpp:182
bool mustMapInterfaceSymbolsForDummyArgument(const PassedEntity &) const
Definition CallInterface.cpp:493
const Fortran::semantics::Symbol * getProcedureSymbol() const
Definition CallInterface.cpp:111
bool isIndirectCall() const
Definition CallInterface.cpp:119
void placeInput(const PassedEntity &passedEntity, mlir::Value arg)
Definition CallInterface.cpp:348
const Fortran::semantics::Symbol * getDummySymbol(const PassedEntity &entity) const
Definition CallInterface.cpp:522
void walkResultExtents(const ExprVisitor &) const
Walk the result non-deferred extent specification expressions.
Definition CallInterface.cpp:450
std::optional< unsigned > getPassArgIndex() const
Definition CallInterface.cpp:148
mlir::Type getResultStorageType() const
Definition CallInterface.cpp:539
const Fortran::semantics::Symbol & getResultSymbol() const
Definition CallInterface.cpp:552
mlir::Value getArgumentValue(const semantics::Symbol &sym) const
Definition CallInterface.cpp:504
void walkResultLengths(const ExprVisitor &) const
Walk the result non-deferred length specification expressions.
Definition CallInterface.cpp:403
bool hasAlternateReturns() const
CRTP callbacks.
Definition CallInterface.cpp:61
llvm::ArrayRef< mlir::Value > getInputs() const
Get the input vector once it is complete.
Definition CallInterface.h:347
Definition HostAssociations.h:28
Definition SymbolMap.h:181
Definition ParserActions.h:24
bool mustPassLengthWithDummyProcedure(const Fortran::evaluate::ProcedureDesignator &proc, Fortran::lower::AbstractConverter &)
Is it required to pass proc as a tuple<function address, result length> ?
Definition CallInterface.cpp:1835
mlir::FunctionType translateSignature(const Fortran::evaluate::ProcedureDesignator &, Fortran::lower::AbstractConverter &)
Translate a procedure characteristics to an mlir::FunctionType signature.
Definition CallInterface.cpp:1803
bool isCPtrArgByValueType(mlir::Type ty)
Definition CallInterface.cpp:1868
mlir::func::FuncOp getOrDeclareFunction(const Fortran::evaluate::ProcedureDesignator &, Fortran::lower::AbstractConverter &)
Definition CallInterface.cpp:1809
mlir::Type getDummyProcedurePointerType(const Fortran::semantics::Symbol &dummyProcPtr, Fortran::lower::AbstractConverter &)
Definition CallInterface.cpp:1857
mlir::Type getUntypedBoxProcType(mlir::MLIRContext *context)
Return !fir.boxproc<() -> ()> type.
Definition CallInterface.cpp:34
mlir::Type getDummyProcedureType(const Fortran::semantics::Symbol &dummyProc, Fortran::lower::AbstractConverter &)
Definition CallInterface.cpp:1844
Definition AbstractConverter.h:37
Definition AbstractConverter.h:32
Definition characteristics.h:293
Definition characteristics.h:367
int passedEntityPosition
Definition CallInterface.h:148
Property property
Definition CallInterface.h:152
llvm::SmallVector< mlir::NamedAttribute > attributes
MLIR attributes for this argument.
Definition CallInterface.h:154
mlir::Type type
Type for this input/output.
Definition CallInterface.h:145
Definition CallInterface.h:159
FortranEntity entity
Definition CallInterface.h:190
bool testTKR(Fortran::common::IgnoreTKR flag) const
Does the argument have the specified IgnoreTKR flag?
Definition CallInterface.cpp:1481
bool mayRequireIntentoutFinalization() const
Definition CallInterface.cpp:1547
bool mayBeModifiedByCall() const
Can the argument be modified by the callee?
Definition CallInterface.cpp:1465
bool mayBeReadByCall() const
Can the argument be read by the callee?
Definition CallInterface.cpp:1474
bool hasValueAttribute() const
Does the dummy argument have the VALUE attribute?
Definition CallInterface.cpp:1522
bool isIntentOut() const
Is the argument INTENT(OUT)
Definition CallInterface.cpp:1494
bool hasAllocatableAttribute() const
Does the dummy argument have the ALLOCATABLE attribute?
Definition CallInterface.cpp:1534
const Fortran::evaluate::characteristics::DummyArgument * characteristics
Pointer to the argument characteristics. Nullptr for results.
Definition CallInterface.h:195
bool isSequenceAssociatedDescriptor() const
Definition CallInterface.cpp:1586
PassEntityBy passBy
How entity is passed by.
Definition CallInterface.h:186
bool mustBeMadeContiguous() const
Does the argument have the CONTIGUOUS attribute or have explicit shape?
Definition CallInterface.cpp:1500
bool isOptional() const
Is the dummy argument optional?
Definition CallInterface.cpp:1459
Definition CallInterface.h:63
Definition PFTBuilder.h:629