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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
86 new llvm::raw_fd_ostream(Filename, EC, llvm::sys::fs::F_None)); | 86 new llvm::raw_fd_ostream(Filename, EC, llvm::sys::fs::F_None)); |
87 } | 87 } |
88 } | 88 } |
89 | 89 |
90 ErrorCodes getReturnValue(const Ice::ClFlagsExtra &Flags, ErrorCodes Val) { | 90 ErrorCodes getReturnValue(const Ice::ClFlagsExtra &Flags, ErrorCodes Val) { |
91 if (Flags.getAlwaysExitSuccess()) | 91 if (Flags.getAlwaysExitSuccess()) |
92 return EC_None; | 92 return EC_None; |
93 return Val; | 93 return Val; |
94 } | 94 } |
95 | 95 |
96 // Reports fatal error message, and then exits with success status 0. | |
97 void reportFatalErrorThenExitSuccess(void *UserData, | |
98 const std::string &Reason, | |
99 bool gen_crash_diag) { | |
Jim Stichnoth
2015/09/30 21:32:13
Should probably be GenCrashDiag or something.
But
Karl
2015/09/30 22:02:21
Marking UserData and gen_crash_dag as unused. Surp
| |
100 // Note: This code is (mostly) copied from llvm/lib/Support/ErrorHandling.cpp | |
101 | |
102 // Blast the result out to stderr. We don't try hard to make sure this | |
103 // succeeds (e.g. handling EINTR) and we can't use errs() here because | |
104 // raw ostreams can call report_fatal_error. | |
105 llvm::SmallVector<char, 64> Buffer; | |
106 llvm::raw_svector_ostream OS(Buffer); | |
107 OS << "LLVM ERROR: " << Reason << "\n"; | |
108 llvm::StringRef MessageStr = OS.str(); | |
109 ssize_t written = ::write(2, MessageStr.data(), MessageStr.size()); | |
110 (void)written; // If something went wrong, we deliberately just give up. | |
111 | |
112 // If we reached here, we are failing ungracefully. Run the interrupt handlers | |
113 // to make sure any special cleanups get done, in particular that we remove | |
114 // files registered with RemoveFileOnSignal. | |
115 llvm::sys::RunInterruptHandlers(); | |
116 | |
117 exit(0); | |
118 } | |
119 | |
96 } // end of anonymous namespace | 120 } // end of anonymous namespace |
97 | 121 |
98 void CLCompileServer::run() { | 122 void CLCompileServer::run() { |
99 if (BuildDefs::dump()) { | 123 if (BuildDefs::dump()) { |
100 llvm::sys::PrintStackTraceOnErrorSignal(); | 124 llvm::sys::PrintStackTraceOnErrorSignal(); |
101 } | 125 } |
102 ClFlags::parseFlags(argc, argv); | 126 ClFlags::parseFlags(argc, argv); |
103 ClFlags Flags; | 127 ClFlags Flags; |
104 ClFlagsExtra ExtraFlags; | 128 ClFlagsExtra ExtraFlags; |
105 ClFlags::getParsedClFlags(Flags); | 129 ClFlags::getParsedClFlags(Flags); |
106 ClFlags::getParsedClFlagsExtra(ExtraFlags); | 130 ClFlags::getParsedClFlagsExtra(ExtraFlags); |
107 | 131 |
132 // Override report_fatal_error if we want to exit with 0 status. | |
133 if (ExtraFlags.getAlwaysExitSuccess()) | |
134 llvm::install_fatal_error_handler(reportFatalErrorThenExitSuccess, this); | |
135 | |
108 std::error_code EC; | 136 std::error_code EC; |
109 std::unique_ptr<Ostream> Ls = makeStream(ExtraFlags.getLogFilename(), EC); | 137 std::unique_ptr<Ostream> Ls = makeStream(ExtraFlags.getLogFilename(), EC); |
110 if (EC) { | 138 if (EC) { |
111 llvm::report_fatal_error("Unable to open log file"); | 139 llvm::report_fatal_error("Unable to open log file"); |
112 } | 140 } |
113 Ls->SetUnbuffered(); | 141 Ls->SetUnbuffered(); |
114 std::unique_ptr<Ostream> Os; | 142 std::unique_ptr<Ostream> Os; |
115 std::unique_ptr<ELFStreamer> ELFStr; | 143 std::unique_ptr<ELFStreamer> ELFStr; |
116 switch (Flags.getOutFileType()) { | 144 switch (Flags.getOutFileType()) { |
117 case FT_Elf: { | 145 case FT_Elf: { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
169 }); | 197 }); |
170 CompileThread.join(); | 198 CompileThread.join(); |
171 } else { | 199 } else { |
172 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); | 200 getCompiler().run(ExtraFlags, *Ctx.get(), std::move(InputStream)); |
173 } | 201 } |
174 transferErrorCode(getReturnValue( | 202 transferErrorCode(getReturnValue( |
175 ExtraFlags, static_cast<ErrorCodes>(Ctx->getErrorStatus()->value()))); | 203 ExtraFlags, static_cast<ErrorCodes>(Ctx->getErrorStatus()->value()))); |
176 } | 204 } |
177 | 205 |
178 } // end of namespace Ice | 206 } // end of namespace Ice |
OLD | NEW |