Add support for writing LLVM IR to a specified BitstreamWriter.
authorChris Lattner <sabre@nondot.org>
Fri, 19 Dec 2008 18:37:59 +0000 (18:37 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 19 Dec 2008 18:37:59 +0000 (18:37 +0000)
Patch by Lukasz Janyst!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61251 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Bitcode/BitstreamWriter.h
include/llvm/Bitcode/ReaderWriter.h
lib/Bitcode/Writer/BitcodeWriter.cpp

index f76bb88dee8c8214850e9e189074872636109125..7fd23fe4166d8a5c41b26326cc468ed3458df060 100644 (file)
@@ -76,6 +76,9 @@ public:
       BlockInfoRecords.pop_back();
     }
   }
+
+  std::vector<unsigned char> &getBuffer() { return Out; }
+
   //===--------------------------------------------------------------------===//
   // Basic Primitives for emitting bits to the stream.
   //===--------------------------------------------------------------------===//
index f18b4fc090f6fe80cb8ffcf411e2f9c54927bbd0..7b1e06f655311ad8d0815f3592d3942f911bb0a1 100644 (file)
@@ -22,6 +22,7 @@ namespace llvm {
   class ModuleProvider;
   class MemoryBuffer;
   class ModulePass;
+  class BitstreamWriter;
   class raw_ostream;
   
   /// getBitcodeModuleProvider - Read the header of the specified bitcode buffer
@@ -45,6 +46,10 @@ namespace llvm {
   /// raw output stream.
   void WriteBitcodeToFile(const Module *M, raw_ostream &Out);
 
+  /// WriteBitcodeToStream - Write the specified module to the specified
+  /// raw output stream.
+  void WriteBitcodeToStream(const Module *M, BitstreamWriter &Stream);
+
   /// CreateBitcodeWriterPass - Create and return a pass that writes the module
   /// to the specified ostream.
   ModulePass *CreateBitcodeWriterPass(std::ostream &Str);
index adf49a524a38d83552036fbaac81a029b007785e..b98dab70924f90a357d345a8b43b33b22dee3863 100644 (file)
@@ -1355,7 +1355,23 @@ void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out) {
   BitstreamWriter Stream(Buffer);
   
   Buffer.reserve(256*1024);
+
+  WriteBitcodeToStream( M, Stream );
+  
+  // If writing to stdout, set binary mode.
+  if (&llvm::outs() == &Out)
+    sys::Program::ChangeStdoutToBinary();
+
+  // Write the generated bitstream to "Out".
+  Out.write((char*)&Buffer.front(), Buffer.size());
   
+  // Make sure it hits disk now.
+  Out.flush();
+}
+
+/// WriteBitcodeToStream - Write the specified module to the specified output
+/// stream.
+void llvm::WriteBitcodeToStream(const Module *M, BitstreamWriter &Stream) {
   // If this is darwin, emit a file header and trailer if needed.
   bool isDarwin = M->getTargetTriple().find("-darwin") != std::string::npos;
   if (isDarwin)
@@ -1373,16 +1389,5 @@ void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out) {
   WriteModule(M, Stream);
 
   if (isDarwin)
-    EmitDarwinBCTrailer(Stream, Buffer.size());
-
-  
-  // If writing to stdout, set binary mode.
-  if (&llvm::outs() == &Out)
-    sys::Program::ChangeStdoutToBinary();
-
-  // Write the generated bitstream to "Out".
-  Out.write((char*)&Buffer.front(), Buffer.size());
-  
-  // Make sure it hits disk now.
-  Out.flush();
+    EmitDarwinBCTrailer(Stream, Stream.getBuffer().size());
 }