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