Index: include/llvm/Bitcode/BitcodeWriterPass.h
===================================================================
--- include/llvm/Bitcode/BitcodeWriterPass.h
+++ include/llvm/Bitcode/BitcodeWriterPass.h
@@ -29,8 +29,12 @@
 ///
 /// If \c ShouldPreserveUseListOrder, encode use-list order so it can be
 /// reproduced when deserialized.
+///
+/// If \c EmitThinLTOIndex, emit the ThinLTO function index and summary
+/// into the module block.
 ModulePass *createBitcodeWriterPass(raw_ostream &Str,
-                                    bool ShouldPreserveUseListOrder = false);
+                                    bool ShouldPreserveUseListOrder = false,
+                                    bool EmitThinLTOIndex = false);
 
 /// \brief Pass for writing a module of IR out to a bitcode file.
 ///
@@ -39,6 +43,7 @@
 class BitcodeWriterPass {
   raw_ostream &OS;
   bool ShouldPreserveUseListOrder;
+  bool EmitThinLTOIndex;
 
 public:
   /// \brief Construct a bitcode writer pass around a particular output stream.
@@ -46,8 +51,10 @@
   /// If \c ShouldPreserveUseListOrder, encode use-list order so it can be
   /// reproduced when deserialized.
   explicit BitcodeWriterPass(raw_ostream &OS,
-                             bool ShouldPreserveUseListOrder = false)
-      : OS(OS), ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
+                             bool ShouldPreserveUseListOrder = false,
+                             bool EmitThinLTOIndex = false)
+      : OS(OS), ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
+        EmitThinLTOIndex(EmitThinLTOIndex) {}
 
   /// \brief Run the bitcode writer pass, and output the module to the selected
   /// output stream.
Index: include/llvm/Bitcode/ReaderWriter.h
===================================================================
--- include/llvm/Bitcode/ReaderWriter.h
+++ include/llvm/Bitcode/ReaderWriter.h
@@ -66,8 +66,12 @@
   /// If \c ShouldPreserveUseListOrder, encode the use-list order for each \a
   /// Value in \c M.  These will be reconstructed exactly when \a M is
   /// deserialized.
+  ///
+  /// If \c EmitThinLTOIndex, emit the ThinLTO function index and summary
+  /// into the module block.
   void WriteBitcodeToFile(const Module *M, raw_ostream &Out,
-                          bool ShouldPreserveUseListOrder = false);
+                          bool ShouldPreserveUseListOrder = false,
+                          bool EmitThinLTOIndex = false);
 
   /// isBitcodeWrapper - Return true if the given bytes are the magic bytes
   /// for an LLVM IR bitcode wrapper.
Index: lib/Bitcode/Writer/BitcodeWriter.cpp
===================================================================
--- lib/Bitcode/Writer/BitcodeWriter.cpp
+++ lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -2407,7 +2407,8 @@
 
 /// WriteModule - Emit the specified module to the bitstream.
 static void WriteModule(const Module *M, BitstreamWriter &Stream,
-                        bool ShouldPreserveUseListOrder) {
+                        bool ShouldPreserveUseListOrder,
+                        bool LLVM_ATTRIBUTE_UNUSED EmitThinLTOIndex) {
   Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);
 
   SmallVector<unsigned, 1> Vals;
@@ -2457,6 +2458,9 @@
     if (!F->isDeclaration())
       WriteFunction(*F, VE, Stream);
 
+  // TODO: If EmitThinLTOIndex, then emit the ThinLTO index in bitcode
+  // using information saved during function writing.
+
   Stream.ExitBlock();
 }
 
@@ -2533,7 +2537,8 @@
 /// WriteBitcodeToFile - Write the specified module to the specified output
 /// stream.
 void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out,
-                              bool ShouldPreserveUseListOrder) {
+                              bool ShouldPreserveUseListOrder,
+                              bool EmitThinLTOIndex) {
   SmallVector<char, 0> Buffer;
   Buffer.reserve(256*1024);
 
@@ -2556,7 +2561,7 @@
     Stream.Emit(0xD, 4);
 
     // Emit the module.
-    WriteModule(M, Stream, ShouldPreserveUseListOrder);
+    WriteModule(M, Stream, ShouldPreserveUseListOrder, EmitThinLTOIndex);
   }
 
   if (TT.isOSDarwin())
Index: lib/Bitcode/Writer/BitcodeWriterPass.cpp
===================================================================
--- lib/Bitcode/Writer/BitcodeWriterPass.cpp
+++ lib/Bitcode/Writer/BitcodeWriterPass.cpp
@@ -19,7 +19,7 @@
 using namespace llvm;
 
 PreservedAnalyses BitcodeWriterPass::run(Module &M) {
-  WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder);
+  WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, EmitThinLTOIndex);
   return PreservedAnalyses::all();
 }
 
@@ -27,17 +27,20 @@
   class WriteBitcodePass : public ModulePass {
     raw_ostream &OS; // raw_ostream to print on
     bool ShouldPreserveUseListOrder;
+    bool EmitThinLTOIndex;
 
   public:
     static char ID; // Pass identification, replacement for typeid
-    explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder)
+    explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
+                              bool EmitThinLTOIndex)
         : ModulePass(ID), OS(o),
-          ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
+          ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
+          EmitThinLTOIndex(EmitThinLTOIndex) {}
 
     const char *getPassName() const override { return "Bitcode Writer"; }
 
     bool runOnModule(Module &M) override {
-      WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder);
+      WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, EmitThinLTOIndex);
       return false;
     }
   };
@@ -46,6 +49,8 @@
 char WriteBitcodePass::ID = 0;
 
 ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
-                                          bool ShouldPreserveUseListOrder) {
-  return new WriteBitcodePass(Str, ShouldPreserveUseListOrder);
+                                          bool ShouldPreserveUseListOrder,
+                                          bool EmitThinLTOIndex) {
+  return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
+                              EmitThinLTOIndex);
 }