diff options
author | Devang Patel <dpatel@apple.com> | 2009-07-23 01:07:34 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-07-23 01:07:34 +0000 |
commit | 104cf9e02b0ed94d4173869a598af6c6972a8660 (patch) | |
tree | 424e9727423125da907cebf5f0ac9bc19d47e9fd /lib/Bitcode | |
parent | 0aaf4e91c2961585c160af0cc87f040301aafbd2 (diff) |
Derive MDNode from MetadataBase instead of Constant. Emit MDNodes into METADATA_BLOCK in bitcode file.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76834 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode')
-rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 33 | ||||
-rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 46 | ||||
-rw-r--r-- | lib/Bitcode/Writer/ValueEnumerator.cpp | 28 |
3 files changed, 58 insertions, 49 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index d22d467476..8393cd4216 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -734,6 +734,23 @@ bool BitcodeReader::ParseMetadata() { switch (Stream.ReadRecord(Code, Record)) { default: // Default behavior: ignore. break; + case bitc::METADATA_NODE: { + if (Record.empty() || Record.size() % 2 == 1) + return Error("Invalid METADATA_NODE record"); + + unsigned Size = Record.size(); + SmallVector<Value*, 8> Elts; + for (unsigned i = 0; i != Size; i += 2) { + const Type *Ty = getTypeByID(Record[i], false); + if (Ty != Type::VoidTy) + Elts.push_back(ValueList.getValueFwdRef(Record[i+1], Ty)); + else + Elts.push_back(NULL); + } + Value *V = Context.getMDNode(&Elts[0], Elts.size()); + ValueList.AssignValue(V, NextValueNo++); + break; + } case bitc::METADATA_STRING: { unsigned MDStringLength = Record.size(); SmallString<8> String; @@ -1078,22 +1095,6 @@ bool BitcodeReader::ParseConstants() { AsmStr, ConstrStr, HasSideEffects); break; } - case bitc::CST_CODE_MDNODE: { - if (Record.empty() || Record.size() % 2 == 1) - return Error("Invalid CST_MDNODE record"); - - unsigned Size = Record.size(); - SmallVector<Value*, 8> Elts; - for (unsigned i = 0; i != Size; i += 2) { - const Type *Ty = getTypeByID(Record[i], false); - if (Ty != Type::VoidTy) - Elts.push_back(ValueList.getValueFwdRef(Record[i+1], Ty)); - else - Elts.push_back(NULL); - } - V = Context.getMDNode(&Elts[0], Elts.size()); - break; - } } ValueList.AssignValue(V, NextCstNo); diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index 719ea8a02a..7d745ffd50 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -478,8 +478,26 @@ static uint64_t GetOptimizationFlags(const Value *V) { const ValueEnumerator::ValueList &Vals = VE.getValues(); bool StartedMetadataBlock = false; unsigned MDSAbbrev = 0; + SmallVector<uint64_t, 64> Record; for (unsigned i = 0, e = Vals.size(); i != e; ++i) { - if (const MDString *MDS = dyn_cast<MDString>(Vals[i].first)) { + + if (const MDNode *N = dyn_cast<MDNode>(Vals[i].first)) { + if (!StartedMetadataBlock) { + Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); + StartedMetadataBlock = true; + } + for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) { + if (N->getElement(i)) { + Record.push_back(VE.getTypeID(N->getElement(i)->getType())); + Record.push_back(VE.getValueID(N->getElement(i))); + } else { + Record.push_back(VE.getTypeID(Type::VoidTy)); + Record.push_back(0); + } + } + Stream.EmitRecord(bitc::METADATA_NODE, Record, 0); + Record.clear(); + } else if (const MDString *MDS = dyn_cast<MDString>(Vals[i].first)) { if (!StartedMetadataBlock) { Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); @@ -492,15 +510,14 @@ static uint64_t GetOptimizationFlags(const Value *V) { StartedMetadataBlock = true; } - SmallVector<unsigned, 64> StrVals; - StrVals.clear(); // Code: [strchar x N] const char *StrBegin = MDS->begin(); for (unsigned i = 0, e = MDS->size(); i != e; ++i) - StrVals.push_back(StrBegin[i]); + Record.push_back(StrBegin[i]); // Emit the finished record. - Stream.EmitRecord(bitc::METADATA_STRING, StrVals, MDSAbbrev); + Stream.EmitRecord(bitc::METADATA_STRING, Record, MDSAbbrev); + Record.clear(); } } @@ -555,7 +572,7 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, const Type *LastTy = 0; for (unsigned i = FirstVal; i != LastVal; ++i) { const Value *V = Vals[i].first; - if (isa<MDString>(V)) + if (isa<MDString>(V) || isa<MDNode>(V)) continue; // If we need to switch types, do so now. if (V->getType() != LastTy) { @@ -736,17 +753,6 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, Record.push_back(CE->getPredicate()); break; } - } else if (const MDNode *N = dyn_cast<MDNode>(C)) { - Code = bitc::CST_CODE_MDNODE; - for (unsigned i = 0, e = N->getNumElements(); i != e; ++i) { - if (N->getElement(i)) { - Record.push_back(VE.getTypeID(N->getElement(i)->getType())); - Record.push_back(VE.getValueID(N->getElement(i))); - } else { - Record.push_back(VE.getTypeID(Type::VoidTy)); - Record.push_back(0); - } - } } else { llvm_unreachable("Unknown constant!"); } @@ -1342,12 +1348,12 @@ static void WriteModule(const Module *M, BitstreamWriter &Stream) { // descriptors for global variables, and function prototype info. WriteModuleInfo(M, VE, Stream); + // Emit constants. + WriteModuleConstants(VE, Stream); + // Emit metadata. WriteModuleMetadata(VE, Stream); - // Emit constants. - WriteModuleConstants(VE, Stream); - // Emit function bodies. for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) if (!I->isDeclaration()) diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index 4a6eea4943..38784ec4a0 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -204,21 +204,23 @@ void ValueEnumerator::EnumerateValue(const Value *V) { Values.push_back(std::make_pair(V, 1U)); ValueMap[V] = Values.size(); return; - } else if (const MDNode *N = dyn_cast<MDNode>(C)) { - for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end(); - I != E; ++I) { - if (*I) - EnumerateValue(*I); - else - EnumerateType(Type::VoidTy); - } + } + } - Values.push_back(std::make_pair(V, 1U)); - ValueMap[V] = Values.size(); - return; + if (const MDNode *N = dyn_cast<MDNode>(V)) { + Values.push_back(std::make_pair(V, 1U)); + ValueMap[V] = Values.size(); + ValueID = Values.size(); + for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end(); + I != E; ++I) { + if (*I) + EnumerateValue(*I); + else + EnumerateType(Type::VoidTy); } + return; } - + // Add the value. Values.push_back(std::make_pair(V, 1U)); ValueID = Values.size(); @@ -265,7 +267,7 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { EnumerateOperandType(Elem); } } - } else if (isa<MDString>(V)) + } else if (isa<MDString>(V) || isa<MDNode>(V)) EnumerateValue(V); } |