[llvm-commits] [llvm] r58791 - in /llvm/trunk: include/llvm/CodeGen/MachineFrameInfo.h include/llvm/Intrinsics.td lib/CodeGen/PrologEpilogInserter.cpp lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp lib/CodeGen/StackProtector.cpp
Evan Cheng
evan.cheng at apple.com
Wed Nov 5 22:12:08 PST 2008
On Nov 5, 2008, at 6:29 PM, Bill Wendling wrote:
>
>
> Modified: llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h?rev=58791&r1=58790&r2=58791&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h Wed Nov 5
> 20:29:10 2008
> @@ -150,6 +150,12 @@
> /// only valid during and after prolog/epilog code insertion.
> bool HasCalls;
>
> + /// HasStackProtector - Set to true if this function has stack
> protectors.
> + bool HasStackProtector;
There is no need for HasStackProtector. If StackProtectorIndex is
negative (fixed object), then the MF doesn't have one.
>
> +
> + /// StackProtectorIdx - The frame index for the stack protector.
> + int StackProtectorIdx;
> +
> /// MaxCallFrameSize - This contains the size of the largest call
> frame if the
> /// target uses frame setup/destroy pseudo instructions (as
> defined in the
> /// TargetFrameInfo class). This information is important for
> frame pointer
> @@ -180,6 +186,8 @@
> HasVarSizedObjects = false;
> FrameAddressTaken = false;
> HasCalls = false;
> + HasStackProtector = false;
> + StackProtectorIdx = -1;
> MaxCallFrameSize = 0;
> MMI = 0;
> }
> @@ -195,6 +203,17 @@
> ///
> 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.
> + ///
> + int getStackProtectorIndex() const { return StackProtectorIdx; }
> + void setStackProtectorIndex(int I) { StackProtectorIdx = I; }
> +
> /// isFrameAddressTaken - This method may be called any time after
> instruction
> /// selection is complete to determine if there is a call to
> /// @llvm.frameaddress in this function.
>
> Modified: llvm/trunk/include/llvm/Intrinsics.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.td?rev=58791&r1=58790&r2=58791&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/Intrinsics.td (original)
> +++ llvm/trunk/include/llvm/Intrinsics.td Wed Nov 5 20:29:10 2008
> @@ -165,6 +165,7 @@
> GCCBuiltin<"__builtin_stack_save">;
> def int_stackrestore : Intrinsic<[llvm_void_ty, llvm_ptr_ty]>,
> GCCBuiltin<"__builtin_stack_restore">;
> +
> // IntrWriteArgMem is more pessimistic than strictly necessary for
> prefetch,
> // however it does conveniently prevent the prefetch from being
> reordered
> // with respect to nearby accesses to the same memory.
> @@ -175,6 +176,10 @@
>
> 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]>;
Comments? How are these used? Do they read / write memory?
>
> +
> //===------------------- Standard C Library Intrinsics
> --------------------===//
> //
>
>
> Modified: llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp?rev=58791&r1=58790&r2=58791&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp Wed Nov 5
> 20:29:10 2008
> @@ -406,6 +406,33 @@
> }
> }
>
> + // Make sure that the stack protector comes before the local
> variables on the
> + // stack.
> + if (FFI->hasStackProtector()) {
> + int FI = FFI->getStackProtectorIndex();
> +
> + // If stack grows down, we need to add size of find the lowest
> + // address of the object.
> + if (StackGrowsDown)
> + Offset += FFI->getObjectSize(FI);
> +
> + unsigned Align = FFI->getObjectAlignment(FI);
> +
> + // If the alignment of this object is greater than that of the
> stack, then
> + // increase the stack alignment to match.
> + MaxAlign = std::max(MaxAlign, Align);
> +
> + // Adjust to alignment boundary.
> + Offset = (Offset + Align - 1) / Align * Align;
> +
> + if (StackGrowsDown) {
> + FFI->setObjectOffset(FI, -Offset); // Set the computed offset
> + } else {
> + FFI->setObjectOffset(FI, Offset);
> + Offset += FFI->getObjectSize(FI);
> + }
> + }
> +
> // Then assign frame offsets to stack objects that are not used to
> spill
> // callee saved registers.
> for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp?rev=58791&r1=58790&r2=58791&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
> (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp Wed
> Nov 5 20:29:10 2008
> @@ -25,6 +25,7 @@
> #include "llvm/Instructions.h"
> #include "llvm/Intrinsics.h"
> #include "llvm/IntrinsicInst.h"
> +#include "llvm/Module.h"
> #include "llvm/CodeGen/FastISel.h"
> #include "llvm/CodeGen/GCStrategy.h"
> #include "llvm/CodeGen/GCMetadata.h"
> @@ -34,6 +35,7 @@
> #include "llvm/CodeGen/MachineJumpTableInfo.h"
> #include "llvm/CodeGen/MachineModuleInfo.h"
> #include "llvm/CodeGen/MachineRegisterInfo.h"
> +#include "llvm/CodeGen/PseudoSourceValue.h"
> #include "llvm/CodeGen/SelectionDAG.h"
> #include "llvm/Target/TargetRegisterInfo.h"
> #include "llvm/Target/TargetData.h"
> @@ -3793,6 +3795,47 @@
> DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, MVT::Other,
> getRoot(), Tmp));
> return 0;
> }
> + case Intrinsic::stackprotector_prologue: {
Ok. Perhaps call this stackprotector_create? And change
stackprotector_epilogue to stackprotector_check?
Evan
>
> + // Emit code into the DAG to store the stack guard onto the
> stack.
> + MachineFunction &MF = DAG.getMachineFunction();
> + MachineFrameInfo *MFI = MF.getFrameInfo();
> + MVT PtrTy = TLI.getPointerTy();
> +
> + // Retrieve the stack protector guard's value.
> + SDValue Src = getValue(I.getOperand(1));
> +
> + // Create a slot on the stack for the stack protector. It
> should go first
> + // before local variables are allocated.
> + 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);
> +
> + // Store the stack protector onto the stack.
> + SDValue Result = DAG.getStore(getRoot(), Src, FIN,
> +
> PseudoSourceValue::getFixedStack(FI),
> + 0, true);
> + setValue(&I, Result);
> + DAG.setRoot(Result);
> + return 0;
> + }
> + case Intrinsic::stackprotector_epilogue: {
> + // Emit code into the DAG to retrieve the stack guard off of
> the stack.
> + MachineFunction &MF = DAG.getMachineFunction();
> + MachineFrameInfo *MFI = MF.getFrameInfo();
> + MVT PtrTy = TLI.getPointerTy();
> +
> + // Load the value stored on the stack.
> + int FI = MFI->getStackProtectorIndex();
> + SDValue FIN = DAG.getFrameIndex(MFI->getStackProtectorIndex(),
> PtrTy);
> + setValue(&I, DAG.getLoad(PtrTy, getRoot(), FIN,
> + PseudoSourceValue::getFixedStack(FI),
> 0, true));
> + return 0;
> + }
> case Intrinsic::var_annotation:
> // Discard annotate attributes
> return 0;
>
> Modified: llvm/trunk/lib/CodeGen/StackProtector.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StackProtector.cpp?rev=58791&r1=58790&r2=58791&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/StackProtector.cpp (original)
> +++ llvm/trunk/lib/CodeGen/StackProtector.cpp Wed Nov 5 20:29:10 2008
> @@ -20,6 +20,7 @@
> #include "llvm/DerivedTypes.h"
> #include "llvm/Function.h"
> #include "llvm/Instructions.h"
> +#include "llvm/Intrinsics.h"
> #include "llvm/Module.h"
> #include "llvm/Pass.h"
> #include "llvm/ADT/APInt.h"
> @@ -110,16 +111,15 @@
> // onto the stack.
> BasicBlock &Entry = F->getEntryBlock();
> Instruction *InsertPt = &Entry.front();
> +
> const PointerType *GuardTy = PointerType::getUnqual(Type::Int8Ty);
>
> // The global variable for the stack guard.
> Constant *StackGuardVar = M-
> >getOrInsertGlobal("__stack_chk_guard", GuardTy);
> -
> - // The place on the stack that the stack protector guard is kept.
> - AllocaInst *StackProtFrameSlot =
> - new AllocaInst(GuardTy, "StackProt_Frame", InsertPt);
> LoadInst *LI = new LoadInst(StackGuardVar, "StackGuard", false,
> InsertPt);
> - new StoreInst(LI, StackProtFrameSlot, false, InsertPt);
> + CallInst::
> + Create(Intrinsic::getDeclaration(M,
> Intrinsic::stackprotector_prologue),
> + LI, "", InsertPt);
>
> // Create the basic block to jump to when the guard check fails.
> BasicBlock *FailBB = CreateFailBB();
> @@ -137,7 +137,7 @@
> // %1 = load __stack_chk_guard
> // %2 = load <stored stack guard>
> // %3 = cmp i1 %1, %2
> - // br i1 %3, label %SPRet, label %CallStackCheckFailBlk
> + // br i1 %3, label %SP_return, label %CallStackCheckFailBlk
> //
> // SP_return:
> // ret ...
> @@ -161,9 +161,11 @@
> F->getBasicBlockList().insert(InsPt, NewBB);
>
> // Generate the stack protector instructions in the old basic
> block.
> - LoadInst *LI2 = new LoadInst(StackGuardVar, "", false, BB);
> - LoadInst *LI1 = new LoadInst(StackProtFrameSlot, "", true, BB);
> - ICmpInst *Cmp = new ICmpInst(CmpInst::ICMP_EQ, LI1, LI2, "", BB);
> + LoadInst *LI1 = new LoadInst(StackGuardVar, "", false, BB);
> + CallInst *CI = CallInst::
> + Create(Intrinsic::getDeclaration(M,
> Intrinsic::stackprotector_epilogue),
> + "", BB);
> + ICmpInst *Cmp = new ICmpInst(CmpInst::ICMP_EQ, CI, LI1, "", BB);
> BranchInst::Create(NewBB, FailBB, Cmp, BB);
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list