[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:
parent
5777f71bce
commit
a26cd2d504
@ -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);
|
||||
|
||||
12
flang/test/Transforms/dummy-procedure-common-block-name.f
Normal file
12
flang/test/Transforms/dummy-procedure-common-block-name.f
Normal 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
|
||||
Loading…
x
Reference in New Issue
Block a user