StackProtector.cpp revision 733bbc5320ac9d729caa8c0fe741dd516e7eda0b
1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//===-- StackProtector.cpp - Stack Protector Insertion --------------------===//
2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//
3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//                     The LLVM Compiler Infrastructure
4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//
5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// This file is distributed under the University of Illinois Open Source
6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// License. See LICENSE.TXT for details.
7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//
8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//===----------------------------------------------------------------------===//
9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//
10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// This pass inserts stack protectors into functions which need them. A variable
11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// with a random value in it is stored onto the stack before the local variables
12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// are allocated. Upon exiting the block, the stored value is checked. If it's
13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// changed, then there was some sort of violation and the program aborts.
14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//
15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen//===----------------------------------------------------------------------===//
16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#define DEBUG_TYPE "stack-protector"
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/CodeGen/Passes.h"
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Attributes.h"
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Constants.h"
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/DerivedTypes.h"
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Function.h"
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Instructions.h"
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Intrinsics.h"
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Module.h"
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Pass.h"
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Support/CommandLine.h"
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Target/TargetData.h"
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen#include "llvm/Target/TargetLowering.h"
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenusing namespace llvm;
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// SSPBufferSize - The lower bound for a buffer to be considered for stack
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen// smashing protection.
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenstatic cl::opt<unsigned>
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon BoekenoogenSSPBufferSize("stack-protector-buffer-size", cl::init(8),
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen              cl::desc("Lower bound for a buffer to be considered for "
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                       "stack protection"));
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogennamespace {
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  class VISIBILITY_HIDDEN StackProtector : public FunctionPass {
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// TLI - Keep a pointer of a TargetLowering to consult for determining
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// target type sizes.
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    const TargetLowering *TLI;
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    Function *F;
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    Module *M;
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// InsertStackProtectors - Insert code into the prologue and epilogue of
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// the function.
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    ///
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    ///  - The prologue code loads and stores the stack guard onto the stack.
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    ///  - The epilogue checks the value stored in the prologue against the
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    ///    original value. It calls __stack_chk_fail if they differ.
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    bool InsertStackProtectors();
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// CreateFailBB - Create a basic block to jump to when the stack protector
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// check fails.
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    BasicBlock *CreateFailBB();
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// RequiresStackProtector - Check whether or not this function needs a
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /// stack protector based upon the stack protector level.
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    bool RequiresStackProtector() const;
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  public:
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static char ID;             // Pass identification, replacement for typeid.
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    StackProtector() : FunctionPass(&ID), TLI(0) {}
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    StackProtector(const TargetLowering *tli)
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      : FunctionPass(&ID), TLI(tli) {}
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    virtual bool runOnFunction(Function &Fn);
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  };
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen} // end anonymous namespace
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenchar StackProtector::ID = 0;
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenstatic RegisterPass<StackProtector>
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon BoekenoogenX("stack-protector", "Insert stack protectors");
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon BoekenoogenFunctionPass *llvm::createStackProtectorPass(const TargetLowering *tli) {
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  return new StackProtector(tli);
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenbool StackProtector::runOnFunction(Function &Fn) {
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  F = &Fn;
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  M = F->getParent();
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  if (!RequiresStackProtector()) return false;
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  return InsertStackProtectors();
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// RequiresStackProtector - Check whether or not this function needs a stack
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// protector based upon the stack protector level. The heuristic we use is to
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// add a guard variable to functions that call alloca, and functions with
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// buffers larger than SSPBufferSize bytes.
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenbool StackProtector::RequiresStackProtector() const {
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  if (F->hasFnAttr(Attribute::StackProtectReq))
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    return true;
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  if (!F->hasFnAttr(Attribute::StackProtect))
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    return false;
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  const TargetData *TD = TLI->getTargetData();
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    BasicBlock *BB = I;
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    for (BasicBlock::iterator
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen           II = BB->begin(), IE = BB->end(); II != IE; ++II)
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      if (AllocaInst *AI = dyn_cast<AllocaInst>(II)) {
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (AI->isArrayAllocation())
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen          // This is a call to alloca with a variable size. Emit stack
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen          // protectors.
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen          return true;
113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (const ArrayType *AT = dyn_cast<ArrayType>(AI->getAllocatedType()))
115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen          // If an array has more than SSPBufferSize bytes of allocated space,
116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen          // then we emit stack protectors.
117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen          if (SSPBufferSize <= TD->getABITypeSize(AT))
118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return true;
119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      }
120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  }
121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  return false;
123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// InsertStackProtectors - Insert code into the prologue and epilogue of the
126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// function.
127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen///
128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen///  - The prologue code loads and stores the stack guard onto the stack.
129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen///  - The epilogue checks the value stored in the prologue against the original
130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen///    value. It calls __stack_chk_fail if they differ.
131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenbool StackProtector::InsertStackProtectors() {
132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  BasicBlock *FailBB = 0;       // The basic block to jump to if check fails.
133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  AllocaInst *AI = 0;           // Place on stack that stores the stack guard.
134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  Constant *StackGuardVar = 0;  // The stack guard variable.
135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  for (Function::iterator I = F->begin(), E = F->end(); I != E; ) {
137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    BasicBlock *BB = I++;
138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator());
140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    if (!RI) continue;
141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    if (!FailBB) {
143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      // Insert code into the entry block that stores the __stack_chk_guard
144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      // variable onto the stack:
145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      //
146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      //   entry:
147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      //     StackGuardSlot = alloca i8*
148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      //     StackGuard = load __stack_chk_guard
149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      //     call void @llvm.stackprotect.create(StackGuard, StackGuardSlot)
150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      //
151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      PointerType *PtrTy = PointerType::getUnqual(Type::Int8Ty);
152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);
153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      BasicBlock &Entry = F->getEntryBlock();
155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      Instruction *InsPt = &Entry.front();
156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      AI = new AllocaInst(PtrTy, "StackGuardSlot", InsPt);
158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false, InsPt);
159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      Value *Args[] = { LI, AI };
161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      CallInst::
162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector_create),
163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen               &Args[0], array_endof(Args), "", InsPt);
164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      // Create the basic block to jump to when the guard check fails.
166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      FailBB = CreateFailBB();
167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // For each block with a return instruction, convert this:
170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //
171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //   return:
172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     ...
173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     ret ...
174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //
175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // into this:
176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //
177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //   return:
178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     ...
179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     %1 = load __stack_chk_guard
180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     %2 = load StackGuardSlot
181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     %3 = cmp i1 %1, %2
182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     br i1 %3, label %SP_return, label %CallStackCheckFailBlk
183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //
184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //   SP_return:
185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     ret ...
186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //
187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //   CallStackCheckFailBlk:
188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     call void @__stack_chk_fail()
189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    //     unreachable
190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // Split the basic block before the return instruction.
192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    BasicBlock *NewBB = BB->splitBasicBlock(RI, "SP_return");
193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // Move the newly created basic block to the point right after the old basic
195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // block so that it's in the "fall through" position.
196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    NewBB->moveAfter(BB);
197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    // Generate the stack protector instructions in the old basic block.
199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    LoadInst *LI1 = new LoadInst(StackGuardVar, "", false, BB);
200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    LoadInst *LI2 = new LoadInst(AI, "", true, BB);
201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    ICmpInst *Cmp = new ICmpInst(CmpInst::ICMP_EQ, LI1, LI2, "", BB);
202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    BranchInst::Create(NewBB, FailBB, Cmp, BB);
203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  }
204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // Return if we didn't modify any basic blocks. I.e., there are no return
206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  // statements in the function.
207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  if (!FailBB) return false;
208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  return true;
210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// CreateFailBB - Create a basic block to jump to when the stack protector
213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/// check fails.
214674060f01e9090cd21b3c5656cc3204912ad17a6Jon BoekenoogenBasicBlock *StackProtector::CreateFailBB() {
215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  BasicBlock *FailBB = BasicBlock::Create("CallStackCheckFailBlk", F);
216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  Constant *StackChkFail =
217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    M->getOrInsertFunction("__stack_chk_fail", Type::VoidTy, NULL);
218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  CallInst::Create(StackChkFail, "", FailBB);
219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  new UnreachableInst(FailBB);
220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen  return FailBB;
221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen