mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-13 17:00:01 +00:00
[WinEH] Remove unused intrinsic llvm.x86.seh.restoreframe
We can clean this up now that we have the X86 CATCHRET instruction to restore the FP, SP, and BP. llvm-svn: 255677
This commit is contained in:
parent
608538dccc
commit
c8a81bcc44
@ -25,11 +25,6 @@ let TargetPrefix = "x86" in {
|
|||||||
// Marks the EH registration node created in LLVM IR prior to code generation.
|
// Marks the EH registration node created in LLVM IR prior to code generation.
|
||||||
def int_x86_seh_ehregnode : Intrinsic<[], [llvm_ptr_ty], []>;
|
def int_x86_seh_ehregnode : Intrinsic<[], [llvm_ptr_ty], []>;
|
||||||
|
|
||||||
// Restores the frame, base, and stack pointers as necessary after recovering
|
|
||||||
// from an exception. Any block resuming control flow in the parent function
|
|
||||||
// should call this before accessing any stack memory.
|
|
||||||
def int_x86_seh_restoreframe : Intrinsic<[], [], []>;
|
|
||||||
|
|
||||||
// Given a pointer to the end of an EH registration object, returns the true
|
// Given a pointer to the end of an EH registration object, returns the true
|
||||||
// parent frame address that can be used with llvm.localrecover.
|
// parent frame address that can be used with llvm.localrecover.
|
||||||
def int_x86_seh_recoverfp : Intrinsic<[llvm_ptr_ty],
|
def int_x86_seh_recoverfp : Intrinsic<[llvm_ptr_ty],
|
||||||
|
@ -16168,7 +16168,8 @@ static int getSEHRegistrationNodeSize(const Function *Fn) {
|
|||||||
case EHPersonality::MSVC_CXX: return 16;
|
case EHPersonality::MSVC_CXX: return 16;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
report_fatal_error("can only recover FP for MSVC EH personality functions");
|
report_fatal_error(
|
||||||
|
"can only recover FP for 32-bit MSVC EH personality functions");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// When the 32-bit MSVC runtime transfers control to us, either to an outlined
|
/// When the 32-bit MSVC runtime transfers control to us, either to an outlined
|
||||||
@ -17077,66 +17078,6 @@ static SDValue LowerREADCYCLECOUNTER(SDValue Op, const X86Subtarget *Subtarget,
|
|||||||
return DAG.getMergeValues(Results, DL);
|
return DAG.getMergeValues(Results, DL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDValue LowerSEHRESTOREFRAME(SDValue Op, const X86Subtarget *Subtarget,
|
|
||||||
SelectionDAG &DAG) {
|
|
||||||
MachineFunction &MF = DAG.getMachineFunction();
|
|
||||||
const Function *Fn = MF.getFunction();
|
|
||||||
SDLoc dl(Op);
|
|
||||||
SDValue Chain = Op.getOperand(0);
|
|
||||||
|
|
||||||
assert(Subtarget->getFrameLowering()->hasFP(MF) &&
|
|
||||||
"using llvm.x86.seh.restoreframe requires a frame pointer");
|
|
||||||
|
|
||||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
|
||||||
MVT VT = TLI.getPointerTy(DAG.getDataLayout());
|
|
||||||
|
|
||||||
const X86RegisterInfo *RegInfo = Subtarget->getRegisterInfo();
|
|
||||||
unsigned FrameReg =
|
|
||||||
RegInfo->getPtrSizedFrameRegister(DAG.getMachineFunction());
|
|
||||||
unsigned SPReg = RegInfo->getStackRegister();
|
|
||||||
unsigned SlotSize = RegInfo->getSlotSize();
|
|
||||||
|
|
||||||
// Get incoming EBP.
|
|
||||||
SDValue IncomingEBP =
|
|
||||||
DAG.getCopyFromReg(Chain, dl, FrameReg, VT);
|
|
||||||
|
|
||||||
// SP is saved in the first field of every registration node, so load
|
|
||||||
// [EBP-RegNodeSize] into SP.
|
|
||||||
int RegNodeSize = getSEHRegistrationNodeSize(Fn);
|
|
||||||
SDValue SPAddr = DAG.getNode(ISD::ADD, dl, VT, IncomingEBP,
|
|
||||||
DAG.getConstant(-RegNodeSize, dl, VT));
|
|
||||||
SDValue NewSP =
|
|
||||||
DAG.getLoad(VT, dl, Chain, SPAddr, MachinePointerInfo(), false, false,
|
|
||||||
false, VT.getScalarSizeInBits() / 8);
|
|
||||||
Chain = DAG.getCopyToReg(Chain, dl, SPReg, NewSP);
|
|
||||||
|
|
||||||
if (!RegInfo->needsStackRealignment(MF)) {
|
|
||||||
// Adjust EBP to point back to the original frame position.
|
|
||||||
SDValue NewFP = recoverFramePointer(DAG, Fn, IncomingEBP);
|
|
||||||
Chain = DAG.getCopyToReg(Chain, dl, FrameReg, NewFP);
|
|
||||||
} else {
|
|
||||||
assert(RegInfo->hasBasePointer(MF) &&
|
|
||||||
"functions with Win32 EH must use frame or base pointer register");
|
|
||||||
|
|
||||||
// Reload the base pointer (ESI) with the adjusted incoming EBP.
|
|
||||||
SDValue NewBP = recoverFramePointer(DAG, Fn, IncomingEBP);
|
|
||||||
Chain = DAG.getCopyToReg(Chain, dl, RegInfo->getBaseRegister(), NewBP);
|
|
||||||
|
|
||||||
// Reload the spilled EBP value, now that the stack and base pointers are
|
|
||||||
// set up.
|
|
||||||
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
|
|
||||||
X86FI->setHasSEHFramePtrSave(true);
|
|
||||||
int FI = MF.getFrameInfo()->CreateSpillStackObject(SlotSize, SlotSize);
|
|
||||||
X86FI->setSEHFramePtrSaveIndex(FI);
|
|
||||||
SDValue NewFP = DAG.getLoad(VT, dl, Chain, DAG.getFrameIndex(FI, VT),
|
|
||||||
MachinePointerInfo(), false, false, false,
|
|
||||||
VT.getScalarSizeInBits() / 8);
|
|
||||||
Chain = DAG.getCopyToReg(NewFP, dl, FrameReg, NewFP);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Chain;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SDValue MarkEHRegistrationNode(SDValue Op, SelectionDAG &DAG) {
|
static SDValue MarkEHRegistrationNode(SDValue Op, SelectionDAG &DAG) {
|
||||||
MachineFunction &MF = DAG.getMachineFunction();
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
SDValue Chain = Op.getOperand(0);
|
SDValue Chain = Op.getOperand(0);
|
||||||
@ -17198,9 +17139,7 @@ static SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, const X86Subtarget *Subtarget,
|
|||||||
|
|
||||||
const IntrinsicData* IntrData = getIntrinsicWithChain(IntNo);
|
const IntrinsicData* IntrData = getIntrinsicWithChain(IntNo);
|
||||||
if (!IntrData) {
|
if (!IntrData) {
|
||||||
if (IntNo == llvm::Intrinsic::x86_seh_restoreframe)
|
if (IntNo == llvm::Intrinsic::x86_seh_ehregnode)
|
||||||
return LowerSEHRESTOREFRAME(Op, Subtarget, DAG);
|
|
||||||
else if (IntNo == llvm::Intrinsic::x86_seh_ehregnode)
|
|
||||||
return MarkEHRegistrationNode(Op, DAG);
|
return MarkEHRegistrationNode(Op, DAG);
|
||||||
return SDValue();
|
return SDValue();
|
||||||
}
|
}
|
||||||
|
@ -84,8 +84,8 @@ class X86MachineFunctionInfo : public MachineFunctionInfo {
|
|||||||
/// of pushes to pass function parameters.
|
/// of pushes to pass function parameters.
|
||||||
bool HasPushSequences = false;
|
bool HasPushSequences = false;
|
||||||
|
|
||||||
/// True if the function uses llvm.x86.seh.restoreframe, and it needed a spill
|
/// True if the function recovers from an SEH exception, and therefore needs
|
||||||
/// slot for the frame pointer.
|
/// to spill and restore the frame pointer.
|
||||||
bool HasSEHFramePtrSave = false;
|
bool HasSEHFramePtrSave = false;
|
||||||
|
|
||||||
/// The frame index of a stack object containing the original frame pointer
|
/// The frame index of a stack object containing the original frame pointer
|
||||||
|
@ -87,7 +87,6 @@ private:
|
|||||||
Function *FrameRecover = nullptr;
|
Function *FrameRecover = nullptr;
|
||||||
Function *FrameAddress = nullptr;
|
Function *FrameAddress = nullptr;
|
||||||
Function *FrameEscape = nullptr;
|
Function *FrameEscape = nullptr;
|
||||||
Function *RestoreFrame = nullptr;
|
|
||||||
|
|
||||||
// Per-function state
|
// Per-function state
|
||||||
EHPersonality Personality = EHPersonality::Unknown;
|
EHPersonality Personality = EHPersonality::Unknown;
|
||||||
@ -120,8 +119,6 @@ bool WinEHStatePass::doInitialization(Module &M) {
|
|||||||
FrameEscape = Intrinsic::getDeclaration(TheModule, Intrinsic::localescape);
|
FrameEscape = Intrinsic::getDeclaration(TheModule, Intrinsic::localescape);
|
||||||
FrameRecover = Intrinsic::getDeclaration(TheModule, Intrinsic::localrecover);
|
FrameRecover = Intrinsic::getDeclaration(TheModule, Intrinsic::localrecover);
|
||||||
FrameAddress = Intrinsic::getDeclaration(TheModule, Intrinsic::frameaddress);
|
FrameAddress = Intrinsic::getDeclaration(TheModule, Intrinsic::frameaddress);
|
||||||
RestoreFrame =
|
|
||||||
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_seh_restoreframe);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user