Index: src/IceCompileServer.cpp |
diff --git a/src/IceCompileServer.cpp b/src/IceCompileServer.cpp |
index d4048e9464fafaa35c406517ed31f239422882b4..cda32da2cf3ded097fef661ddd5a12a21aa82e6b 100644 |
--- a/src/IceCompileServer.cpp |
+++ b/src/IceCompileServer.cpp |
@@ -15,6 +15,10 @@ |
#include <iostream> |
#include <thread> |
+// Include code to handle converting textual bitcode records to binary (for |
+// INPUT_IS_TEXTUAL_BITCODE). |
+#include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" |
+ |
#include "llvm/Support/FileSystem.h" |
#include "llvm/Support/raw_os_ostream.h" |
#include "llvm/Support/Signals.h" |
@@ -31,6 +35,50 @@ namespace Ice { |
namespace { |
+static_assert( |
+!(INPUT_IS_TEXTUAL_BITCODE && PNACL_BROWSER_TRANSLATOR), |
+ "Can not define INPUT_IS_TEXTUAL_BITCODE when building browswer translator"); |
+ |
+// Define a SmallVector backed buffer as a data stream, so that it |
+// can hold the generated binary version of the textual bitcode in the |
+// input file. |
+class TextDataStreamer : public llvm::DataStreamer { |
+public: |
+ TextDataStreamer() = default; |
+ ~TextDataStreamer() final = default; |
+ static TextDataStreamer *create(const IceString &Filename, std::string *Err); |
+ size_t GetBytes(unsigned char *Buf, size_t Len) final; |
+private: |
+ llvm::SmallVector<char, 1024> BitcodeBuffer; |
+ size_t Cursor = 0; |
+}; |
+ |
+TextDataStreamer *TextDataStreamer::create(const IceString &Filename, |
+ std::string *Err) { |
+ TextDataStreamer *Streamer = new TextDataStreamer(); |
+ llvm::raw_string_ostream ErrStrm(*Err); |
+ if (std::error_code EC = llvm::readNaClRecordTextAndBuildBitcode( |
+ Filename, Streamer->BitcodeBuffer, &ErrStrm)) { |
+ ErrStrm << "Error: " << EC.message() << "\n"; |
+ ErrStrm.flush(); |
+ delete Streamer; |
+ return nullptr; |
+ } |
+ ErrStrm.flush(); |
+ return Streamer; |
+} |
+ |
+size_t TextDataStreamer::GetBytes(unsigned char *Buf, size_t Len) { |
+ if (Cursor >= BitcodeBuffer.size()) |
+ return 0; |
+ size_t Remaining = BitcodeBuffer.size(); |
+ Len = std::min(Len, Remaining); |
+ for (size_t i = 0; i < Len; ++i) |
+ Buf[i] = BitcodeBuffer[Cursor + i]; |
+ Cursor += Len; |
+ return Len; |
+} |
+ |
std::unique_ptr<Ostream> makeStream(const IceString &Filename, |
std::error_code &EC) { |
if (Filename == "-") { |
@@ -100,7 +148,10 @@ void CLCompileServer::run() { |
IceString StrError; |
std::unique_ptr<llvm::DataStreamer> InputStream( |
- llvm::getDataFileStreamer(ExtraFlags.getIRFilename(), &StrError)); |
+ INPUT_IS_TEXTUAL_BITCODE |
+ ? TextDataStreamer::create(ExtraFlags.getIRFilename(), &StrError) |
+ : llvm::getDataFileStreamer(ExtraFlags.getIRFilename(), &StrError) |
+ ); |
if (!StrError.empty() || !InputStream) { |
llvm::SMDiagnostic Err(ExtraFlags.getIRFilename(), |
llvm::SourceMgr::DK_Error, StrError); |