xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceBrowserCompileServer.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceBrowserCompileServer.h - Browser 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 browser-based compile server.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H
16*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "IceClFlags.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceCompileServer.h"
20*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h"
21*03ce13f7SAndroid Build Coastguard Worker #include "IceELFStreamer.h"
22*03ce13f7SAndroid Build Coastguard Worker 
23*03ce13f7SAndroid Build Coastguard Worker #include <atomic>
24*03ce13f7SAndroid Build Coastguard Worker #include <thread>
25*03ce13f7SAndroid Build Coastguard Worker 
26*03ce13f7SAndroid Build Coastguard Worker namespace llvm {
27*03ce13f7SAndroid Build Coastguard Worker class QueueStreamer;
28*03ce13f7SAndroid Build Coastguard Worker class raw_fd_ostream;
29*03ce13f7SAndroid Build Coastguard Worker } // end of namespace llvm
30*03ce13f7SAndroid Build Coastguard Worker 
31*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
32*03ce13f7SAndroid Build Coastguard Worker 
33*03ce13f7SAndroid Build Coastguard Worker /// The browser variant of the compile server. Compared to the commandline
34*03ce13f7SAndroid Build Coastguard Worker /// version, this version gets compile requests over IPC. Each compile request
35*03ce13f7SAndroid Build Coastguard Worker /// will have a slimmed down version of argc, argv while other flags are set to
36*03ce13f7SAndroid Build Coastguard Worker /// defaults that make sense in the browser case. The output file is specified
37*03ce13f7SAndroid Build Coastguard Worker /// via a posix FD, and input bytes are pushed to the server.
38*03ce13f7SAndroid Build Coastguard Worker class BrowserCompileServer : public CompileServer {
39*03ce13f7SAndroid Build Coastguard Worker   BrowserCompileServer(const BrowserCompileServer &) = delete;
40*03ce13f7SAndroid Build Coastguard Worker   BrowserCompileServer &operator=(const BrowserCompileServer &) = delete;
41*03ce13f7SAndroid Build Coastguard Worker   class StringStream;
42*03ce13f7SAndroid Build Coastguard Worker 
43*03ce13f7SAndroid Build Coastguard Worker public:
BrowserCompileServer()44*03ce13f7SAndroid Build Coastguard Worker   BrowserCompileServer() : HadError(false) {}
45*03ce13f7SAndroid Build Coastguard Worker 
46*03ce13f7SAndroid Build Coastguard Worker   ~BrowserCompileServer() final;
47*03ce13f7SAndroid Build Coastguard Worker 
48*03ce13f7SAndroid Build Coastguard Worker   void run() final;
49*03ce13f7SAndroid Build Coastguard Worker 
50*03ce13f7SAndroid Build Coastguard Worker   ErrorCode &getErrorCode() final;
51*03ce13f7SAndroid Build Coastguard Worker 
52*03ce13f7SAndroid Build Coastguard Worker   /// Parse and set up the flags for compile jobs.
53*03ce13f7SAndroid Build Coastguard Worker   void getParsedFlags(bool UseNumThreadsFromBrowser, uint32_t NumThreads,
54*03ce13f7SAndroid Build Coastguard Worker                       int argc, const char *const *argv);
55*03ce13f7SAndroid Build Coastguard Worker 
56*03ce13f7SAndroid Build Coastguard Worker   /// Creates the streams + context and starts the compile thread, handing off
57*03ce13f7SAndroid Build Coastguard Worker   /// the streams + context.
58*03ce13f7SAndroid Build Coastguard Worker   void startCompileThread(int OutFD);
59*03ce13f7SAndroid Build Coastguard Worker 
60*03ce13f7SAndroid Build Coastguard Worker   /// Call to push more bytes to the current input stream. Returns false on
61*03ce13f7SAndroid Build Coastguard Worker   /// success and true on error.
62*03ce13f7SAndroid Build Coastguard Worker   bool pushInputBytes(const void *Data, size_t NumBytes);
63*03ce13f7SAndroid Build Coastguard Worker 
64*03ce13f7SAndroid Build Coastguard Worker   /// Notify the input stream of EOF.
65*03ce13f7SAndroid Build Coastguard Worker   void endInputStream();
66*03ce13f7SAndroid Build Coastguard Worker 
67*03ce13f7SAndroid Build Coastguard Worker   /// Wait for the compile thread to complete then reset the state.
waitForCompileThread()68*03ce13f7SAndroid Build Coastguard Worker   void waitForCompileThread() {
69*03ce13f7SAndroid Build Coastguard Worker     CompileThread.join();
70*03ce13f7SAndroid Build Coastguard Worker     if (Ctx->getErrorStatus()->value())
71*03ce13f7SAndroid Build Coastguard Worker       LastError.assign(Ctx->getErrorStatus()->value());
72*03ce13f7SAndroid Build Coastguard Worker     // Reset some state. The InputStream is deleted by the compiler so only
73*03ce13f7SAndroid Build Coastguard Worker     // reset this to nullptr. Free and flush the rest of the streams.
74*03ce13f7SAndroid Build Coastguard Worker     InputStream = nullptr;
75*03ce13f7SAndroid Build Coastguard Worker     EmitStream.reset(nullptr);
76*03ce13f7SAndroid Build Coastguard Worker     ELFStream.reset(nullptr);
77*03ce13f7SAndroid Build Coastguard Worker   }
78*03ce13f7SAndroid Build Coastguard Worker 
getErrorStream()79*03ce13f7SAndroid Build Coastguard Worker   StringStream &getErrorStream() { return *ErrorStream; }
80*03ce13f7SAndroid Build Coastguard Worker 
81*03ce13f7SAndroid Build Coastguard Worker   void setFatalError(const std::string &Reason);
82*03ce13f7SAndroid Build Coastguard Worker 
83*03ce13f7SAndroid Build Coastguard Worker private:
84*03ce13f7SAndroid Build Coastguard Worker   class StringStream {
85*03ce13f7SAndroid Build Coastguard Worker   public:
StringStream()86*03ce13f7SAndroid Build Coastguard Worker     StringStream() : StrBuf(Buffer) {}
getContents()87*03ce13f7SAndroid Build Coastguard Worker     const std::string &getContents() { return StrBuf.str(); }
getStream()88*03ce13f7SAndroid Build Coastguard Worker     Ostream &getStream() { return StrBuf; }
89*03ce13f7SAndroid Build Coastguard Worker 
90*03ce13f7SAndroid Build Coastguard Worker   private:
91*03ce13f7SAndroid Build Coastguard Worker     std::string Buffer;
92*03ce13f7SAndroid Build Coastguard Worker     llvm::raw_string_ostream StrBuf;
93*03ce13f7SAndroid Build Coastguard Worker   };
94*03ce13f7SAndroid Build Coastguard Worker   /// This currently only handles a single compile request, hence one copy of
95*03ce13f7SAndroid Build Coastguard Worker   /// the state.
96*03ce13f7SAndroid Build Coastguard Worker   std::unique_ptr<GlobalContext> Ctx;
97*03ce13f7SAndroid Build Coastguard Worker   /// A borrowed reference to the current InputStream. The compiler owns the
98*03ce13f7SAndroid Build Coastguard Worker   /// actual reference so the server must be careful not to access after the
99*03ce13f7SAndroid Build Coastguard Worker   /// compiler is done.
100*03ce13f7SAndroid Build Coastguard Worker   llvm::QueueStreamer *InputStream = nullptr;
101*03ce13f7SAndroid Build Coastguard Worker   std::unique_ptr<Ostream> LogStream;
102*03ce13f7SAndroid Build Coastguard Worker   std::unique_ptr<llvm::raw_fd_ostream> EmitStream;
103*03ce13f7SAndroid Build Coastguard Worker   std::unique_ptr<StringStream> ErrorStream;
104*03ce13f7SAndroid Build Coastguard Worker   std::unique_ptr<ELFStreamer> ELFStream;
105*03ce13f7SAndroid Build Coastguard Worker   std::thread CompileThread;
106*03ce13f7SAndroid Build Coastguard Worker   std::atomic<bool> HadError;
107*03ce13f7SAndroid Build Coastguard Worker };
108*03ce13f7SAndroid Build Coastguard Worker 
109*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
110*03ce13f7SAndroid Build Coastguard Worker 
111*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEBROWSERCOMPILESERVER_H
112