diff options
author | Bill Wendling <isanbard@gmail.com> | 2008-11-04 22:51:24 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2008-11-04 22:51:24 +0000 |
commit | b7c2c1246f10972d5a8f55499226872608eb10f9 (patch) | |
tree | 49a98464696bc8346153399ac199678be10758fe /lib/CodeGen/StackProtector.cpp | |
parent | f1f75b1bd12d6badad382f473929a4b744010e2f (diff) |
- Add a "getOrInsertGlobal" method to the Module class. This acts similarly to
"getOrInsertFunction" in that it either adds a new declaration of the global
and returns it, or returns the current one -- optionally casting it to the
correct type.
- Use the new getOrInsertGlobal in the stack protector code.
- Use "splitBasicBlock" in the stack protector code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58727 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/StackProtector.cpp')
-rw-r--r-- | lib/CodeGen/StackProtector.cpp | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/lib/CodeGen/StackProtector.cpp b/lib/CodeGen/StackProtector.cpp index 4bbb357bc5..30c3db5b52 100644 --- a/lib/CodeGen/StackProtector.cpp +++ b/lib/CodeGen/StackProtector.cpp @@ -52,7 +52,7 @@ namespace { AllocaInst *StackProtFrameSlot; /// StackGuardVar - The global variable for the stack guard. - GlobalVariable *StackGuardVar; + Constant *StackGuardVar; Function *F; Module *M; @@ -115,14 +115,8 @@ void StackProtector::InsertStackProtectorPrologue() { BasicBlock &Entry = F->getEntryBlock(); Instruction &InsertPt = Entry.front(); - const char *StackGuardStr = "__stack_chk_guard"; - StackGuardVar = M->getNamedGlobal(StackGuardStr); - - if (!StackGuardVar) - StackGuardVar = new GlobalVariable(PointerType::getUnqual(Type::Int8Ty), - false, GlobalValue::ExternalLinkage, - 0, StackGuardStr, M); - + StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", + PointerType::getUnqual(Type::Int8Ty)); StackProtFrameSlot = new AllocaInst(PointerType::getUnqual(Type::Int8Ty), "StackProt_Frame", &InsertPt); LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false, &InsertPt); @@ -161,7 +155,7 @@ void StackProtector::InsertStackProtectorEpilogue() { // %3 = cmp i1 %1, %2 // br i1 %3, label %SPRet, label %CallStackCheckFailBlk // - // SPRet: + // SP_return: // ret ... // // CallStackCheckFailBlk: @@ -174,12 +168,15 @@ void StackProtector::InsertStackProtectorEpilogue() { ReturnInst *RI = cast<ReturnInst>(BB->getTerminator()); Function::iterator InsPt = BB; ++InsPt; // Insertion point for new BB. - BasicBlock *NewBB = BasicBlock::Create("SPRet", F, InsPt); + // Split the basic block before the return instruction. + BasicBlock *NewBB = BB->splitBasicBlock(RI, "SP_return"); - // Move the return instruction into the new basic block. - RI->removeFromParent(); - NewBB->getInstList().insert(NewBB->begin(), RI); + // Move the newly created basic block to the point right after the old basic + // block. + NewBB->removeFromParent(); + F->getBasicBlockList().insert(InsPt, NewBB); + // Generate the stack protector instructions in the old basic block. LoadInst *LI2 = new LoadInst(StackGuardVar, "", false, BB); LoadInst *LI1 = new LoadInst(StackProtFrameSlot, "", true, BB); ICmpInst *Cmp = new ICmpInst(CmpInst::ICMP_EQ, LI1, LI2, "", BB); |