@@ -53,7 +53,10 @@ LinkState LinkState::nest(ModuleOp submod) const {
5353 return LinkState (submod, mapping);
5454}
5555
56- IRMapping &LinkState::getMapping () { return *mapping.get (); }
56+ IRMapping &LinkState::getMapping () { return *mapping; }
57+ SymbolUserMap &LinkState::getSymbolUserMap (ModuleOp mod) {
58+ return moduleMaps.try_emplace (mod, symbolTableCollection, mod).first ->second ;
59+ }
5760
5861// ===----------------------------------------------------------------------===//
5962// SymbolAttrLinkerInterface
@@ -83,21 +86,17 @@ static void renameSymbolRefIn(Operation *op, StringAttr newName) {
8386static LogicalResult renameRemappedUsersOf (Operation *op, StringAttr newName,
8487 LinkState &state) {
8588 ModuleOp module = op->getParentOfType <ModuleOp>();
89+ SymbolUserMap &userMap = state.getSymbolUserMap (module );
8690 // TODO: use something like SymbolTableAnalysis
87- SymbolTable src (module );
88- if (auto uses = src.getSymbolUses (op, module )) {
89- for (SymbolTable::SymbolUse use : *uses) {
90- // TODO: add test where user is not remapped
91- Operation *dstUser = state.remapped (use.getUser ());
92- if (!dstUser)
93- continue ;
94- renameSymbolRefIn (dstUser, newName);
95- }
96-
97- return success ();
91+ auto users = userMap.getUsers (op);
92+ for (Operation *user : users) {
93+ // TODO: add test where user is not remapped
94+ Operation *dstUser = state.remapped (user);
95+ if (!dstUser)
96+ continue ;
97+ renameSymbolRefIn (dstUser, newName);
9898 }
99-
100- return op->emitError (" failed to rename symbol to a unique name" );
99+ return success ();
101100}
102101
103102StringRef SymbolAttrLinkerInterface::getSymbol (Operation *op) const {
@@ -119,7 +118,8 @@ void SymbolAttrLinkerInterface::registerForLink(Operation *op) {
119118}
120119
121120LogicalResult SymbolAttrLinkerInterface::link (LinkState &state) const {
122- SymbolTable st (state.getDestinationOp ());
121+ SymbolTable &st =
122+ state.getSymbolTableCollection ().getSymbolTable (state.getDestinationOp ());
123123
124124 auto materializeError = [&](Operation *op) {
125125 return op->emitError (" failed to materialize symbol for linking" );
@@ -145,7 +145,7 @@ LogicalResult SymbolAttrLinkerInterface::link(LinkState &state) const {
145145 if (st.lookup (name)) {
146146 StringAttr newName = getUniqueNameIn (st, name);
147147 st.setSymbolName (materialized, newName);
148- toRenameUsers.push_back ({ op, newName} );
148+ toRenameUsers.emplace_back ( op, newName);
149149 }
150150
151151 st.insert (materialized);
0 commit comments