Rollup merge of #103792 - JhonnyBillM:migrate-codegen-ssa-to-diagnostics-structs-pt2, r=davidtwco
Migrate `codegen_ssa` to diagnostics structs - [Part 2] Completes migrating `link.rs` in `codegen_ssa` module. _Part 1 - https://github.com/rust-lang/rust/pull/102612_ r? `@davidtwco`
This commit is contained in:
commit
1cb8684dde
5 changed files with 298 additions and 99 deletions
|
@ -6,11 +6,12 @@ use rustc_span::symbol::Symbol;
|
||||||
|
|
||||||
use object::read::archive::ArchiveFile;
|
use object::read::archive::ArchiveFile;
|
||||||
|
|
||||||
use std::fmt::Display;
|
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
use crate::errors::ExtractBundledLibsError;
|
||||||
|
|
||||||
pub trait ArchiveBuilderBuilder {
|
pub trait ArchiveBuilderBuilder {
|
||||||
fn new_archive_builder<'a>(&self, sess: &'a Session) -> Box<dyn ArchiveBuilder<'a> + 'a>;
|
fn new_archive_builder<'a>(&self, sess: &'a Session) -> Box<dyn ArchiveBuilder<'a> + 'a>;
|
||||||
|
|
||||||
|
@ -28,32 +29,35 @@ pub trait ArchiveBuilderBuilder {
|
||||||
is_direct_dependency: bool,
|
is_direct_dependency: bool,
|
||||||
) -> PathBuf;
|
) -> PathBuf;
|
||||||
|
|
||||||
fn extract_bundled_libs(
|
fn extract_bundled_libs<'a>(
|
||||||
&self,
|
&'a self,
|
||||||
rlib: &Path,
|
rlib: &'a Path,
|
||||||
outdir: &Path,
|
outdir: &Path,
|
||||||
bundled_lib_file_names: &FxHashSet<Symbol>,
|
bundled_lib_file_names: &FxHashSet<Symbol>,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), ExtractBundledLibsError<'_>> {
|
||||||
let message = |msg: &str, e: &dyn Display| format!("{} '{}': {}", msg, &rlib.display(), e);
|
|
||||||
let archive_map = unsafe {
|
let archive_map = unsafe {
|
||||||
Mmap::map(File::open(rlib).map_err(|e| message("failed to open file", &e))?)
|
Mmap::map(
|
||||||
.map_err(|e| message("failed to mmap file", &e))?
|
File::open(rlib)
|
||||||
|
.map_err(|e| ExtractBundledLibsError::OpenFile { rlib, error: Box::new(e) })?,
|
||||||
|
)
|
||||||
|
.map_err(|e| ExtractBundledLibsError::MmapFile { rlib, error: Box::new(e) })?
|
||||||
};
|
};
|
||||||
let archive = ArchiveFile::parse(&*archive_map)
|
let archive = ArchiveFile::parse(&*archive_map)
|
||||||
.map_err(|e| message("failed to parse archive", &e))?;
|
.map_err(|e| ExtractBundledLibsError::ParseArchive { rlib, error: Box::new(e) })?;
|
||||||
|
|
||||||
for entry in archive.members() {
|
for entry in archive.members() {
|
||||||
let entry = entry.map_err(|e| message("failed to read entry", &e))?;
|
let entry = entry
|
||||||
|
.map_err(|e| ExtractBundledLibsError::ReadEntry { rlib, error: Box::new(e) })?;
|
||||||
let data = entry
|
let data = entry
|
||||||
.data(&*archive_map)
|
.data(&*archive_map)
|
||||||
.map_err(|e| message("failed to get data from archive member", &e))?;
|
.map_err(|e| ExtractBundledLibsError::ArchiveMember { rlib, error: Box::new(e) })?;
|
||||||
let name = std::str::from_utf8(entry.name())
|
let name = std::str::from_utf8(entry.name())
|
||||||
.map_err(|e| message("failed to convert name", &e))?;
|
.map_err(|e| ExtractBundledLibsError::ConvertName { rlib, error: Box::new(e) })?;
|
||||||
if !bundled_lib_file_names.contains(&Symbol::intern(name)) {
|
if !bundled_lib_file_names.contains(&Symbol::intern(name)) {
|
||||||
continue; // We need to extract only native libraries.
|
continue; // We need to extract only native libraries.
|
||||||
}
|
}
|
||||||
std::fs::write(&outdir.join(&name), data)
|
std::fs::write(&outdir.join(&name), data)
|
||||||
.map_err(|e| message("failed to write file", &e))?;
|
.map_err(|e| ExtractBundledLibsError::WriteFile { rlib, error: Box::new(e) })?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -919,29 +919,17 @@ fn link_natively<'a>(
|
||||||
)
|
)
|
||||||
.is_some();
|
.is_some();
|
||||||
|
|
||||||
sess.note_without_error("`link.exe` returned an unexpected error");
|
sess.emit_note(errors::LinkExeUnexpectedError);
|
||||||
if is_vs_installed && has_linker {
|
if is_vs_installed && has_linker {
|
||||||
// the linker is broken
|
// the linker is broken
|
||||||
sess.note_without_error(
|
sess.emit_note(errors::RepairVSBuildTools);
|
||||||
"the Visual Studio build tools may need to be repaired \
|
sess.emit_note(errors::MissingCppBuildToolComponent);
|
||||||
using the Visual Studio installer",
|
|
||||||
);
|
|
||||||
sess.note_without_error(
|
|
||||||
"or a necessary component may be missing from the \
|
|
||||||
\"C++ build tools\" workload",
|
|
||||||
);
|
|
||||||
} else if is_vs_installed {
|
} else if is_vs_installed {
|
||||||
// the linker is not installed
|
// the linker is not installed
|
||||||
sess.note_without_error(
|
sess.emit_note(errors::SelectCppBuildToolWorkload);
|
||||||
"in the Visual Studio installer, ensure the \
|
|
||||||
\"C++ build tools\" workload is selected",
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
// visual studio is not installed
|
// visual studio is not installed
|
||||||
sess.note_without_error(
|
sess.emit_note(errors::VisualStudioNotInstalled);
|
||||||
"you may need to install Visual Studio build tools with the \
|
|
||||||
\"C++ build tools\" workload",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -954,35 +942,20 @@ fn link_natively<'a>(
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
let linker_not_found = e.kind() == io::ErrorKind::NotFound;
|
let linker_not_found = e.kind() == io::ErrorKind::NotFound;
|
||||||
|
|
||||||
let mut linker_error = {
|
|
||||||
if linker_not_found {
|
if linker_not_found {
|
||||||
sess.struct_err(&format!("linker `{}` not found", linker_path.display()))
|
sess.emit_err(errors::LinkerNotFound { linker_path, error: e });
|
||||||
} else {
|
} else {
|
||||||
sess.struct_err(&format!(
|
sess.emit_err(errors::UnableToExeLinker {
|
||||||
"could not exec the linker `{}`",
|
linker_path,
|
||||||
linker_path.display()
|
error: e,
|
||||||
))
|
command_formatted: format!("{:?}", &cmd),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
linker_error.note(&e.to_string());
|
|
||||||
|
|
||||||
if !linker_not_found {
|
|
||||||
linker_error.note(&format!("{:?}", &cmd));
|
|
||||||
}
|
|
||||||
|
|
||||||
linker_error.emit();
|
|
||||||
|
|
||||||
if sess.target.is_like_msvc && linker_not_found {
|
if sess.target.is_like_msvc && linker_not_found {
|
||||||
sess.note_without_error(
|
sess.emit_note(errors::MsvcMissingLinker);
|
||||||
"the msvc targets depend on the msvc linker \
|
sess.emit_note(errors::CheckInstalledVisualStudio);
|
||||||
but `link.exe` was not found",
|
sess.emit_note(errors::UnsufficientVSCodeProduct);
|
||||||
);
|
|
||||||
sess.note_without_error(
|
|
||||||
"please ensure that Visual Studio 2017 or later, or Build Tools \
|
|
||||||
for Visual Studio were installed with the Visual C++ option.",
|
|
||||||
);
|
|
||||||
sess.note_without_error("VS Code is a different product, and is not sufficient.");
|
|
||||||
}
|
}
|
||||||
sess.abort_if_errors();
|
sess.abort_if_errors();
|
||||||
}
|
}
|
||||||
|
@ -1007,15 +980,13 @@ fn link_natively<'a>(
|
||||||
if !prog.status.success() {
|
if !prog.status.success() {
|
||||||
let mut output = prog.stderr.clone();
|
let mut output = prog.stderr.clone();
|
||||||
output.extend_from_slice(&prog.stdout);
|
output.extend_from_slice(&prog.stdout);
|
||||||
sess.struct_warn(&format!(
|
sess.emit_warning(errors::ProcessingDymutilFailed {
|
||||||
"processing debug info with `dsymutil` failed: {}",
|
status: prog.status,
|
||||||
prog.status
|
output: escape_string(&output),
|
||||||
))
|
});
|
||||||
.note(&escape_string(&output))
|
|
||||||
.emit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => sess.fatal(&format!("unable to run `dsymutil`: {}", e)),
|
Err(error) => sess.emit_fatal(errors::UnableToRunDsymutil { error }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1092,15 +1063,14 @@ fn strip_symbols_with_external_utility<'a>(
|
||||||
if !prog.status.success() {
|
if !prog.status.success() {
|
||||||
let mut output = prog.stderr.clone();
|
let mut output = prog.stderr.clone();
|
||||||
output.extend_from_slice(&prog.stdout);
|
output.extend_from_slice(&prog.stdout);
|
||||||
sess.struct_warn(&format!(
|
sess.emit_warning(errors::StrippingDebugInfoFailed {
|
||||||
"stripping debug info with `{}` failed: {}",
|
util,
|
||||||
util, prog.status
|
status: prog.status,
|
||||||
))
|
output: escape_string(&output),
|
||||||
.note(&escape_string(&output))
|
});
|
||||||
.emit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => sess.fatal(&format!("unable to run `{}`: {}", util, e)),
|
Err(error) => sess.emit_fatal(errors::UnableToRun { util, error }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1251,7 +1221,7 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
|
||||||
)),
|
)),
|
||||||
(Some(linker), None) => {
|
(Some(linker), None) => {
|
||||||
let stem = linker.file_stem().and_then(|stem| stem.to_str()).unwrap_or_else(|| {
|
let stem = linker.file_stem().and_then(|stem| stem.to_str()).unwrap_or_else(|| {
|
||||||
sess.fatal("couldn't extract file stem from specified linker")
|
sess.emit_fatal(errors::LinkerFileStem);
|
||||||
});
|
});
|
||||||
|
|
||||||
let flavor = if stem == "emcc" {
|
let flavor = if stem == "emcc" {
|
||||||
|
@ -1378,13 +1348,9 @@ fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLib]) {
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
if !lib_args.is_empty() {
|
if !lib_args.is_empty() {
|
||||||
sess.note_without_error(
|
sess.emit_note(errors::StaticLibraryNativeArtifacts);
|
||||||
"Link against the following native artifacts when linking \
|
|
||||||
against this static library. The order and any duplication \
|
|
||||||
can be significant on some platforms.",
|
|
||||||
);
|
|
||||||
// Prefix for greppability
|
// Prefix for greppability
|
||||||
sess.note_without_error(&format!("native-static-libs: {}", &lib_args.join(" ")));
|
sess.emit_note(errors::NativeStaticLibs { arguments: lib_args.join(" ") });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1688,14 +1654,14 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty
|
||||||
match (crate_type, &sess.target.link_script) {
|
match (crate_type, &sess.target.link_script) {
|
||||||
(CrateType::Cdylib | CrateType::Executable, Some(script)) => {
|
(CrateType::Cdylib | CrateType::Executable, Some(script)) => {
|
||||||
if !sess.target.linker_flavor.is_gnu() {
|
if !sess.target.linker_flavor.is_gnu() {
|
||||||
sess.fatal("can only use link script when linking with GNU-like linker");
|
sess.emit_fatal(errors::LinkScriptUnavailable);
|
||||||
}
|
}
|
||||||
|
|
||||||
let file_name = ["rustc", &sess.target.llvm_target, "linkfile.ld"].join("-");
|
let file_name = ["rustc", &sess.target.llvm_target, "linkfile.ld"].join("-");
|
||||||
|
|
||||||
let path = tmpdir.join(file_name);
|
let path = tmpdir.join(file_name);
|
||||||
if let Err(e) = fs::write(&path, script.as_ref()) {
|
if let Err(error) = fs::write(&path, script.as_ref()) {
|
||||||
sess.fatal(&format!("failed to write link script to {}: {}", path.display(), e));
|
sess.emit_fatal(errors::LinkScriptWriteFailure { path, error });
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.arg("--script");
|
cmd.arg("--script");
|
||||||
|
@ -1841,8 +1807,8 @@ fn add_linked_symbol_object(
|
||||||
|
|
||||||
let path = tmpdir.join("symbols.o");
|
let path = tmpdir.join("symbols.o");
|
||||||
let result = std::fs::write(&path, file.write().unwrap());
|
let result = std::fs::write(&path, file.write().unwrap());
|
||||||
if let Err(e) = result {
|
if let Err(error) = result {
|
||||||
sess.fatal(&format!("failed to write {}: {}", path.display(), e));
|
sess.emit_fatal(errors::FailedToWrite { path, error });
|
||||||
}
|
}
|
||||||
cmd.add_object(&path);
|
cmd.add_object(&path);
|
||||||
}
|
}
|
||||||
|
@ -2299,14 +2265,10 @@ fn collect_natvis_visualizers(
|
||||||
visualizer_paths.push(visualizer_out_file);
|
visualizer_paths.push(visualizer_out_file);
|
||||||
}
|
}
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
sess.warn(
|
sess.emit_warning(errors::UnableToWriteDebuggerVisualizer {
|
||||||
format!(
|
path: visualizer_out_file,
|
||||||
"Unable to write debugger visualizer file `{}`: {} ",
|
error,
|
||||||
visualizer_out_file.display(),
|
});
|
||||||
error
|
|
||||||
)
|
|
||||||
.as_str(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -2484,7 +2446,7 @@ fn add_upstream_rust_crates<'a>(
|
||||||
let rlib = &src.rlib.as_ref().unwrap().0;
|
let rlib = &src.rlib.as_ref().unwrap().0;
|
||||||
archive_builder_builder
|
archive_builder_builder
|
||||||
.extract_bundled_libs(rlib, tmpdir, &bundled_libs)
|
.extract_bundled_libs(rlib, tmpdir, &bundled_libs)
|
||||||
.unwrap_or_else(|e| sess.fatal(e));
|
.unwrap_or_else(|e| sess.emit_fatal(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut last = (None, NativeLibKind::Unspecified, None);
|
let mut last = (None, NativeLibKind::Unspecified, None);
|
||||||
|
@ -2641,7 +2603,7 @@ fn add_upstream_rust_crates<'a>(
|
||||||
|| !codegen_results.crate_info.is_no_builtins.contains(&cnum);
|
|| !codegen_results.crate_info.is_no_builtins.contains(&cnum);
|
||||||
|
|
||||||
let mut archive = archive_builder_builder.new_archive_builder(sess);
|
let mut archive = archive_builder_builder.new_archive_builder(sess);
|
||||||
if let Err(e) = archive.add_archive(
|
if let Err(error) = archive.add_archive(
|
||||||
cratepath,
|
cratepath,
|
||||||
Box::new(move |f| {
|
Box::new(move |f| {
|
||||||
if f == METADATA_FILENAME {
|
if f == METADATA_FILENAME {
|
||||||
|
@ -2681,7 +2643,7 @@ fn add_upstream_rust_crates<'a>(
|
||||||
false
|
false
|
||||||
}),
|
}),
|
||||||
) {
|
) {
|
||||||
sess.fatal(&format!("failed to build archive from rlib: {}", e));
|
sess.emit_fatal(errors::RlibArchiveBuildFailure { error });
|
||||||
}
|
}
|
||||||
if archive.build(&dst) {
|
if archive.build(&dst) {
|
||||||
link_upstream(&dst);
|
link_upstream(&dst);
|
||||||
|
@ -2813,14 +2775,14 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
||||||
("arm", "watchos") => "watchos",
|
("arm", "watchos") => "watchos",
|
||||||
(_, "macos") => "macosx",
|
(_, "macos") => "macosx",
|
||||||
_ => {
|
_ => {
|
||||||
sess.err(&format!("unsupported arch `{}` for os `{}`", arch, os));
|
sess.emit_err(errors::UnsupportedArch { arch, os });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let sdk_root = match get_apple_sdk_root(sdk_name) {
|
let sdk_root = match get_apple_sdk_root(sdk_name) {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
sess.err(&e);
|
sess.emit_err(e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -2836,7 +2798,7 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_apple_sdk_root(sdk_name: &str) -> Result<String, String> {
|
fn get_apple_sdk_root(sdk_name: &str) -> Result<String, errors::AppleSdkRootError<'_>> {
|
||||||
// Following what clang does
|
// Following what clang does
|
||||||
// (https://github.com/llvm/llvm-project/blob/
|
// (https://github.com/llvm/llvm-project/blob/
|
||||||
// 296a80102a9b72c3eda80558fb78a3ed8849b341/clang/lib/Driver/ToolChains/Darwin.cpp#L1661-L1678)
|
// 296a80102a9b72c3eda80558fb78a3ed8849b341/clang/lib/Driver/ToolChains/Darwin.cpp#L1661-L1678)
|
||||||
|
@ -2886,7 +2848,7 @@ fn get_apple_sdk_root(sdk_name: &str) -> Result<String, String> {
|
||||||
|
|
||||||
match res {
|
match res {
|
||||||
Ok(output) => Ok(output.trim().to_string()),
|
Ok(output) => Ok(output.trim().to_string()),
|
||||||
Err(e) => Err(format!("failed to get {} SDK path: {}", sdk_name, e)),
|
Err(error) => Err(errors::AppleSdkRootError::SdkPath { sdk_name, error }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2919,7 +2881,7 @@ fn add_gcc_ld_path(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sess.fatal("option `-Z gcc-ld` is used even though linker flavor is not gcc");
|
sess.emit_fatal(errors::OptionGccOnly);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -354,3 +354,170 @@ impl IntoDiagnostic<'_> for LinkingFailed<'_> {
|
||||||
diag
|
diag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_link_exe_unexpected_error)]
|
||||||
|
pub struct LinkExeUnexpectedError;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_repair_vs_build_tools)]
|
||||||
|
pub struct RepairVSBuildTools;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_missing_cpp_build_tool_component)]
|
||||||
|
pub struct MissingCppBuildToolComponent;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_select_cpp_build_tool_workload)]
|
||||||
|
pub struct SelectCppBuildToolWorkload;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_visual_studio_not_installed)]
|
||||||
|
pub struct VisualStudioNotInstalled;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_linker_not_found)]
|
||||||
|
#[note]
|
||||||
|
pub struct LinkerNotFound {
|
||||||
|
pub linker_path: PathBuf,
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unable_to_exe_linker)]
|
||||||
|
#[note]
|
||||||
|
#[note(command_note)]
|
||||||
|
pub struct UnableToExeLinker {
|
||||||
|
pub linker_path: PathBuf,
|
||||||
|
pub error: Error,
|
||||||
|
pub command_formatted: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_msvc_missing_linker)]
|
||||||
|
pub struct MsvcMissingLinker;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_check_installed_visual_studio)]
|
||||||
|
pub struct CheckInstalledVisualStudio;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unsufficient_vs_code_product)]
|
||||||
|
pub struct UnsufficientVSCodeProduct;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_processing_dymutil_failed)]
|
||||||
|
#[note]
|
||||||
|
pub struct ProcessingDymutilFailed {
|
||||||
|
pub status: ExitStatus,
|
||||||
|
pub output: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unable_to_run_dsymutil)]
|
||||||
|
#[note]
|
||||||
|
pub struct UnableToRunDsymutil {
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_stripping_debu_info_failed)]
|
||||||
|
#[note]
|
||||||
|
pub struct StrippingDebugInfoFailed<'a> {
|
||||||
|
pub util: &'a str,
|
||||||
|
pub status: ExitStatus,
|
||||||
|
pub output: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unable_to_run)]
|
||||||
|
pub struct UnableToRun<'a> {
|
||||||
|
pub util: &'a str,
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_linker_file_stem)]
|
||||||
|
pub struct LinkerFileStem;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_static_library_native_artifacts)]
|
||||||
|
pub struct StaticLibraryNativeArtifacts;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_native_static_libs)]
|
||||||
|
pub struct NativeStaticLibs {
|
||||||
|
pub arguments: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_link_script_unavailable)]
|
||||||
|
pub struct LinkScriptUnavailable;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_link_script_write_failure)]
|
||||||
|
pub struct LinkScriptWriteFailure {
|
||||||
|
pub path: PathBuf,
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_failed_to_write)]
|
||||||
|
pub struct FailedToWrite {
|
||||||
|
pub path: PathBuf,
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unable_to_write_debugger_visualizer)]
|
||||||
|
pub struct UnableToWriteDebuggerVisualizer {
|
||||||
|
pub path: PathBuf,
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_rlib_archive_build_failure)]
|
||||||
|
pub struct RlibArchiveBuildFailure {
|
||||||
|
pub error: Error,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_option_gcc_only)]
|
||||||
|
pub struct OptionGccOnly;
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
pub enum ExtractBundledLibsError<'a> {
|
||||||
|
#[diag(codegen_ssa_extract_bundled_libs_open_file)]
|
||||||
|
OpenFile { rlib: &'a Path, error: Box<dyn std::error::Error> },
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_extract_bundled_libs_mmap_file)]
|
||||||
|
MmapFile { rlib: &'a Path, error: Box<dyn std::error::Error> },
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_extract_bundled_libs_parse_archive)]
|
||||||
|
ParseArchive { rlib: &'a Path, error: Box<dyn std::error::Error> },
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_extract_bundled_libs_read_entry)]
|
||||||
|
ReadEntry { rlib: &'a Path, error: Box<dyn std::error::Error> },
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_extract_bundled_libs_archive_member)]
|
||||||
|
ArchiveMember { rlib: &'a Path, error: Box<dyn std::error::Error> },
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_extract_bundled_libs_convert_name)]
|
||||||
|
ConvertName { rlib: &'a Path, error: Box<dyn std::error::Error> },
|
||||||
|
|
||||||
|
#[diag(codegen_ssa_extract_bundled_libs_write_file)]
|
||||||
|
WriteFile { rlib: &'a Path, error: Box<dyn std::error::Error> },
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_unsupported_arch)]
|
||||||
|
pub struct UnsupportedArch<'a> {
|
||||||
|
pub arch: &'a str,
|
||||||
|
pub os: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
pub enum AppleSdkRootError<'a> {
|
||||||
|
#[diag(codegen_ssa_apple_sdk_error_sdk_path)]
|
||||||
|
SdkPath { sdk_name: &'a str, error: Error },
|
||||||
|
}
|
||||||
|
|
|
@ -119,3 +119,66 @@ codegen_ssa_thorin_object_read = {$error}
|
||||||
codegen_ssa_thorin_object_write = {$error}
|
codegen_ssa_thorin_object_write = {$error}
|
||||||
codegen_ssa_thorin_gimli_read = {$error}
|
codegen_ssa_thorin_gimli_read = {$error}
|
||||||
codegen_ssa_thorin_gimli_write = {$error}
|
codegen_ssa_thorin_gimli_write = {$error}
|
||||||
|
|
||||||
|
codegen_ssa_link_exe_unexpected_error = `link.exe` returned an unexpected error
|
||||||
|
|
||||||
|
codegen_ssa_repair_vs_build_tools = the Visual Studio build tools may need to be repaired using the Visual Studio installer
|
||||||
|
|
||||||
|
codegen_ssa_missing_cpp_build_tool_component = or a necessary component may be missing from the "C++ build tools" workload
|
||||||
|
|
||||||
|
codegen_ssa_select_cpp_build_tool_workload = in the Visual Studio installer, ensure the "C++ build tools" workload is selected
|
||||||
|
|
||||||
|
codegen_ssa_visual_studio_not_installed = you may need to install Visual Studio build tools with the "C++ build tools" workload
|
||||||
|
|
||||||
|
codegen_ssa_linker_not_found = linker `{$linker_path}` not found
|
||||||
|
.note = {$error}
|
||||||
|
|
||||||
|
codegen_ssa_unable_to_exe_linker = could not exec the linker `{$linker_path}`
|
||||||
|
.note = {$error}
|
||||||
|
.command_note = {$command_formatted}
|
||||||
|
|
||||||
|
codegen_ssa_msvc_missing_linker = the msvc targets depend on the msvc linker but `link.exe` was not found
|
||||||
|
|
||||||
|
codegen_ssa_check_installed_visual_studio = please ensure that Visual Studio 2017 or later, or Build Tools for Visual Studio were installed with the Visual C++ option.
|
||||||
|
|
||||||
|
codegen_ssa_unsufficient_vs_code_product = VS Code is a different product, and is not sufficient.
|
||||||
|
|
||||||
|
codegen_ssa_processing_dymutil_failed = processing debug info with `dsymutil` failed: {$status}
|
||||||
|
.note = {$output}
|
||||||
|
|
||||||
|
codegen_ssa_unable_to_run_dsymutil = unable to run `dsymutil`: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_stripping_debu_info_failed = stripping debug info with `{$util}` failed: {$status}
|
||||||
|
.note = {$output}
|
||||||
|
|
||||||
|
codegen_ssa_unable_to_run = unable to run `{$util}`: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_linker_file_stem = couldn't extract file stem from specified linker
|
||||||
|
|
||||||
|
codegen_ssa_static_library_native_artifacts = Link against the following native artifacts when linking against this static library. The order and any duplication can be significant on some platforms.
|
||||||
|
|
||||||
|
codegen_ssa_native_static_libs = native-static-libs: {$arguments}
|
||||||
|
|
||||||
|
codegen_ssa_link_script_unavailable = can only use link script when linking with GNU-like linker
|
||||||
|
|
||||||
|
codegen_ssa_link_script_write_failure = failed to write link script to {$path}: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_failed_to_write = failed to write {$path}: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_unable_to_write_debugger_visualizer = Unable to write debugger visualizer file `{$path}`: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_rlib_archive_build_failure = failed to build archive from rlib: {$error}
|
||||||
|
|
||||||
|
codegen_ssa_option_gcc_only = option `-Z gcc-ld` is used even though linker flavor is not gcc
|
||||||
|
|
||||||
|
codegen_ssa_extract_bundled_libs_open_file = failed to open file '{$rlib}': {$error}
|
||||||
|
codegen_ssa_extract_bundled_libs_mmap_file = failed to mmap file '{$rlib}': {$error}
|
||||||
|
codegen_ssa_extract_bundled_libs_parse_archive = failed to parse archive '{$rlib}': {$error}
|
||||||
|
codegen_ssa_extract_bundled_libs_read_entry = failed to read entry '{$rlib}': {$error}
|
||||||
|
codegen_ssa_extract_bundled_libs_archive_member = failed to get data from archive member '{$rlib}': {$error}
|
||||||
|
codegen_ssa_extract_bundled_libs_convert_name = failed to convert name '{$rlib}': {$error}
|
||||||
|
codegen_ssa_extract_bundled_libs_write_file = failed to write file '{$rlib}': {$error}
|
||||||
|
|
||||||
|
codegen_ssa_unsupported_arch = unsupported arch `{$arch}` for os `{$os}`
|
||||||
|
|
||||||
|
codegen_ssa_apple_sdk_error_sdk_path = failed to get {$sdk_name} SDK path: {error}
|
||||||
|
|
|
@ -14,6 +14,7 @@ use std::fmt;
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
use std::num::ParseIntError;
|
use std::num::ParseIntError;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::ExitStatus;
|
||||||
|
|
||||||
pub struct DiagnosticArgFromDisplay<'a>(pub &'a dyn fmt::Display);
|
pub struct DiagnosticArgFromDisplay<'a>(pub &'a dyn fmt::Display);
|
||||||
|
|
||||||
|
@ -59,6 +60,7 @@ into_diagnostic_arg_using_display!(
|
||||||
i128,
|
i128,
|
||||||
u128,
|
u128,
|
||||||
std::io::Error,
|
std::io::Error,
|
||||||
|
std::boxed::Box<dyn std::error::Error>,
|
||||||
std::num::NonZeroU32,
|
std::num::NonZeroU32,
|
||||||
hir::Target,
|
hir::Target,
|
||||||
Edition,
|
Edition,
|
||||||
|
@ -67,7 +69,8 @@ into_diagnostic_arg_using_display!(
|
||||||
ParseIntError,
|
ParseIntError,
|
||||||
StackProtector,
|
StackProtector,
|
||||||
&TargetTriple,
|
&TargetTriple,
|
||||||
SplitDebuginfo
|
SplitDebuginfo,
|
||||||
|
ExitStatus,
|
||||||
);
|
);
|
||||||
|
|
||||||
impl IntoDiagnosticArg for bool {
|
impl IntoDiagnosticArg for bool {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue