|
9 | 9 | #![feature(once_cell)] |
10 | 10 | #![recursion_limit = "256"] |
11 | 11 | #![allow(rustc::potential_query_instability)] |
| 12 | +#![deny(rustc::untranslatable_diagnostic)] |
| 13 | +#![deny(rustc::diagnostic_outside_of_impl)] |
12 | 14 |
|
13 | 15 | #[macro_use] |
14 | 16 | extern crate tracing; |
15 | 17 |
|
16 | 18 | pub extern crate rustc_plugin_impl as plugin; |
17 | 19 |
|
18 | 20 | use rustc_ast as ast; |
19 | | -use rustc_codegen_ssa::{traits::CodegenBackend, CodegenResults}; |
| 21 | +use rustc_codegen_ssa::{traits::CodegenBackend, CodegenErrors, CodegenResults}; |
20 | 22 | use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry}; |
21 | 23 | use rustc_data_structures::sync::SeqCst; |
22 | 24 | use rustc_errors::registry::{InvalidErrorCode, Registry}; |
@@ -56,6 +58,12 @@ use std::time::Instant; |
56 | 58 |
|
57 | 59 | pub mod args; |
58 | 60 | pub mod pretty; |
| 61 | +mod session_diagnostics; |
| 62 | + |
| 63 | +use crate::session_diagnostics::{ |
| 64 | + RLinkEmptyVersionNumber, RLinkEncodingVersionMismatch, RLinkRustcVersionMismatch, |
| 65 | + RLinkWrongFileType, RlinkNotAFile, RlinkUnableToRead, |
| 66 | +}; |
59 | 67 |
|
60 | 68 | /// Exit status code used for successful compilation and help output. |
61 | 69 | pub const EXIT_SUCCESS: i32 = 0; |
@@ -581,18 +589,35 @@ pub fn try_process_rlink(sess: &Session, compiler: &interface::Compiler) -> Comp |
581 | 589 | sess.init_crate_types(collect_crate_types(sess, &[])); |
582 | 590 | let outputs = compiler.build_output_filenames(sess, &[]); |
583 | 591 | let rlink_data = fs::read(file).unwrap_or_else(|err| { |
584 | | - sess.fatal(&format!("failed to read rlink file: {}", err)); |
| 592 | + sess.emit_fatal(RlinkUnableToRead { err }); |
585 | 593 | }); |
586 | 594 | let codegen_results = match CodegenResults::deserialize_rlink(rlink_data) { |
587 | 595 | Ok(codegen) => codegen, |
588 | | - Err(error) => { |
589 | | - sess.fatal(&format!("Could not deserialize .rlink file: {error}")); |
| 596 | + Err(err) => { |
| 597 | + match err { |
| 598 | + CodegenErrors::WrongFileType => sess.emit_fatal(RLinkWrongFileType), |
| 599 | + CodegenErrors::EmptyVersionNumber => { |
| 600 | + sess.emit_fatal(RLinkEmptyVersionNumber) |
| 601 | + } |
| 602 | + CodegenErrors::EncodingVersionMismatch { version_array, rlink_version } => { |
| 603 | + sess.emit_fatal(RLinkEncodingVersionMismatch { |
| 604 | + version_array, |
| 605 | + rlink_version, |
| 606 | + }) |
| 607 | + } |
| 608 | + CodegenErrors::RustcVersionMismatch { rustc_version, current_version } => { |
| 609 | + sess.emit_fatal(RLinkRustcVersionMismatch { |
| 610 | + rustc_version, |
| 611 | + current_version, |
| 612 | + }) |
| 613 | + } |
| 614 | + }; |
590 | 615 | } |
591 | 616 | }; |
592 | 617 | let result = compiler.codegen_backend().link(sess, codegen_results, &outputs); |
593 | 618 | abort_on_err(result, sess); |
594 | 619 | } else { |
595 | | - sess.fatal("rlink must be a file") |
| 620 | + sess.emit_fatal(RlinkNotAFile {}) |
596 | 621 | } |
597 | 622 | Compilation::Stop |
598 | 623 | } else { |
|
0 commit comments