Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: src/IceCompileServer.cpp

Issue 1190413004: Allow pnacl-sz to be compiled to textual bitcode records. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« Makefile.standalone ('K') | « Makefile.standalone ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« Makefile.standalone ('K') | « Makefile.standalone ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698