StackProtector.cpp revision 8c65f6e71c1d46d823b9a884819992a9255edd54
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===-- StackProtector.cpp - Stack Protector Insertion --------------------===//
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//                     The LLVM Compiler Infrastructure
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This file is distributed under the University of Illinois Open Source
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// License. See LICENSE.TXT for details.
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===----------------------------------------------------------------------===//
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// This pass inserts stack protectors into functions which need them. A variable
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// with a random value in it is stored onto the stack before the local variables
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// are allocated. Upon exiting the block, the stored value is checked. If it's
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// changed, then there was some sort of violation and the program aborts.
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//===----------------------------------------------------------------------===//
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DEBUG_TYPE "stack-protector"
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/CodeGen/Passes.h"
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Attributes.h"
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Constants.h"
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/DerivedTypes.h"
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Function.h"
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Instructions.h"
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Intrinsics.h"
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Module.h"
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Pass.h"
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Support/CommandLine.h"
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Target/TargetData.h"
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "llvm/Target/TargetLowering.h"
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownusing namespace llvm;
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// SSPBufferSize - The lower bound for a buffer to be considered for stack
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// smashing protection.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic cl::opt<unsigned>
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownSSPBufferSize("stack-protector-buffer-size", cl::init(8),
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              cl::desc("Lower bound for a buffer to be considered for "
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       "stack protection"));
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengnamespace {
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  class StackProtector : public FunctionPass {
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// TLI - Keep a pointer of a TargetLowering to consult for determining
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// target type sizes.
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    const TargetLowering *TLI;
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Function *F;
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Module *M;
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// InsertStackProtectors - Insert code into the prologue and epilogue of
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// the function.
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ///
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ///  - The prologue code loads and stores the stack guard onto the stack.
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ///  - The epilogue checks the value stored in the prologue against the
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ///    original value. It calls __stack_chk_fail if they differ.
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    bool InsertStackProtectors();
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// CreateFailBB - Create a basic block to jump to when the stack protector
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// check fails.
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    BasicBlock *CreateFailBB();
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// RequiresStackProtector - Check whether or not this function needs a
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /// stack protector based upon the stack protector level.
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    bool RequiresStackProtector() const;
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  public:
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    static char ID;             // Pass identification, replacement for typeid.
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    StackProtector() : FunctionPass(&ID), TLI(0) {}
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    StackProtector(const TargetLowering *tli)
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      : FunctionPass(&ID), TLI(tli) {}
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    virtual bool runOnFunction(Function &Fn);
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  };
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} // end anonymous namespace
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovchar StackProtector::ID = 0;
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic RegisterPass<StackProtector>
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownX("stack-protector", "Insert stack protectors");
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownFunctionPass *llvm::createStackProtectorPass(const TargetLowering *tli) {
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return new StackProtector(tli);
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovbool StackProtector::runOnFunction(Function &Fn) {
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  F = &Fn;
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  M = F->getParent();
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  if (!RequiresStackProtector()) return false;
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  return InsertStackProtectors();
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/// RequiresStackProtector - Check whether or not this function needs a stack
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/// protector based upon the stack protector level. The heuristic we use is to
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/// add a guard variable to functions that call alloca, and functions with
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/// buffers larger than SSPBufferSize bytes.
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbool StackProtector::RequiresStackProtector() const {
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (F->hasFnAttr(Attribute::StackProtectReq))
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    return true;
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (!F->hasFnAttr(Attribute::StackProtect))
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    return false;
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  const TargetData *TD = TLI->getTargetData();
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    BasicBlock *BB = I;
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (BasicBlock::iterator
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           II = BB->begin(), IE = BB->end(); II != IE; ++II)
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (AllocaInst *AI = dyn_cast<AllocaInst>(II)) {
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        if (AI->isArrayAllocation())
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          // This is a call to alloca with a variable size. Emit stack
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          // protectors.
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          return true;
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        if (const ArrayType *AT = dyn_cast<ArrayType>(AI->getAllocatedType())) {
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          // We apparently only care about character arrays.
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          if (!AT->getElementType()->isInteger(8))
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            continue;
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          // If an array has more than SSPBufferSize bytes of allocated space,
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          // then we emit stack protectors.
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          if (SSPBufferSize <= TD->getTypeAllocSize(AT))
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            return true;
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        }
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return false;
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// InsertStackProtectors - Insert code into the prologue and epilogue of the
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/// function.
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown///
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown///  - The prologue code loads and stores the stack guard onto the stack.
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown///  - The epilogue checks the value stored in the prologue against the original
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown///    value. It calls __stack_chk_fail if they differ.
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbool StackProtector::InsertStackProtectors() {
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  BasicBlock *FailBB = 0;       // The basic block to jump to if check fails.
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  AllocaInst *AI = 0;           // Place on stack that stores the stack guard.
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Constant *StackGuardVar = 0;  // The stack guard variable.
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (Function::iterator I = F->begin(), E = F->end(); I != E; ) {
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    BasicBlock *BB = I++;
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator());
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    if (!RI) continue;
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    if (!FailBB) {
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Insert code into the entry block that stores the __stack_chk_guard
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // variable onto the stack:
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //   entry:
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //     StackGuardSlot = alloca i8*
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //     StackGuard = load __stack_chk_guard
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //     call void @llvm.stackprotect.create(StackGuard, StackGuardSlot)
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      PointerType *PtrTy = PointerType::getUnqual(
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          Type::getInt8Ty(RI->getContext()));
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      BasicBlock &Entry = F->getEntryBlock();
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Instruction *InsPt = &Entry.front();
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      AI = new AllocaInst(PtrTy, "StackGuardSlot", InsPt);
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false, InsPt);
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Value *Args[] = { LI, AI };
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      CallInst::
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               &Args[0], array_endof(Args), "", InsPt);
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      // Create the basic block to jump to when the guard check fails.
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      FailBB = CreateFailBB();
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // For each block with a return instruction, convert this:
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //   return:
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     ...
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     ret ...
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // into this:
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //   return:
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     ...
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     %1 = load __stack_chk_guard
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     %2 = load StackGuardSlot
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     %3 = cmp i1 %1, %2
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     br i1 %3, label %SP_return, label %CallStackCheckFailBlk
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //   SP_return:
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     ret ...
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //   CallStackCheckFailBlk:
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     call void @__stack_chk_fail()
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    //     unreachable
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // Split the basic block before the return instruction.
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    BasicBlock *NewBB = BB->splitBasicBlock(RI, "SP_return");
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // Remove default branch instruction to the new BB.
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    BB->getTerminator()->eraseFromParent();
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // Move the newly created basic block to the point right after the old basic
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // block so that it's in the "fall through" position.
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    NewBB->moveAfter(BB);
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    // Generate the stack protector instructions in the old basic block.
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    LoadInst *LI1 = new LoadInst(StackGuardVar, "", false, BB);
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    LoadInst *LI2 = new LoadInst(AI, "", true, BB);
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    ICmpInst *Cmp = new ICmpInst(*BB, CmpInst::ICMP_EQ, LI1, LI2, "");
211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    BranchInst::Create(NewBB, FailBB, Cmp, BB);
212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  }
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
214eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Return if we didn't modify any basic blocks. I.e., there are no return
215eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // statements in the function.
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (!FailBB) return false;
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return true;
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/// CreateFailBB - Create a basic block to jump to when the stack protector
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/// check fails.
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovBasicBlock *StackProtector::CreateFailBB() {
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  BasicBlock *FailBB = BasicBlock::Create(F->getContext(),
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                          "CallStackCheckFailBlk", F);
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  Constant *StackChkFail =
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    M->getOrInsertFunction("__stack_chk_fail",
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                           Type::getVoidTy(F->getContext()), NULL);
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  CallInst::Create(StackChkFail, "", FailBB);
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  new UnreachableInst(F->getContext(), FailBB);
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return FailBB;
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov