diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-07-10 07:00:44 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-07-10 07:00:44 +0000 |
commit | ae2ffc8a8c825acf46f58f20dc7d0ae5fecbdd0b (patch) | |
tree | bba694cd7ab6a7a5eb4aca757ebfc3b38b1e949d /llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | |
parent | 83505347724a3eeb42f66a0b58fb8ff5c4c9ea4c (diff) | |
download | llvm-ae2ffc8a8c825acf46f58f20dc7d0ae5fecbdd0b.zip llvm-ae2ffc8a8c825acf46f58f20dc7d0ae5fecbdd0b.tar.gz llvm-ae2ffc8a8c825acf46f58f20dc7d0ae5fecbdd0b.tar.bz2 |
New EH representation for MSVC compatibility
Summary:
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.
Reviewers: rnk, JosephTremoulet, reames, nlewycky, rjmccall
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D11041
llvm-svn: 241888
Diffstat (limited to 'llvm/lib/Bitcode/Writer/BitcodeWriter.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 622f7ea..c1fd666 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1845,6 +1845,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::CatchBlock: { + Code = bitc::FUNC_CODE_INST_CATCHBLOCK; + const auto &CBI = cast<CatchBlockInst>(I); + Vals.push_back(VE.getTypeID(CBI.getType())); + Vals.push_back(VE.getValueID(CBI.getNormalDest())); + Vals.push_back(VE.getValueID(CBI.getUnwindDest())); + unsigned NumArgOperands = CBI.getNumArgOperands(); + Vals.push_back(NumArgOperands); + for (unsigned Op = 0; Op != NumArgOperands; ++Op) + PushValueAndType(CBI.getArgOperand(Op), InstID, Vals, VE); + break; + } + case Instruction::TerminateBlock: { + Code = bitc::FUNC_CODE_INST_TERMINATEBLOCK; + const auto &TBI = cast<TerminateBlockInst>(I); + Vals.push_back(TBI.hasUnwindDest()); + if (TBI.hasUnwindDest()) + Vals.push_back(VE.getValueID(TBI.getUnwindDest())); + unsigned NumArgOperands = TBI.getNumArgOperands(); + Vals.push_back(NumArgOperands); + for (unsigned Op = 0; Op != NumArgOperands; ++Op) + PushValueAndType(TBI.getArgOperand(Op), InstID, Vals, VE); + break; + } + case Instruction::CleanupBlock: { + Code = bitc::FUNC_CODE_INST_CLEANUPBLOCK; + const auto &CBI = cast<CleanupBlockInst>(I); + Vals.push_back(VE.getTypeID(CBI.getType())); + unsigned NumOperands = CBI.getNumOperands(); + Vals.push_back(NumOperands); + for (unsigned Op = 0; Op != NumOperands; ++Op) + PushValueAndType(CBI.getOperand(Op), InstID, Vals, VE); + break; + } + case Instruction::CatchEndBlock: { + Code = bitc::FUNC_CODE_INST_CATCHENDBLOCK; + const auto &CEBI = cast<CatchEndBlockInst>(I); + if (CEBI.hasUnwindDest()) + Vals.push_back(VE.getValueID(CEBI.getUnwindDest())); + break; + } case Instruction::Unreachable: Code = bitc::FUNC_CODE_INST_UNREACHABLE; AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV; |