mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 21:24:00 +00:00
[opaque pointer type] bitcode: add explicit callee type to invoke instructions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235735 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -3863,24 +3863,33 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
// INVOKE: [attrs, cc, normBB, unwindBB, fnty, op0,op1,op2, ...]
|
||||
if (Record.size() < 4)
|
||||
return Error("Invalid record");
|
||||
AttributeSet PAL = getAttributes(Record[0]);
|
||||
unsigned CCInfo = Record[1];
|
||||
BasicBlock *NormalBB = getBasicBlock(Record[2]);
|
||||
BasicBlock *UnwindBB = getBasicBlock(Record[3]);
|
||||
unsigned OpNum = 0;
|
||||
AttributeSet PAL = getAttributes(Record[OpNum++]);
|
||||
unsigned CCInfo = Record[OpNum++];
|
||||
BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
|
||||
BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
|
||||
|
||||
FunctionType *FTy = nullptr;
|
||||
if (CCInfo >> 13 & 1 &&
|
||||
!(FTy = dyn_cast<FunctionType>(getTypeByID(Record[OpNum++]))))
|
||||
return Error("Explicit invoke type is not a function type");
|
||||
|
||||
unsigned OpNum = 4;
|
||||
Value *Callee;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Callee))
|
||||
return Error("Invalid record");
|
||||
|
||||
PointerType *CalleeTy = dyn_cast<PointerType>(Callee->getType());
|
||||
FunctionType *FTy = !CalleeTy ? nullptr :
|
||||
dyn_cast<FunctionType>(CalleeTy->getElementType());
|
||||
|
||||
// Check that the right number of fixed parameters are here.
|
||||
if (!FTy || !NormalBB || !UnwindBB ||
|
||||
Record.size() < OpNum+FTy->getNumParams())
|
||||
return Error("Invalid record");
|
||||
if (!CalleeTy)
|
||||
return Error("Callee is not a pointer");
|
||||
if (!FTy) {
|
||||
FTy = dyn_cast<FunctionType>(CalleeTy->getElementType());
|
||||
if (!FTy)
|
||||
return Error("Callee is not of pointer to function type");
|
||||
} else if (CalleeTy->getElementType() != FTy)
|
||||
return Error("Explicit invoke type does not match pointee type of "
|
||||
"callee operand");
|
||||
if (Record.size() < FTy->getNumParams() + OpNum)
|
||||
return Error("Insufficient operands to call");
|
||||
|
||||
SmallVector<Value*, 16> Ops;
|
||||
for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
|
||||
@ -3905,8 +3914,8 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
|
||||
I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops);
|
||||
InstructionList.push_back(I);
|
||||
cast<InvokeInst>(I)->setCallingConv(
|
||||
static_cast<CallingConv::ID>(CCInfo));
|
||||
cast<InvokeInst>(I)
|
||||
->setCallingConv(static_cast<CallingConv::ID>(~(1U << 13) & CCInfo));
|
||||
cast<InvokeInst>(I)->setAttributes(PAL);
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user