diff --git a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp --- a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp +++ b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp @@ -45,27 +45,6 @@ namespace { -class MangleNameOnCallOp : public mlir::OpRewritePattern { -public: - using OpRewritePattern::OpRewritePattern; - - mlir::LogicalResult - matchAndRewrite(fir::CallOp op, - mlir::PatternRewriter &rewriter) const override { - rewriter.startRootUpdate(op); - auto callee = op.getCallee(); - if (callee) { - auto result = - fir::NameUniquer::deconstruct(callee->getRootReference().getValue()); - if (fir::NameUniquer::isExternalFacingUniquedName(result)) - op.setCalleeAttr( - SymbolRefAttr::get(op.getContext(), mangleExternalName(result))); - } - rewriter.finalizeRootUpdate(op); - return success(); - } -}; - struct MangleNameOnFuncOp : public mlir::OpRewritePattern { public: using OpRewritePattern::OpRewritePattern; @@ -73,12 +52,22 @@ mlir::LogicalResult matchAndRewrite(mlir::func::FuncOp op, mlir::PatternRewriter &rewriter) const override { + mlir::LogicalResult ret = success(); rewriter.startRootUpdate(op); auto result = fir::NameUniquer::deconstruct(op.getSymName()); - if (fir::NameUniquer::isExternalFacingUniquedName(result)) - op.setSymNameAttr(rewriter.getStringAttr(mangleExternalName(result))); + if (fir::NameUniquer::isExternalFacingUniquedName(result)) { + auto newSymbol = rewriter.getStringAttr(mangleExternalName(result)); + + // Try to update all SymbolRef's in the module that match the current op + if (mlir::ModuleOp mod = op->getParentOfType()) + ret = op.replaceAllSymbolUses(newSymbol, mod); + + op.setSymNameAttr(newSymbol); + mlir::SymbolTable::setSymbolName(op, newSymbol); + } + rewriter.finalizeRootUpdate(op); - return success(); + return ret; } }; @@ -134,20 +123,13 @@ auto *context = &getContext(); mlir::RewritePatternSet patterns(context); - patterns.insert(context); + patterns.insert(context); ConversionTarget target(*context); target.addLegalDialect(); - target.addDynamicallyLegalOp([](fir::CallOp op) { - if (op.getCallee()) - return !fir::NameUniquer::needExternalNameMangling( - op.getCallee()->getRootReference().getValue()); - return true; - }); - target.addDynamicallyLegalOp([](mlir::func::FuncOp op) { return !fir::NameUniquer::needExternalNameMangling(op.getSymName()); }); diff --git a/flang/test/Fir/external-mangling.fir b/flang/test/Fir/external-mangling.fir --- a/flang/test/Fir/external-mangling.fir +++ b/flang/test/Fir/external-mangling.fir @@ -39,3 +39,23 @@ // LLVMIR: llvm.mlir.global common @__BLNK__(dense<0> : vector<4xi8>) {{.*}} : !llvm.array<4 x i8> // LLVMIR: llvm.func @bar_(!llvm.ptr) attributes {sym_visibility = "private"} // LLVMIR: llvm.func @bar2_(!llvm.ptr) attributes {sym_visibility = "private"} + +// ----- + +func.func @_QPcallee() { + fir.call @_QPcallee() : () -> () + return +} + +func.func @_QPcaller() { + fir.call @_QPcallee() : () -> () + return +} + +// CHECK: func @callee_ +// CHECK: fir.call @callee_ +// CHECK: func @caller_ +// CHECK: fir.call @callee_ + +// LLVMIR: llvm.call @callee_() : () -> () +// LLVMIR: llvm.call @callee_() : () -> ()