diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp
index c405feb..fd3ec9e 100644
--- a/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -849,6 +849,7 @@
   
   SmallVector<uint64_t, 64> Record;
   std::vector<std::string> SectionTable;
+  std::vector<std::string> CollectorTable;
 
   // Read all the records for this module.
   while (!Stream.AtEndOfStream()) {
@@ -974,6 +975,13 @@
       SectionTable.push_back(S);
       break;
     }
+    case bitc::MODULE_CODE_COLLECTORNAME: {  // SECTIONNAME: [strchr x N]
+      std::string S;
+      if (ConvertToString(Record, 0, S))
+        return Error("Invalid MODULE_CODE_COLLECTORNAME record");
+      CollectorTable.push_back(S);
+      break;
+    }
     // GLOBALVAR: [type, isconst, initid, 
     //             linkage, alignment, section, visibility, threadlocal]
     case bitc::MODULE_CODE_GLOBALVAR: {
@@ -1016,7 +1024,7 @@
       break;
     }
     // FUNCTION:  [type, callingconv, isproto, linkage, paramattr,
-    //             alignment, section, visibility]
+    //             alignment, section, visibility, collector]
     case bitc::MODULE_CODE_FUNCTION: {
       if (Record.size() < 8)
         return Error("Invalid MODULE_CODE_FUNCTION record");
@@ -1044,6 +1052,11 @@
         Func->setSection(SectionTable[Record[6]-1]);
       }
       Func->setVisibility(GetDecodedVisibility(Record[7]));
+      if (Record.size() > 8 && Record[8]) {
+        if (Record[8]-1 > CollectorTable.size())
+          return Error("Invalid collector ID");
+        Func->setCollector(CollectorTable[Record[8]-1].c_str());
+      }
       
       ValueList.push_back(Func);
       
diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp
index 6d111fa..612d893 100644
--- a/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -297,9 +297,10 @@
     WriteStringRecord(bitc::MODULE_CODE_ASM, M->getModuleInlineAsm(),
                       0/*TODO*/, Stream);
 
-  // Emit information about sections, computing how many there are.  Also
-  // compute the maximum alignment value.
+  // Emit information about sections and collectors, computing how many there
+  // are.  Also compute the maximum alignment value.
   std::map<std::string, unsigned> SectionMap;
+  std::map<std::string, unsigned> CollectorMap;
   unsigned MaxAlignment = 0;
   unsigned MaxGlobalType = 0;
   for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end();
@@ -317,13 +318,24 @@
   }
   for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) {
     MaxAlignment = std::max(MaxAlignment, F->getAlignment());
-    if (!F->hasSection()) continue;
-    // Give section names unique ID's.
-    unsigned &Entry = SectionMap[F->getSection()];
-    if (Entry != 0) continue;
-    WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, F->getSection(),
-                      0/*TODO*/, Stream);
-    Entry = SectionMap.size();
+    if (F->hasSection()) {
+      // Give section names unique ID's.
+      unsigned &Entry = SectionMap[F->getSection()];
+      if (!Entry) {
+        WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, F->getSection(),
+                          0/*TODO*/, Stream);
+        Entry = SectionMap.size();
+      }
+    }
+    if (F->hasCollector()) {
+      // Same for collector names.
+      unsigned &Entry = CollectorMap[F->getCollector()];
+      if (!Entry) {
+        WriteStringRecord(bitc::MODULE_CODE_COLLECTORNAME, F->getCollector(),
+                          0/*TODO*/, Stream);
+        Entry = CollectorMap.size();
+      }
+    }
   }
   
   // Emit abbrev for globals, now that we know # sections and max alignment.
@@ -383,7 +395,7 @@
   // Emit the function proto information.
   for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) {
     // FUNCTION:  [type, callingconv, isproto, paramattr,
-    //             linkage, alignment, section, visibility]
+    //             linkage, alignment, section, visibility, collector]
     Vals.push_back(VE.getTypeID(F->getType()));
     Vals.push_back(F->getCallingConv());
     Vals.push_back(F->isDeclaration());
@@ -392,6 +404,7 @@
     Vals.push_back(Log2_32(F->getAlignment())+1);
     Vals.push_back(F->hasSection() ? SectionMap[F->getSection()] : 0);
     Vals.push_back(getEncodedVisibility(F));
+    Vals.push_back(F->hasCollector() ? CollectorMap[F->getCollector()] : 0);
     
     unsigned AbbrevToUse = 0;
     Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);
