diff options
author | Bill Wendling <isanbard@gmail.com> | 2008-11-10 21:13:10 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2008-11-10 21:13:10 +0000 |
commit | 7205677a46d02867004826218942dab3b466c926 (patch) | |
tree | 048aebdf47fbd9bb6d0620e48be6a3ffe523bd2e /lib/CodeGen/StackProtector.cpp | |
parent | 77cdf30742284a173fe818417eb482224cdee8d4 (diff) | |
download | external_llvm-7205677a46d02867004826218942dab3b466c926.zip external_llvm-7205677a46d02867004826218942dab3b466c926.tar.gz external_llvm-7205677a46d02867004826218942dab3b466c926.tar.bz2 |
- Make sure that we don't over-increment the iterator when going through the
basic blocks.
- Minor code clean-up.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59002 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/StackProtector.cpp')
-rw-r--r-- | lib/CodeGen/StackProtector.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/CodeGen/StackProtector.cpp b/lib/CodeGen/StackProtector.cpp index 19fd45c..386c7cd 100644 --- a/lib/CodeGen/StackProtector.cpp +++ b/lib/CodeGen/StackProtector.cpp @@ -123,14 +123,11 @@ bool StackProtector::InsertStackProtectors() { AllocaInst *AI = 0; // Place on stack that stores the stack guard. Constant *StackGuardVar = 0; // The stack guard variable. - for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) { + for (Function::iterator I = F->begin(), E = F->end(); I != E; ) { BasicBlock *BB = I; - if (isa<ReturnInst>(BB->getTerminator())) { + if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) { if (!FailBB) { - // Create the basic block to jump to when the guard check fails. - FailBB = CreateFailBB(); - // Insert code into the entry block that stores the __stack_chk_guard // variable onto the stack. PointerType *PtrTy = PointerType::getUnqual(Type::Int8Ty); @@ -146,11 +143,13 @@ bool StackProtector::InsertStackProtectors() { CallInst:: Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector_create), &Args[0], array_endof(Args), "", InsPt); + + // Create the basic block to jump to when the guard check fails. + FailBB = CreateFailBB(); } - ReturnInst *RI = cast<ReturnInst>(BB->getTerminator()); Function::iterator InsPt = BB; ++InsPt; // Insertion point for new BB. - ++I; + ++I; // Skip to the next block so that we don't resplit the return block. // Split the basic block before the return instruction. BasicBlock *NewBB = BB->splitBasicBlock(RI, "SP_return"); @@ -167,6 +166,8 @@ bool StackProtector::InsertStackProtectors() { AI, "", BB); ICmpInst *Cmp = new ICmpInst(CmpInst::ICMP_EQ, CI, LI1, "", BB); BranchInst::Create(NewBB, FailBB, Cmp, BB); + } else { + ++I; } } |