remove support for reading llvm 2.9 .bc files. LLVM 3.1 is only compatible back to 3.0

llvm-svn: 145164
This commit is contained in:
Chris Lattner 2011-11-27 05:48:27 +00:00
parent 74a3e00ebf
commit 1c9e5678b8
10 changed files with 5 additions and 311 deletions

View File

@ -29,17 +29,13 @@ namespace bitc {
// Module sub-block id's.
PARAMATTR_BLOCK_ID,
/// TYPE_BLOCK_ID_OLD - This is the type descriptor block in LLVM 2.9 and
/// earlier, replaced with TYPE_BLOCK_ID2. FIXME: Remove in LLVM 3.1.
TYPE_BLOCK_ID_OLD,
UNUSED_ID1,
CONSTANTS_BLOCK_ID,
FUNCTION_BLOCK_ID,
/// TYPE_SYMTAB_BLOCK_ID_OLD - This type descriptor is from LLVM 2.9 and
/// earlier bitcode files. FIXME: Remove in LLVM 3.1
TYPE_SYMTAB_BLOCK_ID_OLD,
UNUSED_ID2,
VALUE_SYMTAB_BLOCK_ID,
METADATA_BLOCK_ID,
@ -94,9 +90,8 @@ namespace bitc {
TYPE_CODE_POINTER = 8, // POINTER: [pointee type]
TYPE_CODE_FUNCTION_OLD = 9, // FUNCTION: [vararg, attrid, retty, paramty x N]
// FIXME: This is the encoding used for structs in LLVM 2.9 and earlier.
// REMOVE this in LLVM 3.1
TYPE_CODE_STRUCT_OLD = 10, // STRUCT: [ispacked, eltty x N]
// Code #10 is unused.
TYPE_CODE_ARRAY = 11, // ARRAY: [numelts, eltty]
TYPE_CODE_VECTOR = 12, // VECTOR: [numelts, eltty]

View File

@ -403,14 +403,6 @@ Type *BitcodeReader::getTypeByID(unsigned ID) {
return TypeList[ID] = StructType::create(Context);
}
/// FIXME: Remove in LLVM 3.1, only used by ParseOldTypeTable.
Type *BitcodeReader::getTypeByIDOrNull(unsigned ID) {
if (ID >= TypeList.size())
TypeList.resize(ID+1);
return TypeList[ID];
}
//===----------------------------------------------------------------------===//
// Functions for parsing blocks from the bitcode file
@ -747,264 +739,6 @@ bool BitcodeReader::ParseTypeTableBody() {
}
}
// FIXME: Remove in LLVM 3.1
bool BitcodeReader::ParseOldTypeTable() {
if (Stream.EnterSubBlock(bitc::TYPE_BLOCK_ID_OLD))
return Error("Malformed block record");
if (!TypeList.empty())
return Error("Multiple TYPE_BLOCKs found!");
// While horrible, we have no good ordering of types in the bc file. Just
// iteratively parse types out of the bc file in multiple passes until we get
// them all. Do this by saving a cursor for the start of the type block.
BitstreamCursor StartOfTypeBlockCursor(Stream);
unsigned NumTypesRead = 0;
SmallVector<uint64_t, 64> Record;
RestartScan:
unsigned NextTypeID = 0;
bool ReadAnyTypes = false;
// Read all the records for this type table.
while (1) {
unsigned Code = Stream.ReadCode();
if (Code == bitc::END_BLOCK) {
if (NextTypeID != TypeList.size())
return Error("Invalid type forward reference in TYPE_BLOCK_ID_OLD");
// If we haven't read all of the types yet, iterate again.
if (NumTypesRead != TypeList.size()) {
// If we didn't successfully read any types in this pass, then we must
// have an unhandled forward reference.
if (!ReadAnyTypes)
return Error("Obsolete bitcode contains unhandled recursive type");
Stream = StartOfTypeBlockCursor;
goto RestartScan;
}
if (Stream.ReadBlockEnd())
return Error("Error at end of type table block");
return false;
}
if (Code == bitc::ENTER_SUBBLOCK) {
// No known subblocks, always skip them.
Stream.ReadSubBlockID();
if (Stream.SkipBlock())
return Error("Malformed block record");
continue;
}
if (Code == bitc::DEFINE_ABBREV) {
Stream.ReadAbbrevRecord();
continue;
}
// Read a record.
Record.clear();
Type *ResultTy = 0;
switch (Stream.ReadRecord(Code, Record)) {
default: return Error("unknown type in type table");
case bitc::TYPE_CODE_NUMENTRY: // TYPE_CODE_NUMENTRY: [numentries]
// TYPE_CODE_NUMENTRY contains a count of the number of types in the
// type list. This allows us to reserve space.
if (Record.size() < 1)
return Error("Invalid TYPE_CODE_NUMENTRY record");
TypeList.resize(Record[0]);
continue;
case bitc::TYPE_CODE_VOID: // VOID
ResultTy = Type::getVoidTy(Context);
break;
case bitc::TYPE_CODE_FLOAT: // FLOAT
ResultTy = Type::getFloatTy(Context);
break;
case bitc::TYPE_CODE_DOUBLE: // DOUBLE
ResultTy = Type::getDoubleTy(Context);
break;
case bitc::TYPE_CODE_X86_FP80: // X86_FP80
ResultTy = Type::getX86_FP80Ty(Context);
break;
case bitc::TYPE_CODE_FP128: // FP128
ResultTy = Type::getFP128Ty(Context);
break;
case bitc::TYPE_CODE_PPC_FP128: // PPC_FP128
ResultTy = Type::getPPC_FP128Ty(Context);
break;
case bitc::TYPE_CODE_LABEL: // LABEL
ResultTy = Type::getLabelTy(Context);
break;
case bitc::TYPE_CODE_METADATA: // METADATA
ResultTy = Type::getMetadataTy(Context);
break;
case bitc::TYPE_CODE_X86_MMX: // X86_MMX
ResultTy = Type::getX86_MMXTy(Context);
break;
case bitc::TYPE_CODE_INTEGER: // INTEGER: [width]
if (Record.size() < 1)
return Error("Invalid Integer type record");
ResultTy = IntegerType::get(Context, Record[0]);
break;
case bitc::TYPE_CODE_OPAQUE: // OPAQUE
if (NextTypeID < TypeList.size() && TypeList[NextTypeID] == 0)
ResultTy = StructType::create(Context);
break;
case bitc::TYPE_CODE_STRUCT_OLD: {// STRUCT_OLD
if (NextTypeID >= TypeList.size()) break;
// If we already read it, don't reprocess.
if (TypeList[NextTypeID] &&
!cast<StructType>(TypeList[NextTypeID])->isOpaque())
break;
// Set a type.
if (TypeList[NextTypeID] == 0)
TypeList[NextTypeID] = StructType::create(Context);
std::vector<Type*> EltTys;
for (unsigned i = 1, e = Record.size(); i != e; ++i) {
if (Type *Elt = getTypeByIDOrNull(Record[i]))
EltTys.push_back(Elt);
else
break;
}
if (EltTys.size() != Record.size()-1)
break; // Not all elements are ready.
cast<StructType>(TypeList[NextTypeID])->setBody(EltTys, Record[0]);
ResultTy = TypeList[NextTypeID];
TypeList[NextTypeID] = 0;
break;
}
case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or
// [pointee type, address space]
if (Record.size() < 1)
return Error("Invalid POINTER type record");
unsigned AddressSpace = 0;
if (Record.size() == 2)
AddressSpace = Record[1];
if ((ResultTy = getTypeByIDOrNull(Record[0])))
ResultTy = PointerType::get(ResultTy, AddressSpace);
break;
}
case bitc::TYPE_CODE_FUNCTION_OLD: {
// FIXME: attrid is dead, remove it in LLVM 3.0
// FUNCTION: [vararg, attrid, retty, paramty x N]
if (Record.size() < 3)
return Error("Invalid FUNCTION type record");
std::vector<Type*> ArgTys;
for (unsigned i = 3, e = Record.size(); i != e; ++i) {
if (Type *Elt = getTypeByIDOrNull(Record[i]))
ArgTys.push_back(Elt);
else
break;
}
if (ArgTys.size()+3 != Record.size())
break; // Something was null.
if ((ResultTy = getTypeByIDOrNull(Record[2])))
ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
break;
}
case bitc::TYPE_CODE_FUNCTION: {
// FUNCTION: [vararg, retty, paramty x N]
if (Record.size() < 2)
return Error("Invalid FUNCTION type record");
std::vector<Type*> ArgTys;
for (unsigned i = 2, e = Record.size(); i != e; ++i) {
if (Type *Elt = getTypeByIDOrNull(Record[i]))
ArgTys.push_back(Elt);
else
break;
}
if (ArgTys.size()+2 != Record.size())
break; // Something was null.
if ((ResultTy = getTypeByIDOrNull(Record[1])))
ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
break;
}
case bitc::TYPE_CODE_ARRAY: // ARRAY: [numelts, eltty]
if (Record.size() < 2)
return Error("Invalid ARRAY type record");
if ((ResultTy = getTypeByIDOrNull(Record[1])))
ResultTy = ArrayType::get(ResultTy, Record[0]);
break;
case bitc::TYPE_CODE_VECTOR: // VECTOR: [numelts, eltty]
if (Record.size() < 2)
return Error("Invalid VECTOR type record");
if ((ResultTy = getTypeByIDOrNull(Record[1])))
ResultTy = VectorType::get(ResultTy, Record[0]);
break;
}
if (NextTypeID >= TypeList.size())
return Error("invalid TYPE table");
if (ResultTy && TypeList[NextTypeID] == 0) {
++NumTypesRead;
ReadAnyTypes = true;
TypeList[NextTypeID] = ResultTy;
}
++NextTypeID;
}
}
bool BitcodeReader::ParseOldTypeSymbolTable() {
if (Stream.EnterSubBlock(bitc::TYPE_SYMTAB_BLOCK_ID_OLD))
return Error("Malformed block record");
SmallVector<uint64_t, 64> Record;
// Read all the records for this type table.
std::string TypeName;
while (1) {
unsigned Code = Stream.ReadCode();
if (Code == bitc::END_BLOCK) {
if (Stream.ReadBlockEnd())
return Error("Error at end of type symbol table block");
return false;
}
if (Code == bitc::ENTER_SUBBLOCK) {
// No known subblocks, always skip them.
Stream.ReadSubBlockID();
if (Stream.SkipBlock())
return Error("Malformed block record");
continue;
}
if (Code == bitc::DEFINE_ABBREV) {
Stream.ReadAbbrevRecord();
continue;
}
// Read a record.
Record.clear();
switch (Stream.ReadRecord(Code, Record)) {
default: // Default behavior: unknown type.
break;
case bitc::TST_CODE_ENTRY: // TST_ENTRY: [typeid, namechar x N]
if (ConvertToString(Record, 1, TypeName))
return Error("Invalid TST_ENTRY record");
unsigned TypeID = Record[0];
if (TypeID >= TypeList.size())
return Error("Invalid Type ID in TST_ENTRY record");
// Only apply the type name to a struct type with no name.
if (StructType *STy = dyn_cast<StructType>(TypeList[TypeID]))
if (!STy->isLiteral() && !STy->hasName())
STy->setName(TypeName);
TypeName.clear();
break;
}
}
}
bool BitcodeReader::ParseValueSymbolTable() {
if (Stream.EnterSubBlock(bitc::VALUE_SYMTAB_BLOCK_ID))
return Error("Malformed block record");
@ -1636,14 +1370,6 @@ bool BitcodeReader::ParseModule() {
if (ParseTypeTable())
return true;
break;
case bitc::TYPE_BLOCK_ID_OLD:
if (ParseOldTypeTable())
return true;
break;
case bitc::TYPE_SYMTAB_BLOCK_ID_OLD:
if (ParseOldTypeSymbolTable())
return true;
break;
case bitc::VALUE_SYMTAB_BLOCK_ID:
if (ParseValueSymbolTable())
return true;

View File

@ -211,7 +211,6 @@ public:
bool ParseTriple(std::string &Triple);
private:
Type *getTypeByID(unsigned ID);
Type *getTypeByIDOrNull(unsigned ID);
Value *getFnValueByID(unsigned ID, Type *Ty) {
if (Ty && Ty->isMetadataTy())
return MDValueList.getValueFwdRef(ID);
@ -259,10 +258,8 @@ private:
bool ParseModule();
bool ParseAttributeBlock();
bool ParseTypeTable();
bool ParseOldTypeTable(); // FIXME: Remove in LLVM 3.1
bool ParseTypeTableBody();
bool ParseOldTypeSymbolTable(); // FIXME: Remove in LLVM 3.1
bool ParseValueSymbolTable();
bool ParseConstants();
bool RememberAndSkipFunctionBody();

View File

@ -1,4 +0,0 @@
; This isn't really an assembly file. It just runs test on bitcode to ensure
; it is auto-upgraded.
; RUN: llvm-dis < %s.bc | FileCheck %s
; CHECK-NOT: {i32 @\\.llvm\\.eh}

View File

@ -1,5 +0,0 @@
; This isn't really an assembly file. It just runs the test on the bitcode to
; ensure bitcode file backward compatibility. No need for FileCheck as the
; BitcodeReader will fail with an assert if broken. This test case was
; generated using a clang binary, based on LLVM 2.9, downloaded from llvm.org.
; RUN: llvm-dis < %s.bc > /dev/null

View File

@ -1,5 +0,0 @@
; This isn't really an assembly file. It just runs the test on the bitcode to
; ensure bitcode file backward compatibility. No need for FileCheck as the
; BitcodeReader will fail with an assert if broken. This test case was
; generated using a clang binary, based on LLVM 2.9, downloaded from llvm.org.
; RUN: llvm-dis < %s.bc > /dev/null

View File

@ -102,11 +102,9 @@ static const char *GetBlockName(unsigned BlockID,
default: return 0;
case bitc::MODULE_BLOCK_ID: return "MODULE_BLOCK";
case bitc::PARAMATTR_BLOCK_ID: return "PARAMATTR_BLOCK";
case bitc::TYPE_BLOCK_ID_OLD: return "TYPE_BLOCK_ID_OLD";
case bitc::TYPE_BLOCK_ID_NEW: return "TYPE_BLOCK_ID";
case bitc::CONSTANTS_BLOCK_ID: return "CONSTANTS_BLOCK";
case bitc::FUNCTION_BLOCK_ID: return "FUNCTION_BLOCK";
case bitc::TYPE_SYMTAB_BLOCK_ID_OLD: return "TYPE_SYMTAB_OLD";
case bitc::VALUE_SYMTAB_BLOCK_ID: return "VALUE_SYMTAB";
case bitc::METADATA_BLOCK_ID: return "METADATA_BLOCK";
case bitc::METADATA_ATTACHMENT_ID: return "METADATA_ATTACHMENT_BLOCK";
@ -163,7 +161,6 @@ static const char *GetCodeName(unsigned CodeID, unsigned BlockID,
default: return 0;
case bitc::PARAMATTR_CODE_ENTRY: return "ENTRY";
}
case bitc::TYPE_BLOCK_ID_OLD:
case bitc::TYPE_BLOCK_ID_NEW:
switch (CodeID) {
default: return 0;
@ -175,8 +172,6 @@ static const char *GetCodeName(unsigned CodeID, unsigned BlockID,
case bitc::TYPE_CODE_OPAQUE: return "OPAQUE";
case bitc::TYPE_CODE_INTEGER: return "INTEGER";
case bitc::TYPE_CODE_POINTER: return "POINTER";
case bitc::TYPE_CODE_FUNCTION_OLD: return "FUNCTION_OLD";
case bitc::TYPE_CODE_STRUCT_OLD: return "STRUCT_OLD";
case bitc::TYPE_CODE_ARRAY: return "ARRAY";
case bitc::TYPE_CODE_VECTOR: return "VECTOR";
case bitc::TYPE_CODE_X86_FP80: return "X86_FP80";
@ -248,11 +243,6 @@ static const char *GetCodeName(unsigned CodeID, unsigned BlockID,
case bitc::FUNC_CODE_INST_CALL: return "INST_CALL";
case bitc::FUNC_CODE_DEBUG_LOC: return "DEBUG_LOC";
}
case bitc::TYPE_SYMTAB_BLOCK_ID_OLD:
switch (CodeID) {
default: return 0;
case bitc::TST_CODE_ENTRY: return "ENTRY";
}
case bitc::VALUE_SYMTAB_BLOCK_ID:
switch (CodeID) {
default: return 0;