| 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 |
| 11 /// \brief Defines the basic commandline-based compile server. | 11 /// \brief Defines the basic commandline-based compile server. |
| 12 /// | 12 /// |
| 13 //===----------------------------------------------------------------------===// | 13 //===----------------------------------------------------------------------===// |
| 14 | 14 |
| 15 #include "IceCompileServer.h" | 15 #include "IceCompileServer.h" |
| 16 | 16 |
| 17 #include "IceClFlags.h" | 17 #include "IceClFlags.h" |
| 18 #include "IceClFlagsExtra.h" | |
| 19 #include "IceELFStreamer.h" | 18 #include "IceELFStreamer.h" |
| 20 #include "IceGlobalContext.h" | 19 #include "IceGlobalContext.h" |
| 21 #include "LinuxMallocProfiling.h" | 20 #include "LinuxMallocProfiling.h" |
| 22 | 21 |
| 23 #ifdef __clang__ | 22 #ifdef __clang__ |
| 24 #pragma clang diagnostic push | 23 #pragma clang diagnostic push |
| 25 #pragma clang diagnostic ignored "-Wunused-parameter" | 24 #pragma clang diagnostic ignored "-Wunused-parameter" |
| 26 #endif // __clang__ | 25 #endif // __clang__ |
| 27 | 26 |
| 28 #include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" | 27 #include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 std::error_code &EC) { | 88 std::error_code &EC) { |
| 90 if (Filename == "-") { | 89 if (Filename == "-") { |
| 91 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)); |
| 92 } else { | 91 } else { |
| 93 return std::unique_ptr<Ostream>( | 92 return std::unique_ptr<Ostream>( |
| 94 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)); |
| 95 } | 94 } |
| 96 } | 95 } |
| 97 | 96 |
| 98 ErrorCodes getReturnValue(ErrorCodes Val) { | 97 ErrorCodes getReturnValue(ErrorCodes Val) { |
| 99 if (GlobalContext::ExtraFlags.getAlwaysExitSuccess()) | 98 if (GlobalContext::Flags.getAlwaysExitSuccess()) |
| 100 return EC_None; | 99 return EC_None; |
| 101 return Val; | 100 return Val; |
| 102 } | 101 } |
| 103 | 102 |
| 104 // Reports fatal error message, and then exits with success status 0. | 103 // Reports fatal error message, and then exits with success status 0. |
| 105 void reportFatalErrorThenExitSuccess(void *UserData, const std::string &Reason, | 104 void reportFatalErrorThenExitSuccess(void *UserData, const std::string &Reason, |
| 106 bool GenCrashDag) { | 105 bool GenCrashDag) { |
| 107 (void)UserData; | 106 (void)UserData; |
| 108 (void)GenCrashDag; | 107 (void)GenCrashDag; |
| 109 | 108 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 } | 152 } |
| 154 | 153 |
| 155 } // end of anonymous namespace | 154 } // end of anonymous namespace |
| 156 | 155 |
| 157 void CLCompileServer::run() { | 156 void CLCompileServer::run() { |
| 158 if (BuildDefs::dump()) { | 157 if (BuildDefs::dump()) { |
| 159 llvm::sys::PrintStackTraceOnErrorSignal(); | 158 llvm::sys::PrintStackTraceOnErrorSignal(); |
| 160 } | 159 } |
| 161 ClFlags::parseFlags(argc, argv); | 160 ClFlags::parseFlags(argc, argv); |
| 162 ClFlags &Flags = GlobalContext::Flags; | 161 ClFlags &Flags = GlobalContext::Flags; |
| 163 ClFlagsExtra &ExtraFlags = GlobalContext::ExtraFlags; | |
| 164 ClFlags::getParsedClFlags(Flags); | 162 ClFlags::getParsedClFlags(Flags); |
| 165 ClFlags::getParsedClFlagsExtra(ExtraFlags); | |
| 166 | 163 |
| 167 // Override report_fatal_error if we want to exit with 0 status. | 164 // Override report_fatal_error if we want to exit with 0 status. |
| 168 if (ExtraFlags.getAlwaysExitSuccess()) | 165 if (Flags.getAlwaysExitSuccess()) |
| 169 llvm::install_fatal_error_handler(reportFatalErrorThenExitSuccess, this); | 166 llvm::install_fatal_error_handler(reportFatalErrorThenExitSuccess, this); |
| 170 | 167 |
| 171 std::error_code EC; | 168 std::error_code EC; |
| 172 std::unique_ptr<Ostream> Ls = makeStream(ExtraFlags.getLogFilename(), EC); | 169 std::unique_ptr<Ostream> Ls = makeStream(Flags.getLogFilename(), EC); |
| 173 if (EC) { | 170 if (EC) { |
| 174 llvm::report_fatal_error("Unable to open log file"); | 171 llvm::report_fatal_error("Unable to open log file"); |
| 175 } | 172 } |
| 176 Ls->SetUnbuffered(); | 173 Ls->SetUnbuffered(); |
| 177 Ice::LinuxMallocProfiling _(Flags.getNumTranslationThreads(), Ls.get()); | 174 Ice::LinuxMallocProfiling _(Flags.getNumTranslationThreads(), Ls.get()); |
| 178 | 175 |
| 179 std::unique_ptr<Ostream> Os; | 176 std::unique_ptr<Ostream> Os; |
| 180 std::unique_ptr<ELFStreamer> ELFStr; | 177 std::unique_ptr<ELFStreamer> ELFStr; |
| 181 switch (Flags.getOutFileType()) { | 178 switch (Flags.getOutFileType()) { |
| 182 case FT_Elf: { | 179 case FT_Elf: { |
| 183 if (ExtraFlags.getOutputFilename() == "-") { | 180 if (Flags.getOutputFilename() == "-" && !Flags.getGenerateBuildAtts()) { |
| 184 *Ls << "Error: writing binary ELF to stdout is unsupported\n"; | 181 *Ls << "Error: writing binary ELF to stdout is unsupported\n"; |
| 185 return transferErrorCode(getReturnValue(Ice::EC_Args)); | 182 return transferErrorCode(getReturnValue(Ice::EC_Args)); |
| 186 } | 183 } |
| 187 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( |
| 188 ExtraFlags.getOutputFilename(), EC, llvm::sys::fs::F_None)); | 185 Flags.getOutputFilename(), EC, llvm::sys::fs::F_None)); |
| 189 if (EC) { | 186 if (EC) { |
| 190 *Ls << "Failed to open output file: " << ExtraFlags.getOutputFilename() | 187 *Ls << "Failed to open output file: " << Flags.getOutputFilename() |
| 191 << ":\n" << EC.message() << "\n"; | 188 << ":\n" << EC.message() << "\n"; |
| 192 return transferErrorCode(getReturnValue(Ice::EC_Args)); | 189 return transferErrorCode(getReturnValue(Ice::EC_Args)); |
| 193 } | 190 } |
| 194 ELFStr.reset(new ELFStreamer(*FdOs.get())); | 191 ELFStr.reset(new ELFStreamer(*FdOs.get())); |
| 195 Os.reset(FdOs.release()); | 192 Os.reset(FdOs.release()); |
| 196 // 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 |
| 197 // preferred buffer size. Set to something non-zero. | 194 // preferred buffer size. Set to something non-zero. |
| 198 Os->SetBufferSize(1 << 14); | 195 Os->SetBufferSize(1 << 14); |
| 199 } break; | 196 } break; |
| 200 case FT_Asm: | 197 case FT_Asm: |
| 201 case FT_Iasm: { | 198 case FT_Iasm: { |
| 202 Os = makeStream(ExtraFlags.getOutputFilename(), EC); | 199 Os = makeStream(Flags.getOutputFilename(), EC); |
| 203 if (EC) { | 200 if (EC) { |
| 204 *Ls << "Failed to open output file: " << ExtraFlags.getOutputFilename() | 201 *Ls << "Failed to open output file: " << Flags.getOutputFilename() |
| 205 << ":\n" << EC.message() << "\n"; | 202 << ":\n" << EC.message() << "\n"; |
| 206 return transferErrorCode(getReturnValue(Ice::EC_Args)); | 203 return transferErrorCode(getReturnValue(Ice::EC_Args)); |
| 207 } | 204 } |
| 208 Os->SetUnbuffered(); | 205 Os->SetUnbuffered(); |
| 209 } break; | 206 } break; |
| 210 } | 207 } |
| 211 | 208 |
| 212 if (BuildDefs::minimal() && ExtraFlags.getBitcodeAsText()) | 209 if (BuildDefs::minimal() && Flags.getBitcodeAsText()) |
| 213 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 " |
| 214 "minimal build"); | 211 "minimal build"); |
| 215 | 212 |
| 216 IceString StrError; | 213 IceString StrError; |
| 217 std::unique_ptr<llvm::DataStreamer> InputStream( | 214 std::unique_ptr<llvm::DataStreamer> InputStream( |
| 218 (!BuildDefs::minimal() && ExtraFlags.getBitcodeAsText()) | 215 (!BuildDefs::minimal() && Flags.getBitcodeAsText()) |
| 219 ? TextDataStreamer::create(ExtraFlags.getIRFilename(), &StrError) | 216 ? TextDataStreamer::create(Flags.getIRFilename(), &StrError) |
| 220 : llvm::getDataFileStreamer(ExtraFlags.getIRFilename(), &StrError)); | 217 : llvm::getDataFileStreamer(Flags.getIRFilename(), &StrError)); |
| 221 if (!StrError.empty() || !InputStream) { | 218 if (!StrError.empty() || !InputStream) { |
| 222 llvm::SMDiagnostic Err(ExtraFlags.getIRFilename(), | 219 llvm::SMDiagnostic Err(Flags.getIRFilename(), llvm::SourceMgr::DK_Error, |
| 223 llvm::SourceMgr::DK_Error, StrError); | 220 StrError); |
| 224 Err.print(ExtraFlags.getAppName().c_str(), *Ls); | 221 Err.print(Flags.getAppName().c_str(), *Ls); |
| 225 return transferErrorCode(getReturnValue(Ice::EC_Bitcode)); | 222 return transferErrorCode(getReturnValue(Ice::EC_Bitcode)); |
| 226 } | 223 } |
| 227 | 224 |
| 228 if (ExtraFlags.getGenerateBuildAtts()) { | 225 if (Flags.getGenerateBuildAtts()) { |
| 229 dumpBuildAttributes(*Os.get()); | 226 dumpBuildAttributes(*Os.get()); |
| 230 return transferErrorCode(getReturnValue(Ice::EC_None)); | 227 return transferErrorCode(getReturnValue(Ice::EC_None)); |
| 231 } | 228 } |
| 232 | 229 |
| 233 Ctx.reset(new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get())); | 230 Ctx.reset(new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get())); |
| 234 if (Ctx->getFlags().getNumTranslationThreads() != 0) { | 231 if (Ctx->getFlags().getNumTranslationThreads() != 0) { |
| 235 std::thread CompileThread([this, &ExtraFlags, &InputStream]() { | 232 std::thread CompileThread([this, &Flags, &InputStream]() { |
| 236 Ctx->initParserThread(); | 233 Ctx->initParserThread(); |
| 237 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); | 234 getCompiler().run(Flags, *Ctx.get(), std::move(InputStream)); |
| 238 }); | 235 }); |
| 239 CompileThread.join(); | 236 CompileThread.join(); |
| 240 } else { | 237 } else { |
| 241 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); | 238 getCompiler().run(Flags, *Ctx.get(), std::move(InputStream)); |
| 242 } | 239 } |
| 243 transferErrorCode( | 240 transferErrorCode( |
| 244 getReturnValue(static_cast<ErrorCodes>(Ctx->getErrorStatus()->value()))); | 241 getReturnValue(static_cast<ErrorCodes>(Ctx->getErrorStatus()->value()))); |
| 245 Ctx->dumpConstantLookupCounts(); | 242 Ctx->dumpConstantLookupCounts(); |
| 246 } | 243 } |
| 247 | 244 |
| 248 } // end of namespace Ice | 245 } // end of namespace Ice |
| OLD | NEW |