diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2007-08-15 17:12:32 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2007-08-15 17:12:32 +0000 |
commit | e844e47bf4a3b0a89b8590a08cea48d76b2bb29e (patch) | |
tree | 13f549a8dc2b8e01bbe63a9b3cbe244a544882e2 /lib/Target | |
parent | 94ad3602945156bd498b11a42893bef89cdffeb0 (diff) | |
download | external_llvm-e844e47bf4a3b0a89b8590a08cea48d76b2bb29e.zip external_llvm-e844e47bf4a3b0a89b8590a08cea48d76b2bb29e.tar.gz external_llvm-e844e47bf4a3b0a89b8590a08cea48d76b2bb29e.tar.bz2 |
Move ReturnAddrIndex variable to X86MachineFunctionInfo structure. This fixed
hard to catch bugs with retaddr lowering
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41104 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 23 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelLowering.h | 1 | ||||
-rw-r--r-- | lib/Target/X86/X86MachineFunctionInfo.h | 14 |
3 files changed, 24 insertions, 14 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index ab7a7ed..179c47a 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -781,12 +781,11 @@ SDOperand X86TargetLowering::LowerCCCArguments(SDOperand Op, SelectionDAG &DAG, BytesCallerReserves = StackSize; } - + RegSaveFrameIndex = 0xAAAAAAA; // X86-64 only. - ReturnAddrIndex = 0; // No return address slot generated yet. - MF.getInfo<X86MachineFunctionInfo>() - ->setBytesToPopOnReturn(BytesToPopOnReturn); + X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>(); + FuncInfo->setBytesToPopOnReturn(BytesToPopOnReturn); // Return the new list of results. return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(), @@ -1027,12 +1026,11 @@ X86TargetLowering::LowerFastCCArguments(SDOperand Op, SelectionDAG &DAG) { VarArgsFrameIndex = 0xAAAAAAA; // fastcc functions can't have varargs. RegSaveFrameIndex = 0xAAAAAAA; // X86-64 only. - ReturnAddrIndex = 0; // No return address slot generated yet. BytesToPopOnReturn = StackSize; // Callee pops all stack arguments. BytesCallerReserves = 0; - MF.getInfo<X86MachineFunctionInfo>() - ->setBytesToPopOnReturn(BytesToPopOnReturn); + X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>(); + FuncInfo->setBytesToPopOnReturn(BytesToPopOnReturn); // Return the new list of results. return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(), @@ -1319,10 +1317,12 @@ X86TargetLowering::LowerX86_64CCCArguments(SDOperand Op, SelectionDAG &DAG) { ArgValues.push_back(Root); - ReturnAddrIndex = 0; // No return address slot generated yet. BytesToPopOnReturn = 0; // Callee pops nothing. BytesCallerReserves = StackSize; + X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>(); + FuncInfo->setBytesToPopOnReturn(BytesToPopOnReturn); + // Return the new list of results. return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(), &ArgValues[0], ArgValues.size()).getValue(Op.ResNo); @@ -1471,13 +1471,18 @@ X86TargetLowering::LowerX86_64CCCCallTo(SDOperand Op, SelectionDAG &DAG, SDOperand X86TargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) { + MachineFunction &MF = DAG.getMachineFunction(); + X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>(); + int ReturnAddrIndex = FuncInfo->getRAIndex(); + if (ReturnAddrIndex == 0) { // Set up a frame object for the return address. - MachineFunction &MF = DAG.getMachineFunction(); if (Subtarget->is64Bit()) ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(8, -8); else ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(4, -4); + + FuncInfo->setRAIndex(ReturnAddrIndex); } return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy()); diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index 55c34a3..022005d 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -282,7 +282,6 @@ namespace llvm { int RegSaveFrameIndex; // X86-64 vararg func register save area. unsigned VarArgsGPOffset; // X86-64 vararg func int reg offset. unsigned VarArgsFPOffset; // X86-64 vararg func fp reg offset. - int ReturnAddrIndex; // FrameIndex for return slot. int BytesToPopOnReturn; // Number of arg bytes ret should pop. int BytesCallerReserves; // Number of arg bytes caller makes. public: diff --git a/lib/Target/X86/X86MachineFunctionInfo.h b/lib/Target/X86/X86MachineFunctionInfo.h index 7a21fb2..e50a104 100644 --- a/lib/Target/X86/X86MachineFunctionInfo.h +++ b/lib/Target/X86/X86MachineFunctionInfo.h @@ -44,17 +44,21 @@ class X86MachineFunctionInfo : public MachineFunctionInfo { /// If the function requires additional name decoration, DecorationStyle holds /// the right way to do so. NameDecorationStyle DecorationStyle; - + + // FrameIndex for return slot. + int ReturnAddrIndex; public: X86MachineFunctionInfo() : ForceFramePointer(false), CalleeSavedFrameSize(0), BytesToPopOnReturn(0), - DecorationStyle(None) {} + DecorationStyle(None), + ReturnAddrIndex(0) {} X86MachineFunctionInfo(MachineFunction &MF) : ForceFramePointer(false), CalleeSavedFrameSize(0), BytesToPopOnReturn(0), - DecorationStyle(None) {} + DecorationStyle(None), + ReturnAddrIndex(0) {} bool getForceFramePointer() const { return ForceFramePointer;} void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; } @@ -67,7 +71,9 @@ public: NameDecorationStyle getDecorationStyle() const { return DecorationStyle; } void setDecorationStyle(NameDecorationStyle style) { DecorationStyle = style;} - + + int getRAIndex() const { return ReturnAddrIndex; } + void setRAIndex(int Index) { ReturnAddrIndex = Index; } }; } // End llvm namespace |