| 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
 | 
| 
 |