Auto merge of #135030 - Flakebi:require-cpu, r=workingjubilee
Target option to require explicit cpu Some targets have many different CPUs and no generic CPU that can be used as a default. For these targets, the user needs to explicitly specify a CPU through `-C target-cpu=`. Add an option for targets and an error message if no CPU is set. This affects the proposed amdgpu and avr targets. amdgpu tracking issue: #135024 AVR MCP: https://github.com/rust-lang/compiler-team/issues/800
This commit is contained in:
commit
a730edcd67
7 changed files with 41 additions and 0 deletions
|
@ -30,6 +30,8 @@ codegen_ssa_copy_path = could not copy {$from} to {$to}: {$error}
|
|||
|
||||
codegen_ssa_copy_path_buf = unable to copy {$source_file} to {$output_path}: {$error}
|
||||
|
||||
codegen_ssa_cpu_required = target requires explicitly specifying a cpu with `-C target-cpu`
|
||||
|
||||
codegen_ssa_create_temp_dir = couldn't create a temp dir: {$error}
|
||||
|
||||
codegen_ssa_dlltool_fail_import_library =
|
||||
|
|
|
@ -615,6 +615,11 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
|
|||
return ongoing_codegen;
|
||||
}
|
||||
|
||||
if tcx.sess.target.need_explicit_cpu && tcx.sess.opts.cg.target_cpu.is_none() {
|
||||
// The target has no default cpu, but none is set explicitly
|
||||
tcx.dcx().emit_fatal(errors::CpuRequired);
|
||||
}
|
||||
|
||||
let cgu_name_builder = &mut CodegenUnitNameBuilder::new(tcx);
|
||||
|
||||
// Run the monomorphization collector and partition the collected items into
|
||||
|
|
|
@ -523,6 +523,10 @@ pub(crate) struct CheckInstalledVisualStudio;
|
|||
#[diag(codegen_ssa_insufficient_vs_code_product)]
|
||||
pub(crate) struct InsufficientVSCodeProduct;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_ssa_cpu_required)]
|
||||
pub(crate) struct CpuRequired;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_ssa_processing_dymutil_failed)]
|
||||
#[note]
|
||||
|
|
|
@ -546,6 +546,7 @@ impl Target {
|
|||
key!(link_env_remove, list);
|
||||
key!(asm_args, list);
|
||||
key!(cpu);
|
||||
key!(need_explicit_cpu, bool);
|
||||
key!(features);
|
||||
key!(dynamic_linking, bool);
|
||||
key!(direct_access_external_data, Option<bool>);
|
||||
|
@ -720,6 +721,7 @@ impl ToJson for Target {
|
|||
target_option_val!(link_env_remove);
|
||||
target_option_val!(asm_args);
|
||||
target_option_val!(cpu);
|
||||
target_option_val!(need_explicit_cpu);
|
||||
target_option_val!(features);
|
||||
target_option_val!(dynamic_linking);
|
||||
target_option_val!(direct_access_external_data);
|
||||
|
|
|
@ -2254,6 +2254,9 @@ pub struct TargetOptions {
|
|||
/// Default CPU to pass to LLVM. Corresponds to `llc -mcpu=$cpu`. Defaults
|
||||
/// to "generic".
|
||||
pub cpu: StaticCow<str>,
|
||||
/// Whether a cpu needs to be explicitly set.
|
||||
/// Set to true if there is no default cpu. Defaults to false.
|
||||
pub need_explicit_cpu: bool,
|
||||
/// Default target features to pass to LLVM. These features overwrite
|
||||
/// `-Ctarget-cpu` but can be overwritten with `-Ctarget-features`.
|
||||
/// Corresponds to `llc -mattr=$features`.
|
||||
|
@ -2686,6 +2689,7 @@ impl Default for TargetOptions {
|
|||
link_script: None,
|
||||
asm_args: cvs![],
|
||||
cpu: "generic".into(),
|
||||
need_explicit_cpu: false,
|
||||
features: "".into(),
|
||||
direct_access_external_data: None,
|
||||
dynamic_linking: false,
|
||||
|
|
11
tests/run-make/target-specs/require-explicit-cpu.json
Normal file
11
tests/run-make/target-specs/require-explicit-cpu.json
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"data-layout": "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128",
|
||||
"linker-flavor": "gcc",
|
||||
"llvm-target": "i686-unknown-linux-gnu",
|
||||
"target-endian": "little",
|
||||
"target-pointer-width": "32",
|
||||
"target-c-int-width": "32",
|
||||
"arch": "x86",
|
||||
"os": "linux",
|
||||
"need-explicit-cpu": true
|
||||
}
|
|
@ -63,4 +63,17 @@ fn main() {
|
|||
.crate_type("lib")
|
||||
.run_fail()
|
||||
.assert_stderr_contains("data-layout for target");
|
||||
rustc()
|
||||
.input("foo.rs")
|
||||
.target("require-explicit-cpu")
|
||||
.crate_type("lib")
|
||||
.run_fail()
|
||||
.assert_stderr_contains("target requires explicitly specifying a cpu");
|
||||
rustc()
|
||||
.input("foo.rs")
|
||||
.target("require-explicit-cpu")
|
||||
.crate_type("lib")
|
||||
.arg("-Ctarget-cpu=generic")
|
||||
.run();
|
||||
rustc().target("require-explicit-cpu").arg("--print=target-cpus").run();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue