forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 16
/
AbstractConverter.h
201 lines (166 loc) · 7.7 KB
/
AbstractConverter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
//===-- Lower/AbstractConverter.h -------------------------------*- 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
//
//===----------------------------------------------------------------------===//
//
// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
//
//===----------------------------------------------------------------------===//
#ifndef FORTRAN_LOWER_ABSTRACTCONVERTER_H
#define FORTRAN_LOWER_ABSTRACTCONVERTER_H
#include "flang/Common/Fortran.h"
#include "flang/Lower/PFTDefs.h"
#include "flang/Optimizer/Builder/BoxValue.h"
#include "mlir/IR/BuiltinOps.h"
#include "llvm/ADT/ArrayRef.h"
namespace fir {
class KindMapping;
class FirOpBuilder;
} // namespace fir
namespace Fortran {
namespace common {
template <typename>
class Reference;
}
namespace evaluate {
template <typename>
class Expr;
class FoldingContext;
struct SomeType;
} // namespace evaluate
namespace parser {
class CharBlock;
}
namespace semantics {
class Symbol;
class DerivedTypeSpec;
} // namespace semantics
namespace lower {
namespace pft {
struct Variable;
}
using SomeExpr = Fortran::evaluate::Expr<Fortran::evaluate::SomeType>;
using SymbolRef = Fortran::common::Reference<const Fortran::semantics::Symbol>;
class StatementContext;
//===----------------------------------------------------------------------===//
// AbstractConverter interface
//===----------------------------------------------------------------------===//
/// The abstract interface for converter implementations to lower Fortran
/// front-end fragments such as expressions, types, etc. to the FIR dialect of
/// MLIR.
class AbstractConverter {
public:
//===--------------------------------------------------------------------===//
// Symbols
//===--------------------------------------------------------------------===//
/// Get the mlir instance of a symbol.
virtual mlir::Value getSymbolAddress(SymbolRef sym) = 0;
/// Get the binding of an implied do variable by name.
virtual mlir::Value impliedDoBinding(llvm::StringRef name) = 0;
/// Copy the binding of src to target symbol.
virtual void copySymbolBinding(SymbolRef src, SymbolRef target) = 0;
/// Binds the symbol to an fir extended value and returns true if the symbol
/// has no existing binding. If there is an existing binding this function
/// does nothing and returns false.
virtual bool bindSymbol(const SymbolRef sym,
const fir::ExtendedValue &exval) = 0;
/// Get the label set associated with a symbol.
virtual bool lookupLabelSet(SymbolRef sym, pft::LabelSet &labelSet) = 0;
/// Get the code defined by a label
virtual pft::Evaluation *lookupLabel(pft::Label label) = 0;
/// For a give symbol which is host-associated, create a clone using
/// parameters from the host-associated symbol.
virtual bool
createHostAssociateVarClone(const Fortran::semantics::Symbol &sym) = 0;
virtual void copyHostAssociateVar(const Fortran::semantics::Symbol &sym) = 0;
//===--------------------------------------------------------------------===//
// Expressions
//===--------------------------------------------------------------------===//
/// Generate the address of the location holding the expression, someExpr.
/// If SomeExpr is a Designator that is not compile time contiguous, the
/// address returned is the one of a contiguous temporary storage holding the
/// expression value. The clean-up for this temporary is added to the
/// StatementContext.
virtual fir::ExtendedValue genExprAddr(const SomeExpr &, StatementContext &,
mlir::Location *loc = nullptr) = 0;
/// Generate the address of the location holding the expression, someExpr
fir::ExtendedValue genExprAddr(const SomeExpr *someExpr,
StatementContext &stmtCtx,
mlir::Location loc) {
return genExprAddr(*someExpr, stmtCtx, &loc);
}
/// Generate the computations of the expression to produce a value
virtual fir::ExtendedValue genExprValue(const SomeExpr &, StatementContext &,
mlir::Location *loc = nullptr) = 0;
/// Generate the computations of the expression, someExpr, to produce a value
fir::ExtendedValue genExprValue(const SomeExpr *someExpr,
StatementContext &stmtCtx,
mlir::Location loc) {
return genExprValue(*someExpr, stmtCtx, &loc);
}
/// Generate or get a fir.box describing the expression. If SomeExpr is
/// a Designator, the fir.box describes an entity over the Designator base
/// storage without making a temporary.
virtual fir::ExtendedValue genExprBox(const SomeExpr &, StatementContext &,
mlir::Location) = 0;
/// Generate the address of the box describing the variable designated
/// by the expression. The expression must be an allocatable or pointer
/// designator.
virtual fir::MutableBoxValue genExprMutableBox(mlir::Location loc,
const SomeExpr &) = 0;
/// Get FoldingContext that is required for some expression
/// analysis.
virtual Fortran::evaluate::FoldingContext &getFoldingContext() = 0;
/// Host associated variables are grouped as a tuple. This returns that value,
/// which is itself a reference. Use bindTuple() to set this value.
virtual mlir::Value hostAssocTupleValue() = 0;
/// Record a binding for the ssa-value of the host assoications tuple for this
/// function.
virtual void bindHostAssocTuple(mlir::Value val) = 0;
//===--------------------------------------------------------------------===//
// Types
//===--------------------------------------------------------------------===//
/// Generate the type of an Expr
virtual mlir::Type genType(const SomeExpr &) = 0;
/// Generate the type of a Symbol
virtual mlir::Type genType(SymbolRef) = 0;
/// Generate the type from a category
virtual mlir::Type genType(Fortran::common::TypeCategory tc) = 0;
/// Generate the type from a category and kind and length parameters.
virtual mlir::Type
genType(Fortran::common::TypeCategory tc, int kind,
llvm::ArrayRef<std::int64_t> lenParameters = llvm::None) = 0;
/// Generate the type from a DerivedTypeSpec.
virtual mlir::Type genType(const Fortran::semantics::DerivedTypeSpec &) = 0;
/// Generate the type from a Variable
virtual mlir::Type genType(const pft::Variable &) = 0;
//===--------------------------------------------------------------------===//
// Locations
//===--------------------------------------------------------------------===//
/// Get the converter's current location
virtual mlir::Location getCurrentLocation() = 0;
/// Generate a dummy location
virtual mlir::Location genUnknownLocation() = 0;
/// Generate the location as converted from a CharBlock
virtual mlir::Location genLocation(const Fortran::parser::CharBlock &) = 0;
//===--------------------------------------------------------------------===//
// FIR/MLIR
//===--------------------------------------------------------------------===//
/// Get the OpBuilder
virtual fir::FirOpBuilder &getFirOpBuilder() = 0;
/// Get the ModuleOp
virtual mlir::ModuleOp &getModuleOp() = 0;
/// Get the MLIRContext
virtual mlir::MLIRContext &getMLIRContext() = 0;
/// Unique a symbol
virtual std::string mangleName(const Fortran::semantics::Symbol &) = 0;
/// Get the KindMap.
virtual fir::KindMapping &getKindMap() = 0;
virtual ~AbstractConverter() = default;
};
} // namespace lower
} // namespace Fortran
#endif // FORTRAN_LOWER_ABSTRACTCONVERTER_H