|
LLVM
3.7.0
|
#include "llvm/CodeGen/StackProtector.h"#include "llvm/ADT/SmallPtrSet.h"#include "llvm/ADT/Statistic.h"#include "llvm/Analysis/BranchProbabilityInfo.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/MDBuilder.h"#include "llvm/IR/Module.h"#include "llvm/Support/CommandLine.h"#include "llvm/Target/TargetSubtargetInfo.h"#include <cstdlib>Go to the source code of this file.
Macros | |
| #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 CallInst * | FindPotentialTailCall (BasicBlock *BB, ReturnInst *RI, const TargetLoweringBase *TLI) |
| Identify if RI has a previous instruction in the "Tail Position" and return it. More... | |
| static bool | CreatePrologue (Function *F, Module *M, ReturnInst *RI, const TargetLoweringBase *TLI, const Triple &TT, AllocaInst *&AI, Value *&StackGuardVar) |
| Insert code into the entry block that stores the __stack_chk_guard variable onto the stack: More... | |
Variables | |
| static cl::opt< bool > | EnableSelectionDAGSP ("enable-selectiondag-sp", cl::init(true), cl::Hidden) |
| #define DEBUG_TYPE "stack-protector" |
Definition at line 42 of file StackProtector.cpp.
|
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 331 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::TargetLoweringBase::getStackCookieLocation(), llvm::GlobalValue::HiddenVisibility, and llvm::Triple::isOSOpenBSD().
|
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 273 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 52 of file StackProtector.cpp.
|
static |
Definition at line 259 of file StackProtector.cpp.
References llvm::isSafeToSpeculativelyExecute(), llvm::Instruction::mayHaveSideEffects(), and llvm::Instruction::mayReadFromMemory().
Referenced by FindPotentialTailCall().
| STATISTIC | ( | NumFunProtected | , |
| "Number of functions protected" | |||
| ) |
| STATISTIC | ( | NumAddrTaken | , |
| "Number of local variables that have their address"" taken." | |||
| ) |
1.8.6