Skip to content

Commit fc61ad3

Browse files
committed
Improve error reporting
1 parent ce5ec54 commit fc61ad3

File tree

5 files changed

+34
-18
lines changed

5 files changed

+34
-18
lines changed

compiler/rustc_codegen_llvm/src/back/write.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ impl<'a> DiagnosticHandlers<'a> {
290290
handler: &'a Handler,
291291
llcx: &'a llvm::Context,
292292
module: &ModuleCodegen<ModuleLlvm>,
293-
section: CodegenDiagnosticsStage,
293+
stage: CodegenDiagnosticsStage,
294294
) -> Self {
295295
let remark_passes_all: bool;
296296
let remark_passes: Vec<CString>;
@@ -312,12 +312,12 @@ impl<'a> DiagnosticHandlers<'a> {
312312
.as_ref()
313313
// Use the .opt.yaml file suffix, which is supported by LLVM's opt-viewer.
314314
.map(|dir| {
315-
let section = match section {
315+
let stage_suffix = match stage {
316316
CodegenDiagnosticsStage::Codegen => "codegen",
317317
CodegenDiagnosticsStage::Opt => "opt",
318318
CodegenDiagnosticsStage::LTO => "lto",
319319
};
320-
dir.join(format!("{}.{section}.opt.yaml", module.name))
320+
dir.join(format!("{}.{stage_suffix}.opt.yaml", module.name))
321321
})
322322
.and_then(|dir| dir.to_str().and_then(|p| CString::new(p).ok()));
323323

compiler/rustc_codegen_ssa/messages.ftl

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ codegen_ssa_create_temp_dir = couldn't create a temp dir: {$error}
2121
2222
codegen_ssa_erroneous_constant = erroneous constant encountered
2323
24+
codegen_ssa_error_creating_remark_dir = failed to create remark directory: {$error}
25+
2426
codegen_ssa_expected_used_symbol = expected `used`, `used(compiler)` or `used(linker)`
2527
2628
codegen_ssa_extern_funcs_not_found = some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified

compiler/rustc_codegen_ssa/src/back/write.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use rustc_span::symbol::sym;
3535
use rustc_span::{BytePos, FileName, InnerSpan, Pos, Span};
3636
use rustc_target::spec::{MergeFunctions, SanitizerSet};
3737

38+
use crate::errors::ErrorCreatingRemarkDir;
3839
use std::any::Any;
3940
use std::borrow::Cow;
4041
use std::fs;
@@ -1046,10 +1047,11 @@ fn start_executing_work<B: ExtraBackendMethods>(
10461047
let backend_features = tcx.global_backend_features(());
10471048

10481049
let remark_dir = if let Some(ref dir) = sess.opts.unstable_opts.remark_dir {
1049-
// Should this be here?
1050-
// Can this conflict with a parallel attempt to create this directory?
1051-
fs::create_dir_all(dir).expect("Cannot create remark directory");
1052-
Some(dir.canonicalize().expect("Cannot canonicalize remark directory"))
1050+
let result = fs::create_dir_all(dir).and_then(|_| dir.canonicalize());
1051+
match result {
1052+
Ok(dir) => Some(dir),
1053+
Err(error) => sess.emit_fatal(ErrorCreatingRemarkDir { error }),
1054+
}
10531055
} else {
10541056
None
10551057
};

compiler/rustc_codegen_ssa/src/errors.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1023,3 +1023,9 @@ pub struct TargetFeatureSafeTrait {
10231023
#[label(codegen_ssa_label_def)]
10241024
pub def: Span,
10251025
}
1026+
1027+
#[derive(Diagnostic)]
1028+
#[diag(codegen_ssa_error_creating_remark_dir)]
1029+
pub struct ErrorCreatingRemarkDir {
1030+
pub error: std::io::Error,
1031+
}

compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp

+17-11
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)