@@ -1877,17 +1877,17 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
18771877 void *DiagnosticHandlerContext,
18781878 bool RemarkAllPasses,
18791879 std::vector<std::string> RemarkPasses,
1880+ std::unique_ptr<ToolOutputFile> RemarksFile,
18801881 std::unique_ptr<llvm::remarks::RemarkStreamer> RemarkStreamer,
1881- std::unique_ptr<LLVMRemarkStreamer> LlvmRemarkStreamer,
1882- std::unique_ptr<ToolOutputFile> RemarksFile
1882+ std::unique_ptr<LLVMRemarkStreamer> LlvmRemarkStreamer
18831883 )
18841884 : DiagnosticHandlerCallback(DiagnosticHandlerCallback),
18851885 DiagnosticHandlerContext (DiagnosticHandlerContext),
18861886 RemarkAllPasses(RemarkAllPasses),
18871887 RemarkPasses(std::move(RemarkPasses)),
1888+ RemarksFile(std::move(RemarksFile)),
18881889 RemarkStreamer(std::move(RemarkStreamer)),
1889- LlvmRemarkStreamer(std::move(LlvmRemarkStreamer)),
1890- RemarksFile(std::move(RemarksFile)) {}
1890+ LlvmRemarkStreamer(std::move(LlvmRemarkStreamer)) {}
18911891
18921892 virtual bool handleDiagnostics (const DiagnosticInfo &DI) override {
18931893 if (this ->LlvmRemarkStreamer ) {
@@ -1939,11 +1939,11 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19391939 bool RemarkAllPasses = false ;
19401940 std::vector<std::string> RemarkPasses;
19411941
1942- // Since LlvmRemarkStreamer contains a pointer to RemarkStreamer, the ordering of the two
1942+ // Since LlvmRemarkStreamer contains a pointer to RemarkStreamer, the ordering of the three
19431943 // members below is important.
1944+ std::unique_ptr<ToolOutputFile> RemarksFile;
19441945 std::unique_ptr<llvm::remarks::RemarkStreamer> RemarkStreamer;
19451946 std::unique_ptr<LLVMRemarkStreamer> LlvmRemarkStreamer;
1946- std::unique_ptr<ToolOutputFile> RemarksFile;
19471947 };
19481948
19491949 std::vector<std::string> Passes;
@@ -1953,9 +1953,9 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19531953 }
19541954
19551955 // We need to hold onto both the streamers and the opened file
1956+ std::unique_ptr<ToolOutputFile> RemarkFile;
19561957 std::unique_ptr<llvm::remarks::RemarkStreamer> RemarkStreamer;
19571958 std::unique_ptr<LLVMRemarkStreamer> LlvmRemarkStreamer;
1958- std::unique_ptr<ToolOutputFile> RemarkFile;
19591959
19601960 if (RemarkFilePath != nullptr ) {
19611961 std::error_code EC;
@@ -1964,6 +1964,12 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19641964 EC,
19651965 llvm::sys::fs::OF_TextWithCRLF
19661966 );
1967+ if (EC) {
1968+ std::string Error = std::string (" Cannot create remark file: " ) +
1969+ toString (errorCodeToError (EC));
1970+ report_fatal_error (Twine (Error));
1971+ }
1972+
19671973 // Do not delete the file after we gather remarks
19681974 RemarkFile->keep ();
19691975
@@ -1974,8 +1980,8 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19741980 );
19751981 if (Error E = RemarkSerializer.takeError ())
19761982 {
1977- // Is this OK?
1978- report_fatal_error (" Cannot create remark serializer " );
1983+ std::string Error = std::string ( " Cannot create remark serializer: " ) + toString ( std::move (E));
1984+ report_fatal_error (Twine (Error) );
19791985 }
19801986 RemarkStreamer = std::make_unique<llvm::remarks::RemarkStreamer>(std::move (*RemarkSerializer));
19811987 LlvmRemarkStreamer = std::make_unique<LLVMRemarkStreamer>(*RemarkStreamer);
@@ -1986,9 +1992,9 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19861992 DiagnosticHandlerContext,
19871993 RemarkAllPasses,
19881994 Passes,
1995+ std::move (RemarkFile),
19891996 std::move(RemarkStreamer),
1990- std::move(LlvmRemarkStreamer),
1991- std::move(RemarkFile)
1997+ std::move(LlvmRemarkStreamer)
19921998 ));
19931999}
19942000
0 commit comments