forked from OSchip/llvm-project
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:
parent
74a3e00ebf
commit
1c9e5678b8
|
@ -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]
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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}
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue