mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-14 14:24:05 +00:00
Initial commit of the 'landingpad' instruction.
This implements the 'landingpad' instruction. It's used to indicate that a basic block is a landing pad. There are several restrictions on its use (see LangRef.html for more detail). These restrictions allow the exception handling code to gather the information it needs in a much more sane way. This patch has the definition, implementation, C interface, parsing, and bitcode support in it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137501 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -2543,6 +2543,44 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
break;
|
||||
}
|
||||
|
||||
case bitc::FUNC_CODE_INST_LANDINGPAD: {
|
||||
// LANDINGPAD: [ty, val, val, num, (id0,val0 ...)?]
|
||||
unsigned Idx = 0;
|
||||
if (Record.size() < 4)
|
||||
return Error("Invalid LANDINGPAD record");
|
||||
Type *Ty = getTypeByID(Record[Idx++]);
|
||||
if (!Ty) return Error("Invalid LANDINGPAD record");
|
||||
Value *PersFn = 0;
|
||||
if (getValueTypePair(Record, Idx, NextValueNo, PersFn))
|
||||
return Error("Invalid LANDINGPAD record");
|
||||
|
||||
bool IsCleanup = !!Record[Idx++];
|
||||
unsigned NumClauses = Record[Idx++];
|
||||
LandingPadInst *LP = LandingPadInst::Create(Ty, PersFn, NumClauses);
|
||||
LP->setCleanup(IsCleanup);
|
||||
for (unsigned J = 0; J != NumClauses; ++J) {
|
||||
LandingPadInst::ClauseType CT =
|
||||
LandingPadInst::ClauseType(Record[Idx++]); (void)CT;
|
||||
Value *Val;
|
||||
|
||||
if (getValueTypePair(Record, Idx, NextValueNo, Val)) {
|
||||
delete LP;
|
||||
return Error("Invalid LANDINGPAD record");
|
||||
}
|
||||
|
||||
assert((CT != LandingPadInst::Catch ||
|
||||
!isa<ArrayType>(Val->getType())) &&
|
||||
"Catch clause has a invalid type!");
|
||||
assert((CT != LandingPadInst::Filter ||
|
||||
isa<ArrayType>(Val->getType())) &&
|
||||
"Filter clause has invalid type!");
|
||||
LP->addClause(Val);
|
||||
}
|
||||
|
||||
I = LP;
|
||||
break;
|
||||
}
|
||||
|
||||
case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align]
|
||||
if (Record.size() != 4)
|
||||
return Error("Invalid ALLOCA record");
|
||||
|
Reference in New Issue
Block a user