13#ifndef FORTRAN_LOWER_SYMBOLMAP_H
14#define FORTRAN_LOWER_SYMBOLMAP_H
16#include "flang/Common/reference.h"
17#include "flang/Optimizer/Builder/BoxValue.h"
18#include "flang/Optimizer/Dialect/FIRType.h"
19#include "flang/Optimizer/Dialect/FortranVariableInterface.h"
20#include "flang/Optimizer/Support/Matcher.h"
21#include "flang/Semantics/symbol.h"
22#include "mlir/IR/Value.h"
23#include "llvm/ADT/ArrayRef.h"
24#include "llvm/ADT/DenseMap.h"
25#include "llvm/ADT/SmallVector.h"
26#include "llvm/Support/Compiler.h"
33llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
const SymbolBox &symMap);
34llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
const SymMap &symMap);
54 using None = std::monostate;
80 Box, fir::FortranVariableOpInterface, None>;
90 explicit operator bool()
const {
return !std::holds_alternative<None>(box); }
100 return match([](
const None &) {
return mlir::Value{}; },
101 [](
const fir::FortranVariableOpInterface &x) {
102 return fir::FortranVariableOpInterface(x).getBase();
104 [](
const auto &x) {
return x.getAddr(); });
107 std::optional<fir::FortranVariableOpInterface>
108 getIfFortranVariableOpInterface() {
110 [](
const fir::FortranVariableOpInterface &x)
111 -> std::optional<fir::FortranVariableOpInterface> {
return x; },
112 [](
const auto &x) -> std::optional<fir::FortranVariableOpInterface> {
118 template <
typename ON,
typename RT>
119 constexpr RT
apply(RT (&&func)(
const ON &))
const {
120 if (
auto *x = std::get_if<ON>(&box))
125 const VT &matchee()
const {
return box; }
127 friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
128 const SymbolBox &symBox);
131 LLVM_DUMP_METHOD
void dump()
const { llvm::errs() << *
this <<
'\n'; }
148 using AcDoVar = llvm::StringRef;
153 void pushScope() { symbolMapStack.emplace_back(); }
155 symbolMapStack.pop_back();
156 assert(symbolMapStack.size() >= 1);
165 bool force =
false) {
171 mlir::Value len,
bool force =
false) {
175 bool force =
false) {
176 makeSym(sym, value, force);
182 bool force =
false) {
187 makeSym(sym, value, force);
194 bool force =
false) {
199 bool force =
false) {
200 makeSym(sym, value, force);
207 bool force =
false) {
212 bool force =
false) {
213 makeSym(sym, value, force);
221 bool force =
false) {
226 bool force =
false) {
227 makeSym(sym, value, force);
232 makeSym(sym, box, force);
235 void addBoxSymbol(semantics::SymbolRef sym, mlir::Value irBox,
239 bool force =
false) {
241 SymbolBox::Box(irBox, lbounds, explicitParams, explicitExtents),
244 void addBoxSymbol(semantics::SymbolRef sym,
const SymbolBox::Box &value,
245 bool force =
false) {
246 makeSym(sym, value, force);
271 impliedDoStack.emplace_back(var, value);
276 assert(!impliedDoStack.empty());
277 impliedDoStack.pop_back();
286 symbolMapStack.clear();
287 symbolMapStack.emplace_back();
288 assert(symbolMapStack.size() == 1);
289 impliedDoStack.clear();
292 friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
296 LLVM_DUMP_METHOD
void dump()
const { llvm::errs() << *
this <<
'\n'; }
299 fir::FortranVariableOpInterface definingOp,
300 bool force =
false) {
301 makeSym(symRef,
SymbolBox(definingOp), force);
307 assert(symBox &&
"source binding does not exists");
308 makeSym(target, symBox,
false);
311 std::optional<fir::FortranVariableOpInterface>
312 lookupVariableDefinition(semantics::SymbolRef sym) {
314 return symBox.getIfFortranVariableOpInterface();
320 void makeSym(semantics::SymbolRef symRef,
const SymbolBox &box,
321 bool force =
false) {
322 auto *sym = symRef->HasLocalLocality() ? &*symRef : &symRef->GetUltimate();
324 symbolMapStack.back().erase(sym);
325 assert(box &&
"cannot add an undefined symbol box");
326 symbolMapStack.back().try_emplace(sym, box);
RAII wrapper for SymMap.
Definition: SymbolMap.h:338
Definition: SymbolMap.h:146
void addSymbolWithShape(semantics::SymbolRef sym, mlir::Value value, llvm::ArrayRef< mlir::Value > shape, bool force=false)
Add an array mapping with (address, shape).
Definition: SymbolMap.h:180
void pushImpliedDoBinding(AcDoVar var, mlir::Value value)
Add a new binding from the ac-do-variable var to value.
Definition: SymbolMap.h:270
SymbolBox lookupSymbol(semantics::SymbolRef sym)
Find symbol and return its value if it appears in the current mappings.
Definition: SymbolMap.cpp:37
void addSymbolWithBounds(semantics::SymbolRef sym, mlir::Value value, llvm::ArrayRef< mlir::Value > extents, llvm::ArrayRef< mlir::Value > lbounds, bool force=false)
Add an array mapping with bounds notation.
Definition: SymbolMap.h:204
mlir::Value lookupImpliedDo(AcDoVar var)
Definition: SymbolMap.cpp:78
void addCharSymbolWithShape(semantics::SymbolRef sym, mlir::Value value, mlir::Value len, llvm::ArrayRef< mlir::Value > shape, bool force=false)
Add an array of CHARACTER mapping.
Definition: SymbolMap.h:191
void popImpliedDoBinding()
Pop the most recent implied do binding off the stack.
Definition: SymbolMap.h:275
void addSymbol(semantics::SymbolRef sym, mlir::Value value, bool force=false)
Add a trivial symbol mapping to an address.
Definition: SymbolMap.h:164
void addCharSymbolWithBounds(semantics::SymbolRef sym, mlir::Value value, mlir::Value len, llvm::ArrayRef< mlir::Value > extents, llvm::ArrayRef< mlir::Value > lbounds, bool force=false)
Add an array of CHARACTER with bounds notation.
Definition: SymbolMap.h:217
LLVM_DUMP_METHOD void dump() const
Dump the map. For debugging.
Definition: SymbolMap.h:296
void clear()
Remove all symbols from the map.
Definition: SymbolMap.h:285
SymbolBox lookupOneLevelUpSymbol(semantics::SymbolRef sym)
Definition: SymbolMap.cpp:61
void addSymbol(semantics::SymbolRef sym, const fir::ExtendedValue &ext, bool force=false)
Add an extended value to the symbol table.
Definition: SymbolMap.cpp:21
void addCharSymbol(semantics::SymbolRef sym, mlir::Value value, mlir::Value len, bool force=false)
Add a scalar CHARACTER mapping to an (address, len).
Definition: SymbolMap.h:170
SymbolBox shallowLookupSymbol(semantics::SymbolRef sym)
Definition: SymbolMap.cpp:48
Abstract base class.
Definition: BoxValue.h:61
Definition: BoxValue.h:153
Definition: BoxValue.h:291
Expressions of type CHARACTER and with rank > 0.
Definition: BoxValue.h:170
Definition: BoxValue.h:77
Definition: BoxValue.h:478
Definition: BoxValue.h:360
Definition: AbstractConverter.h:59
Definition: SymbolMap.h:52
mlir::Value getAddr() const
Definition: SymbolMap.h:99
LLVM_DUMP_METHOD void dump() const
Dump the map. For debugging.
Definition: SymbolMap.h:131
constexpr RT apply(RT(&&func)(const ON &)) const
Apply the lambda func to this box value.
Definition: SymbolMap.h:119