Index: src/IceCompileServer.cpp |
diff --git a/src/IceCompileServer.cpp b/src/IceCompileServer.cpp |
index cf398d41dc8b197f93a2fa69015c122b881e39e9..25b8092bf256e886936f95e8a95c634d2f589f1e 100644 |
--- a/src/IceCompileServer.cpp |
+++ b/src/IceCompileServer.cpp |
@@ -30,13 +30,13 @@ namespace Ice { |
namespace { |
-std::unique_ptr<Ostream> getStream(const IceString &Filename) { |
- std::ofstream Ofs; |
- if (Filename != "-") { |
- Ofs.open(Filename.c_str(), std::ofstream::out); |
- return std::unique_ptr<Ostream>(new llvm::raw_os_ostream(Ofs)); |
- } else { |
+std::unique_ptr<Ostream> makeStream(const IceString &Filename, |
+ std::error_code &EC) { |
+ if (Filename == "-") { |
return std::unique_ptr<Ostream>(new llvm::raw_os_ostream(std::cout)); |
+ } else { |
+ return std::unique_ptr<Ostream>( |
+ new llvm::raw_fd_ostream(Filename, EC, llvm::sys::fs::F_None)); |
} |
} |
@@ -55,7 +55,11 @@ void CLCompileServer::run() { |
ClFlags::getParsedClFlags(Flags); |
ClFlags::getParsedClFlagsExtra(ExtraFlags); |
- std::unique_ptr<Ostream> Ls = getStream(ExtraFlags.getLogFilename()); |
+ std::error_code EC; |
+ std::unique_ptr<Ostream> Ls = makeStream(ExtraFlags.getLogFilename(), EC); |
+ if (EC) { |
+ llvm::report_fatal_error("Unable to open log file"); |
+ } |
Ls->SetUnbuffered(); |
std::unique_ptr<Ostream> Os; |
std::unique_ptr<ELFStreamer> ELFStr; |
@@ -65,7 +69,6 @@ void CLCompileServer::run() { |
*Ls << "Error: writing binary ELF to stdout is unsupported\n"; |
return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_Args)); |
} |
- std::error_code EC; |
std::unique_ptr<llvm::raw_fd_ostream> FdOs(new llvm::raw_fd_ostream( |
ExtraFlags.getOutputFilename(), EC, llvm::sys::fs::F_None)); |
if (EC) { |
@@ -81,7 +84,12 @@ void CLCompileServer::run() { |
} break; |
case FT_Asm: |
case FT_Iasm: { |
- Os = getStream(ExtraFlags.getOutputFilename()); |
+ Os = makeStream(ExtraFlags.getOutputFilename(), EC); |
+ if (EC) { |
+ *Ls << "Failed to open output file: " << ExtraFlags.getOutputFilename() |
+ << ":\n" << EC.message() << "\n"; |
+ return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_Args)); |
+ } |
Os->SetUnbuffered(); |
} break; |
} |
@@ -96,8 +104,8 @@ void CLCompileServer::run() { |
return transferErrorCode(getReturnValue(ExtraFlags, Ice::EC_Bitcode)); |
} |
- Ctx.reset(new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get(), |
- Flags)); |
+ Ctx.reset( |
+ new GlobalContext(Ls.get(), Os.get(), Ls.get(), ELFStr.get(), Flags)); |
if (Ctx->getFlags().getNumTranslationThreads() != 0) { |
std::thread CompileThread([this, &ExtraFlags, &InputStream]() { |
Ctx->initParserThread(); |