mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-06 13:09:50 +00:00
The fix imported into llvm in r274442 contains some C++11 constructs,
which gcc in base cannot handle. Replace these with C++98 equivalents. While here, add the patch for the adapted fix. Reported by: bz, kib Pointy hat to: dim MFC after: 1 week X-MFC-With: r274442
This commit is contained in:
parent
eb48fbd963
commit
daf03b8dad
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=274483
@ -629,8 +629,8 @@ void SDDbgInfo::erase(const SDNode *Node) {
|
|||||||
DbgValMapType::iterator I = DbgValMap.find(Node);
|
DbgValMapType::iterator I = DbgValMap.find(Node);
|
||||||
if (I == DbgValMap.end())
|
if (I == DbgValMap.end())
|
||||||
return;
|
return;
|
||||||
for (auto &Val: I->second)
|
for (unsigned J = 0, N = I->second.size(); J != N; ++J)
|
||||||
Val->setIsInvalidated();
|
I->second[J]->setIsInvalidated();
|
||||||
DbgValMap.erase(I);
|
DbgValMap.erase(I);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
Pull in r221709 from upstream llvm trunk (by Frédéric Riss):
|
||||||
|
|
||||||
|
Totally forget deallocated SDNodes in SDDbgInfo.
|
||||||
|
|
||||||
|
What would happen before that commit is that the SDDbgValues associated with
|
||||||
|
a deallocated SDNode would be marked Invalidated, but SDDbgInfo would keep
|
||||||
|
a map entry keyed by the SDNode pointer pointing to this list of invalidated
|
||||||
|
SDDbgNodes. As the memory gets reused, the list might get wrongly associated
|
||||||
|
with another new SDNode. As the SDDbgValues are cloned when they are transfered,
|
||||||
|
this can lead to an exponential number of SDDbgValues being produced during
|
||||||
|
DAGCombine like in http://llvm.org/bugs/show_bug.cgi?id=20893
|
||||||
|
|
||||||
|
Note that the previous behavior wasn't really buggy as the invalidation made
|
||||||
|
sure that the SDDbgValues won't be used. This commit can be considered a
|
||||||
|
memory optimization and as such is really hard to validate in a unit-test.
|
||||||
|
|
||||||
|
This should fix abnormally large memory usage and resulting OOM crashes
|
||||||
|
when compiling certain ports with debug information.
|
||||||
|
|
||||||
|
Reported by: Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
Upstream PRs: http://llvm.org/PR19031 http://llvm.org/PR20893
|
||||||
|
|
||||||
|
Introduced here: http://svnweb.freebsd.org/changeset/base/274442
|
||||||
|
|
||||||
|
Index: include/llvm/CodeGen/SelectionDAG.h
|
||||||
|
===================================================================
|
||||||
|
--- include/llvm/CodeGen/SelectionDAG.h
|
||||||
|
+++ include/llvm/CodeGen/SelectionDAG.h
|
||||||
|
@@ -127,6 +127,10 @@ class SDDbgInfo {
|
||||||
|
DbgValMap[Node].push_back(V);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /// \brief Invalidate all DbgValues attached to the node and remove
|
||||||
|
+ /// it from the Node-to-DbgValues map.
|
||||||
|
+ void erase(const SDNode *Node);
|
||||||
|
+
|
||||||
|
void clear() {
|
||||||
|
DbgValMap.clear();
|
||||||
|
DbgValues.clear();
|
||||||
|
Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
|
||||||
|
===================================================================
|
||||||
|
--- lib/CodeGen/SelectionDAG/SelectionDAG.cpp
|
||||||
|
+++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp
|
||||||
|
@@ -625,6 +625,15 @@ void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *
|
||||||
|
DeallocateNode(N);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void SDDbgInfo::erase(const SDNode *Node) {
|
||||||
|
+ DbgValMapType::iterator I = DbgValMap.find(Node);
|
||||||
|
+ if (I == DbgValMap.end())
|
||||||
|
+ return;
|
||||||
|
+ for (unsigned J = 0, N = I->second.size(); J != N; ++J)
|
||||||
|
+ I->second[J]->setIsInvalidated();
|
||||||
|
+ DbgValMap.erase(I);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void SelectionDAG::DeallocateNode(SDNode *N) {
|
||||||
|
if (N->OperandsNeedDelete)
|
||||||
|
delete[] N->OperandList;
|
||||||
|
@@ -635,10 +644,9 @@ void SelectionDAG::DeallocateNode(SDNode *N) {
|
||||||
|
|
||||||
|
NodeAllocator.Deallocate(AllNodes.remove(N));
|
||||||
|
|
||||||
|
- // If any of the SDDbgValue nodes refer to this SDNode, invalidate them.
|
||||||
|
- ArrayRef<SDDbgValue*> DbgVals = DbgInfo->getSDDbgValues(N);
|
||||||
|
- for (unsigned i = 0, e = DbgVals.size(); i != e; ++i)
|
||||||
|
- DbgVals[i]->setIsInvalidated();
|
||||||
|
+ // If any of the SDDbgValue nodes refer to this SDNode, invalidate
|
||||||
|
+ // them and forget about that node.
|
||||||
|
+ DbgInfo->erase(N);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
|
Loading…
Reference in New Issue
Block a user