[Flang] Fix symbol name clash when dummy procedure name is the same as common-block-name (#155508)

Dummy procedures in interface blocks are not external procedures that
need to be linked. Do not externalize those.

Fixes #122822
This commit is contained in:
Carlos Seo 2025-09-03 15:51:23 -03:00 committed by GitHub
parent 5777f71bce
commit a26cd2d504
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 0 deletions

View File

@ -76,12 +76,49 @@ void ExternalNameConversionPass::runOnOperation() {
auto *context = &getContext();
llvm::DenseMap<mlir::StringAttr, mlir::FlatSymbolRefAttr> remappings;
mlir::SymbolTable symbolTable(op);
auto processFctOrGlobal = [&](mlir::Operation &funcOrGlobal) {
auto symName = funcOrGlobal.getAttrOfType<mlir::StringAttr>(
mlir::SymbolTable::getSymbolAttrName());
auto deconstructedName = fir::NameUniquer::deconstruct(symName);
if (fir::NameUniquer::isExternalFacingUniquedName(deconstructedName)) {
// Check if this is a private function that would conflict with a common
// block and get its mangled name.
if (auto funcOp = llvm::dyn_cast<mlir::func::FuncOp>(funcOrGlobal)) {
if (funcOp.isPrivate()) {
std::string mangledName =
mangleExternalName(deconstructedName, appendUnderscoreOpt);
auto mod = funcOp->getParentOfType<mlir::ModuleOp>();
bool hasConflictingCommonBlock = false;
// Check if any existing global has the same mangled name.
if (symbolTable.lookup<fir::GlobalOp>(mangledName))
hasConflictingCommonBlock = true;
// Skip externalization if the function has a conflicting common block
// and is not directly called (i.e. procedure pointers or type
// specifications)
if (hasConflictingCommonBlock) {
bool isDirectlyCalled = false;
std::optional<SymbolTable::UseRange> uses =
funcOp.getSymbolUses(mod);
if (uses.has_value()) {
for (auto use : *uses) {
mlir::Operation *user = use.getUser();
if (mlir::isa<fir::CallOp>(user) ||
mlir::isa<mlir::func::CallOp>(user)) {
isDirectlyCalled = true;
break;
}
}
}
if (!isDirectlyCalled)
return;
}
}
}
auto newName = mangleExternalName(deconstructedName, appendUnderscoreOpt);
auto newAttr = mlir::StringAttr::get(context, newName);
mlir::SymbolTable::setSymbolName(&funcOrGlobal, newAttr);

View File

@ -0,0 +1,12 @@
! RUN: bbc -emit-fir %s -o - | FileCheck %s
subroutine ss5()
common /com_dummy1/ x
! CHECK: fir.global common @com_dummy1_
interface
subroutine com_dummy1()
end subroutine
end interface
! CHECK: func.func private @_QPcom_dummy1()
print *,fun_sub(com_dummy1)
end