Index: src/IceCompileServer.cpp |
diff --git a/src/IceCompileServer.cpp b/src/IceCompileServer.cpp |
index d4048e9464fafaa35c406517ed31f239422882b4..066dcd63c62a2561eb8f2fa1b06bee4f6f39e737 100644 |
--- a/src/IceCompileServer.cpp |
+++ b/src/IceCompileServer.cpp |
@@ -15,6 +15,10 @@ |
#include <iostream> |
#include <thread> |
+#ifdef INPUT_IS_TEXTUAL_BITCODE |
Jim Stichnoth
2015/06/21 07:09:34
Can this be included unconditionally? (maybe with
Karl
2015/06/22 19:52:02
Done.
|
+#include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" |
+#endif |
+ |
#include "llvm/Support/FileSystem.h" |
#include "llvm/Support/raw_os_ostream.h" |
#include "llvm/Support/Signals.h" |
@@ -31,6 +35,52 @@ namespace Ice { |
namespace { |
+#ifdef INPUT_IS_TEXTUAL_BITCODE |
Jim Stichnoth
2015/06/21 07:09:34
Would it be possible to define TextDataStreamer ev
Karl
2015/06/22 19:52:02
Done.
|
+#if PNACL_BROWSER_TRANSLATOR |
+#error Can not define INPUT_IS_TEXTUAL_BITCODE when building browswer translator |
+#endif |
+ |
+// 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() {} |
+ ~TextDataStreamer() final {} |
+ 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; |
+ if (Cursor + Len > BitcodeBuffer.size()) |
+ Len = BitcodeBuffer.size() - Cursor; |
+ for (size_t i = 0; i < Len; ++i) |
+ Buf[i] = BitcodeBuffer[Cursor + i]; |
+ Cursor += Len; |
+ return Len; |
+} |
+#endif |
+ |
std::unique_ptr<Ostream> makeStream(const IceString &Filename, |
std::error_code &EC) { |
if (Filename == "-") { |
@@ -100,7 +150,12 @@ void CLCompileServer::run() { |
IceString StrError; |
std::unique_ptr<llvm::DataStreamer> InputStream( |
- llvm::getDataFileStreamer(ExtraFlags.getIRFilename(), &StrError)); |
+#ifdef INPUT_IS_TEXTUAL_BITCODE |
Jim Stichnoth
2015/06/21 07:09:34
Hopefully you could use this instead?
INPUT_IS_TE
Karl
2015/06/22 19:52:01
Done.
|
+ TextDataStreamer::create(ExtraFlags.getIRFilename(), &StrError) |
+#else |
+ llvm::getDataFileStreamer(ExtraFlags.getIRFilename(), &StrError) |
+#endif |
+ ); |
if (!StrError.empty() || !InputStream) { |
llvm::SMDiagnostic Err(ExtraFlags.getIRFilename(), |
llvm::SourceMgr::DK_Error, StrError); |