LLVM API Documentation

Defines | Functions | Variables
StackProtector.cpp File Reference
#include "llvm/CodeGen/StackProtector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/Analysis.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Target/TargetSubtargetInfo.h"
#include <cstdlib>
Include dependency graph for StackProtector.cpp:

Go to the source code of this file.

Defines

#define DEBUG_TYPE   "stack-protector"

Functions

 STATISTIC (NumFunProtected,"Number of functions protected")
 STATISTIC (NumAddrTaken,"Number of local variables that have their address"" taken.")
 INITIALIZE_PASS (StackProtector,"stack-protector","Insert stack protectors", false, true) FunctionPass *llvm
static bool InstructionWillNotHaveChain (const Instruction *I)
static CallInstFindPotentialTailCall (BasicBlock *BB, ReturnInst *RI, const TargetLoweringBase *TLI)
static bool CreatePrologue (Function *F, Module *M, ReturnInst *RI, const TargetLoweringBase *TLI, const Triple &Trip, AllocaInst *&AI, Value *&StackGuardVar)

Variables

static cl::opt< boolEnableSelectionDAGSP ("enable-selectiondag-sp", cl::init(true), cl::Hidden)

Define Documentation

#define DEBUG_TYPE   "stack-protector"

Definition at line 40 of file StackProtector.cpp.


Function Documentation

static bool CreatePrologue ( Function F,
Module M,
ReturnInst RI,
const TargetLoweringBase TLI,
const Triple Trip,
AllocaInst *&  AI,
Value *&  StackGuardVar 
) [static]

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 .stackprotect.create(StackGuard, StackGuardSlot)

Returns true if the platform/triple supports the stackprotectorcreate pseudo node.

Definition at line 337 of file StackProtector.cpp.

References llvm::BasicBlock::front(), llvm::ConstantInt::get(), llvm::PointerType::get(), llvm::Value::getContext(), llvm::Intrinsic::getDeclaration(), llvm::Function::getEntryBlock(), llvm::Type::getInt32Ty(), llvm::Type::getInt8PtrTy(), llvm::ConstantExpr::getIntToPtr(), llvm::Module::getOrInsertGlobal(), llvm::Triple::getOS(), llvm::TargetLoweringBase::getStackCookieLocation(), llvm::GlobalValue::HiddenVisibility, LI, and llvm::Triple::OpenBSD.

static CallInst* FindPotentialTailCall ( BasicBlock BB,
ReturnInst RI,
const TargetLoweringBase TLI 
) [static]

Identify if RI has a previous instruction in the "Tail Position" and return it. Otherwise return 0.

This is based off of the code in llvm::isInTailCallPosition. The difference is that it inverts the first part of llvm::isInTailCallPosition since isInTailCallPosition is checking if a call is in a tail call position, and we are searching for an unknown tail call that might be in the tail call position. Once we find the call though, the code uses the same refactored code, returnTypeIsEligibleForTailCall.

Definition at line 279 of file StackProtector.cpp.

References llvm::BasicBlock::getParent(), I, InstructionWillNotHaveChain(), llvm::BasicBlock::rbegin(), llvm::BasicBlock::rend(), and llvm::returnTypeIsEligibleForTailCall().

INITIALIZE_PASS ( StackProtector  ,
"stack-protector"  ,
"Insert stack protectors"  ,
false  ,
true   
)

Definition at line 50 of file StackProtector.cpp.

STATISTIC ( NumFunProtected  ,
"Number of functions protected"   
)
STATISTIC ( NumAddrTaken  ,
"Number of local variables that have their address"" taken."   
)

Variable Documentation

cl::opt<bool> EnableSelectionDAGSP("enable-selectiondag-sp", cl::init(true), cl::Hidden) [static]