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