[llvm] 45f3472 - [dsymutil] Avoid invalid keep chains due to pruning
Jonas Devlieghere via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 4 15:06:14 PST 2023
Author: Jonas Devlieghere
Date: 2023-01-04T15:01:58-08:00
New Revision: 45f347270caffafe48146c6c7ed8301d91e492ad
URL: https://github.com/llvm/llvm-project/commit/45f347270caffafe48146c6c7ed8301d91e492ad
DIFF: https://github.com/llvm/llvm-project/commit/45f347270caffafe48146c6c7ed8301d91e492ad.diff
LOG: [dsymutil] Avoid invalid keep chains due to pruning
The pruning property that's part of the DIE info is fully computing
during the analyzeContextInfo phase, but can be updated during the
lookForDIEsToKeep phase.
// Keep a module forward declaration if there is no definition.
if (!(isODRAttribute(AttrSpec.Attr) && Info.Ctxt &&
Info.Ctxt->hasCanonicalDIE()))
Info.Prune = false;
When the pruning property is updated during the lookForDIEsToKeep phase,
it's not propagated to the parent, unlike during the analyzeContextInfo
phase. This can result in an invalid keep chain with the child DIE being
marked as kept while its parent is still marked as pruned and therefore
never kept, a situation that's now caught by 1b79bed8f532.
This patch fixes this issue by updating the pruning properties of the
parent DIE during the parent walk.
Differential revision: https://reviews.llvm.org/D140930
Added:
Modified:
llvm/lib/DWARFLinker/DWARFLinker.cpp
Removed:
################################################################################
diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp
index 4a8c2c26f536..d496245434ff 100644
--- a/llvm/lib/DWARFLinker/DWARFLinker.cpp
+++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp
@@ -788,8 +788,14 @@ void DWARFLinker::lookForDIEsToKeep(AddressesMap &AddressesMap,
unsigned Idx = Current.CU.getOrigUnit().getDIEIndex(Current.Die);
CompileUnit::DIEInfo &MyInfo = Current.CU.getInfo(Idx);
- if (MyInfo.Prune)
- continue;
+ if (MyInfo.Prune) {
+ // We're walking the dependencies of a module forward declaration that was
+ // kept because there is no definition.
+ if (Current.Flags & TF_DependencyWalk)
+ MyInfo.Prune = false;
+ else
+ continue;
+ }
// If the Keep flag is set, we are marking a required DIE's dependencies.
// If our target is already marked as kept, we're all set.
More information about the llvm-commits
mailing list