summaryrefslogtreecommitdiff
path: root/lib/CodeGen/StackProtector.cpp
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-07-22 20:44:11 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-07-22 20:44:11 +0000
commitc03d5ec32041892734324f4dc635e7644aebd672 (patch)
tree6737b86c017e5a55ce5b95cab6f9e2c0210bb308 /lib/CodeGen/StackProtector.cpp
parentfdd16bb91842b9cd8525d0a9202eb001233afcb5 (diff)
downloadllvm-c03d5ec32041892734324f4dc635e7644aebd672.tar.gz
llvm-c03d5ec32041892734324f4dc635e7644aebd672.tar.bz2
llvm-c03d5ec32041892734324f4dc635e7644aebd672.tar.xz
[stackprotector] Refactored ssp prologue creation code into its own helper function.
No functionality change. rdar://13935163 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186868 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/StackProtector.cpp')
-rw-r--r--lib/CodeGen/StackProtector.cpp76
1 files changed, 41 insertions, 35 deletions
diff --git a/lib/CodeGen/StackProtector.cpp b/lib/CodeGen/StackProtector.cpp
index 9ec7daca96..4c5638092e 100644
--- a/lib/CodeGen/StackProtector.cpp
+++ b/lib/CodeGen/StackProtector.cpp
@@ -265,6 +265,46 @@ bool StackProtector::RequiresStackProtector() {
return false;
}
+/// Insert code into the entry block that stores the __stack_chk_guard
+/// variable onto the stack:
+///
+/// entry:
+/// StackGuardSlot = alloca i8*
+/// StackGuard = load __stack_chk_guard
+/// call void @llvm.stackprotect.create(StackGuard, StackGuardSlot)
+///
+static void CreatePrologue(Function *F, Module *M, ReturnInst *RI,
+ const TargetLoweringBase *TLI, const Triple &Trip,
+ AllocaInst *&AI, Value *&StackGuardVar) {
+ PointerType *PtrTy = Type::getInt8PtrTy(RI->getContext());
+ unsigned AddressSpace, Offset;
+ if (TLI->getStackCookieLocation(AddressSpace, Offset)) {
+ Constant *OffsetVal =
+ ConstantInt::get(Type::getInt32Ty(RI->getContext()), Offset);
+
+ StackGuardVar = ConstantExpr::getIntToPtr(OffsetVal,
+ PointerType::get(PtrTy,
+ AddressSpace));
+ } else if (Trip.getOS() == llvm::Triple::OpenBSD) {
+ StackGuardVar = M->getOrInsertGlobal("__guard_local", PtrTy);
+ cast<GlobalValue>(StackGuardVar)
+ ->setVisibility(GlobalValue::HiddenVisibility);
+ } else {
+ StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);
+ }
+
+ BasicBlock &Entry = F->getEntryBlock();
+ Instruction *InsPt = &Entry.front();
+
+ AI = new AllocaInst(PtrTy, "StackGuardSlot", InsPt);
+ LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false, InsPt);
+
+ Value *Args[] = { LI, AI };
+ CallInst::
+ Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
+ Args, "", InsPt);
+}
+
/// InsertStackProtectors - Insert code into the prologue and epilogue of the
/// function.
///
@@ -283,41 +323,7 @@ bool StackProtector::InsertStackProtectors() {
if (!RI) continue;
if (!FailBB) {
- // Insert code into the entry block that stores the __stack_chk_guard
- // variable onto the stack:
- //
- // entry:
- // StackGuardSlot = alloca i8*
- // StackGuard = load __stack_chk_guard
- // call void @llvm.stackprotect.create(StackGuard, StackGuardSlot)
- //
- PointerType *PtrTy = Type::getInt8PtrTy(RI->getContext());
- unsigned AddressSpace, Offset;
- if (TLI->getStackCookieLocation(AddressSpace, Offset)) {
- Constant *OffsetVal =
- ConstantInt::get(Type::getInt32Ty(RI->getContext()), Offset);
-
- StackGuardVar = ConstantExpr::getIntToPtr(OffsetVal,
- PointerType::get(PtrTy, AddressSpace));
- } else if (Trip.getOS() == llvm::Triple::OpenBSD) {
- StackGuardVar = M->getOrInsertGlobal("__guard_local", PtrTy);
- cast<GlobalValue>(StackGuardVar)
- ->setVisibility(GlobalValue::HiddenVisibility);
- } else {
- StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);
- }
-
- BasicBlock &Entry = F->getEntryBlock();
- Instruction *InsPt = &Entry.front();
-
- AI = new AllocaInst(PtrTy, "StackGuardSlot", InsPt);
- LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false, InsPt);
-
- Value *Args[] = { LI, AI };
- CallInst::
- Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
- Args, "", InsPt);
-
+ CreatePrologue(F, M, RI, TLI, Trip, AI, StackGuardVar);
// Create the basic block to jump to when the guard check fails.
FailBB = CreateFailBB();
}