76#define DEBUG_TYPE "safe-stack"
78STATISTIC(NumFunctions,
"Total number of functions");
79STATISTIC(NumUnsafeStackFunctions,
"Number of functions with unsafe stack");
81 "Number of functions that use setjmp or exceptions");
84STATISTIC(NumUnsafeStaticAllocas,
"Number of unsafe static allocas");
85STATISTIC(NumUnsafeDynamicAllocas,
"Number of unsafe dynamic allocas");
86STATISTIC(NumUnsafeByValArguments,
"Number of unsafe byval arguments");
87STATISTIC(NumUnsafeStackRestorePoints,
"Number of setjmps and landingpads");
96 cl::desc(
"enable safe stack coloring"),
118 Value *UnsafeStackPtr =
nullptr;
167 Value *StaticTop,
bool NeedDynamicTop);
172 void moveDynamicAllocasToUnsafeStack(
Function &
F,
Value *UnsafeStackPtr,
176 bool IsSafeStackAlloca(
const Value *AllocaPtr,
uint64_t AllocaSize);
185 bool ShouldInlinePointerAddress(
CallInst &CI);
186 void TryInlinePointerAddress();
192 :
F(
F), TL(TL), Libcalls(Libcalls),
DL(
DL), DTU(DTU), SE(SE),
194 AddrTy(
DL.getAddressType(StackPtrTy)),
205 return Size->getFixedValue();
209bool SafeStack::IsAccessSafe(
Value *Addr, TypeSize AccessSize,
216 return IsAccessSafe(Addr, AccessSize.
getFixedValue(), AllocaPtr, AllocaSize);
219bool SafeStack::IsAccessSafe(
Value *Addr,
uint64_t AccessSize,
221 const SCEV *AddrExpr = SE.
getSCEV(Addr);
223 if (!
Base ||
Base->getValue() != AllocaPtr) {
225 dbgs() <<
"[SafeStack] "
227 << *AllocaPtr <<
"\n"
228 <<
"SCEV " << *AddrExpr <<
" not directly based on alloca\n");
235 ConstantRange SizeRange =
237 ConstantRange AccessRange = AccessStartRange.
add(SizeRange);
238 ConstantRange AllocaRange =
243 dbgs() <<
"[SafeStack] "
245 << *AllocaPtr <<
"\n"
246 <<
" Access " << *Addr <<
"\n"
250 <<
" Range " << AccessRange <<
"\n"
251 <<
" AllocaRange " << AllocaRange <<
"\n"
252 <<
" " << (Safe ?
"safe" :
"unsafe") <<
"\n");
257bool SafeStack::IsMemIntrinsicSafe(
const MemIntrinsic *
MI,
const Use &U,
258 const Value *AllocaPtr,
261 if (MTI->getRawSource() != U && MTI->getRawDest() != U)
264 if (
MI->getRawDest() != U)
268 auto Len =
MI->getLengthInBytes();
270 if (!Len)
return false;
271 return IsAccessSafe(U,
Len->getZExtValue(), AllocaPtr, AllocaSize);
277bool SafeStack::IsSafeStackAlloca(
const Value *AllocaPtr,
uint64_t AllocaSize) {
281 SmallPtrSet<const Value *, 16> Visited;
282 SmallVector<const Value *, 8> WorkList;
286 while (!WorkList.
empty()) {
288 for (
const Use &UI :
V->uses()) {
292 switch (
I->getOpcode()) {
293 case Instruction::Load:
294 if (!IsAccessSafe(UI,
DL.getTypeStoreSize(
I->getType()), AllocaPtr,
299 case Instruction::VAArg:
302 case Instruction::Store:
303 if (
V ==
I->getOperand(0)) {
306 <<
"[SafeStack] Unsafe alloca: " << *AllocaPtr
307 <<
"\n store of address: " << *
I <<
"\n");
311 if (!IsAccessSafe(UI,
DL.getTypeStoreSize(
I->getOperand(0)->getType()),
312 AllocaPtr, AllocaSize))
316 case Instruction::Ret:
320 case Instruction::Call:
321 case Instruction::Invoke: {
324 if (
I->isLifetimeStartOrEnd())
328 if (!IsMemIntrinsicSafe(
MI, UI, AllocaPtr, AllocaSize)) {
330 <<
"[SafeStack] Unsafe alloca: " << *AllocaPtr
331 <<
"\n unsafe memintrinsic: " << *
I <<
"\n");
345 for (
const auto *
A =
B;
A !=
E; ++
A)
350 <<
"\n unsafe call: " << *
I <<
"\n");
371 if (!StackGuardVar) {
376 return IRB.
CreateLoad(StackPtrTy, StackGuardVar,
"StackGuard");
380 SmallVectorImpl<AllocaInst *> &StaticAllocas,
381 SmallVectorImpl<AllocaInst *> &DynamicAllocas,
382 SmallVectorImpl<Argument *> &ByValArguments,
383 SmallVectorImpl<Instruction *> &Returns,
384 SmallVectorImpl<Instruction *> &StackRestorePoints) {
390 if (IsSafeStackAlloca(AI,
Size))
394 ++NumUnsafeStaticAllocas;
397 ++NumUnsafeDynamicAllocas;
401 if (CallInst *CI =
I.getParent()->getTerminatingMustTailCall())
407 if (CI->getCalledFunction() && CI->canReturnTwice())
413 if (
II->getIntrinsicID() == Intrinsic::gcroot)
415 "gcroot intrinsic not compatible with safestack attribute");
418 for (Argument &Arg :
F.args()) {
419 if (!Arg.hasByValAttr())
422 if (IsSafeStackAlloca(&Arg,
Size))
425 ++NumUnsafeByValArguments;
432 ArrayRef<Instruction *> StackRestorePoints,
433 Value *StaticTop,
bool NeedDynamicTop) {
434 assert(StaticTop &&
"The stack top isn't set.");
436 if (StackRestorePoints.
empty())
445 AllocaInst *DynamicTop =
nullptr;
446 if (NeedDynamicTop) {
450 "unsafe_stack_dynamic_ptr");
455 for (Instruction *
I : StackRestorePoints) {
456 ++NumUnsafeStackRestorePoints;
460 DynamicTop ? IRB.
CreateLoad(StackPtrTy, DynamicTop) : StaticTop;
468 AllocaInst *StackGuardSlot,
Value *StackGuard) {
474 MDNode *Weights = MDBuilder(
F.getContext())
475 .createBranchWeights(SuccessProb.getNumerator(),
476 FailureProb.getNumerator());
481 RTLIB::LibcallImpl StackChkFailImpl =
483 if (StackChkFailImpl == RTLIB::Unsupported) {
484 F.getContext().emitError(
485 "no libcall available for stackprotector check fail");
489 FunctionCallee StackChkFail =
491 *
F.getParent(), StackChkFailImpl);
492 CallInst *
Call = IRBFail.CreateCall(StackChkFail, {});
499Value *SafeStack::moveStaticAllocasToUnsafeStack(
502 AllocaInst *StackGuardSlot) {
503 if (StaticAllocas.
empty() && ByValArguments.
empty())
506 DIBuilder DIB(*
F.getParent());
508 StackLifetime SSC(
F, StaticAllocas, StackLifetime::LivenessType::May);
509 static const StackLifetime::LiveRange NoColoringRange(1,
true);
513 for (
const auto *
I : SSC.getMarkers()) {
515 const_cast<IntrinsicInst *
>(
I)->eraseFromParent();
517 if (
Op &&
Op->use_empty())
518 Op->eraseFromParent();
522 StackLayout SSL(StackAlignment);
523 if (StackGuardSlot) {
524 SSL.addObject(StackGuardSlot, getStaticAllocaAllocationSize(StackGuardSlot),
525 StackGuardSlot->
getAlign(), SSC.getFullLiveRange());
528 for (Argument *Arg : ByValArguments) {
529 Type *Ty = Arg->getParamByValType();
536 if (
auto A = Arg->getParamAlign())
537 Align = std::max(Align, *
A);
538 SSL.addObject(Arg,
Size, Align, SSC.getFullLiveRange());
541 for (AllocaInst *AI : StaticAllocas) {
547 ClColoring ? SSC.getLiveRange(AI) : NoColoringRange);
551 Align FrameAlignment = SSL.getFrameAlignment();
555 if (FrameAlignment > StackAlignment) {
559 StackPtrTy, Intrinsic::ptrmask,
560 {BasePointer, ConstantInt::get(AddrTy, ~(FrameAlignment.
value() - 1))});
565 if (StackGuardSlot) {
566 unsigned Offset = SSL.getObjectOffset(StackGuardSlot);
577 for (Argument *Arg : ByValArguments) {
578 unsigned Offset = SSL.getObjectOffset(Arg);
579 MaybeAlign
Align(SSL.getObjectAlignment(Arg));
580 Type *Ty = Arg->getParamByValType();
589 Arg->getName() +
".unsafe-byval");
594 Arg->replaceAllUsesWith(NewArg);
600 for (AllocaInst *AI : StaticAllocas) {
602 unsigned Offset = SSL.getObjectOffset(AI);
609 std::string
Name = std::string(AI->
getName()) +
".unsafe";
616 if (
User->isLifetimeStartOrEnd()) {
617 User->eraseFromParent();
623 InsertBefore =
PHI->getIncomingBlock(U)->getTerminator();
629 IRBUser.CreatePtrAddWithSignedOffset(BasePointer, -(int64_t)
Offset);
631 IRBUser.CreateAddrSpaceCast(
Off, AI->
getType(), Name);
636 PHI->setIncomingValueForBlock(
PHI->getIncomingBlock(U), Replacement);
647 unsigned FrameSize =
alignTo(SSL.getFrameSize(), StackAlignment);
649 F.addFnAttr(
"unsafe-stack-size",
utostr(FrameSize));
655 BasePointer, -(int64_t)FrameSize,
"unsafe_stack_static_top");
660void SafeStack::moveDynamicAllocasToUnsafeStack(
663 DIBuilder DIB(*
F.getParent());
665 for (AllocaInst *AI : DynamicAllocas) {
677 StackPtrTy, Intrinsic::ptrmask,
694 if (!DynamicAllocas.empty()) {
701 if (
II->getIntrinsicID() == Intrinsic::stacksave) {
705 II->replaceAllUsesWith(LI);
706 II->eraseFromParent();
707 }
else if (
II->getIntrinsicID() == Intrinsic::stackrestore) {
712 II->eraseFromParent();
718bool SafeStack::ShouldInlinePointerAddress(CallInst &CI) {
720 if (CI.
hasFnAttr(Attribute::AlwaysInline) &&
728void SafeStack::TryInlinePointerAddress() {
737 if (!Callee ||
Callee->isDeclaration())
740 if (!ShouldInlinePointerAddress(*CI))
746 InlineFunctionInfo IFI;
751bool SafeStack::run() {
752 assert(
F.hasFnAttribute(Attribute::SafeStack) &&
753 "Can't run SafeStack on a function without the attribute");
754 assert(!
F.isDeclaration() &&
"Can't run SafeStack on a function declaration");
761 SmallVector<Instruction *, 4> Returns;
768 SmallVector<Instruction *, 4> StackRestorePoints;
772 findInsts(
F, StaticAllocas, DynamicAllocas, ByValArguments, Returns,
775 if (StaticAllocas.
empty() && DynamicAllocas.
empty() &&
776 ByValArguments.
empty() && StackRestorePoints.
empty())
779 if (!StaticAllocas.
empty() || !DynamicAllocas.
empty() ||
780 !ByValArguments.
empty())
781 ++NumUnsafeStackFunctions;
783 if (!StackRestorePoints.
empty())
784 ++NumUnsafeStackRestorePointsFunctions;
790 if (DISubprogram *SP =
F.getSubprogram())
792 DILocation::get(
SP->getContext(),
SP->getScopeLine(), 0, SP));
798 if (!UnsafeStackPtr) {
799 F.getContext().emitError(
800 "no location available for safestack pointer address");
807 IRB.
CreateLoad(StackPtrTy, UnsafeStackPtr,
false,
"unsafe_stack_ptr");
810 AllocaInst *StackGuardSlot =
nullptr;
812 if (
F.hasFnAttribute(Attribute::StackProtect) ||
813 F.hasFnAttribute(Attribute::StackProtectStrong) ||
814 F.hasFnAttribute(Attribute::StackProtectReq)) {
819 for (Instruction *RI : Returns) {
821 checkStackGuard(IRBRet,
F, *RI, StackGuardSlot, StackGuard);
827 Value *StaticTop = moveStaticAllocasToUnsafeStack(
828 IRB,
F, StaticAllocas, ByValArguments, BasePointer, StackGuardSlot);
836 AllocaInst *DynamicTop = createStackRestorePoints(
837 IRB,
F, StackRestorePoints, StaticTop, !DynamicAllocas.
empty());
840 moveDynamicAllocasToUnsafeStack(
F, UnsafeStackPtr, DynamicTop,
844 for (Instruction *RI : Returns) {
849 TryInlinePointerAddress();
855class SafeStackLegacyPass :
public FunctionPass {
856 const TargetMachine *TM =
nullptr;
861 SafeStackLegacyPass() : FunctionPass(
ID) {}
863 void getAnalysisUsage(AnalysisUsage &AU)
const override {
874 if (!
F.hasFnAttribute(Attribute::SafeStack)) {
876 " for this function\n");
880 if (
F.isDeclaration()) {
882 " is not available\n");
886 TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
892 const LibcallLoweringInfo &Libcalls =
893 getAnalysis<LibcallLoweringInfoWrapper>().getLibcallLowering(
896 auto *
DL = &
F.getDataLayout();
897 auto &
TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
F);
898 auto &ACT = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
F);
905 bool ShouldPreserveDominatorTree;
906 std::optional<DominatorTree> LazilyComputedDomTree;
911 if (
auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>()) {
912 DT = &DTWP->getDomTree();
913 ShouldPreserveDominatorTree =
true;
916 LazilyComputedDomTree.emplace(
F);
917 DT = &*LazilyComputedDomTree;
918 ShouldPreserveDominatorTree =
false;
924 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
926 ScalarEvolution SE(
F,
TLI, ACT, *DT, LI);
928 return SafeStack(
F, *TL, Libcalls, *
DL,
929 ShouldPreserveDominatorTree ? &DTU :
nullptr, SE)
940 if (!
F.hasFnAttribute(Attribute::SafeStack)) {
942 " for this function\n");
946 if (
F.isDeclaration()) {
948 " is not available\n");
953 auto *TL =
Subtarget->getTargetLowering();
955 auto &
DL =
F.getDataLayout();
965 if (!LibcallLowering) {
967 "' analysis required");
976 bool Changed = SafeStack(
F, *TL, Libcalls,
DL, &DTU, SE).run();
985char SafeStackLegacyPass::ID = 0;
988 "Safe Stack instrumentation pass",
false,
false)
const AArch64Subtarget & Subtarget
const TargetLowering & TLI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
VarLocInsertPt getNextNode(const DbgRecord *DVR)
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool runOnFunction(Function &F, bool PostInlining)
Module.h This file contains the declarations for the Module class.
This defines the Use class.
Machine Check Debug Module
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
static cl::opt< bool > SafeStackUsePointerAddress("safestack-use-pointer-address", cl::init(false), cl::Hidden)
Use __safestack_pointer_address even if the platform has a faster way of access safe stack pointer.
static cl::opt< bool > ClColoring("safe-stack-coloring", cl::desc("enable safe stack coloring"), cl::Hidden, cl::init(true))
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static Value * getStackGuard(const TargetLoweringBase &TLI, const LibcallLoweringInfo &Libcalls, Module *M, IRBuilder<> &B, bool *SupportsSelectionDAGSP=nullptr)
Create a stack guard loading and populate whether SelectionDAG SSP is supported.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
This file describes how to lower LLVM code to machine code.
Target-Independent Code Generator Pass Configuration Options pass.
const AArch64TargetLowering * getTargetLowering() const override
an instruction to allocate memory on the stack
LLVM_ABI bool isStaticAlloca() const
Return true if this alloca is in the entry block of the function and is a constant size.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
PointerType * getType() const
Overload to return most specific pointer type.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
static BranchProbability getBranchProbStackProtector(bool IsLikely)
void setCallingConv(CallingConv::ID CC)
bool doesNotCapture(unsigned OpNo) const
Determine whether this data operand is not captured.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool doesNotAccessMemory(unsigned OpNo) const
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isNoInline() const
Return true if the call should not be inlined, either because the call site is marked noinline or bec...
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
This class represents a function call, abstracting a target machine's calling convention.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
A parsed version of the target data layout string in and methods for querying it.
Analysis pass which computes a DominatorTree.
Legacy analysis pass which computes a DominatorTree.
FunctionPass class - This class is used to implement most global optimizations.
void recalculate(FuncT &F)
Notify DTU that the entry block was replaced.
LLVM_ABI CallInst * CreateIntrinsicWithoutFolding(Intrinsic::ID ID, ArrayRef< Type * > OverloadTypes, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="", ArrayRef< OperandBundleDef > OpBundles={})
Create a call to intrinsic ID with Args, mangled using OverloadTypes.
AllocaInst * CreateAlloca(Type *Ty, unsigned AddrSpace, Value *ArraySize=nullptr, const Twine &Name="")
LLVM_ABI Value * CreateAllocationSize(Type *DestTy, AllocaInst *AI)
Get allocation size of an alloca as a runtime Value* (handles both static and dynamic allocas and vsc...
CallInst * CreateMemCpy(Value *Dst, MaybeAlign DstAlign, Value *Src, MaybeAlign SrcAlign, uint64_t Size, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert a memcpy between the specified pointers.
Value * CreatePointerCast(Value *V, Type *DestTy, const Twine &Name="")
void SetCurrentDebugLocation(const DebugLoc &L)
Set location information used by debugging information.
Value * CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Value * CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateNeg(Value *V, const Twine &Name="", bool HasNSW=false)
void disableGEPCanonicalization()
Disable canonicalization of getelementptr instructions to ptradd form.
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
LoadInst * CreateLoad(Type *Ty, Value *Ptr, const char *Name)
Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of converting the string to 'bool...
LLVM_ABI Value * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > OverloadTypes, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="", ArrayRef< OperandBundleDef > OpBundles={}, function_ref< void(CallInst *)> SetFn=[](CallInst *) {})
Variant to create a possibly constant-folded intrinsic.
StoreInst * CreateStore(Value *Val, Value *Ptr, bool isVolatile=false)
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Value * CreatePtrAddWithSignedOffset(Value *Ptr, int64_t Offset, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Create a ptradd with a signed constant offset.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
Tracks which library functions to use for a particular subtarget or function.
const RTLIB::RuntimeLibcallsInfo & getRuntimeLibcallsInfo() const
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This is the common base class for memset/memcpy/memmove.
Records a mapping from an opaque lowering context to its LibcallLoweringInfo.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Type * getType() const
Return the LLVM type of this SCEV expression.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM)
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI const SCEV * removePointerBase(const SCEV *S)
Compute an expression equivalent to S - getPointerBase(S).
LLVM_ABI uint64_t getTypeSizeInBits(Type *Ty) const
Return the size in bits of the specified type, for which isSCEVable must return true.
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
ConstantRange getSignedRange(const SCEV *S)
Determine the signed range for a particular SCEV.
ConstantRange getUnsignedRange(const SCEV *S)
Determine the unsigned range for a particular SCEV.
LLVM_ABI const SCEV * getPointerBase(const SCEV *V)
Transitively follow the chain of pointer-type operands until reaching a SCEV that does not have a sin...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This base class for TargetLowering contains the SelectionDAG-independent parts that can be used from ...
Value * getSafeStackPointerAddressCall(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const
Emits a call to the libcall returning the address of the unsafe stack pointer.
virtual Value * getIRStackGuard(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const
If the target has a standard location for the stack protector guard, returns the address of that loca...
virtual void insertSSPDeclarations(Module &M, const LibcallLoweringInfo &Libcalls) const
Inserts necessary declarations for SSP (stack protection) purpose.
virtual Value * getSafeStackPointerLocation(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const
Returns the target-specific address of the unsafe stack pointer.
virtual const TargetSubtargetInfo * getSubtargetImpl(const Function &) const
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
Target-Independent Code Generator Pass Configuration Options.
TargetSubtargetInfo - Generic base class for all target subtargets.
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
constexpr ScalarTy getFixedValue() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
@ User
could "use" a pointer
NodeAddr< UseNode * > Use
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI FunctionPass * createSafeStackPass()
This pass splits the stack into a safe stack and an unsafe stack to protect against stack-based overf...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
std::string utostr(uint64_t X, bool isNeg=false)
LLVM_ABI InlineResult InlineFunction(CallBase &CB, InlineFunctionInfo &IFI, bool MergeAttributes=false, AAResults *CalleeAAR=nullptr, bool InsertLifetime=true, bool TrackInlineHistory=false, Function *ForwardVarArgsTo=nullptr, OptimizationRemarkEmitter *ORE=nullptr)
This function inlines the called function into the basic block of the caller.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI InlineResult isInlineViable(Function &Callee)
Check if it is mechanically possible to inline the function Callee, based on the contents of the func...
LLVM_ABI const LibcallLoweringInfo & getLibcallLowering(const ModuleLibcallLoweringInfo &ModuleInfo, const TargetSubtargetInfo &Subtarget)
Resolve the LibcallLoweringInfo for Subtarget from the module-level ModuleInfo, applying the subtarge...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
DWARFExpression::Operation Op
LLVM_ABI void replaceDbgValueForAlloca(AllocaInst *AI, Value *NewAllocaAddress, DIBuilder &Builder, int Offset=0)
Replaces multiple dbg.value records when the alloca it describes is replaced with a new value.
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI bool replaceDbgDeclare(Value *Address, Value *NewAddress, DIBuilder &Builder, uint8_t DIExprFlags, int Offset)
Replaces dbg.declare record when the address it describes is replaced with a new value.
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
static constexpr Align Constant()
Allow constructions of constexpr Align.
LLVM_ABI FunctionCallee getOrInsertLibcallDecl(Module &M, RTLIB::LibcallImpl LibcallImpl) const