Skip to content

Commit 15c6f7e

Browse files
committed
Auto merge of #136087 - jhpratt:rollup-tam1mzn, r=jhpratt
Rollup of 7 pull requests Successful merges: - #133631 (Support QNX 7.1 with `io-sock`+libstd and QNX 8.0 (`no_std` only)) - #134358 (compiler: Set `target_abi = "ilp32e"` on all riscv32e targets) - #135812 (Fix GDB `OsString` provider on Windows ) - #135842 (TRPL: more backward-compatible Edition changes) - #135946 (Remove extra whitespace from rustdoc breadcrumbs for copypasting) - #135953 (ci.py: check the return code in `run-local`) - #136019 (Add an `unchecked_div` alias to the `Div<NonZero<_>>` impls) r? `@ghost` `@rustbot` modify labels: rollup
2 parents d9b4598 + 359c504 commit 15c6f7e

26 files changed

+310
-156
lines changed

compiler/rustc_target/src/spec/base/nto_qnx.rs

+96-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::spec::{RelroLevel, TargetOptions, cvs};
1+
use crate::spec::{
2+
Cc, LinkArgs, LinkerFlavor, Lld, RelroLevel, Target, TargetMetadata, TargetOptions, cvs,
3+
};
24

35
pub(crate) fn opts() -> TargetOptions {
46
TargetOptions {
@@ -16,3 +18,96 @@ pub(crate) fn opts() -> TargetOptions {
1618
..Default::default()
1719
}
1820
}
21+
22+
pub(crate) fn meta() -> TargetMetadata {
23+
TargetMetadata { description: None, tier: Some(3), host_tools: Some(false), std: Some(true) }
24+
}
25+
26+
pub(crate) fn aarch64() -> Target {
27+
Target {
28+
llvm_target: "aarch64-unknown-unknown".into(),
29+
metadata: meta(),
30+
pointer_width: 64,
31+
// from: https://llvm.org/docs/LangRef.html#data-layout
32+
// e = little endian
33+
// m:e = ELF mangling: Private symbols get a .L prefix
34+
// i8:8:32 = 8-bit-integer, minimum_alignment=8, preferred_alignment=32
35+
// i16:16:32 = 16-bit-integer, minimum_alignment=16, preferred_alignment=32
36+
// i64:64 = 64-bit-integer, minimum_alignment=64, preferred_alignment=64
37+
// i128:128 = 128-bit-integer, minimum_alignment=128, preferred_alignment=128
38+
// n32:64 = 32 and 64 are native integer widths; Elements of this set are considered to support most general arithmetic operations efficiently.
39+
// S128 = 128 bits are the natural alignment of the stack in bits.
40+
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
41+
arch: "aarch64".into(),
42+
options: TargetOptions {
43+
features: "+v8a".into(),
44+
max_atomic_width: Some(128),
45+
..opts()
46+
}
47+
}
48+
}
49+
50+
pub(crate) fn x86_64() -> Target {
51+
Target {
52+
llvm_target: "x86_64-pc-unknown".into(),
53+
metadata: meta(),
54+
pointer_width: 64,
55+
data_layout:
56+
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
57+
arch: "x86_64".into(),
58+
options: TargetOptions {
59+
cpu: "x86-64".into(),
60+
plt_by_default: false,
61+
max_atomic_width: Some(64),
62+
vendor: "pc".into(),
63+
..opts()
64+
},
65+
}
66+
}
67+
68+
pub(crate) fn pre_link_args(api_var: ApiVariant, arch: Arch) -> LinkArgs {
69+
let (qcc_arg, arch_lib_dir) = match arch {
70+
Arch::Aarch64 => ("-Vgcc_ntoaarch64le_cxx", "aarch64le"),
71+
Arch::I586 => {
72+
("-Vgcc_ntox86_cxx", "notSupportedByQnx_compiler/rustc_target/src/spec/base/nto_qnx.rs")
73+
}
74+
Arch::X86_64 => ("-Vgcc_ntox86_64_cxx", "x86_64"),
75+
};
76+
match api_var {
77+
ApiVariant::Default => {
78+
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[qcc_arg])
79+
}
80+
ApiVariant::IoSock => TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[
81+
qcc_arg,
82+
get_iosock_param(arch_lib_dir),
83+
]),
84+
}
85+
}
86+
87+
pub(crate) enum ApiVariant {
88+
Default,
89+
IoSock,
90+
}
91+
92+
pub(crate) enum Arch {
93+
Aarch64,
94+
I586,
95+
X86_64,
96+
}
97+
98+
// When using `io-sock` on QNX, we must add a search path for the linker so
99+
// that it prefers the io-sock version.
100+
// The path depends on the host, i.e. we cannot hard-code it here, but have
101+
// to determine it when the compiler runs.
102+
// When using the QNX toolchain, the environment variable QNX_TARGET is always set.
103+
// More information:
104+
// https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.io_sock/topic/migrate_app.html
105+
fn get_iosock_param(arch_lib_dir: &str) -> &'static str {
106+
let target_dir = std::env::var("QNX_TARGET")
107+
.unwrap_or_else(|_| "QNX_TARGET_not_set_please_source_qnxsdp-env.sh".into());
108+
let linker_param = format!("-L{target_dir}/{arch_lib_dir}/io-sock/lib");
109+
110+
// FIXME: leaking this is kind of weird: we're feeding these into something that expects an
111+
// `AsRef<OsStr>`, but often converts to `OsString` anyways, so shouldn't we just demand an `OsString`?
112+
linker_param.leak()
113+
}

