Index: src/IceBrowserCompileServer.h |
diff --git a/src/IceBrowserCompileServer.h b/src/IceBrowserCompileServer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..034a1af4cf856f44586549f39d49ea2a7031e7a2 |
--- /dev/null |
+++ b/src/IceBrowserCompileServer.h |
@@ -0,0 +1,95 @@ |
+//===- subzero/src/IceBrowserCompileServer.h - Browser server ---*- C++ -*-===// |
+// |
+// The Subzero Code Generator |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+// |
+// This file declares the browser-specific compile server. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H |
+#define SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H |
+ |
+#include <thread> |
+ |
+#include "IceClFlags.h" |
+#include "IceClFlagsExtra.h" |
+#include "IceCompileServer.h" |
+#include "IceDefs.h" |
+#include "IceELFStreamer.h" |
+ |
+namespace llvm { |
+class QueueStreamer; |
+class raw_fd_ostream; |
+}; |
+ |
+namespace Ice { |
+ |
+// The browser variant of the compile server. |
+// Compared to the commandline version, this version gets compile |
+// requests over IPC. Each compile request will have a slimmed down |
+// version of argc, argv while other flags are set to defaults that |
+// make sense in the browser case. The output file is specified via |
+// a posix FD, and input bytes are pushed to the server. |
+class BrowserCompileServer : public CompileServer { |
+ BrowserCompileServer() = delete; |
+ BrowserCompileServer(const BrowserCompileServer &) = delete; |
+ BrowserCompileServer &operator=(const BrowserCompileServer &) = delete; |
+ |
+public: |
+ explicit BrowserCompileServer(Compiler &Comp) |
+ : CompileServer(Comp), InputStream(nullptr) {} |
+ |
+ ~BrowserCompileServer() final; |
+ |
+ void run() final; |
+ |
+ // Parse and set up the flags for compile jobs. |
+ void getParsedFlags(uint32_t NumThreads, int argc, char **argv); |
+ |
+ // Creates the streams + context and starts the compile thread, |
+ // handing off the streams + context. |
+ void startCompileThread(int OutFD); |
+ |
+ // Call to push more bytes to the current input stream. |
+ // Returns false on success and true on error. |
+ bool pushInputBytes(const void *Data, size_t NumBytes); |
+ |
+ // Notify the input stream of EOF. |
+ void endInputStream(); |
+ |
+ // Wait for the compile thread to complete then reset the state. |
+ void waitForCompileThread() { |
+ CompileThread.join(); |
+ LastError.assign(Ctx->getErrorStatus()->value()); |
+ // Reset some state. The InputStream is deleted by the compiler |
+ // so only reset this to nullptr. Free and flush the rest |
+ // of the streams. |
+ InputStream = nullptr; |
+ EmitStream.reset(nullptr); |
+ ELFStream.reset(nullptr); |
+ } |
+ |
+private: |
+ // This currently only handles a single compile request, hence one copy |
+ // of the state. |
+ std::unique_ptr<GlobalContext> Ctx; |
+ // A borrowed reference to the current InputStream. The compiler owns |
+ // the actual reference so the server must be careful not to access |
+ // after the compiler is done. |
+ llvm::QueueStreamer *InputStream; |
+ std::unique_ptr<Ostream> LogStream; |
+ std::unique_ptr<llvm::raw_fd_ostream> EmitStream; |
+ std::unique_ptr<ELFStreamer> ELFStream; |
+ ClFlags Flags; |
+ ClFlagsExtra ExtraFlags; |
+ std::thread CompileThread; |
+}; |
+ |
+} // end of namespace Ice |
+ |
+#endif // SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H |