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