[llvm-commits] [llvm] r93339 - /llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp

Victor Hernandez vhernandez at apple.com
Wed Jan 13 11:37:33 PST 2010


Author: hernande
Date: Wed Jan 13 13:37:33 2010
New Revision: 93339

URL: http://llvm.org/viewvc/llvm-project?rev=93339&view=rev
Log:
Write function-local metadata as a metadata subblock of a funciton block

Modified:
    llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp

Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=93339&r1=93338&r2=93339&view=diff

==============================================================================
--- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
+++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Wed Jan 13 13:37:33 2010
@@ -499,11 +499,13 @@
   for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
 
     if (const MDNode *N = dyn_cast<MDNode>(Vals[i].first)) {
-      if (!StartedMetadataBlock) {
-        Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);
-        StartedMetadataBlock = true;
+      if (!N->isFunctionLocal()) {
+        if (!StartedMetadataBlock) {
+          Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);
+          StartedMetadataBlock = true;
+        }
+        WriteMDNode(N, VE, Stream, Record);
       }
-      WriteMDNode(N, VE, Stream, Record);
     } else if (const MDString *MDS = dyn_cast<MDString>(Vals[i].first)) {
       if (!StartedMetadataBlock)  {
         Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);
@@ -552,6 +554,35 @@
     Stream.ExitBlock();
 }
 
+static void WriteFunctionLocalMetadata(const ValueEnumerator &VE,
+                                       BitstreamWriter &Stream) {
+  bool StartedMetadataBlock = false;
+  SmallVector<uint64_t, 64> Record;
+  ValueEnumerator::ValueList Vals = VE.getMDValues();
+  ValueEnumerator::ValueList::iterator it = Vals.begin();
+  ValueEnumerator::ValueList::iterator end = Vals.end();
+
+  while (it != end) {
+    if (const MDNode *N = dyn_cast<MDNode>((*it).first)) {
+      if (N->isFunctionLocal()) {
+        if (!StartedMetadataBlock) {
+          Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);
+          StartedMetadataBlock = true;
+        }
+        WriteMDNode(N, VE, Stream, Record);
+        // Remove function-local MD, since it is used outside of function.
+        it = Vals.erase(it);
+        end = Vals.end();
+        continue;
+      }
+    }
+    ++it;
+  }
+
+  if (StartedMetadataBlock)
+    Stream.ExitBlock();
+}
+
 static void WriteMetadataAttachment(const Function &F,
                                     const ValueEnumerator &VE,
                                     BitstreamWriter &Stream) {
@@ -1210,6 +1241,7 @@
   // Emit names for all the instructions etc.
   WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream);
 
+  WriteFunctionLocalMetadata(VE, Stream);
   WriteMetadataAttachment(F, VE, Stream);
   VE.purgeFunction();
   Stream.ExitBlock();





More information about the llvm-commits mailing list