Lines Matching full:symboltable
1 //===- SymbolTable.cpp - MLIR Symbol Table Class --------------------------===//
9 #include "mlir/IR/SymbolTable.h"
29 return op->getAttrOfType<StringAttr>(SymbolTable::getSymbolAttrName());
57 StringAttr::get(ctx, SymbolTable::getSymbolAttrName());
60 if (!symbolTableOp->hasTrait<OpTrait::SymbolTable>())
92 if (!op.hasTrait<OpTrait::SymbolTable>()) {
108 if (result != WalkResult::advance() || op->hasTrait<OpTrait::SymbolTable>())
114 // SymbolTable
118 SymbolTable::SymbolTable(Operation *symbolTableOp)
120 assert(symbolTableOp->hasTrait<OpTrait::SymbolTable>() &&
121 "expected operation to have SymbolTable trait");
128 SymbolTable::getSymbolAttrName());
134 auto inserted = symbolTable.insert({name, &op});
143 Operation *SymbolTable::lookup(StringRef name) const {
146 Operation *SymbolTable::lookup(StringAttr name) const {
147 return symbolTable.lookup(name);
150 void SymbolTable::remove(Operation *op) {
155 "SymbolTable");
157 auto it = symbolTable.find(name);
158 if (it != symbolTable.end() && it->second == op)
159 symbolTable.erase(it);
162 void SymbolTable::erase(Operation *symbol) {
171 StringAttr SymbolTable::insert(Operation *symbol, Block::iterator insertPt) {
175 // TODO: consider if SymbolTable's constructor should behave the same.
198 if (symbolTable.insert({name, symbol}).second)
201 if (symbolTable.lookup(name) == symbol)
208 return !symbolTable
217 LogicalResult SymbolTable::rename(StringAttr from, StringAttr to) {
222 LogicalResult SymbolTable::rename(Operation *op, StringAttr to) {
229 "SymbolTable");
233 if (failed(SymbolTable::replaceAllSymbolUses(op, to, getOp())))
248 LogicalResult SymbolTable::rename(StringAttr from, StringRef to) {
253 LogicalResult SymbolTable::rename(Operation *op, StringRef to) {
259 SymbolTable::renameToUnique(StringAttr oldName,
260 ArrayRef<SymbolTable *> others) {
271 auto lookupNewName = [&](SymbolTable *st) { return st->lookup(newName); };
285 SymbolTable::renameToUnique(Operation *op, ArrayRef<SymbolTable *> others) {
292 StringAttr SymbolTable::getSymbolName(Operation *symbol) {
299 void SymbolTable::setSymbolName(Operation *symbol, StringAttr name) {
304 SymbolTable::Visibility SymbolTable::getSymbolVisibility(Operation *symbol) {
317 void SymbolTable::setSymbolVisibility(Operation *symbol, Visibility vis) {
337 Operation *SymbolTable::getNearestSymbolTable(Operation *from) {
342 while (!from->hasTrait<OpTrait::SymbolTable>()) {
357 void SymbolTable::walkSymbolTables(
360 bool isSymbolTable = op->hasTrait<OpTrait::SymbolTable>();
383 /// with the 'OpTrait::SymbolTable' trait. Returns nullptr if no valid symbol
385 Operation *SymbolTable::lookupSymbolIn(Operation *symbolTableOp,
387 assert(symbolTableOp->hasTrait<OpTrait::SymbolTable>());
394 SymbolTable::getSymbolAttrName());
400 Operation *SymbolTable::lookupSymbolIn(Operation *symbolTableOp,
414 assert(symbolTableOp->hasTrait<OpTrait::SymbolTable>());
428 if (!symbolTableOp->hasTrait<OpTrait::SymbolTable>())
435 if (!symbolTableOp || !symbolTableOp->hasTrait<OpTrait::SymbolTable>())
444 SymbolTable::lookupSymbolIn(Operation *symbolTableOp, SymbolRefAttr symbol,
453 /// closes parent operation with the 'OpTrait::SymbolTable' trait. Returns
455 Operation *SymbolTable::lookupNearestSymbolFrom(Operation *from,
460 Operation *SymbolTable::lookupNearestSymbolFrom(Operation *from,
467 SymbolTable::Visibility visibility) {
469 case SymbolTable::Visibility::Public:
471 case SymbolTable::Visibility::Private:
473 case SymbolTable::Visibility::Nested:
480 // SymbolTable Trait Types
486 << "Operations with a 'SymbolTable' must have exactly one region";
489 << "Operations with a 'SymbolTable' must have exactly one block";
497 op.getAttrOfType<StringAttr>(mlir::SymbolTable::getSymbolAttrName());
512 SymbolTableCollection symbolTable;
515 return WalkResult(user.verifySymbolUses(symbolTable));
526 if (!op->getAttrOfType<StringAttr>(mlir::SymbolTable::getSymbolAttrName()))
528 << mlir::SymbolTable::getSymbolAttrName() << "'";
531 if (Attribute vis = op->getAttr(mlir::SymbolTable::getVisibilityAttrName())) {
535 << mlir::SymbolTable::getVisibilityAttrName()
557 function_ref<WalkResult(SymbolTable::SymbolUse)> callback) {
573 function_ref<WalkResult(SymbolTable::SymbolUse)> callback) {
589 function_ref<WalkResult(SymbolTable::SymbolUse)> callback) {
604 if (!from->hasTrait<OpTrait::SymbolTable>())
629 /// void(SymbolTable::SymbolUse use)
635 return walk([=](SymbolTable::SymbolUse use) {
660 StringAttr symName = SymbolTable::getSymbolName(symbol);
661 assert(!symbol->hasTrait<OpTrait::SymbolTable>() || symbol != limit);
673 if (SymbolTable::getNearestSymbolTable(limit->getParentOp()) ==
705 assert(limitIt->hasTrait<OpTrait::SymbolTable>());
761 // SymbolTable::getSymbolUses
763 /// The implementation of SymbolTable::getSymbolUses below.
765 static std::optional<SymbolTable::UseRange> getSymbolUsesImpl(FromT from) {
766 std::vector<SymbolTable::SymbolUse> uses;
767 auto walkFn = [&](SymbolTable::SymbolUse symbolUse) {
772 return result ? std::optional<SymbolTable::UseRange>(std::move(uses))
783 auto SymbolTable::getSymbolUses(Operation *from) -> std::optional<UseRange> {
786 auto SymbolTable::getSymbolUses(Region *from) -> std::optional<UseRange> {
791 // SymbolTable::getSymbolUses
793 /// The implementation of SymbolTable::getSymbolUses below.
795 static std::optional<SymbolTable::UseRange> getSymbolUsesImpl(SymbolT symbol,
797 std::vector<SymbolTable::SymbolUse> uses;
799 if (!scope.walk([&](SymbolTable::SymbolUse symbolUse) {
805 return SymbolTable::UseRange(std::move(uses));
812 auto SymbolTable::getSymbolUses(StringAttr symbol, Operation *from)
816 auto SymbolTable::getSymbolUses(Operation *symbol, Operation *from)
820 auto SymbolTable::getSymbolUses(StringAttr symbol, Region *from)
824 auto SymbolTable::getSymbolUses(Operation *symbol, Region *from)
830 // SymbolTable::symbolKnownUseEmpty
832 /// The implementation of SymbolTable::symbolKnownUseEmpty below.
837 if (scope.walk([&](SymbolTable::SymbolUse symbolUse) {
851 bool SymbolTable::symbolKnownUseEmpty(StringAttr symbol, Operation *from) {
854 bool SymbolTable::symbolKnownUseEmpty(Operation *symbol, Operation *from) {
857 bool SymbolTable::symbolKnownUseEmpty(StringAttr symbol, Region *from) {
860 bool SymbolTable::symbolKnownUseEmpty(Operation *symbol, Region *from) {
865 // SymbolTable::replaceAllSymbolUses
877 /// The implementation of SymbolTable::replaceAllSymbolUses below.
924 LogicalResult SymbolTable::replaceAllSymbolUses(StringAttr oldSymbol,
929 LogicalResult SymbolTable::replaceAllSymbolUses(Operation *oldSymbol,
934 LogicalResult SymbolTable::replaceAllSymbolUses(StringAttr oldSymbol,
939 LogicalResult SymbolTable::replaceAllSymbolUses(Operation *oldSymbol,
975 /// 'OpTrait::SymbolTable' trait. Returns nullptr if no valid symbol was
979 Operation *symbolTableOp = SymbolTable::getNearestSymbolTable(from);
985 Operation *symbolTableOp = SymbolTable::getNearestSymbolTable(from);
990 SymbolTable &SymbolTableCollection::getSymbolTable(Operation *op) {
993 it.first->second = std::make_unique<SymbolTable>(op);
1029 SymbolTable &
1031 assert(symbolTableOp->hasTrait<OpTrait::SymbolTable>());
1041 auto symbolTable = std::make_unique<SymbolTable>(symbolTableOp);
1045 .insert({symbolTableOp, std::move(symbolTable)})
1053 SymbolUserMap::SymbolUserMap(SymbolTableCollection &symbolTable,
1055 : symbolTable(symbolTable) {
1060 auto symbolUses = SymbolTable::getSymbolUses(&nestedOp);
1063 for (const SymbolTable::SymbolUse &use : *symbolUses) {
1065 (void)symbolTable.lookupSymbolIn(symbolTableOp, use.getSymbolRef(),
1074 SymbolTable::walkSymbolTables(symbolTableOp, /*allSymUsesVisible=*/false,
1086 (void)SymbolTable::replaceAllSymbolUses(symbol, newSymbolName, user);
1091 symbolTable.lookupSymbolIn(symbol->getParentOp(), newSymbolName);
1118 SymbolTable::getVisibilityAttrName(), visibilityAttr));