| OLD | NEW |
| 1 //===- subzero/src/IceCompileServer.cpp - Compile server ------------------===// | 1 //===- subzero/src/IceCompileServer.cpp - Compile server ------------------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 std::unique_ptr<Ostream> makeStream(const IceString &Filename, | 87 std::unique_ptr<Ostream> makeStream(const IceString &Filename, |
| 88 std::error_code &EC) { | 88 std::error_code &EC) { |
| 89 if (Filename == "-") { | 89 if (Filename == "-") { |
| 90 return std::unique_ptr<Ostream>(new llvm::raw_os_ostream(std::cout)); | 90 return std::unique_ptr<Ostream>(new llvm::raw_os_ostream(std::cout)); |
| 91 } else { | 91 } else { |
| 92 return std::unique_ptr<Ostream>( | 92 return std::unique_ptr<Ostream>( |
| 93 new llvm::raw_fd_ostream(Filename, EC, llvm::sys::fs::F_None)); | 93 new llvm::raw_fd_ostream(Filename, EC, llvm::sys::fs::F_None)); |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 | 96 |
| 97 ErrorCodes getReturnValue(const Ice::ClFlagsExtra &Flags, ErrorCodes Val) { | 97 ErrorCodes getReturnValue(ErrorCodes Val) { |
| 98 if (Flags.getAlwaysExitSuccess()) | 98 if (GlobalContext::ExtraFlags.getAlwaysExitSuccess()) |
| 99 return EC_None; | 99 return EC_None; |
| 100 return Val; | 100 return Val; |
| 101 } | 101 } |
| 102 | 102 |
| 103 // Reports fatal error message, and then exits with success status 0. | 103 // Reports fatal error message, and then exits with success status 0. |
| 104 void reportFatalErrorThenExitSuccess(void *UserData, const std::string &Reason, | 104 void reportFatalErrorThenExitSuccess(void *UserData, const std::string &Reason, |
| 105 bool GenCrashDag) { | 105 bool GenCrashDag) { |
| 106 (void)UserData; | 106 (void)UserData; |
| 107 (void)GenCrashDag; | 107 (void)GenCrashDag; |
| 108 | 108 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 } | 151 } |
| 152 } | 152 } |
| 153 | 153 |
| 154 } // end of anonymous namespace | 154 } // end of anonymous namespace |
| 155 | 155 |
| 156 void CLCompileServer::run() { | 156 void CLCompileServer::run() { |
| 157 if (BuildDefs::dump()) { | 157 if (BuildDefs::dump()) { |
| 158 llvm::sys::PrintStackTraceOnErrorSignal(); | 158 llvm::sys::PrintStackTraceOnErrorSignal(); |
| 159 } | 159 } |
| 160 ClFlags::parseFlags(argc, argv); | 160 ClFlags::parseFlags(argc, argv); |
| 161 ClFlags Flags; | 161 ClFlags &Flags = GlobalContext::Flags; |
| 162 ClFlagsExtra ExtraFlags; | 162 ClFlagsExtra &ExtraFlags = GlobalContext::ExtraFlags; |
| 163 ClFlags::getParsedClFlags(Flags); | 163 ClFlags::getParsedClFlags(Flags); |
| 164 ClFlags::getParsedClFlagsExtra(ExtraFlags); | 164 ClFlags::getParsedClFlagsExtra(ExtraFlags); |
| 165 | 165 |
| 166 // Override report_fatal_error if we want to exit with 0 status. | 166 // Override report_fatal_error if we want to exit with 0 status. |
| 167 if (ExtraFlags.getAlwaysExitSuccess()) | 167 if (ExtraFlags.getAlwaysExitSuccess()) |
| 168 llvm::install_fatal_error_handler(reportFatalErrorThenExitSuccess, this); | 168 llvm::install_fatal_error_handler(reportFatalErrorThenExitSuccess, this); |
| 169 | 169 |
| 170 std::error_code EC; | 170 std::error_code EC; |
| 171 std::unique_ptr<Ostream> Ls = makeStream(ExtraFlags.getLogFilename(), EC); | 171 std::unique_ptr<Ostream> Ls = makeStream(ExtraFlags.getLogFilename(), EC); |
| 172 if (EC) { | 172 if (EC) { |
| 173 llvm::report_fatal_error("Unable to open log file"); | 173 llvm::report_fatal_error("Unable to open log file"); |
| 174 } | 174 } |
| 175 Ls->SetUnbuffered(); | 175 Ls->SetUnbuffered(); |
| 176 std::unique_ptr<Ostream> Os; | 176 std::unique_ptr<Ostream> Os; |
| 177 std::unique_ptr<ELFStreamer> ELFStr; | 177 std::unique_ptr<ELFStreamer> ELFStr; |
| 178 switch (Flags.getOutFileType()) { | 178 switch (Flags.getOutFileType()) { |
| 179 case FT_Elf: { | 179 case FT_Elf: { |
| 180 if (ExtraFlags.getOutputFilename() == "-") { | 180 if (ExtraFlags.getOutputFilename() == "-") { |
| 181 *Ls << "Error: writing binary ELF to stdout is unsupported\n"; | 181 *Ls << "Error: writing binary ELF to stdout is unsupported\n"; |
| 182 return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_Args)); | 182 return transferErrorCode(getReturnValue(Ice::EC_Args)); |
| 183 } | 183 } |
| 184 std::unique_ptr<llvm::raw_fd_ostream> FdOs(new llvm::raw_fd_ostream( | 184 std::unique_ptr<llvm::raw_fd_ostream> FdOs(new llvm::raw_fd_ostream( |
| 185 ExtraFlags.getOutputFilename(), EC, llvm::sys::fs::F_None)); | 185 ExtraFlags.getOutputFilename(), EC, llvm::sys::fs::F_None)); |
| 186 if (EC) { | 186 if (EC) { |
| 187 *Ls << "Failed to open output file: " << ExtraFlags.getOutputFilename() | 187 *Ls << "Failed to open output file: " << ExtraFlags.getOutputFilename() |
| 188 << ":\n" << EC.message() << "\n"; | 188 << ":\n" << EC.message() << "\n"; |
| 189 return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_Args)); | 189 return transferErrorCode(getReturnValue(Ice::EC_Args)); |
| 190 } | 190 } |
| 191 ELFStr.reset(new ELFStreamer(*FdOs.get())); | 191 ELFStr.reset(new ELFStreamer(*FdOs.get())); |
| 192 Os.reset(FdOs.release()); | 192 Os.reset(FdOs.release()); |
| 193 // NaCl sets st_blksize to 0, and LLVM uses that to pick the default | 193 // NaCl sets st_blksize to 0, and LLVM uses that to pick the default |
| 194 // preferred buffer size. Set to something non-zero. | 194 // preferred buffer size. Set to something non-zero. |
| 195 Os->SetBufferSize(1 << 14); | 195 Os->SetBufferSize(1 << 14); |
| 196 } break; | 196 } break; |
| 197 case FT_Asm: | 197 case FT_Asm: |
| 198 case FT_Iasm: { | 198 case FT_Iasm: { |
| 199 Os = makeStream(ExtraFlags.getOutputFilename(), EC); | 199 Os = makeStream(ExtraFlags.getOutputFilename(), EC); |
| 200 if (EC) { | 200 if (EC) { |
| 201 *Ls << "Failed to open output file: " << ExtraFlags.getOutputFilename() | 201 *Ls << "Failed to open output file: " << ExtraFlags.getOutputFilename() |
| 202 << ":\n" << EC.message() << "\n"; | 202 << ":\n" << EC.message() << "\n"; |
| 203 return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_Args)); | 203 return transferErrorCode(getReturnValue(Ice::EC_Args)); |
| 204 } | 204 } |
| 205 Os->SetUnbuffered(); | 205 Os->SetUnbuffered(); |
| 206 } break; | 206 } break; |
| 207 } | 207 } |
| 208 | 208 |
| 209 if (BuildDefs::minimal() && ExtraFlags.getBitcodeAsText()) | 209 if (BuildDefs::minimal() && ExtraFlags.getBitcodeAsText()) |
| 210 llvm::report_fatal_error("Can't specify 'bitcode-as-text' flag in " | 210 llvm::report_fatal_error("Can't specify 'bitcode-as-text' flag in " |
| 211 "minimal build"); | 211 "minimal build"); |
| 212 | 212 |
| 213 IceString StrError; | 213 IceString StrError; |
| 214 std::unique_ptr<llvm::DataStreamer> InputStream( | 214 std::unique_ptr<llvm::DataStreamer> InputStream( |
| 215 (!BuildDefs::minimal() && ExtraFlags.getBitcodeAsText()) | 215 (!BuildDefs::minimal() && ExtraFlags.getBitcodeAsText()) |
| 216 ? TextDataStreamer::create(ExtraFlags.getIRFilename(), &StrError) | 216 ? TextDataStreamer::create(ExtraFlags.getIRFilename(), &StrError) |
| 217 : llvm::getDataFileStreamer(ExtraFlags.getIRFilename(), &StrError)); | 217 : llvm::getDataFileStreamer(ExtraFlags.getIRFilename(), &StrError)); |
| 218 if (!StrError.empty() || !InputStream) { | 218 if (!StrError.empty() || !InputStream) { |
| 219 llvm::SMDiagnostic Err(ExtraFlags.getIRFilename(), | 219 llvm::SMDiagnostic Err(ExtraFlags.getIRFilename(), |
| 220 llvm::SourceMgr::DK_Error, StrError); | 220 llvm::SourceMgr::DK_Error, StrError); |
| 221 Err.print(ExtraFlags.getAppName().c_str(), *Ls); | 221 Err.print(ExtraFlags.getAppName().c_str(), *Ls); |
| 222 return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_Bitcode)); | 222 return transferErrorCode(getReturnValue(Ice::EC_Bitcode)); |
| 223 } | 223 } |
| 224 | 224 |
| 225 if (ExtraFlags.getGenerateBuildAtts()) { | 225 if (ExtraFlags.getGenerateBuildAtts()) { |
| 226 dumpBuildAttributes(*Os.get()); | 226 dumpBuildAttributes(*Os.get()); |
| 227 return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_None)); | 227 return transferErrorCode(getReturnValue(Ice::EC_None)); |
| 228 } | 228 } |
| 229 | 229 |
| 230 Ctx.reset( | 230 Ctx.reset(new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get())); |
| 231 new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get(), Flags)); | |
| 232 if (Ctx->getFlags().getNumTranslationThreads() != 0) { | 231 if (Ctx->getFlags().getNumTranslationThreads() != 0) { |
| 233 std::thread CompileThread([this, &ExtraFlags, &InputStream]() { | 232 std::thread CompileThread([this, &ExtraFlags, &InputStream]() { |
| 234 Ctx->initParserThread(); | 233 Ctx->initParserThread(); |
| 235 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); | 234 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); |
| 236 }); | 235 }); |
| 237 CompileThread.join(); | 236 CompileThread.join(); |
| 238 } else { | 237 } else { |
| 239 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); | 238 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); |
| 240 } | 239 } |
| 241 transferErrorCode(getReturnValue( | 240 transferErrorCode( |
| 242 ExtraFlags, static_cast<ErrorCodes>(Ctx->getErrorStatus()->value()))); | 241 getReturnValue(static_cast<ErrorCodes>(Ctx->getErrorStatus()->value()))); |
| 243 } | 242 } |
| 244 | 243 |
| 245 } // end of namespace Ice | 244 } // end of namespace Ice |
| OLD | NEW |