diff options
author | Peter Klausler <pklausler@nvidia.com> | 2025-03-10 13:20:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-10 13:20:52 -0700 |
commit | 8227f2a35aef0abebf0e2914795b668845a90169 (patch) | |
tree | 5e805b6f0923ed9eb78fe2ed4fcd037c173fc3ad /flang/lib/Semantics/mod-file.cpp | |
parent | 40d9096fda65dc94fc1b10c091802dcb8f3ab3a5 (diff) | |
download | llvm-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.cpp | 19 |
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) { |