compiler/rustc_target/src/spec/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1963,7 +1963,11 @@ supported_targets! {
19631963

19641964
("aarch64-unknown-nto-qnx700", aarch64_unknown_nto_qnx700),
19651965
("aarch64-unknown-nto-qnx710", aarch64_unknown_nto_qnx710),
1966+
("aarch64-unknown-nto-qnx710_iosock", aarch64_unknown_nto_qnx710_iosock),
1967+
("aarch64-unknown-nto-qnx800", aarch64_unknown_nto_qnx800),
19661968
("x86_64-pc-nto-qnx710", x86_64_pc_nto_qnx710),
1969+
("x86_64-pc-nto-qnx710_iosock", x86_64_pc_nto_qnx710_iosock),
1970+
("x86_64-pc-nto-qnx800", x86_64_pc_nto_qnx800),
19671971
("i586-pc-nto-qnx700", i586_pc_nto_qnx700),
19681972

19691973
("aarch64-unknown-linux-ohos", aarch64_unknown_linux_ohos),
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,11 @@
1-
use crate::spec::{Cc, LinkerFlavor, Lld, Target, TargetOptions, base};
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
23

34
pub(crate) fn target() -> Target {
4-
// In QNX, libc does not provide a compatible ABI between versions.
5-
// To distinguish between QNX versions, we needed a stable conditional compilation switch,
6-
// which is why we needed to implement different targets in the compiler.
7-
Target {
8-
llvm_target: "aarch64-unknown-unknown".into(),
9-
metadata: crate::spec::TargetMetadata {
10-
description: Some("ARM64 QNX Neutrino 7.0 RTOS".into()),
11-
tier: Some(3),
12-
host_tools: Some(false),
13-
std: Some(true),
14-
},
15-
pointer_width: 64,
16-
// from: https://llvm.org/docs/LangRef.html#data-layout
17-
// e = little endian
18-
// m:e = ELF mangling: Private symbols get a .L prefix
19-
// i8:8:32 = 8-bit-integer, minimum_alignment=8, preferred_alignment=32
20-
// i16:16:32 = 16-bit-integer, minimum_alignment=16, preferred_alignment=32
21-
// i64:64 = 64-bit-integer, minimum_alignment=64, preferred_alignment=64
22-
// i128:128 = 128-bit-integer, minimum_alignment=128, preferred_alignment=128
23-
// n32:64 = 32 and 64 are native integer widths; Elements of this set are considered to support most general arithmetic operations efficiently.
24-
// S128 = 128 bits are the natural alignment of the stack in bits.
25-
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
26-
arch: "aarch64".into(),
27-
options: TargetOptions {
28-
features: "+v8a".into(),
29-
max_atomic_width: Some(128),
30-
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[
31-
"-Vgcc_ntoaarch64le_cxx",
32-
]),
33-
env: "nto70".into(),
34-
..base::nto_qnx::opts()
35-
},
36-
}
5+
let mut target = nto_qnx::aarch64();
6+
target.metadata.description = Some("ARM64 QNX Neutrino 7.0 RTOS".into());
7+
target.options.pre_link_args =
8+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default, nto_qnx::Arch::Aarch64);
9+
target.options.env = "nto70".into();
10+
target
3711
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
23

