mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-12 13:24:29 +00:00
New EH representation for MSVC compatibility
This introduces new instructions neccessary to implement MSVC-compatible exception handling support. Most of the middle-end and none of the back-end haven't been audited or updated to take them into account. Differential Revision: http://reviews.llvm.org/D11097 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243766 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1851,6 +1851,64 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
|
||||
Code = bitc::FUNC_CODE_INST_RESUME;
|
||||
PushValueAndType(I.getOperand(0), InstID, Vals, VE);
|
||||
break;
|
||||
case Instruction::CleanupRet: {
|
||||
Code = bitc::FUNC_CODE_INST_CLEANUPRET;
|
||||
const auto &CRI = cast<CleanupReturnInst>(I);
|
||||
Vals.push_back(CRI.hasReturnValue());
|
||||
Vals.push_back(CRI.hasUnwindDest());
|
||||
if (CRI.hasReturnValue())
|
||||
PushValueAndType(CRI.getReturnValue(), InstID, Vals, VE);
|
||||
if (CRI.hasUnwindDest())
|
||||
Vals.push_back(VE.getValueID(CRI.getUnwindDest()));
|
||||
break;
|
||||
}
|
||||
case Instruction::CatchRet: {
|
||||
Code = bitc::FUNC_CODE_INST_CATCHRET;
|
||||
const auto &CRI = cast<CatchReturnInst>(I);
|
||||
Vals.push_back(VE.getValueID(CRI.getSuccessor()));
|
||||
break;
|
||||
}
|
||||
case Instruction::CatchPad: {
|
||||
Code = bitc::FUNC_CODE_INST_CATCHPAD;
|
||||
const auto &CPI = cast<CatchPadInst>(I);
|
||||
Vals.push_back(VE.getTypeID(CPI.getType()));
|
||||
Vals.push_back(VE.getValueID(CPI.getNormalDest()));
|
||||
Vals.push_back(VE.getValueID(CPI.getUnwindDest()));
|
||||
unsigned NumArgOperands = CPI.getNumArgOperands();
|
||||
Vals.push_back(NumArgOperands);
|
||||
for (unsigned Op = 0; Op != NumArgOperands; ++Op)
|
||||
PushValueAndType(CPI.getArgOperand(Op), InstID, Vals, VE);
|
||||
break;
|
||||
}
|
||||
case Instruction::TerminatePad: {
|
||||
Code = bitc::FUNC_CODE_INST_TERMINATEPAD;
|
||||
const auto &TPI = cast<TerminatePadInst>(I);
|
||||
Vals.push_back(TPI.hasUnwindDest());
|
||||
if (TPI.hasUnwindDest())
|
||||
Vals.push_back(VE.getValueID(TPI.getUnwindDest()));
|
||||
unsigned NumArgOperands = TPI.getNumArgOperands();
|
||||
Vals.push_back(NumArgOperands);
|
||||
for (unsigned Op = 0; Op != NumArgOperands; ++Op)
|
||||
PushValueAndType(TPI.getArgOperand(Op), InstID, Vals, VE);
|
||||
break;
|
||||
}
|
||||
case Instruction::CleanupPad: {
|
||||
Code = bitc::FUNC_CODE_INST_CLEANUPPAD;
|
||||
const auto &CPI = cast<CleanupPadInst>(I);
|
||||
Vals.push_back(VE.getTypeID(CPI.getType()));
|
||||
unsigned NumOperands = CPI.getNumOperands();
|
||||
Vals.push_back(NumOperands);
|
||||
for (unsigned Op = 0; Op != NumOperands; ++Op)
|
||||
PushValueAndType(CPI.getOperand(Op), InstID, Vals, VE);
|
||||
break;
|
||||
}
|
||||
case Instruction::CatchEndPad: {
|
||||
Code = bitc::FUNC_CODE_INST_CATCHENDPAD;
|
||||
const auto &CEPI = cast<CatchEndPadInst>(I);
|
||||
if (CEPI.hasUnwindDest())
|
||||
Vals.push_back(VE.getValueID(CEPI.getUnwindDest()));
|
||||
break;
|
||||
}
|
||||
case Instruction::Unreachable:
|
||||
Code = bitc::FUNC_CODE_INST_UNREACHABLE;
|
||||
AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
|
||||
|
Reference in New Issue
Block a user