aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/StackProtector.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2008-11-04 22:51:24 +0000
committerBill Wendling <isanbard@gmail.com>2008-11-04 22:51:24 +0000
commitb7c2c1246f10972d5a8f55499226872608eb10f9 (patch)
tree49a98464696bc8346153399ac199678be10758fe /lib/CodeGen/StackProtector.cpp
parentf1f75b1bd12d6badad382f473929a4b744010e2f (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.cpp25
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);