xref: /llvm-project/flang/lib/Lower/SymbolMap.cpp (revision 335b3990ef9115e3b20eb9dfa32393a7fdfde4e3)
1e1a12767SValentin Clement //===-- SymbolMap.cpp -----------------------------------------------------===//
2e1a12767SValentin Clement //
3e1a12767SValentin Clement // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e1a12767SValentin Clement // See https://llvm.org/LICENSE.txt for license information.
5e1a12767SValentin Clement // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e1a12767SValentin Clement //
7e1a12767SValentin Clement //===----------------------------------------------------------------------===//
8e1a12767SValentin Clement //
9e1a12767SValentin Clement // Pretty printers for symbol boxes, etc.
10e1a12767SValentin Clement //
11e1a12767SValentin Clement //===----------------------------------------------------------------------===//
12e1a12767SValentin Clement 
13e1a12767SValentin Clement #include "flang/Lower/SymbolMap.h"
14ca0a0bf9SJean Perier #include "flang/Optimizer/Builder/Todo.h"
15e1a12767SValentin Clement #include "mlir/IR/BuiltinTypes.h"
16e1a12767SValentin Clement #include "llvm/Support/Debug.h"
174d4d4785SKazu Hirata #include <optional>
18e1a12767SValentin Clement 
19e1a12767SValentin Clement #define DEBUG_TYPE "flang-lower-symbol-map"
20e1a12767SValentin Clement 
addSymbol(Fortran::semantics::SymbolRef sym,const fir::ExtendedValue & exv,bool force)21e1a12767SValentin Clement void Fortran::lower::SymMap::addSymbol(Fortran::semantics::SymbolRef sym,
22e1a12767SValentin Clement                                        const fir::ExtendedValue &exv,
23e1a12767SValentin Clement                                        bool force) {
24e1a12767SValentin Clement   exv.match([&](const fir::UnboxedValue &v) { addSymbol(sym, v, force); },
25e1a12767SValentin Clement             [&](const fir::CharBoxValue &v) { makeSym(sym, v, force); },
26e1a12767SValentin Clement             [&](const fir::ArrayBoxValue &v) { makeSym(sym, v, force); },
27e1a12767SValentin Clement             [&](const fir::CharArrayBoxValue &v) { makeSym(sym, v, force); },
28e1a12767SValentin Clement             [&](const fir::BoxValue &v) { makeSym(sym, v, force); },
29e1a12767SValentin Clement             [&](const fir::MutableBoxValue &v) { makeSym(sym, v, force); },
30f677c5eeSValentin Clement             [&](const fir::PolymorphicValue &v) { makeSym(sym, v, force); },
31e1a12767SValentin Clement             [](auto) {
32e1a12767SValentin Clement               llvm::report_fatal_error("value not added to symbol table");
33e1a12767SValentin Clement             });
34e1a12767SValentin Clement }
35e1a12767SValentin Clement 
36e1a12767SValentin Clement Fortran::lower::SymbolBox
lookupSymbol(Fortran::semantics::SymbolRef symRef)37a1425019SValentin Clement Fortran::lower::SymMap::lookupSymbol(Fortran::semantics::SymbolRef symRef) {
38*335b3990SV Donaldson   auto *sym = symRef->HasLocalLocality() ? &*symRef : &symRef->GetUltimate();
39e1a12767SValentin Clement   for (auto jmap = symbolMapStack.rbegin(), jend = symbolMapStack.rend();
40e1a12767SValentin Clement        jmap != jend; ++jmap) {
41*335b3990SV Donaldson     auto iter = jmap->find(sym);
42e1a12767SValentin Clement     if (iter != jmap->end())
43ab9c4e9fSJean Perier       return iter->second;
44e1a12767SValentin Clement   }
45e1a12767SValentin Clement   return SymbolBox::None{};
46e1a12767SValentin Clement }
47e1a12767SValentin Clement 
shallowLookupSymbol(Fortran::semantics::SymbolRef symRef)48a1425019SValentin Clement Fortran::lower::SymbolBox Fortran::lower::SymMap::shallowLookupSymbol(
49a1425019SValentin Clement     Fortran::semantics::SymbolRef symRef) {
50*335b3990SV Donaldson   auto *sym = symRef->HasLocalLocality() ? &*symRef : &symRef->GetUltimate();
51a1425019SValentin Clement   auto &map = symbolMapStack.back();
52*335b3990SV Donaldson   auto iter = map.find(sym);
53a1425019SValentin Clement   if (iter != map.end())
54ab9c4e9fSJean Perier     return iter->second;
55a1425019SValentin Clement   return SymbolBox::None{};
56a1425019SValentin Clement }
57a1425019SValentin Clement 
5827afb362SPeixin-Qiao /// Skip one level when looking up the symbol. The use case is such as looking
5927afb362SPeixin-Qiao /// up the host variable symbol box by skipping the associated level in
6027afb362SPeixin-Qiao /// host-association in OpenMP code.
lookupOneLevelUpSymbol(Fortran::semantics::SymbolRef symRef)6127afb362SPeixin-Qiao Fortran::lower::SymbolBox Fortran::lower::SymMap::lookupOneLevelUpSymbol(
6227afb362SPeixin-Qiao     Fortran::semantics::SymbolRef symRef) {
63*335b3990SV Donaldson   auto *sym = symRef->HasLocalLocality() ? &*symRef : &symRef->GetUltimate();
6427afb362SPeixin-Qiao   auto jmap = symbolMapStack.rbegin();
6527afb362SPeixin-Qiao   auto jend = symbolMapStack.rend();
6627afb362SPeixin-Qiao   if (jmap == jend)
6727afb362SPeixin-Qiao     return SymbolBox::None{};
6827afb362SPeixin-Qiao   // Skip one level in symbol map stack.
6927afb362SPeixin-Qiao   for (++jmap; jmap != jend; ++jmap) {
70*335b3990SV Donaldson     auto iter = jmap->find(sym);
7127afb362SPeixin-Qiao     if (iter != jmap->end())
72ab9c4e9fSJean Perier       return iter->second;
7327afb362SPeixin-Qiao   }
7427afb362SPeixin-Qiao   return SymbolBox::None{};
7527afb362SPeixin-Qiao }
7627afb362SPeixin-Qiao 
77e1a12767SValentin Clement mlir::Value
lookupImpliedDo(Fortran::lower::SymMap::AcDoVar var)78e1a12767SValentin Clement Fortran::lower::SymMap::lookupImpliedDo(Fortran::lower::SymMap::AcDoVar var) {
79e1a12767SValentin Clement   for (auto [marker, binding] : llvm::reverse(impliedDoStack))
80e1a12767SValentin Clement     if (var == marker)
81e1a12767SValentin Clement       return binding;
82e1a12767SValentin Clement   return {};
83e1a12767SValentin Clement }
84e1a12767SValentin Clement 
85e1a12767SValentin Clement llvm::raw_ostream &
operator <<(llvm::raw_ostream & os,const Fortran::lower::SymbolBox & symBox)86e1a12767SValentin Clement Fortran::lower::operator<<(llvm::raw_ostream &os,
87e1a12767SValentin Clement                            const Fortran::lower::SymbolBox &symBox) {
88e1a12767SValentin Clement   symBox.match(
89e1a12767SValentin Clement       [&](const Fortran::lower::SymbolBox::None &box) {
90e1a12767SValentin Clement         os << "** symbol not properly mapped **\n";
91e1a12767SValentin Clement       },
92e1a12767SValentin Clement       [&](const Fortran::lower::SymbolBox::Intrinsic &val) {
93e1a12767SValentin Clement         os << val.getAddr() << '\n';
94e1a12767SValentin Clement       },
95e1a12767SValentin Clement       [&](const auto &box) { os << box << '\n'; });
96e1a12767SValentin Clement   return os;
97e1a12767SValentin Clement }
98e1a12767SValentin Clement 
99e1a12767SValentin Clement llvm::raw_ostream &
operator <<(llvm::raw_ostream & os,const Fortran::lower::SymMap & symMap)100e1a12767SValentin Clement Fortran::lower::operator<<(llvm::raw_ostream &os,
101e1a12767SValentin Clement                            const Fortran::lower::SymMap &symMap) {
102e1a12767SValentin Clement   os << "Symbol map:\n";
103e1a12767SValentin Clement   for (auto i : llvm::enumerate(symMap.symbolMapStack)) {
104e1a12767SValentin Clement     os << " level " << i.index() << "<{\n";
105ca0a0bf9SJean Perier     for (auto iter : i.value()) {
106e1a12767SValentin Clement       os << "  symbol @" << static_cast<const void *>(iter.first) << " ["
107ca0a0bf9SJean Perier          << *iter.first << "] ->\n    ";
108ab9c4e9fSJean Perier       os << iter.second;
109ca0a0bf9SJean Perier     }
110e1a12767SValentin Clement     os << " }>\n";
111e1a12767SValentin Clement   }
112e1a12767SValentin Clement   return os;
113e1a12767SValentin Clement }
114