1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceCompileServer.h - Compile server ----------*- C++ -*-===// 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker // 5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker // 8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker /// 10*03ce13f7SAndroid Build Coastguard Worker /// \file 11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares the compile server. 12*03ce13f7SAndroid Build Coastguard Worker /// 13*03ce13f7SAndroid Build Coastguard Worker /// Given a compiler implementation, it dispatches compile requests to the 14*03ce13f7SAndroid Build Coastguard Worker /// implementation. 15*03ce13f7SAndroid Build Coastguard Worker /// 16*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 17*03ce13f7SAndroid Build Coastguard Worker 18*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICECOMPILESERVER_H 19*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICECOMPILESERVER_H 20*03ce13f7SAndroid Build Coastguard Worker 21*03ce13f7SAndroid Build Coastguard Worker #include "IceCompiler.h" 22*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h" 23*03ce13f7SAndroid Build Coastguard Worker #include "IceGlobalContext.h" 24*03ce13f7SAndroid Build Coastguard Worker 25*03ce13f7SAndroid Build Coastguard Worker namespace llvm { 26*03ce13f7SAndroid Build Coastguard Worker class DataStreamer; 27*03ce13f7SAndroid Build Coastguard Worker class raw_fd_ostream; 28*03ce13f7SAndroid Build Coastguard Worker } // namespace llvm 29*03ce13f7SAndroid Build Coastguard Worker 30*03ce13f7SAndroid Build Coastguard Worker namespace Ice { 31*03ce13f7SAndroid Build Coastguard Worker 32*03ce13f7SAndroid Build Coastguard Worker /// A CompileServer awaits compile requests, and dispatches the requests to a 33*03ce13f7SAndroid Build Coastguard Worker /// given Compiler. Each request is paired with an input stream, a context 34*03ce13f7SAndroid Build Coastguard Worker /// (which has the output stream), and a set of arguments. The CompileServer 35*03ce13f7SAndroid Build Coastguard Worker /// takes over the current thread to listen to requests, and compile requests 36*03ce13f7SAndroid Build Coastguard Worker /// are handled on separate threads. 37*03ce13f7SAndroid Build Coastguard Worker /// 38*03ce13f7SAndroid Build Coastguard Worker /// Currently, this only handles a single request. 39*03ce13f7SAndroid Build Coastguard Worker /// 40*03ce13f7SAndroid Build Coastguard Worker /// When run on the commandline, it receives and therefore dispatches the 41*03ce13f7SAndroid Build Coastguard Worker /// request immediately. When run in the browser, it blocks waiting for a 42*03ce13f7SAndroid Build Coastguard Worker /// request. 43*03ce13f7SAndroid Build Coastguard Worker class CompileServer { 44*03ce13f7SAndroid Build Coastguard Worker CompileServer(const CompileServer &) = delete; 45*03ce13f7SAndroid Build Coastguard Worker CompileServer &operator=(const CompileServer &) = delete; 46*03ce13f7SAndroid Build Coastguard Worker 47*03ce13f7SAndroid Build Coastguard Worker public: 48*03ce13f7SAndroid Build Coastguard Worker CompileServer() = default; 49*03ce13f7SAndroid Build Coastguard Worker 50*03ce13f7SAndroid Build Coastguard Worker virtual ~CompileServer() = default; 51*03ce13f7SAndroid Build Coastguard Worker 52*03ce13f7SAndroid Build Coastguard Worker virtual void run() = 0; 53*03ce13f7SAndroid Build Coastguard Worker getErrorCode()54*03ce13f7SAndroid Build Coastguard Worker virtual ErrorCode &getErrorCode() { return LastError; } transferErrorCode(ErrorCodes Code)55*03ce13f7SAndroid Build Coastguard Worker void transferErrorCode(ErrorCodes Code) { LastError.assign(Code); } 56*03ce13f7SAndroid Build Coastguard Worker runAndReturnErrorCode()57*03ce13f7SAndroid Build Coastguard Worker int runAndReturnErrorCode() { 58*03ce13f7SAndroid Build Coastguard Worker run(); 59*03ce13f7SAndroid Build Coastguard Worker return getErrorCode().value(); 60*03ce13f7SAndroid Build Coastguard Worker } 61*03ce13f7SAndroid Build Coastguard Worker 62*03ce13f7SAndroid Build Coastguard Worker protected: getCompiler()63*03ce13f7SAndroid Build Coastguard Worker Compiler &getCompiler() { return Comp; } 64*03ce13f7SAndroid Build Coastguard Worker 65*03ce13f7SAndroid Build Coastguard Worker Compiler Comp; 66*03ce13f7SAndroid Build Coastguard Worker ErrorCode LastError; 67*03ce13f7SAndroid Build Coastguard Worker }; 68*03ce13f7SAndroid Build Coastguard Worker 69*03ce13f7SAndroid Build Coastguard Worker /// Commandline variant of the compile server. 70*03ce13f7SAndroid Build Coastguard Worker class CLCompileServer : public CompileServer { 71*03ce13f7SAndroid Build Coastguard Worker CLCompileServer() = delete; 72*03ce13f7SAndroid Build Coastguard Worker CLCompileServer(const CLCompileServer &) = delete; 73*03ce13f7SAndroid Build Coastguard Worker CLCompileServer &operator=(const CLCompileServer &) = delete; 74*03ce13f7SAndroid Build Coastguard Worker 75*03ce13f7SAndroid Build Coastguard Worker public: CLCompileServer(int argc,char ** argv)76*03ce13f7SAndroid Build Coastguard Worker CLCompileServer(int argc, char **argv) : argc(argc), argv(argv) {} 77*03ce13f7SAndroid Build Coastguard Worker 78*03ce13f7SAndroid Build Coastguard Worker ~CLCompileServer() final = default; 79*03ce13f7SAndroid Build Coastguard Worker 80*03ce13f7SAndroid Build Coastguard Worker void run() final; 81*03ce13f7SAndroid Build Coastguard Worker 82*03ce13f7SAndroid Build Coastguard Worker private: 83*03ce13f7SAndroid Build Coastguard Worker int argc; 84*03ce13f7SAndroid Build Coastguard Worker char **argv; 85*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<GlobalContext> Ctx; 86*03ce13f7SAndroid Build Coastguard Worker }; 87*03ce13f7SAndroid Build Coastguard Worker 88*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice 89*03ce13f7SAndroid Build Coastguard Worker 90*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICECOMPILESERVER_H 91