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
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp
index d22d467..8393cd4 100644
--- a/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -734,6 +734,23 @@
     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 @@
                          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 719ea8a..7d745ff 100644
--- a/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -478,8 +478,26 @@
    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 @@
         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 @@
   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 @@
         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 @@
   // 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 4a6eea4..38784ec 100644
--- a/lib/Bitcode/Writer/ValueEnumerator.cpp
+++ b/lib/Bitcode/Writer/ValueEnumerator.cpp
@@ -204,21 +204,23 @@
       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 @@
           EnumerateOperandType(Elem);
       }
     }
-  } else if (isa<MDString>(V))
+  } else if (isa<MDString>(V) || isa<MDNode>(V))
     EnumerateValue(V);
 }