34
pub(crate) fn target() -> Target {
4-
let mut base = super::aarch64_unknown_nto_qnx700::target();
5-
base.metadata.description = Some("ARM64 QNX Neutrino 7.1 RTOS".into());
6-
base.options.env = "nto71".into();
7-
base
5+
let mut target = nto_qnx::aarch64();
6+
target.metadata.description =
7+
Some("ARM64 QNX Neutrino 7.1 RTOS with io-pkt network stack".into());
8+
target.options.pre_link_args =
9+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default, nto_qnx::Arch::Aarch64);
10+
target.options.env = "nto71".into();
11+
target
812
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
3+
4+
pub(crate) fn target() -> Target {
5+
let mut target = nto_qnx::aarch64();
6+
target.metadata.description =
7+
Some("ARM64 QNX Neutrino 7.1 RTOS with io-sock network stack".into());
8+
target.options.pre_link_args =
9+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock, nto_qnx::Arch::Aarch64);
10+
target.options.env = "nto71_iosock".into();
11+
target
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
3+
4+
pub(crate) fn target() -> Target {
5+
let mut target = nto_qnx::aarch64();
6+
target.metadata.description = Some("ARM64 QNX Neutrino 8.0 RTOS".into());
7+
target.options.pre_link_args =
8+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default, nto_qnx::Arch::Aarch64);
9+
target.options.env = "nto80".into();
10+
target
11+
}

compiler/rustc_target/src/spec/targets/i586_pc_nto_qnx700.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
use crate::spec::{Cc, LinkerFlavor, Lld, StackProbeType, Target, TargetOptions, base};
1+
use crate::spec::base::nto_qnx;
2+
use crate::spec::{StackProbeType, Target, TargetOptions, base};
23

