Index: flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp =================================================================== --- flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp +++ flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp @@ -73,12 +73,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 (ModuleOp mod = op->getParentOfType<ModuleOp>()) + ret = op.replaceAllSymbolUses(newSymbol, mod); + + op.setSymNameAttr(newSymbol); + SymbolTable::setSymbolName(op, newSymbol); + } + rewriter.finalizeRootUpdate(op); - return success(); + return ret; } }; Index: flang/test/Fir/external-mangling.fir =================================================================== --- flang/test/Fir/external-mangling.fir +++ 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<i32>) attributes {sym_visibility = "private"} // LLVMIR: llvm.func @bar2_(!llvm.ptr<f32>) attributes {sym_visibility = "private"} + +// ----- + +func.func @_QPcallee() { + func.call @_QPcallee() : () -> () + return +} + +func.func @_QPcaller() { + func.call @_QPcallee() : () -> () + return +} + +// CHECK: func @callee_ +// CHECK: call @callee_ +// CHECK: func @caller_ +// CHECK: call @callee_ + +// LLVMIR: llvm.call @callee_() : () -> () +// LLVMIR: llvm.call @callee_() : () -> ()