#include "llvm/CodeGen/StackProtector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.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>
usingnamespacellvm;
#define DEBUG_TYPE …
STATISTIC(NumFunProtected, "Number of functions protected");
STATISTIC(NumAddrTaken, "Number of local variables that have their address"
" taken.");
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);
static bool InsertStackProtectors(const TargetMachine *TM, Function *F,
DomTreeUpdater *DTU, bool &HasPrologue,
bool &HasIRCheck);
static BasicBlock *CreateFailBB(Function *F, const Triple &Trip);
bool SSPLayoutInfo::shouldEmitSDCheck(const BasicBlock &BB) const { … }
void SSPLayoutInfo::copyToMachineFrameInfo(MachineFrameInfo &MFI) const { … }
SSPLayoutInfo SSPLayoutAnalysis::run(Function &F,
FunctionAnalysisManager &FAM) { … }
AnalysisKey SSPLayoutAnalysis::Key;
PreservedAnalyses StackProtectorPass::run(Function &F,
FunctionAnalysisManager &FAM) { … }
char StackProtector::ID = …;
StackProtector::StackProtector() : … { … }
INITIALIZE_PASS_BEGIN(StackProtector, DEBUG_TYPE,
"Insert stack protectors", false, true)
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
INITIALIZE_PASS_END(StackProtector, DEBUG_TYPE,
"Insert stack protectors", false, true)
FunctionPass *llvm::createStackProtectorPass() { … }
void StackProtector::getAnalysisUsage(AnalysisUsage &AU) const { … }
bool StackProtector::runOnFunction(Function &Fn) { … }
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) { … }
static const CallInst *findStackProtectorIntrinsic(Function &F) { … }
bool SSPLayoutAnalysis::requiresStackProtector(Function *F,
SSPLayoutMap *Layout) { … }
static Value *getStackGuard(const TargetLoweringBase *TLI, Module *M,
IRBuilder<> &B,
bool *SupportsSelectionDAGSP = nullptr) { … }
static bool CreatePrologue(Function *F, Module *M, Instruction *CheckLoc,
const TargetLoweringBase *TLI, AllocaInst *&AI) { … }
bool InsertStackProtectors(const TargetMachine *TM, Function *F,
DomTreeUpdater *DTU, bool &HasPrologue,
bool &HasIRCheck) { … }
BasicBlock *CreateFailBB(Function *F, const Triple &Trip) { … }