Make a preemptive bitcode format change to support PR1146. This lets us do

pr1146 in llvm 2.1 without ugly code to emulate old behavior.  This should
be merged into the 2.0 release branch.

llvm-svn: 36928
This commit is contained in:
Chris Lattner
2007-05-08 05:38:01 +00:00
parent 2357362805
commit 4c0a6d660e
2 changed files with 48 additions and 20 deletions

View File

@@ -985,10 +985,10 @@ bool BitcodeReader::ParseModule(const std::string &ModuleID) {
GlobalInits.push_back(std::make_pair(NewGV, InitID-1));
break;
}
// FUNCTION: [type, callingconv, isproto, linkage, alignment, section,
// visibility]
// FUNCTION: [type, callingconv, isproto, linkage, paramattr,
// alignment, section, visibility]
case bitc::MODULE_CODE_FUNCTION: {
if (Record.size() < 7)
if (Record.size() < 8)
return Error("Invalid MODULE_CODE_FUNCTION record");
const Type *Ty = getTypeByID(Record[0]);
if (!isa<PointerType>(Ty))
@@ -1004,13 +1004,17 @@ bool BitcodeReader::ParseModule(const std::string &ModuleID) {
Func->setCallingConv(Record[1]);
bool isProto = Record[2];
Func->setLinkage(GetDecodedLinkage(Record[3]));
Func->setAlignment((1 << Record[4]) >> 1);
if (Record[5]) {
if (Record[5]-1 >= SectionTable.size())
assert(Func->getFunctionType()->getParamAttrs() ==
getParamAttrs(Record[4]));
Func->setAlignment((1 << Record[5]) >> 1);
if (Record[6]) {
if (Record[6]-1 >= SectionTable.size())
return Error("Invalid section ID");
Func->setSection(SectionTable[Record[5]-1]);
Func->setSection(SectionTable[Record[6]-1]);
}
Func->setVisibility(GetDecodedVisibility(Record[6]));
Func->setVisibility(GetDecodedVisibility(Record[7]));
ValueList.push_back(Func);
@@ -1364,12 +1368,12 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
}
case bitc::FUNC_CODE_INST_INVOKE: { // INVOKE: [cc,fnty, op0,op1,op2, ...]
if (Record.size() < 3) return Error("Invalid INVOKE record");
unsigned CCInfo = Record[0];
BasicBlock *NormalBB = getBasicBlock(Record[1]);
BasicBlock *UnwindBB = getBasicBlock(Record[2]);
if (Record.size() < 4) return Error("Invalid INVOKE record");
unsigned CCInfo = Record[1];
BasicBlock *NormalBB = getBasicBlock(Record[2]);
BasicBlock *UnwindBB = getBasicBlock(Record[3]);
unsigned OpNum = 3;
unsigned OpNum = 4;
Value *Callee;
if (getValueTypePair(Record, OpNum, NextValueNo, Callee))
return Error("Invalid INVOKE record");
@@ -1383,6 +1387,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
Record.size() < OpNum+FTy->getNumParams())
return Error("Invalid INVOKE record");
assert(FTy->getParamAttrs() == getParamAttrs(Record[0]));
SmallVector<Value*, 16> Ops;
for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
Ops.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i)));
@@ -1484,11 +1490,12 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
break;
}
case bitc::FUNC_CODE_INST_CALL: { // CALL: [cc, fnty, fnid, arg0, arg1...]
if (Record.size() < 1)
if (Record.size() < 2)
return Error("Invalid CALL record");
unsigned CCInfo = Record[0];
unsigned OpNum = 1;
unsigned CCInfo = Record[1];
unsigned OpNum = 2;
Value *Callee;
if (getValueTypePair(Record, OpNum, NextValueNo, Callee))
return Error("Invalid CALL record");
@@ -1499,6 +1506,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
if (!FTy || Record.size() < FTy->getNumParams()+OpNum)
return Error("Invalid CALL record");
assert(FTy->getParamAttrs() == getParamAttrs(Record[0]));
SmallVector<Value*, 16> Args;
// Read the fixed params.
for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {