1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceCompileServer.cpp - Compile server ------------------===//
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 Defines the basic commandline-based compile server.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "IceCompileServer.h"
16*03ce13f7SAndroid Build Coastguard Worker
17*03ce13f7SAndroid Build Coastguard Worker #include "IceASanInstrumentation.h"
18*03ce13f7SAndroid Build Coastguard Worker #include "IceClFlags.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "IceELFStreamer.h"
20*03ce13f7SAndroid Build Coastguard Worker #include "IceGlobalContext.h"
21*03ce13f7SAndroid Build Coastguard Worker #include "IceRevision.h"
22*03ce13f7SAndroid Build Coastguard Worker #include "LinuxMallocProfiling.h"
23*03ce13f7SAndroid Build Coastguard Worker
24*03ce13f7SAndroid Build Coastguard Worker #ifdef __clang__
25*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic push
26*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunused-parameter"
27*03ce13f7SAndroid Build Coastguard Worker #endif // __clang__
28*03ce13f7SAndroid Build Coastguard Worker
29*03ce13f7SAndroid Build Coastguard Worker #ifdef PNACL_LLVM
30*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h"
31*03ce13f7SAndroid Build Coastguard Worker #endif // PNACL_LLVM
32*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Support/FileSystem.h"
33*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Support/Signals.h"
34*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
35*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Support/StreamingMemoryObject.h"
36*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Support/raw_os_ostream.h"
37*03ce13f7SAndroid Build Coastguard Worker
38*03ce13f7SAndroid Build Coastguard Worker #ifdef __clang__
39*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic pop
40*03ce13f7SAndroid Build Coastguard Worker #endif // __clang__
41*03ce13f7SAndroid Build Coastguard Worker
42*03ce13f7SAndroid Build Coastguard Worker #include <cstdio>
43*03ce13f7SAndroid Build Coastguard Worker #include <fstream>
44*03ce13f7SAndroid Build Coastguard Worker #include <iostream>
45*03ce13f7SAndroid Build Coastguard Worker #include <thread>
46*03ce13f7SAndroid Build Coastguard Worker
47*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
48*03ce13f7SAndroid Build Coastguard Worker
49*03ce13f7SAndroid Build Coastguard Worker namespace {
50*03ce13f7SAndroid Build Coastguard Worker
51*03ce13f7SAndroid Build Coastguard Worker // Define a SmallVector backed buffer as a data stream, so that it can hold the
52*03ce13f7SAndroid Build Coastguard Worker // generated binary version of the textual bitcode in the input file.
53*03ce13f7SAndroid Build Coastguard Worker class TextDataStreamer : public llvm::DataStreamer {
54*03ce13f7SAndroid Build Coastguard Worker public:
55*03ce13f7SAndroid Build Coastguard Worker TextDataStreamer() = default;
56*03ce13f7SAndroid Build Coastguard Worker ~TextDataStreamer() final = default;
57*03ce13f7SAndroid Build Coastguard Worker #ifdef PNACL_LLVM
58*03ce13f7SAndroid Build Coastguard Worker using CreateType = TextDataStreamer *;
59*03ce13f7SAndroid Build Coastguard Worker #else // !PNACL_LLVM
60*03ce13f7SAndroid Build Coastguard Worker using CreateType = std::unique_ptr<TextDataStreamer>;
61*03ce13f7SAndroid Build Coastguard Worker #endif // !PNACL_LLVM
62*03ce13f7SAndroid Build Coastguard Worker static CreateType create(const std::string &Filename, std::string *Err);
63*03ce13f7SAndroid Build Coastguard Worker size_t GetBytes(unsigned char *Buf, size_t Len) final;
64*03ce13f7SAndroid Build Coastguard Worker
65*03ce13f7SAndroid Build Coastguard Worker private:
66*03ce13f7SAndroid Build Coastguard Worker llvm::SmallVector<char, 1024> BitcodeBuffer;
67*03ce13f7SAndroid Build Coastguard Worker size_t Cursor = 0;
68*03ce13f7SAndroid Build Coastguard Worker };
69*03ce13f7SAndroid Build Coastguard Worker
70*03ce13f7SAndroid Build Coastguard Worker TextDataStreamer::CreateType
create(const std::string & Filename,std::string * Err)71*03ce13f7SAndroid Build Coastguard Worker TextDataStreamer::create(const std::string &Filename, std::string *Err) {
72*03ce13f7SAndroid Build Coastguard Worker #ifdef PNACL_LLVM
73*03ce13f7SAndroid Build Coastguard Worker TextDataStreamer *Streamer = new TextDataStreamer();
74*03ce13f7SAndroid Build Coastguard Worker llvm::raw_string_ostream ErrStrm(*Err);
75*03ce13f7SAndroid Build Coastguard Worker if (std::error_code EC = llvm::readNaClRecordTextAndBuildBitcode(
76*03ce13f7SAndroid Build Coastguard Worker Filename, Streamer->BitcodeBuffer, &ErrStrm)) {
77*03ce13f7SAndroid Build Coastguard Worker ErrStrm << EC.message();
78*03ce13f7SAndroid Build Coastguard Worker ErrStrm.flush();
79*03ce13f7SAndroid Build Coastguard Worker delete Streamer;
80*03ce13f7SAndroid Build Coastguard Worker return nullptr;
81*03ce13f7SAndroid Build Coastguard Worker }
82*03ce13f7SAndroid Build Coastguard Worker ErrStrm.flush();
83*03ce13f7SAndroid Build Coastguard Worker return Streamer;
84*03ce13f7SAndroid Build Coastguard Worker #else // !PNACL_LLVM
85*03ce13f7SAndroid Build Coastguard Worker return CreateType();
86*03ce13f7SAndroid Build Coastguard Worker #endif // !PNACL_LLVM
87*03ce13f7SAndroid Build Coastguard Worker }
88*03ce13f7SAndroid Build Coastguard Worker
GetBytes(unsigned char * Buf,size_t Len)89*03ce13f7SAndroid Build Coastguard Worker size_t TextDataStreamer::GetBytes(unsigned char *Buf, size_t Len) {
90*03ce13f7SAndroid Build Coastguard Worker if (Cursor >= BitcodeBuffer.size())
91*03ce13f7SAndroid Build Coastguard Worker return 0;
92*03ce13f7SAndroid Build Coastguard Worker size_t Remaining = BitcodeBuffer.size();
93*03ce13f7SAndroid Build Coastguard Worker Len = std::min(Len, Remaining);
94*03ce13f7SAndroid Build Coastguard Worker for (size_t i = 0; i < Len; ++i)
95*03ce13f7SAndroid Build Coastguard Worker Buf[i] = BitcodeBuffer[Cursor + i];
96*03ce13f7SAndroid Build Coastguard Worker Cursor += Len;
97*03ce13f7SAndroid Build Coastguard Worker return Len;
98*03ce13f7SAndroid Build Coastguard Worker }
99*03ce13f7SAndroid Build Coastguard Worker
makeStream(const std::string & Filename,std::error_code & EC)100*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<Ostream> makeStream(const std::string &Filename,
101*03ce13f7SAndroid Build Coastguard Worker std::error_code &EC) {
102*03ce13f7SAndroid Build Coastguard Worker if (Filename == "-") {
103*03ce13f7SAndroid Build Coastguard Worker return std::unique_ptr<Ostream>(new llvm::raw_os_ostream(std::cout));
104*03ce13f7SAndroid Build Coastguard Worker } else if (Filename == "/dev/stderr") {
105*03ce13f7SAndroid Build Coastguard Worker return std::unique_ptr<Ostream>(new llvm::raw_os_ostream(std::cerr));
106*03ce13f7SAndroid Build Coastguard Worker } else {
107*03ce13f7SAndroid Build Coastguard Worker return std::unique_ptr<Ostream>(
108*03ce13f7SAndroid Build Coastguard Worker new llvm::raw_fd_ostream(Filename, EC, llvm::sys::fs::F_None));
109*03ce13f7SAndroid Build Coastguard Worker }
110*03ce13f7SAndroid Build Coastguard Worker }
111*03ce13f7SAndroid Build Coastguard Worker
getReturnValue(ErrorCodes Val)112*03ce13f7SAndroid Build Coastguard Worker ErrorCodes getReturnValue(ErrorCodes Val) {
113*03ce13f7SAndroid Build Coastguard Worker if (getFlags().getAlwaysExitSuccess())
114*03ce13f7SAndroid Build Coastguard Worker return EC_None;
115*03ce13f7SAndroid Build Coastguard Worker return Val;
116*03ce13f7SAndroid Build Coastguard Worker }
117*03ce13f7SAndroid Build Coastguard Worker
118*03ce13f7SAndroid Build Coastguard Worker // Reports fatal error message, and then exits with success status 0.
reportFatalErrorThenExitSuccess(void * UserData,const std::string & Reason,bool GenCrashDag)119*03ce13f7SAndroid Build Coastguard Worker void reportFatalErrorThenExitSuccess(void *UserData, const std::string &Reason,
120*03ce13f7SAndroid Build Coastguard Worker bool GenCrashDag) {
121*03ce13f7SAndroid Build Coastguard Worker (void)UserData;
122*03ce13f7SAndroid Build Coastguard Worker (void)GenCrashDag;
123*03ce13f7SAndroid Build Coastguard Worker
124*03ce13f7SAndroid Build Coastguard Worker // Note: This code is (mostly) copied from llvm/lib/Support/ErrorHandling.cpp
125*03ce13f7SAndroid Build Coastguard Worker
126*03ce13f7SAndroid Build Coastguard Worker // Blast the result out to stderr. We don't try hard to make sure this
127*03ce13f7SAndroid Build Coastguard Worker // succeeds (e.g. handling EINTR) and we can't use errs() here because
128*03ce13f7SAndroid Build Coastguard Worker // raw ostreams can call report_fatal_error.
129*03ce13f7SAndroid Build Coastguard Worker llvm::SmallVector<char, 64> Buffer;
130*03ce13f7SAndroid Build Coastguard Worker llvm::raw_svector_ostream OS(Buffer);
131*03ce13f7SAndroid Build Coastguard Worker OS << "LLVM ERROR: " << Reason << "\n";
132*03ce13f7SAndroid Build Coastguard Worker llvm::StringRef MessageStr = OS.str();
133*03ce13f7SAndroid Build Coastguard Worker ssize_t Written =
134*03ce13f7SAndroid Build Coastguard Worker std::fwrite(MessageStr.data(), sizeof(char), MessageStr.size(), stderr);
135*03ce13f7SAndroid Build Coastguard Worker (void)Written; // If something went wrong, we deliberately just give up.
136*03ce13f7SAndroid Build Coastguard Worker
137*03ce13f7SAndroid Build Coastguard Worker // If we reached here, we are failing ungracefully. Run the interrupt handlers
138*03ce13f7SAndroid Build Coastguard Worker // to make sure any special cleanups get done, in particular that we remove
139*03ce13f7SAndroid Build Coastguard Worker // files registered with RemoveFileOnSignal.
140*03ce13f7SAndroid Build Coastguard Worker llvm::sys::RunInterruptHandlers();
141*03ce13f7SAndroid Build Coastguard Worker
142*03ce13f7SAndroid Build Coastguard Worker exit(0);
143*03ce13f7SAndroid Build Coastguard Worker }
144*03ce13f7SAndroid Build Coastguard Worker
145*03ce13f7SAndroid Build Coastguard Worker struct {
146*03ce13f7SAndroid Build Coastguard Worker const char *FlagName;
147*03ce13f7SAndroid Build Coastguard Worker bool FlagValue;
148*03ce13f7SAndroid Build Coastguard Worker } ConditionalBuildAttributes[] = {
149*03ce13f7SAndroid Build Coastguard Worker {"dump", BuildDefs::dump()},
150*03ce13f7SAndroid Build Coastguard Worker {"llvm_cl", BuildDefs::llvmCl()},
151*03ce13f7SAndroid Build Coastguard Worker {"llvm_ir", BuildDefs::llvmIr()},
152*03ce13f7SAndroid Build Coastguard Worker {"llvm_ir_as_input", BuildDefs::llvmIrAsInput()},
153*03ce13f7SAndroid Build Coastguard Worker {"minimal_build", BuildDefs::minimal()},
154*03ce13f7SAndroid Build Coastguard Worker {"browser_mode", BuildDefs::browser()}};
155*03ce13f7SAndroid Build Coastguard Worker
156*03ce13f7SAndroid Build Coastguard Worker /// Dumps values of build attributes to Stream if Stream is non-null.
dumpBuildAttributes(Ostream & Str)157*03ce13f7SAndroid Build Coastguard Worker void dumpBuildAttributes(Ostream &Str) {
158*03ce13f7SAndroid Build Coastguard Worker // List the supported targets.
159*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_TARGET(TARGET) Str << "target_" XSTRINGIFY(TARGET) "\n";
160*03ce13f7SAndroid Build Coastguard Worker #include "SZTargets.def"
161*03ce13f7SAndroid Build Coastguard Worker const char *Prefix[2] = {"no", "allow"};
162*03ce13f7SAndroid Build Coastguard Worker for (size_t i = 0; i < llvm::array_lengthof(ConditionalBuildAttributes);
163*03ce13f7SAndroid Build Coastguard Worker ++i) {
164*03ce13f7SAndroid Build Coastguard Worker const auto &A = ConditionalBuildAttributes[i];
165*03ce13f7SAndroid Build Coastguard Worker Str << Prefix[A.FlagValue] << "_" << A.FlagName << "\n";
166*03ce13f7SAndroid Build Coastguard Worker }
167*03ce13f7SAndroid Build Coastguard Worker Str << "revision_" << getSubzeroRevision() << "\n";
168*03ce13f7SAndroid Build Coastguard Worker }
169*03ce13f7SAndroid Build Coastguard Worker
170*03ce13f7SAndroid Build Coastguard Worker } // end of anonymous namespace
171*03ce13f7SAndroid Build Coastguard Worker
run()172*03ce13f7SAndroid Build Coastguard Worker void CLCompileServer::run() {
173*03ce13f7SAndroid Build Coastguard Worker if (BuildDefs::dump()) {
174*03ce13f7SAndroid Build Coastguard Worker #ifdef PNACL_LLVM
175*03ce13f7SAndroid Build Coastguard Worker llvm::sys::PrintStackTraceOnErrorSignal();
176*03ce13f7SAndroid Build Coastguard Worker #else // !PNACL_LLVM
177*03ce13f7SAndroid Build Coastguard Worker llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
178*03ce13f7SAndroid Build Coastguard Worker #endif // !PNACL_LLVM
179*03ce13f7SAndroid Build Coastguard Worker }
180*03ce13f7SAndroid Build Coastguard Worker ClFlags::parseFlags(argc, argv);
181*03ce13f7SAndroid Build Coastguard Worker ClFlags &Flags = ClFlags::Flags;
182*03ce13f7SAndroid Build Coastguard Worker ClFlags::getParsedClFlags(Flags);
183*03ce13f7SAndroid Build Coastguard Worker
184*03ce13f7SAndroid Build Coastguard Worker // Override report_fatal_error if we want to exit with 0 status.
185*03ce13f7SAndroid Build Coastguard Worker if (Flags.getAlwaysExitSuccess())
186*03ce13f7SAndroid Build Coastguard Worker llvm::install_fatal_error_handler(reportFatalErrorThenExitSuccess, this);
187*03ce13f7SAndroid Build Coastguard Worker
188*03ce13f7SAndroid Build Coastguard Worker std::error_code EC;
189*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<Ostream> Ls = makeStream(Flags.getLogFilename(), EC);
190*03ce13f7SAndroid Build Coastguard Worker if (EC) {
191*03ce13f7SAndroid Build Coastguard Worker llvm::report_fatal_error("Unable to open log file");
192*03ce13f7SAndroid Build Coastguard Worker }
193*03ce13f7SAndroid Build Coastguard Worker Ls->SetUnbuffered();
194*03ce13f7SAndroid Build Coastguard Worker Ice::LinuxMallocProfiling _(Flags.getNumTranslationThreads(), Ls.get());
195*03ce13f7SAndroid Build Coastguard Worker
196*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<Ostream> Os;
197*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<ELFStreamer> ELFStr;
198*03ce13f7SAndroid Build Coastguard Worker switch (Flags.getOutFileType()) {
199*03ce13f7SAndroid Build Coastguard Worker case FT_Elf: {
200*03ce13f7SAndroid Build Coastguard Worker if (Flags.getOutputFilename() == "-" && !Flags.getGenerateBuildAtts()) {
201*03ce13f7SAndroid Build Coastguard Worker *Ls << "Error: writing binary ELF to stdout is unsupported\n";
202*03ce13f7SAndroid Build Coastguard Worker return transferErrorCode(getReturnValue(Ice::EC_Args));
203*03ce13f7SAndroid Build Coastguard Worker }
204*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<llvm::raw_fd_ostream> FdOs(new llvm::raw_fd_ostream(
205*03ce13f7SAndroid Build Coastguard Worker Flags.getOutputFilename(), EC, llvm::sys::fs::F_None));
206*03ce13f7SAndroid Build Coastguard Worker if (EC) {
207*03ce13f7SAndroid Build Coastguard Worker *Ls << "Failed to open output file: " << Flags.getOutputFilename()
208*03ce13f7SAndroid Build Coastguard Worker << ":\n"
209*03ce13f7SAndroid Build Coastguard Worker << EC.message() << "\n";
210*03ce13f7SAndroid Build Coastguard Worker return transferErrorCode(getReturnValue(Ice::EC_Args));
211*03ce13f7SAndroid Build Coastguard Worker }
212*03ce13f7SAndroid Build Coastguard Worker ELFStr.reset(new ELFFileStreamer(*FdOs.get()));
213*03ce13f7SAndroid Build Coastguard Worker Os.reset(FdOs.release());
214*03ce13f7SAndroid Build Coastguard Worker // NaCl sets st_blksize to 0, and LLVM uses that to pick the default
215*03ce13f7SAndroid Build Coastguard Worker // preferred buffer size. Set to something non-zero.
216*03ce13f7SAndroid Build Coastguard Worker Os->SetBufferSize(1 << 14);
217*03ce13f7SAndroid Build Coastguard Worker } break;
218*03ce13f7SAndroid Build Coastguard Worker case FT_Asm:
219*03ce13f7SAndroid Build Coastguard Worker case FT_Iasm: {
220*03ce13f7SAndroid Build Coastguard Worker Os = makeStream(Flags.getOutputFilename(), EC);
221*03ce13f7SAndroid Build Coastguard Worker if (EC) {
222*03ce13f7SAndroid Build Coastguard Worker *Ls << "Failed to open output file: " << Flags.getOutputFilename()
223*03ce13f7SAndroid Build Coastguard Worker << ":\n"
224*03ce13f7SAndroid Build Coastguard Worker << EC.message() << "\n";
225*03ce13f7SAndroid Build Coastguard Worker return transferErrorCode(getReturnValue(Ice::EC_Args));
226*03ce13f7SAndroid Build Coastguard Worker }
227*03ce13f7SAndroid Build Coastguard Worker Os->SetUnbuffered();
228*03ce13f7SAndroid Build Coastguard Worker } break;
229*03ce13f7SAndroid Build Coastguard Worker }
230*03ce13f7SAndroid Build Coastguard Worker
231*03ce13f7SAndroid Build Coastguard Worker if (BuildDefs::minimal() && Flags.getBitcodeAsText())
232*03ce13f7SAndroid Build Coastguard Worker llvm::report_fatal_error("Can't specify 'bitcode-as-text' flag in "
233*03ce13f7SAndroid Build Coastguard Worker "minimal build");
234*03ce13f7SAndroid Build Coastguard Worker
235*03ce13f7SAndroid Build Coastguard Worker std::string StrError;
236*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<llvm::DataStreamer> InputStream(
237*03ce13f7SAndroid Build Coastguard Worker (!BuildDefs::minimal() && Flags.getBitcodeAsText())
238*03ce13f7SAndroid Build Coastguard Worker ? TextDataStreamer::create(Flags.getIRFilename(), &StrError)
239*03ce13f7SAndroid Build Coastguard Worker : llvm::getDataFileStreamer(Flags.getIRFilename(), &StrError));
240*03ce13f7SAndroid Build Coastguard Worker if (!StrError.empty() || !InputStream) {
241*03ce13f7SAndroid Build Coastguard Worker llvm::SMDiagnostic Err(Flags.getIRFilename(), llvm::SourceMgr::DK_Error,
242*03ce13f7SAndroid Build Coastguard Worker StrError);
243*03ce13f7SAndroid Build Coastguard Worker Err.print(Flags.getAppName().c_str(), *Ls);
244*03ce13f7SAndroid Build Coastguard Worker return transferErrorCode(getReturnValue(Ice::EC_Bitcode));
245*03ce13f7SAndroid Build Coastguard Worker }
246*03ce13f7SAndroid Build Coastguard Worker
247*03ce13f7SAndroid Build Coastguard Worker if (Flags.getGenerateBuildAtts()) {
248*03ce13f7SAndroid Build Coastguard Worker dumpBuildAttributes(*Os.get());
249*03ce13f7SAndroid Build Coastguard Worker return transferErrorCode(getReturnValue(Ice::EC_None));
250*03ce13f7SAndroid Build Coastguard Worker }
251*03ce13f7SAndroid Build Coastguard Worker
252*03ce13f7SAndroid Build Coastguard Worker Ctx.reset(new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get()));
253*03ce13f7SAndroid Build Coastguard Worker
254*03ce13f7SAndroid Build Coastguard Worker if (!BuildDefs::minimal() && getFlags().getSanitizeAddresses()) {
255*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<Instrumentation> Instr(new ASanInstrumentation(Ctx.get()));
256*03ce13f7SAndroid Build Coastguard Worker Ctx->setInstrumentation(std::move(Instr));
257*03ce13f7SAndroid Build Coastguard Worker }
258*03ce13f7SAndroid Build Coastguard Worker
259*03ce13f7SAndroid Build Coastguard Worker if (getFlags().getNumTranslationThreads() != 0) {
260*03ce13f7SAndroid Build Coastguard Worker std::thread CompileThread([this, &InputStream]() {
261*03ce13f7SAndroid Build Coastguard Worker Ctx->initParserThread();
262*03ce13f7SAndroid Build Coastguard Worker getCompiler().run(Flags, *Ctx.get(), std::move(InputStream));
263*03ce13f7SAndroid Build Coastguard Worker });
264*03ce13f7SAndroid Build Coastguard Worker CompileThread.join();
265*03ce13f7SAndroid Build Coastguard Worker } else {
266*03ce13f7SAndroid Build Coastguard Worker getCompiler().run(Flags, *Ctx.get(), std::move(InputStream));
267*03ce13f7SAndroid Build Coastguard Worker }
268*03ce13f7SAndroid Build Coastguard Worker transferErrorCode(
269*03ce13f7SAndroid Build Coastguard Worker getReturnValue(static_cast<ErrorCodes>(Ctx->getErrorStatus()->value())));
270*03ce13f7SAndroid Build Coastguard Worker Ctx->dumpConstantLookupCounts();
271*03ce13f7SAndroid Build Coastguard Worker Ctx->dumpStrings();
272*03ce13f7SAndroid Build Coastguard Worker }
273*03ce13f7SAndroid Build Coastguard Worker
274*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
275