//===- subzero/src/IceCompileServer.h - Compile server ----------*- C++ -*-===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file declares the compile server. Given a compiler implementation,
/// it dispatches compile requests to the implementation.
///
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_ICECOMPILESERVER_H
#define SUBZERO_SRC_ICECOMPILESERVER_H

#include "IceCompiler.h"
#include "IceDefs.h"
#include "IceGlobalContext.h"

namespace llvm {
class DataStreamer;
class raw_fd_ostream;
}

namespace Ice {

/// A CompileServer awaits compile requests, and dispatches the requests
/// to a given Compiler. Each request is paired with an input stream,
/// a context (which has the output stream), and a set of arguments.
/// The CompileServer takes over the current thread to listen to requests,
/// and compile requests are handled on separate threads.
///
/// Currently, this only handles a single request.
///
/// When run on the commandline, it receives and therefore dispatches
/// the request immediately.  When run in the browser, it blocks waiting
/// for a request.
class CompileServer {
  CompileServer() = delete;
  CompileServer(const CompileServer &) = delete;
  CompileServer &operator=(const CompileServer &) = delete;

public:
  explicit CompileServer(Compiler &Comp) : Comp(Comp) {}

  virtual ~CompileServer() = default;

  virtual void run() = 0;

  virtual ErrorCode &getErrorCode() { return LastError; }
  void transferErrorCode(ErrorCodes Code) { LastError.assign(Code); }

protected:
  Compiler &getCompiler() const { return Comp; }

  Compiler &Comp;
  ErrorCode LastError;
};

/// Commandline variant of the compile server.
class CLCompileServer : public CompileServer {
  CLCompileServer() = delete;
  CLCompileServer(const CLCompileServer &) = delete;
  CLCompileServer &operator=(const CLCompileServer &) = delete;

public:
  CLCompileServer(Compiler &Comp, int argc, char **argv)
      : CompileServer(Comp), argc(argc), argv(argv) {}

  ~CLCompileServer() final = default;

  void run() final;

private:
  int argc;
  char **argv;
  std::unique_ptr<GlobalContext> Ctx;
};

} // end of namespace Ice

#endif // SUBZERO_SRC_ICECOMPILESERVER_H
