aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/mod-file.cpp
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2025-03-10 13:20:52 -0700
committerGitHub <noreply@github.com>2025-03-10 13:20:52 -0700
commit8227f2a35aef0abebf0e2914795b668845a90169 (patch)
tree5e805b6f0923ed9eb78fe2ed4fcd037c173fc3ad /flang/lib/Semantics/mod-file.cpp
parent40d9096fda65dc94fc1b10c091802dcb8f3ab3a5 (diff)
downloadllvm-8227f2a35aef0abebf0e2914795b668845a90169.zip
llvm-8227f2a35aef0abebf0e2914795b668845a90169.tar.gz
llvm-8227f2a35aef0abebf0e2914795b668845a90169.tar.bz2
[flang] Fix Cray pointers in module file output (#130315)
The relationship between a Cray pointee and its pointer is not in the symbol table entry, but instead in a per-scope map. Use this information to ensure that if a pointee/pointer is needed in the module file, so is its pointer/pointee. Fixes https://github.com/llvm/llvm-project/issues/130270.
Diffstat (limited to 'flang/lib/Semantics/mod-file.cpp')
-rw-r--r--flang/lib/Semantics/mod-file.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp
index ac17697..c3b4626 100644
--- a/flang/lib/Semantics/mod-file.cpp
+++ b/flang/lib/Semantics/mod-file.cpp
@@ -978,11 +978,9 @@ void ModFileWriter::PutObjectEntity(
<< ") " << symbol.name() << '\n';
}
if (symbol.test(Fortran::semantics::Symbol::Flag::CrayPointer)) {
- if (!symbol.owner().crayPointers().empty()) {
- for (const auto &[pointee, pointer] : symbol.owner().crayPointers()) {
- if (pointer == symbol) {
- os << "pointer(" << symbol.name() << "," << pointee << ")\n";
- }
+ for (const auto &[pointee, pointer] : symbol.owner().crayPointers()) {
+ if (pointer == symbol) {
+ os << "pointer(" << symbol.name() << "," << pointee << ")\n";
}
}
}
@@ -1725,6 +1723,17 @@ void SubprogramSymbolCollector::DoSymbol(
if (!scope.IsDerivedType()) {
need_.push_back(symbol);
}
+ if (symbol.test(Fortran::semantics::Symbol::Flag::CrayPointer)) {
+ for (const auto &[pointee, pointer] : symbol.owner().crayPointers()) {
+ if (&*pointer == &symbol) {
+ auto iter{symbol.owner().find(pointee)};
+ CHECK(iter != symbol.owner().end());
+ DoSymbol(*iter->second);
+ }
+ }
+ } else if (symbol.test(Fortran::semantics::Symbol::Flag::CrayPointee)) {
+ DoSymbol(GetCrayPointer(symbol));
+ }
}
void SubprogramSymbolCollector::DoType(const DeclTypeSpec *type) {