LLVM 17.0.0git
|
#include "llvm/CodeGen/StackProtector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/EHPersonalities.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instruction.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/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include <optional>
#include <utility>
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_BEGIN (StackProtector, DEBUG_TYPE, "Insert stack protectors", false, true) INITIALIZE_PASS_END(StackProtector | |
static bool | ContainsProtectableArray (Type *Ty, Module *M, unsigned SSPBufferSize, bool &IsLarge, bool Strong, bool InStruct) |
static bool | HasAddressTaken (const Instruction *AI, TypeSize AllocSize, Module *M, SmallPtrSet< const PHINode *, 16 > &VisitedPHIs) |
Check whether a stack allocation has its address taken. | |
static const CallInst * | findStackProtectorIntrinsic (Function &F) |
Search for the first call to the llvm.stackprotector intrinsic and return it if present. | |
static Value * | getStackGuard (const TargetLoweringBase *TLI, Module *M, IRBuilder<> &B, bool *SupportsSelectionDAGSP=nullptr) |
Create a stack guard loading and populate whether SelectionDAG SSP is supported. | |
static bool | CreatePrologue (Function *F, Module *M, Instruction *CheckLoc, const TargetLoweringBase *TLI, AllocaInst *&AI) |
Insert code into the entry block that stores the stack guard variable onto the stack: | |
Variables | |
static cl::opt< bool > | EnableSelectionDAGSP ("enable-selectiondag-sp", cl::init(true), cl::Hidden) |
static cl::opt< bool > | DisableCheckNoReturn ("disable-check-noreturn-call", cl::init(false), cl::Hidden) |
DEBUG_TYPE | |
Insert stack | protectors |
Insert stack | false |
#define DEBUG_TYPE "stack-protector" |
Definition at line 55 of file StackProtector.cpp.
|
static |
[out] | IsLarge | is set to true if a protectable array is found and it is "large" ( >= ssp-buffer-size). In the case of a structure with multiple arrays, this gets set if any of them is large. |
Definition at line 124 of file StackProtector.cpp.
References ContainsProtectableArray(), and llvm::Triple::isOSDarwin().
Referenced by ContainsProtectableArray(), and llvm::StackProtector::requiresStackProtector().
|
static |
Insert code into the entry block that stores the stack guard variable onto the stack:
entry: StackGuardSlot = alloca i8* StackGuard = <stack guard> call void @llvm.stackprotector(StackGuard, StackGuardSlot)
Returns true if the platform/triple supports the stackprotectorcreate pseudo node.
Definition at line 450 of file StackProtector.cpp.
References B, F, llvm::Value::getContext(), llvm::Intrinsic::getDeclaration(), llvm::Type::getInt8PtrTy(), and getStackGuard().
Search for the first call to the llvm.stackprotector intrinsic and return it if present.
Definition at line 265 of file StackProtector.cpp.
|
static |
Create a stack guard loading and populate whether SelectionDAG SSP is supported.
Definition at line 415 of file StackProtector.cpp.
References B, llvm::StringRef::empty(), llvm::Intrinsic::getDeclaration(), llvm::TargetLoweringBase::getIRStackGuard(), and llvm::TargetLoweringBase::insertSSPDeclarations().
Referenced by CreatePrologue().
|
static |
Check whether a stack allocation has its address taken.
Definition at line 170 of file StackProtector.cpp.
References DL, llvm::TypeSize::Fixed(), GEP, llvm::TypeSize::getFixed(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getKnownMinValue(), llvm::MemoryLocation::getOrNone(), HasAddressTaken(), I, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::details::FixedOrScalableQuantity< TypeSize, uint64_t >::isKnownGE(), llvm::details::FixedOrScalableQuantity< TypeSize, uint64_t >::isKnownGT(), llvm::Offset, and llvm::Value::users().
Referenced by HasAddressTaken(), and llvm::StackProtector::requiresStackProtector().
INITIALIZE_PASS_BEGIN | ( | StackProtector | , |
DEBUG_TYPE | , | ||
"Insert stack protectors" | , | ||
false | , | ||
true | |||
) |
STATISTIC | ( | NumAddrTaken | , |
"Number of local variables that have their address" " taken." | |||
) |
STATISTIC | ( | NumFunProtected | , |
"Number of functions protected" | |||
) |
DEBUG_TYPE |
Definition at line 76 of file StackProtector.cpp.
|
static |
|
static |
Insert stack false |
Definition at line 77 of file StackProtector.cpp.
Insert stack protectors |
Definition at line 77 of file StackProtector.cpp.