Chromium Code Reviews| Index: src/IceCompileServer.cpp |
| diff --git a/src/IceCompileServer.cpp b/src/IceCompileServer.cpp |
| index d4048e9464fafaa35c406517ed31f239422882b4..03a805aa7e1d47c740d202594fa9ecb04787c3cf 100644 |
| --- a/src/IceCompileServer.cpp |
| +++ b/src/IceCompileServer.cpp |
| @@ -15,6 +15,10 @@ |
| #include <iostream> |
| #include <thread> |
| +// Include code to handle converting textual bitcod records to binary (for |
|
Jim Stichnoth
2015/06/22 20:02:47
bitcode
Karl
2015/06/22 20:20:37
Done.
|
| +// 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() {} |
|
Jim Stichnoth
2015/06/22 20:02:47
"() {}" ==> "() = default;" for ctor and dtor
Karl
2015/06/22 20:20:37
Done.
|
| + ~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()) |
|
Jim Stichnoth
2015/06/22 20:02:47
Might be clearer to do something like:
size_t Re
Karl
2015/06/22 20:20:37
Done.
|
| + Len = BitcodeBuffer.size() - Cursor; |
| + 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); |