Chromium Code Reviews| 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); |