/// only valid during and after prolog/epilog code insertion.
bool HasCalls;
- /// HasStackProtector - Set to true if this function has stack protectors.
- bool HasStackProtector;
-
/// StackProtectorIdx - The frame index for the stack protector.
int StackProtectorIdx;
HasVarSizedObjects = false;
FrameAddressTaken = false;
HasCalls = false;
- HasStackProtector = false;
StackProtectorIdx = -1;
MaxCallFrameSize = 0;
MMI = 0;
///
bool hasVarSizedObjects() const { return HasVarSizedObjects; }
- /// hasStackProtector - Return true if the function has a stack protector.
- ///
- bool hasStackProtector() const { return HasStackProtector; }
- void setStackProtector(bool T) { HasStackProtector = T; }
-
/// getStackProtectorIndex/setStackProtectorIndex - Return the index for the
/// stack protector object.
///
def int_readcyclecounter : Intrinsic<[llvm_i64_ty]>;
-// Stack protector intrinsics.
-def int_stackprotector_prologue : Intrinsic<[llvm_void_ty, llvm_ptr_ty]>;
-def int_stackprotector_epilogue : Intrinsic<[llvm_ptr_ty]>;
+// Stack Protector Intrinsics - The stackprotector_create writes the stack guard
+// to the correct place on the stack frame. The stackprotector_check reads back
+// the stack guard that the stackprotector_create stored.
+def int_stackprotector_create : Intrinsic<[llvm_void_ty, llvm_ptr_ty],
+ [IntrWriteMem]>;
+def int_stackprotector_check : Intrinsic<[llvm_ptr_ty], [IntrReadMem]>;
//===------------------- Standard C Library Intrinsics --------------------===//
//
// Make sure that the stack protector comes before the local variables on the
// stack.
- if (FFI->hasStackProtector()) {
+ if (FFI->getStackProtectorIndex() >= 0) {
int FI = FFI->getStackProtectorIndex();
// If stack grows down, we need to add size of find the lowest
DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, MVT::Other, getRoot(), Tmp));
return 0;
}
- case Intrinsic::stackprotector_prologue: {
+ case Intrinsic::stackprotector_create: {
// Emit code into the DAG to store the stack guard onto the stack.
MachineFunction &MF = DAG.getMachineFunction();
MachineFrameInfo *MFI = MF.getFrameInfo();
unsigned Align =
TLI.getTargetData()->getPrefTypeAlignment(PtrTy.getTypeForMVT());
int FI = MFI->CreateStackObject(PtrTy.getSizeInBits() / 8, Align);
-
- MFI->setStackProtector(true);
MFI->setStackProtectorIndex(FI);
SDValue FIN = DAG.getFrameIndex(FI, PtrTy);
DAG.setRoot(Result);
return 0;
}
- case Intrinsic::stackprotector_epilogue: {
+ case Intrinsic::stackprotector_check: {
// Emit code into the DAG to retrieve the stack guard off of the stack.
MachineFunction &MF = DAG.getMachineFunction();
MachineFrameInfo *MFI = MF.getFrameInfo();
Constant *StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", GuardTy);
LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false, InsertPt);
CallInst::
- Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector_prologue),
+ Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector_create),
LI, "", InsertPt);
// Create the basic block to jump to when the guard check fails.
// Generate the stack protector instructions in the old basic block.
LoadInst *LI1 = new LoadInst(StackGuardVar, "", false, BB);
CallInst *CI = CallInst::
- Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector_epilogue),
+ Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector_check),
"", BB);
ICmpInst *Cmp = new ICmpInst(CmpInst::ICMP_EQ, CI, LI1, "", BB);
BranchInst::Create(NewBB, FailBB, Cmp, BB);