summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/CFIInstrInserter.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2018-05-11 15:54:46 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2018-05-11 15:54:46 +0000
commit82105e2a7d6a06db3a73c53a76840df7cfe7c28b (patch)
tree5d699f082d6d43cc395bff1ec314196ff712a74b /llvm/lib/CodeGen/CFIInstrInserter.cpp
parent6e1f7bf316424f3b3af108db4911c09cb24c421c (diff)
downloadbcm5719-llvm-82105e2a7d6a06db3a73c53a76840df7cfe7c28b.tar.gz
bcm5719-llvm-82105e2a7d6a06db3a73c53a76840df7cfe7c28b.zip
Use iteration instead of recursion in CFIInserter
Summary: This recursive step can overflow the stack. Reviewers: djokov, petarj Subscribers: mcrosier, jlebar, bixia, llvm-commits Differential Revision: https://reviews.llvm.org/D46671 llvm-svn: 332101
Diffstat (limited to 'llvm/lib/CodeGen/CFIInstrInserter.cpp')
-rw-r--r--llvm/lib/CodeGen/CFIInstrInserter.cpp41
1 files changed, 26 insertions, 15 deletions
diff --git a/llvm/lib/CodeGen/CFIInstrInserter.cpp b/llvm/lib/CodeGen/CFIInstrInserter.cpp
index a7382692050..00ebf63fc17 100644
--- a/llvm/lib/CodeGen/CFIInstrInserter.cpp
+++ b/llvm/lib/CodeGen/CFIInstrInserter.cpp
@@ -151,7 +151,6 @@ void CFIInstrInserter::calculateCFAInfo(MachineFunction &MF) {
// information.
for (MachineBasicBlock &MBB : MF) {
if (MBBVector[MBB.getNumber()].Processed) continue;
- calculateOutgoingCFAInfo(MBBVector[MBB.getNumber()]);
updateSuccCFAInfo(MBBVector[MBB.getNumber()]);
}
}
@@ -222,14 +221,25 @@ void CFIInstrInserter::calculateOutgoingCFAInfo(MBBCFAInfo &MBBInfo) {
}
void CFIInstrInserter::updateSuccCFAInfo(MBBCFAInfo &MBBInfo) {
- for (MachineBasicBlock *Succ : MBBInfo.MBB->successors()) {
- MBBCFAInfo &SuccInfo = MBBVector[Succ->getNumber()];
- if (SuccInfo.Processed) continue;
- SuccInfo.IncomingCFAOffset = MBBInfo.OutgoingCFAOffset;
- SuccInfo.IncomingCFARegister = MBBInfo.OutgoingCFARegister;
- calculateOutgoingCFAInfo(SuccInfo);
- updateSuccCFAInfo(SuccInfo);
- }
+ SmallVector<MachineBasicBlock *, 4> Stack;
+ Stack.push_back(MBBInfo.MBB);
+
+ do {
+ MachineBasicBlock *Current = Stack.pop_back_val();
+ MBBCFAInfo &CurrentInfo = MBBVector[Current->getNumber()];
+ if (CurrentInfo.Processed)
+ continue;
+
+ calculateOutgoingCFAInfo(CurrentInfo);
+ for (auto *Succ : CurrentInfo.MBB->successors()) {
+ MBBCFAInfo &SuccInfo = MBBVector[Succ->getNumber()];
+ if (!SuccInfo.Processed) {
+ SuccInfo.IncomingCFAOffset = CurrentInfo.OutgoingCFAOffset;
+ SuccInfo.IncomingCFARegister = CurrentInfo.OutgoingCFARegister;
+ Stack.push_back(Succ);
+ }
+ }
+ } while (!Stack.empty());
}
bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) {
@@ -282,17 +292,18 @@ bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) {
return InsertedCFIInstr;
}
-void CFIInstrInserter::report(const MBBCFAInfo &Pred,
- const MBBCFAInfo &Succ) {
+void CFIInstrInserter::report(const MBBCFAInfo &Pred, const MBBCFAInfo &Succ) {
errs() << "*** Inconsistent CFA register and/or offset between pred and succ "
"***\n";
- errs() << "Pred: " << Pred.MBB->getName()
+ errs() << "Pred: " << Pred.MBB->getName() << " #" << Pred.MBB->getNumber()
+ << " in " << Pred.MBB->getParent()->getName()
<< " outgoing CFA Reg:" << Pred.OutgoingCFARegister << "\n";
- errs() << "Pred: " << Pred.MBB->getName()
+ errs() << "Pred: " << Pred.MBB->getName() << " #" << Pred.MBB->getNumber()
+ << " in " << Pred.MBB->getParent()->getName()
<< " outgoing CFA Offset:" << Pred.OutgoingCFAOffset << "\n";
- errs() << "Succ: " << Succ.MBB->getName()
+ errs() << "Succ: " << Succ.MBB->getName() << " #" << Succ.MBB->getNumber()
<< " incoming CFA Reg:" << Succ.IncomingCFARegister << "\n";
- errs() << "Succ: " << Succ.MBB->getName()
+ errs() << "Succ: " << Succ.MBB->getName() << " #" << Succ.MBB->getNumber()
<< " incoming CFA Offset:" << Succ.IncomingCFAOffset << "\n";
}
OpenPOWER on IntegriCloud