|
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