34
pub(crate) fn target() -> Target {
5+
let mut meta = nto_qnx::meta();
6+
meta.description = Some("32-bit x86 QNX Neutrino 7.0 RTOS".into());
7+
meta.std = Some(false);
48
Target {
59
llvm_target: "i586-pc-unknown".into(),
6-
metadata: crate::spec::TargetMetadata {
7-
description: Some("32-bit x86 QNX Neutrino 7.0 RTOS".into()),
8-
tier: Some(3),
9-
host_tools: Some(false),
10-
std: Some(false),
11-
},
10+
metadata: meta,
1211
pointer_width: 32,
1312
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
1413
i128:128-f64:32:64-f80:32-n8:16:32-S128"
@@ -17,9 +16,10 @@ pub(crate) fn target() -> Target {
1716
options: TargetOptions {
1817
cpu: "pentium4".into(),
1918
max_atomic_width: Some(64),
20-
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[
21-
"-Vgcc_ntox86_cxx",
22-
]),
19+
pre_link_args: nto_qnx::pre_link_args(
20+
nto_qnx::ApiVariant::Default,
21+
nto_qnx::Arch::I586,
22+
),
2323
env: "nto70".into(),
2424
vendor: "pc".into(),
2525
stack_probes: StackProbeType::Inline,

compiler/rustc_target/src/spec/targets/riscv32e_unknown_none_elf.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::spec::{Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target, TargetOptions};
22

33
pub(crate) fn target() -> Target {
4+
let abi = "ilp32e";
45
Target {
56
// The below `data_layout` is explicitly specified by the ilp32e ABI in LLVM. See also
67
// `options.llvm_abiname`.
@@ -16,11 +17,12 @@ pub(crate) fn target() -> Target {
1617
arch: "riscv32".into(),
1718

1819
options: TargetOptions {
20+
abi: abi.into(),
1921
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
2022
linker: Some("rust-lld".into()),
2123
cpu: "generic-rv32".into(),
2224
// The ilp32e ABI specifies the `data_layout`
23-
llvm_abiname: "ilp32e".into(),
25+
llvm_abiname: abi.into(),
2426
max_atomic_width: Some(32),
2527
atomic_cas: false,
2628
features: "+e,+forced-atomics".into(),

compiler/rustc_target/src/spec/targets/riscv32em_unknown_none_elf.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::spec::{Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target, TargetOptions};
22

33
pub(crate) fn target() -> Target {
4+
let abi = "ilp32e";
45
Target {
56
// The below `data_layout` is explicitly specified by the ilp32e ABI in LLVM. See also
67
// `options.llvm_abiname`.
@@ -16,11 +17,12 @@ pub(crate) fn target() -> Target {
1617
arch: "riscv32".into(),
1718

1819
options: TargetOptions {
20+
abi: abi.into(),
1921
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
2022
linker: Some("rust-lld".into()),
2123
cpu: "generic-rv32".into(),
2224
// The ilp32e ABI specifies the `data_layout`
23-
llvm_abiname: "ilp32e".into(),
25+
llvm_abiname: abi.into(),
2426
max_atomic_width: Some(32),
2527
atomic_cas: false,
2628
features: "+e,+m,+forced-atomics".into(),

compiler/rustc_target/src/spec/targets/riscv32emc_unknown_none_elf.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::spec::{Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target, TargetOptions};
22

33
pub(crate) fn target() -> Target {
4+
let abi = "ilp32e";
45
Target {
56
// The below `data_layout` is explicitly specified by the ilp32e ABI in LLVM. See also
67
// `options.llvm_abiname`.
@@ -16,11 +17,12 @@ pub(crate) fn target() -> Target {
1617
arch: "riscv32".into(),
1718

1819
options: TargetOptions {
20+
abi: abi.into(),
1921
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
2022
linker: Some("rust-lld".into()),
2123
cpu: "generic-rv32".into(),
2224
// The ilp32e ABI specifies the `data_layout`
23-
llvm_abiname: "ilp32e".into(),
25+
llvm_abiname: abi.into(),
2426
max_atomic_width: Some(32),
2527
atomic_cas: false,
2628
features: "+e,+m,+c,+forced-atomics".into(),
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,12 @@
1-
use crate::spec::{Cc, LinkerFlavor, Lld, Target, TargetOptions, base};
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
23

34
pub(crate) fn target() -> Target {
4-
Target {
5-
llvm_target: "x86_64-pc-unknown".into(),
6-
metadata: crate::spec::TargetMetadata {
7-
description: Some("x86 64-bit QNX Neutrino 7.1 RTOS".into()),
8-
tier: Some(3),
9-
host_tools: Some(false),
10-
std: Some(true),
11-
},
12-
pointer_width: 64,
13-
data_layout:
14-
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
15-
arch: "x86_64".into(),
16-
options: TargetOptions {
17-
cpu: "x86-64".into(),
18-
plt_by_default: false,
19-
max_atomic_width: Some(64),
20-
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[
21-
"-Vgcc_ntox86_64_cxx",
22-
]),
23-
env: "nto71".into(),
24-
vendor: "pc".into(),
25-
..base::nto_qnx::opts()
26-
},
27-
}
5+
let mut target = nto_qnx::x86_64();
6+
target.metadata.description =
7+
Some("x86 64-bit QNX Neutrino 7.1 RTOS with io-pkt network stack".into());
8+
target.options.pre_link_args =
9+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default, nto_qnx::Arch::X86_64);
10+
target.options.env = "nto71".into();
11+
target
2812
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
3+
4+
pub(crate) fn target() -> Target {
5+
let mut target = nto_qnx::x86_64();
6+
target.metadata.description =
7+
Some("x86 64-bit QNX Neutrino 7.1 RTOS with io-sock network stack".into());
8+
target.options.pre_link_args =
9+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock, nto_qnx::Arch::X86_64);
10+
target.options.env = "nto71_iosock".into();
11+
target
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
3+
4+
pub(crate) fn target() -> Target {
5+
let mut target = nto_qnx::x86_64();
6+
target.metadata.description = Some("x86 64-bit QNX Neutrino 8.0 RTOS".into());
7+
target.options.pre_link_args =
8+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default, nto_qnx::Arch::X86_64);
9+
target.options.env = "nto80".into();
10+
target
11+
}

library/core/src/num/nonzero.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1185,8 +1185,12 @@ macro_rules! nonzero_integer_signedness_dependent_impls {
11851185
impl Div<NonZero<$Int>> for $Int {
11861186
type Output = $Int;
11871187

1188+
/// Same as `self / other.get()`, but because `other` is a `NonZero<_>`,
1189+
/// there's never a runtime check for division-by-zero.
1190+
///
11881191
/// This operation rounds towards zero, truncating any fractional
11891192
/// part of the exact result, and cannot panic.
1193+
#[doc(alias = "unchecked_div")]
11901194
#[inline]
11911195
fn div(self, other: NonZero<$Int>) -> $Int {
11921196
// SAFETY: Division by zero is checked because `other` is non-zero,
@@ -1197,6 +1201,9 @@ macro_rules! nonzero_integer_signedness_dependent_impls {
11971201

11981202
#[stable(feature = "nonzero_div_assign", since = "1.79.0")]
11991203
impl DivAssign<NonZero<$Int>> for $Int {
1204+
/// Same as `self /= other.get()`, but because `other` is a `NonZero<_>`,
1205+
/// there's never a runtime check for division-by-zero.
1206+
///
12001207
/// This operation rounds towards zero, truncating any fractional
12011208
/// part of the exact result, and cannot panic.
12021209
#[inline]

0 commit comments

Comments
 (0)