1 //===-- SymbolMap.cpp -----------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Pretty printers for symbol boxes, etc. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "flang/Lower/SymbolMap.h" 14 #include "mlir/IR/BuiltinTypes.h" 15 #include "llvm/Support/Debug.h" 16 17 #define DEBUG_TYPE "flang-lower-symbol-map" 18 19 void Fortran::lower::SymMap::addSymbol(Fortran::semantics::SymbolRef sym, 20 const fir::ExtendedValue &exv, 21 bool force) { 22 exv.match([&](const fir::UnboxedValue &v) { addSymbol(sym, v, force); }, 23 [&](const fir::CharBoxValue &v) { makeSym(sym, v, force); }, 24 [&](const fir::ArrayBoxValue &v) { makeSym(sym, v, force); }, 25 [&](const fir::CharArrayBoxValue &v) { makeSym(sym, v, force); }, 26 [&](const fir::BoxValue &v) { makeSym(sym, v, force); }, 27 [&](const fir::MutableBoxValue &v) { makeSym(sym, v, force); }, 28 [](auto) { 29 llvm::report_fatal_error("value not added to symbol table"); 30 }); 31 } 32 33 Fortran::lower::SymbolBox 34 Fortran::lower::SymMap::lookupSymbol(Fortran::semantics::SymbolRef sym) { 35 for (auto jmap = symbolMapStack.rbegin(), jend = symbolMapStack.rend(); 36 jmap != jend; ++jmap) { 37 auto iter = jmap->find(&*sym); 38 if (iter != jmap->end()) 39 return iter->second; 40 } 41 return SymbolBox::None{}; 42 } 43 44 mlir::Value 45 Fortran::lower::SymMap::lookupImpliedDo(Fortran::lower::SymMap::AcDoVar var) { 46 for (auto [marker, binding] : llvm::reverse(impliedDoStack)) 47 if (var == marker) 48 return binding; 49 return {}; 50 } 51 52 llvm::raw_ostream & 53 Fortran::lower::operator<<(llvm::raw_ostream &os, 54 const Fortran::lower::SymbolBox &symBox) { 55 symBox.match( 56 [&](const Fortran::lower::SymbolBox::None &box) { 57 os << "** symbol not properly mapped **\n"; 58 }, 59 [&](const Fortran::lower::SymbolBox::Intrinsic &val) { 60 os << val.getAddr() << '\n'; 61 }, 62 [&](const auto &box) { os << box << '\n'; }); 63 return os; 64 } 65 66 llvm::raw_ostream & 67 Fortran::lower::operator<<(llvm::raw_ostream &os, 68 const Fortran::lower::SymMap &symMap) { 69 os << "Symbol map:\n"; 70 for (auto i : llvm::enumerate(symMap.symbolMapStack)) { 71 os << " level " << i.index() << "<{\n"; 72 for (auto iter : i.value()) 73 os << " symbol @" << static_cast<const void *>(iter.first) << " [" 74 << *iter.first << "] ->\n " << iter.second; 75 os << " }>\n"; 76 } 77 return os; 78 } 79