Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 0d0e841

Browse files
authored
Rollup merge of rust-lang#133631 - flba-eb:add_nto_qnx71_iosock_support, r=workingjubilee
Support QNX 7.1 with `io-sock`+libstd and QNX 8.0 (`no_std` only) Changes of this pull request: 1. Refactor code for qnx nto targets to share more code in file `nto_qnx.rs` 1. Add support for an additional network stack on nto qnx 7.1. QNX 7.1 supports two network stacks: 1. `io-pkt`, which is default 2. `io-sock`, which is optional on 7.1 but default in QNX 8.0 As one can see in the [io-sock migration notes](https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.io_sock/topic/migrate_app.html), this changes the libc API in a way similar to e.g. linux-gnu vs. linux-musl. This change adds a new target which has a different value for `target_env`, so that e.g. libc can distinguish between both APIs. 2. Add initial support for QNX 8.0, thanks to AkhilTThomas. As it turned out, the problem with forking many processes still exists in QNX 8.0. Because if this, we are now using it for any QNX version (i.e. not check for `target_env` anymore).
2 parents 2f0ad2a + 0462826 commit 0d0e841

File tree

17 files changed

+285
-141
lines changed

17 files changed

+285
-141
lines changed

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

Lines changed: 96 additions & 1 deletion
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

Lines changed: 4 additions & 0 deletions
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),
Lines changed: 8 additions & 34 deletions
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
}
Lines changed: 8 additions & 4 deletions
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
}
Lines changed: 12 additions & 0 deletions
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+
}
Lines changed: 11 additions & 0 deletions
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

Lines changed: 10 additions & 10 deletions
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,
Lines changed: 9 additions & 25 deletions
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
}
Lines changed: 12 additions & 0 deletions
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+
}
Lines changed: 11 additions & 0 deletions
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+
}

0 commit comments

Comments
 (0)