mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Rollup merge of #132565 - bjorn3:less_target_name_dependence, r=workingjubilee
Reduce dependence on the target name The target name can be anything with custom target specs. Matching on fields inside the target spec is much more robust than matching on the target name. Also remove the unused is_builtin target spec field.
This commit is contained in:
commit
7155c65d68
@ -146,7 +146,7 @@ impl<'gcc, 'tcx> StaticCodegenMethods for CodegenCx<'gcc, 'tcx> {
|
|||||||
|
|
||||||
// Wasm statics with custom link sections get special treatment as they
|
// Wasm statics with custom link sections get special treatment as they
|
||||||
// go into custom sections of the wasm executable.
|
// go into custom sections of the wasm executable.
|
||||||
if self.tcx.sess.opts.target_triple.tuple().starts_with("wasm32") {
|
if self.tcx.sess.target.is_like_wasm {
|
||||||
if let Some(_section) = attrs.link_section {
|
if let Some(_section) = attrs.link_section {
|
||||||
unimplemented!();
|
unimplemented!();
|
||||||
}
|
}
|
||||||
|
@ -945,23 +945,10 @@ fn create_section_with_flags_asm(section_name: &str, section_flags: &str, data:
|
|||||||
asm
|
asm
|
||||||
}
|
}
|
||||||
|
|
||||||
fn target_is_apple(cgcx: &CodegenContext<LlvmCodegenBackend>) -> bool {
|
|
||||||
let triple = cgcx.opts.target_triple.tuple();
|
|
||||||
triple.contains("-ios")
|
|
||||||
|| triple.contains("-darwin")
|
|
||||||
|| triple.contains("-tvos")
|
|
||||||
|| triple.contains("-watchos")
|
|
||||||
|| triple.contains("-visionos")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn target_is_aix(cgcx: &CodegenContext<LlvmCodegenBackend>) -> bool {
|
|
||||||
cgcx.opts.target_triple.tuple().contains("-aix")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn bitcode_section_name(cgcx: &CodegenContext<LlvmCodegenBackend>) -> &'static CStr {
|
pub(crate) fn bitcode_section_name(cgcx: &CodegenContext<LlvmCodegenBackend>) -> &'static CStr {
|
||||||
if target_is_apple(cgcx) {
|
if cgcx.target_is_like_osx {
|
||||||
c"__LLVM,__bitcode"
|
c"__LLVM,__bitcode"
|
||||||
} else if target_is_aix(cgcx) {
|
} else if cgcx.target_is_like_aix {
|
||||||
c".ipa"
|
c".ipa"
|
||||||
} else {
|
} else {
|
||||||
c".llvmbc"
|
c".llvmbc"
|
||||||
@ -1028,10 +1015,12 @@ unsafe fn embed_bitcode(
|
|||||||
// Unfortunately, LLVM provides no way to set custom section flags. For ELF
|
// Unfortunately, LLVM provides no way to set custom section flags. For ELF
|
||||||
// and COFF we emit the sections using module level inline assembly for that
|
// and COFF we emit the sections using module level inline assembly for that
|
||||||
// reason (see issue #90326 for historical background).
|
// reason (see issue #90326 for historical background).
|
||||||
let is_aix = target_is_aix(cgcx);
|
|
||||||
let is_apple = target_is_apple(cgcx);
|
|
||||||
unsafe {
|
unsafe {
|
||||||
if is_apple || is_aix || cgcx.opts.target_triple.tuple().starts_with("wasm") {
|
if cgcx.target_is_like_osx
|
||||||
|
|| cgcx.target_is_like_aix
|
||||||
|
|| cgcx.target_arch == "wasm32"
|
||||||
|
|| cgcx.target_arch == "wasm64"
|
||||||
|
{
|
||||||
// We don't need custom section flags, create LLVM globals.
|
// We don't need custom section flags, create LLVM globals.
|
||||||
let llconst = common::bytes_in_context(llcx, bitcode);
|
let llconst = common::bytes_in_context(llcx, bitcode);
|
||||||
let llglobal = llvm::LLVMAddGlobal(
|
let llglobal = llvm::LLVMAddGlobal(
|
||||||
@ -1052,9 +1041,9 @@ unsafe fn embed_bitcode(
|
|||||||
c"rustc.embedded.cmdline".as_ptr(),
|
c"rustc.embedded.cmdline".as_ptr(),
|
||||||
);
|
);
|
||||||
llvm::LLVMSetInitializer(llglobal, llconst);
|
llvm::LLVMSetInitializer(llglobal, llconst);
|
||||||
let section = if is_apple {
|
let section = if cgcx.target_is_like_osx {
|
||||||
c"__LLVM,__cmdline"
|
c"__LLVM,__cmdline"
|
||||||
} else if is_aix {
|
} else if cgcx.target_is_like_aix {
|
||||||
c".info"
|
c".info"
|
||||||
} else {
|
} else {
|
||||||
c".llvmcmd"
|
c".llvmcmd"
|
||||||
|
@ -85,11 +85,7 @@ pub fn link_binary(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if invalid_output_for_target(sess, crate_type) {
|
if invalid_output_for_target(sess, crate_type) {
|
||||||
bug!(
|
bug!("invalid output type `{:?}` for target `{}`", crate_type, sess.opts.target_triple);
|
||||||
"invalid output type `{:?}` for target os `{}`",
|
|
||||||
crate_type,
|
|
||||||
sess.opts.target_triple
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sess.time("link_binary_check_files_are_writeable", || {
|
sess.time("link_binary_check_files_are_writeable", || {
|
||||||
@ -996,6 +992,7 @@ fn link_natively(
|
|||||||
&& (code < 1000 || code > 9999)
|
&& (code < 1000 || code > 9999)
|
||||||
{
|
{
|
||||||
let is_vs_installed = windows_registry::find_vs_version().is_ok();
|
let is_vs_installed = windows_registry::find_vs_version().is_ok();
|
||||||
|
// FIXME(cc-rs#1265) pass only target arch to find_tool()
|
||||||
let has_linker = windows_registry::find_tool(
|
let has_linker = windows_registry::find_tool(
|
||||||
sess.opts.target_triple.tuple(),
|
sess.opts.target_triple.tuple(),
|
||||||
"link.exe",
|
"link.exe",
|
||||||
|
@ -47,6 +47,7 @@ pub(crate) fn get_linker<'a>(
|
|||||||
self_contained: bool,
|
self_contained: bool,
|
||||||
target_cpu: &'a str,
|
target_cpu: &'a str,
|
||||||
) -> Box<dyn Linker + 'a> {
|
) -> Box<dyn Linker + 'a> {
|
||||||
|
// FIXME(cc-rs#1265) pass only target arch to find_tool()
|
||||||
let msvc_tool = windows_registry::find_tool(sess.opts.target_triple.tuple(), "link.exe");
|
let msvc_tool = windows_registry::find_tool(sess.opts.target_triple.tuple(), "link.exe");
|
||||||
|
|
||||||
// If our linker looks like a batch script on Windows then to execute this
|
// If our linker looks like a batch script on Windows then to execute this
|
||||||
|
@ -345,6 +345,8 @@ pub struct CodegenContext<B: WriteBackendMethods> {
|
|||||||
pub is_pe_coff: bool,
|
pub is_pe_coff: bool,
|
||||||
pub target_can_use_split_dwarf: bool,
|
pub target_can_use_split_dwarf: bool,
|
||||||
pub target_arch: String,
|
pub target_arch: String,
|
||||||
|
pub target_is_like_osx: bool,
|
||||||
|
pub target_is_like_aix: bool,
|
||||||
pub split_debuginfo: rustc_target::spec::SplitDebuginfo,
|
pub split_debuginfo: rustc_target::spec::SplitDebuginfo,
|
||||||
pub split_dwarf_kind: rustc_session::config::SplitDwarfKind,
|
pub split_dwarf_kind: rustc_session::config::SplitDwarfKind,
|
||||||
|
|
||||||
@ -1195,6 +1197,8 @@ fn start_executing_work<B: ExtraBackendMethods>(
|
|||||||
is_pe_coff: tcx.sess.target.is_like_windows,
|
is_pe_coff: tcx.sess.target.is_like_windows,
|
||||||
target_can_use_split_dwarf: tcx.sess.target_can_use_split_dwarf(),
|
target_can_use_split_dwarf: tcx.sess.target_can_use_split_dwarf(),
|
||||||
target_arch: tcx.sess.target.arch.to_string(),
|
target_arch: tcx.sess.target.arch.to_string(),
|
||||||
|
target_is_like_osx: tcx.sess.target.is_like_osx,
|
||||||
|
target_is_like_aix: tcx.sess.target.is_like_aix,
|
||||||
split_debuginfo: tcx.sess.split_debuginfo(),
|
split_debuginfo: tcx.sess.split_debuginfo(),
|
||||||
split_dwarf_kind: tcx.sess.opts.unstable_opts.split_dwarf_kind,
|
split_dwarf_kind: tcx.sess.opts.unstable_opts.split_dwarf_kind,
|
||||||
parallel: backend.supports_parallel() && !sess.opts.unstable_opts.no_parallel_backend,
|
parallel: backend.supports_parallel() && !sess.opts.unstable_opts.no_parallel_backend,
|
||||||
|
@ -1595,11 +1595,10 @@ macro_rules! supported_targets {
|
|||||||
pub const TARGETS: &[&str] = &[$($tuple),+];
|
pub const TARGETS: &[&str] = &[$($tuple),+];
|
||||||
|
|
||||||
fn load_builtin(target: &str) -> Option<Target> {
|
fn load_builtin(target: &str) -> Option<Target> {
|
||||||
let mut t = match target {
|
let t = match target {
|
||||||
$( $tuple => targets::$module::target(), )+
|
$( $tuple => targets::$module::target(), )+
|
||||||
_ => return None,
|
_ => return None,
|
||||||
};
|
};
|
||||||
t.is_builtin = true;
|
|
||||||
debug!("got builtin target: {:?}", t);
|
debug!("got builtin target: {:?}", t);
|
||||||
Some(t)
|
Some(t)
|
||||||
}
|
}
|
||||||
@ -2128,9 +2127,6 @@ type StaticCow<T> = Cow<'static, T>;
|
|||||||
/// through `Deref` impls.
|
/// through `Deref` impls.
|
||||||
#[derive(PartialEq, Clone, Debug)]
|
#[derive(PartialEq, Clone, Debug)]
|
||||||
pub struct TargetOptions {
|
pub struct TargetOptions {
|
||||||
/// Whether the target is built-in or loaded from a custom target specification.
|
|
||||||
pub is_builtin: bool,
|
|
||||||
|
|
||||||
/// Used as the `target_endian` `cfg` variable. Defaults to little endian.
|
/// Used as the `target_endian` `cfg` variable. Defaults to little endian.
|
||||||
pub endian: Endian,
|
pub endian: Endian,
|
||||||
/// Width of c_int type. Defaults to "32".
|
/// Width of c_int type. Defaults to "32".
|
||||||
@ -2606,7 +2602,6 @@ impl Default for TargetOptions {
|
|||||||
/// incomplete, and if used for compilation, will certainly not work.
|
/// incomplete, and if used for compilation, will certainly not work.
|
||||||
fn default() -> TargetOptions {
|
fn default() -> TargetOptions {
|
||||||
TargetOptions {
|
TargetOptions {
|
||||||
is_builtin: false,
|
|
||||||
endian: Endian::Little,
|
endian: Endian::Little,
|
||||||
c_int_width: "32".into(),
|
c_int_width: "32".into(),
|
||||||
os: "none".into(),
|
os: "none".into(),
|
||||||
@ -3349,7 +3344,6 @@ impl Target {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
key!(is_builtin, bool);
|
|
||||||
key!(c_int_width = "target-c-int-width");
|
key!(c_int_width = "target-c-int-width");
|
||||||
key!(c_enum_min_bits, Option<u64>); // if None, matches c_int_width
|
key!(c_enum_min_bits, Option<u64>); // if None, matches c_int_width
|
||||||
key!(os);
|
key!(os);
|
||||||
@ -3462,10 +3456,6 @@ impl Target {
|
|||||||
key!(entry_abi, Conv)?;
|
key!(entry_abi, Conv)?;
|
||||||
key!(supports_xray, bool);
|
key!(supports_xray, bool);
|
||||||
|
|
||||||
if base.is_builtin {
|
|
||||||
// This can cause unfortunate ICEs later down the line.
|
|
||||||
return Err("may not set is_builtin for targets not built-in".into());
|
|
||||||
}
|
|
||||||
base.update_from_cli();
|
base.update_from_cli();
|
||||||
|
|
||||||
// Each field should have been read using `Json::remove` so any keys remaining are unused.
|
// Each field should have been read using `Json::remove` so any keys remaining are unused.
|
||||||
@ -3635,7 +3625,6 @@ impl ToJson for Target {
|
|||||||
target_val!(arch);
|
target_val!(arch);
|
||||||
target_val!(data_layout);
|
target_val!(data_layout);
|
||||||
|
|
||||||
target_option_val!(is_builtin);
|
|
||||||
target_option_val!(endian, "target-endian");
|
target_option_val!(endian, "target-endian");
|
||||||
target_option_val!(c_int_width, "target-c-int-width");
|
target_option_val!(c_int_width, "target-c-int-width");
|
||||||
target_option_val!(os);
|
target_option_val!(os);
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"arch": "x86_64",
|
|
||||||
"is-builtin": true,
|
|
||||||
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
|
|
||||||
"llvm-target": "x86_64-unknown-unknown-gnu",
|
|
||||||
"target-pointer-width": "64"
|
|
||||||
}
|
|
@ -52,11 +52,6 @@ fn main() {
|
|||||||
.expected_file("test-platform.json")
|
.expected_file("test-platform.json")
|
||||||
.actual_text("test-platform-2", test_platform_2)
|
.actual_text("test-platform-2", test_platform_2)
|
||||||
.run();
|
.run();
|
||||||
rustc()
|
|
||||||
.input("foo.rs")
|
|
||||||
.target("definitely-not-builtin-target")
|
|
||||||
.run_fail()
|
|
||||||
.assert_stderr_contains("may not set is_builtin");
|
|
||||||
rustc()
|
rustc()
|
||||||
.input("foo.rs")
|
.input("foo.rs")
|
||||||
.target("endianness-mismatch")
|
.target("endianness-mismatch")
|
||||||
|
Loading…
Reference in New Issue
Block a user