summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-09-09 23:12:39 +0000
committerDan Gohman <gohman@apple.com>2010-09-09 23:12:39 +0000
commit70c2fc0823bcc3970fdebf18ba69449d7822af86 (patch)
tree1b3552a2f8e972d81ab5a83cb194eed3e822aea0 /lib
parent1ab6f2fa7a38a12d8f20157d71e5280a253f2578 (diff)
downloadllvm-70c2fc0823bcc3970fdebf18ba69449d7822af86.tar.gz
llvm-70c2fc0823bcc3970fdebf18ba69449d7822af86.tar.bz2
llvm-70c2fc0823bcc3970fdebf18ba69449d7822af86.tar.xz
Discard metadata produced by LLVM 2.7. The value enumeration it used
is different from what the code now uses in a two ways: NamedMDNodes were considered Values and included in the numbering, and the function-local metadata counter wasn't reset between functions. The later problem breaks lazy deserialization, so instead of trying to emulate the old numbering, just drop the old metadata. The only in-tree use case is debug info with LTO, where the QOI loss is considered acceptable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113557 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Bitcode/Reader/BitcodeReader.cpp46
-rw-r--r--lib/Bitcode/Writer/BitcodeWriter.cpp14
2 files changed, 45 insertions, 15 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp
index 4d679ecb93..02b1fb0e6b 100644
--- a/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -786,8 +786,12 @@ bool BitcodeReader::ParseMetadata() {
Record.clear();
Code = Stream.ReadCode();
- // METADATA_NAME is always followed by METADATA_NAMED_NODE.
- if (Stream.ReadRecord(Code, Record) != bitc::METADATA_NAMED_NODE)
+ // METADATA_NAME is always followed by METADATA_NAMED_NODE2.
+ 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)
assert ( 0 && "Inavlid Named Metadata record");
// Read named metadata elements.
@@ -802,11 +806,19 @@ bool BitcodeReader::ParseMetadata() {
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_NODE2:
IsFunctionLocal = true;
// fall-through
- case bitc::METADATA_NODE: {
+ case bitc::METADATA_NODE2: {
if (Record.size() % 2 == 1)
- return Error("Invalid METADATA_NODE record");
+ return Error("Invalid METADATA_NODE2 record");
unsigned Size = Record.size();
SmallVector<Value*, 8> Elts;
@@ -1593,7 +1605,10 @@ bool BitcodeReader::ParseMetadataAttachment() {
switch (Stream.ReadRecord(Code, Record)) {
default: // Default behavior: ignore.
break;
- case bitc::METADATA_ATTACHMENT: {
+ case bitc::METADATA_ATTACHMENT:
+ // LLVM 3.0: Remove this.
+ break;
+ case bitc::METADATA_ATTACHMENT2: {
unsigned RecordLength = Record.size();
if (Record.empty() || (RecordLength - 1) % 2 == 1)
return Error ("Invalid METADATA_ATTACHMENT reader!");
@@ -1706,7 +1721,11 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
I = 0;
continue;
- case bitc::FUNC_CODE_DEBUG_LOC: { // DEBUG_LOC: [line, col, scope, ia]
+ case bitc::FUNC_CODE_DEBUG_LOC:
+ // FIXME: Ignore. Remove this in LLVM 3.0.
+ continue;
+
+ case bitc::FUNC_CODE_DEBUG_LOC2: { // DEBUG_LOC: [line, col, scope, ia]
I = 0; // Get the last instruction emitted.
if (CurBB && !CurBB->empty())
I = &CurBB->back();
@@ -2221,7 +2240,12 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
InstructionList.push_back(I);
break;
}
- case bitc::FUNC_CODE_INST_CALL: {
+ case bitc::FUNC_CODE_INST_CALL:
+ 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");
@@ -2245,7 +2269,13 @@ 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
+ 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
Args.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i)));
if (Args.back() == 0) return Error("Invalid CALL record");
}
diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp
index 07727f33d9..7b6fc6cd92 100644
--- a/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -485,8 +485,8 @@ static void WriteMDNode(const MDNode *N,
Record.push_back(0);
}
}
- unsigned MDCode = N->isFunctionLocal() ? bitc::METADATA_FN_NODE :
- bitc::METADATA_NODE;
+ unsigned MDCode = N->isFunctionLocal() ? bitc::METADATA_FN_NODE2 :
+ bitc::METADATA_NODE2;
Stream.EmitRecord(MDCode, Record, 0);
Record.clear();
}
@@ -549,7 +549,7 @@ static void WriteModuleMetadata(const Module *M,
// Write named metadata operands.
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
Record.push_back(VE.getValueID(NMD->getOperand(i)));
- Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0);
+ Stream.EmitRecord(bitc::METADATA_NAMED_NODE2, Record, 0);
Record.clear();
}
@@ -585,7 +585,7 @@ static void WriteMetadataAttachment(const Function &F,
SmallVector<uint64_t, 64> Record;
// Write metadata attachments
- // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]]
+ // METADATA_ATTACHMENT2 - [m x [value, [n x [id, mdnode]]]
SmallVector<std::pair<unsigned, MDNode*>, 4> MDs;
for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
@@ -603,7 +603,7 @@ static void WriteMetadataAttachment(const Function &F,
Record.push_back(MDs[i].first);
Record.push_back(VE.getValueID(MDs[i].second));
}
- Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);
+ Stream.EmitRecord(bitc::METADATA_ATTACHMENT2, Record, 0);
Record.clear();
}
@@ -1111,7 +1111,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
const PointerType *PTy = cast<PointerType>(CI.getCalledValue()->getType());
const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
- Code = bitc::FUNC_CODE_INST_CALL;
+ Code = bitc::FUNC_CODE_INST_CALL2;
Vals.push_back(VE.getAttributeID(CI.getAttributes()));
Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall()));
@@ -1255,7 +1255,7 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,
Vals.push_back(DL.getCol());
Vals.push_back(Scope ? VE.getValueID(Scope)+1 : 0);
Vals.push_back(IA ? VE.getValueID(IA)+1 : 0);
- Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals);
+ Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC2, Vals);
Vals.clear();
LastDL = DL;