aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/Reader
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-09-13 18:00:48 +0000
committerDan Gohman <gohman@apple.com>2010-09-13 18:00:48 +0000
commit9b10dfb7d6ffb0e4466f908cd7d18212a45cfdac (patch)
tree17c88de375705ab30dd913af2bf2b982cef2120f /lib/Bitcode/Reader
parent2c5f19db2eef055d2a65482504ae98e79f2ca24d (diff)
Add full auto-upgrade support for LLVM 2.7 bitcode metadata.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113764 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode/Reader')
-rw-r--r--lib/Bitcode/Reader/BitcodeReader.cpp71
-rw-r--r--lib/Bitcode/Reader/BitcodeReader.h9
2 files changed, 49 insertions, 31 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp
index 84349761cb..ced1761d17 100644
--- a/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -776,7 +776,8 @@ bool BitcodeReader::ParseMetadata() {
bool IsFunctionLocal = false;
// Read a record.
Record.clear();
- switch (Stream.ReadRecord(Code, Record)) {
+ Code = Stream.ReadRecord(Code, Record);
+ switch (Code) {
default: // Default behavior: ignore.
break;
case bitc::METADATA_NAME: {
@@ -790,11 +791,11 @@ bool BitcodeReader::ParseMetadata() {
Code = Stream.ReadCode();
// METADATA_NAME is always followed by METADATA_NAMED_NODE2.
+ // Or METADATA_NAMED_NODE in LLVM 2.7. FIXME: Remove this in LLVM 3.0.
unsigned NextBitCode = Stream.ReadRecord(Code, Record);
- // FIXME: LLVM 3.0: Remove this.
- if (NextBitCode == bitc::METADATA_NAMED_NODE)
- break;
- if (NextBitCode != bitc::METADATA_NAMED_NODE2)
+ if (NextBitCode == bitc::METADATA_NAMED_NODE) {
+ LLVM2_7MetadataDetected = true;
+ } else if (NextBitCode != bitc::METADATA_NAMED_NODE2)
assert ( 0 && "Inavlid Named Metadata record");
// Read named metadata elements.
@@ -806,20 +807,27 @@ bool BitcodeReader::ParseMetadata() {
return Error("Malformed metadata record");
NMD->addOperand(MD);
}
+ // Backwards compatibility hack: NamedMDValues used to be Values,
+ // and they got their own slots in the value numbering. They are no
+ // longer Values, however we still need to account for them in the
+ // numbering in order to be able to read old bitcode files.
+ // FIXME: Remove this in LLVM 3.0.
+ if (LLVM2_7MetadataDetected)
+ MDValueList.AssignValue(0, NextMDValueNo++);
break;
}
- case bitc::METADATA_FN_NODE:
- // FIXME: Legacy support for the old fn_node, where function-local
- // metadata operands were bogus. Remove in LLVM 3.0.
- break;
- case bitc::METADATA_NODE:
- // FIXME: Legacy support for the old node, where function-local
- // metadata operands were bogus. Remove in LLVM 3.0.
- break;
+ case bitc::METADATA_FN_NODE: // FIXME: Remove in LLVM 3.0.
case bitc::METADATA_FN_NODE2:
IsFunctionLocal = true;
// fall-through
+ case bitc::METADATA_NODE: // FIXME: Remove in LLVM 3.0.
case bitc::METADATA_NODE2: {
+
+ // Detect 2.7-era metadata.
+ // FIXME: Remove in LLVM 3.0.
+ if (Code == bitc::METADATA_FN_NODE || Code == bitc::METADATA_NODE)
+ LLVM2_7MetadataDetected = true;
+
if (Record.size() % 2 == 1)
return Error("Invalid METADATA_NODE2 record");
@@ -1614,9 +1622,9 @@ bool BitcodeReader::ParseMetadataAttachment() {
switch (Stream.ReadRecord(Code, Record)) {
default: // Default behavior: ignore.
break;
+ // FIXME: Remove in LLVM 3.0.
case bitc::METADATA_ATTACHMENT:
- // LLVM 3.0: Remove this.
- break;
+ LLVM2_7MetadataDetected = true;
case bitc::METADATA_ATTACHMENT2: {
unsigned RecordLength = Record.size();
if (Record.empty() || (RecordLength - 1) % 2 == 1)
@@ -1730,10 +1738,9 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
I = 0;
continue;
+ // FIXME: Remove this in LLVM 3.0.
case bitc::FUNC_CODE_DEBUG_LOC:
- // FIXME: Ignore. Remove this in LLVM 3.0.
- continue;
-
+ LLVM2_7MetadataDetected = true;
case bitc::FUNC_CODE_DEBUG_LOC2: { // DEBUG_LOC: [line, col, scope, ia]
I = 0; // Get the last instruction emitted.
if (CurBB && !CurBB->empty())
@@ -2196,7 +2203,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
}
case bitc::FUNC_CODE_INST_ALLOCA: { // ALLOCA: [instty, opty, op, align]
// For backward compatibility, tolerate a lack of an opty, and use i32.
- // LLVM 3.0: Remove this.
+ // Remove this in LLVM 3.0.
if (Record.size() < 3 || Record.size() > 4)
return Error("Invalid ALLOCA record");
unsigned OpNum = 0;
@@ -2249,12 +2256,10 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
InstructionList.push_back(I);
break;
}
+ // FIXME: Remove this in LLVM 3.0.
case bitc::FUNC_CODE_INST_CALL:
+ LLVM2_7MetadataDetected = true;
case bitc::FUNC_CODE_INST_CALL2: {
- // FIXME: Legacy support for the old call instruction, where function-local
- // metadata operands were bogus. Remove in LLVM 3.0.
- bool DropMetadata = BitCode == bitc::FUNC_CODE_INST_CALL;
-
// CALL: [paramattrs, cc, fnty, fnid, arg0, arg1...]
if (Record.size() < 3)
return Error("Invalid CALL record");
@@ -2278,13 +2283,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
if (FTy->getParamType(i)->getTypeID()==Type::LabelTyID)
Args.push_back(getBasicBlock(Record[OpNum]));
- else if (DropMetadata &&
- FTy->getParamType(i)->getTypeID()==Type::MetadataTyID) {
- // LLVM 2.7 compatibility: drop metadata arguments to null.
- Value *Ops = 0;
- Args.push_back(MDNode::get(Context, &Ops, 1));
- continue;
- } else
+ else
Args.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i)));
if (Args.back() == 0) return Error("Invalid CALL record");
}
@@ -2379,9 +2378,21 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
BlockAddrFwdRefs.erase(BAFRI);
}
+ // FIXME: Remove this in LLVM 3.0.
+ unsigned NewMDValueListSize = MDValueList.size();
+
// Trim the value list down to the size it was before we parsed this function.
ValueList.shrinkTo(ModuleValueListSize);
MDValueList.shrinkTo(ModuleMDValueListSize);
+
+ // Backwards compatibility hack: Function-local metadata numbers
+ // were previously not reset between functions. This is now fixed,
+ // however we still need to understand the old numbering in order
+ // to be able to read old bitcode files.
+ // FIXME: Remove this in LLVM 3.0.
+ if (LLVM2_7MetadataDetected)
+ MDValueList.resize(NewMDValueListSize);
+
std::vector<BasicBlock*>().swap(FunctionBBs);
return false;
diff --git a/lib/Bitcode/Reader/BitcodeReader.h b/lib/Bitcode/Reader/BitcodeReader.h
index a5ab5d29e9..053121bdad 100644
--- a/lib/Bitcode/Reader/BitcodeReader.h
+++ b/lib/Bitcode/Reader/BitcodeReader.h
@@ -173,11 +173,18 @@ class BitcodeReader : public GVMaterializer {
/// are resolved lazily when functions are loaded.
typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy;
DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs;
+
+ /// LLVM2_7MetadataDetected - True if metadata produced by LLVM 2.7 or
+ /// earlier was detected, in which case we behave slightly differently,
+ /// for compatibility.
+ /// FIXME: Remove in LLVM 3.0.
+ bool LLVM2_7MetadataDetected;
public:
explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext &C)
: Context(C), TheModule(0), Buffer(buffer), BufferOwned(false),
- ErrorString(0), ValueList(C), MDValueList(C) {
+ ErrorString(0), ValueList(C), MDValueList(C),
+ LLVM2_7MetadataDetected(false) {
HasReversedFunctionsWithBodies = false;
}
~BitcodeReader() {