Skip to content

Commit 62661f2

Browse files
committed
Move common code to mod nto_qnx
Signed-off-by: Florian Bartels <[email protected]>
1 parent efe53dd commit 62661f2

File tree

8 files changed

+169
-137
lines changed

8 files changed

+169
-137
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+
}
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
@@ -1,27 +1,12 @@
1-
use crate::spec::{Cc, LinkerFlavor, Lld, Target, TargetOptions};
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
23

34
pub(crate) fn target() -> Target {
4-
let mut target = super::aarch64_unknown_nto_qnx710::target();
5-
target.options.env = "nto71_iosock".into();
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());
68
target.options.pre_link_args =
7-
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[
8-
"-Vgcc_ntoaarch64le_cxx",
9-
get_iosock_param(),
10-
]);
9+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock, nto_qnx::Arch::Aarch64);
10+
target.options.env = "nto71_iosock".into();
1111
target
1212
}
13-
14-
// When using `io-sock` on QNX, we must add a search path for the linker so
15-
// that it prefers the io-sock version.
16-
// The path depends on the host, i.e. we cannot hard-code it here, but have
17-
// to determine it when the compiler runs.
18-
// When using the QNX toolchain, the environment variable QNX_TARGET is always set.
19-
// More information:
20-
// https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.io_sock/topic/migrate_app.html
21-
fn get_iosock_param() -> &'static str {
22-
let target_dir =
23-
std::env::var("QNX_TARGET").unwrap_or_else(|_| "PLEASE_SET_ENV_VAR_QNX_TARGET".into());
24-
let linker_param = format!("-L{target_dir}/aarch64le/io-sock/lib");
25-
26-
linker_param.leak()
27-
}

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,
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
@@ -1,27 +1,12 @@
1-
use crate::spec::{Cc, LinkerFlavor, Lld, Target, TargetOptions};
1+
use crate::spec::Target;
2+
use crate::spec::base::nto_qnx;
23

34
pub(crate) fn target() -> Target {
4-
let mut target = super::x86_64_pc_nto_qnx710::target();
5-
target.options.env = "nto71_iosock".into();
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());
68
target.options.pre_link_args =
7-
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &[
8-
"-Vgcc_ntox86_64_cxx",
9-
get_iosock_param(),
10-
]);
9+
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock, nto_qnx::Arch::X86_64);
10+
target.options.env = "nto71_iosock".into();
1111
target
1212
}
13-
14-
// When using `io-sock` on QNX, we must add a search path for the linker so
15-
// that it prefers the io-sock version.
16-
// The path depends on the host, i.e. we cannot hard-code it here, but have
17-
// to determine it when the compiler runs.
18-
// When using the QNX toolchain, the environment variable QNX_TARGET is always set.
19-
// More information:
20-
// https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.io_sock/topic/migrate_app.html
21-
fn get_iosock_param() -> &'static str {
22-
let target_dir =
23-
std::env::var("QNX_TARGET").unwrap_or_else(|_| "PLEASE_SET_ENV_VAR_QNX_TARGET".into());
24-
let linker_param = format!("-L{target_dir}/x86_64/io-sock/lib");
25-
26-
linker_param.leak()
27-
}

src/doc/rustc/src/platform-support/nto-qnx.md

+24-19
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,31 @@ To compile for QNX Neutrino (aarch64 and x86_64) and Linux (x86_64):
136136

137137
```bash
138138
export build_env='
139-
CC_aarch64-unknown-nto-qnx710=qcc
140-
CFLAGS_aarch64-unknown-nto-qnx710=-Vgcc_ntoaarch64le_cxx
141-
CXX_aarch64-unknown-nto-qnx710=qcc
139+
CC_i586_pc_nto_qnx700=qcc
140+
CFLAGS_i586_pc_nto_qnx700=-Vgcc_ntox86_cxx
141+
CXX_i586_pc_nto_qnx700=qcc
142+
AR_i586_pc_nto_qnx700=ntox86-ar
143+
144+
CC_aarch64_unknown_nto_qnx710=qcc
145+
CFLAGS_aarch64_unknown_nto_qnx710=-Vgcc_ntoaarch64le_cxx
146+
CXX_aarch64_unknown_nto_qnx710=qcc
142147
AR_aarch64_unknown_nto_qnx710=ntoaarch64-ar
143-
CC_aarch64-unknown-nto-qnx710_iosock=qcc
144-
CFLAGS_aarch64-unknown-nto-qnx710_iosock=-Vgcc_ntoaarch64le_cxx
145-
CXX_aarch64-unknown-nto-qnx710_iosock=qcc
148+
149+
CC_aarch64_unknown_nto_qnx710_iosock=qcc
150+
CFLAGS_aarch64_unknown_nto_qnx710_iosock=-Vgcc_ntoaarch64le_cxx
151+
CXX_aarch64_unknown_nto_qnx710_iosock=qcc
146152
AR_aarch64_unknown_nto_qnx710_iosock=ntoaarch64-ar
147-
CC_x86_64-pc-nto-qnx710=qcc
148-
CFLAGS_x86_64-pc-nto-qnx710=-Vgcc_ntox86_64_cxx
149-
CXX_x86_64-pc-nto-qnx710=qcc
150-
AR_x86_64_pc_nto_qnx710=ntox86_64-ar'
153+
154+
CC_aarch64_unknown_nto_qnx700=qcc
155+
CFLAGS_aarch64_unknown_nto_qnx700=-Vgcc_ntoaarch64le_cxx
156+
CXX_aarch64_unknown_nto_qnx700=qcc
157+
AR_aarch64_unknown_nto_qnx700=ntoaarch64-ar
158+
159+
CC_x86_64_pc_nto_qnx710=qcc
160+
CFLAGS_x86_64_pc_nto_qnx710=-Vgcc_ntox86_64_cxx
161+
CXX_x86_64_pc_nto_qnx710=qcc
162+
AR_x86_64_pc_nto_qnx710=ntox86_64-ar
163+
'
151164

152165
env $build_env \
153166
./x.py build \
@@ -167,15 +180,7 @@ To run all tests on a x86_64 QNX Neutrino target:
167180

168181
```bash
169182
export TEST_DEVICE_ADDR="localhost:12345" # must address the test target, can be a SSH tunnel
170-
export build_env='
171-
CC_aarch64-unknown-nto-qnx710=qcc
172-
CFLAGS_aarch64-unknown-nto-qnx710=-Vgcc_ntoaarch64le_cxx
173-
CXX_aarch64-unknown-nto-qnx710=qcc
174-
AR_aarch64_unknown_nto_qnx710=ntoaarch64-ar
175-
CC_x86_64-pc-nto-qnx710=qcc
176-
CFLAGS_x86_64-pc-nto-qnx710=-Vgcc_ntox86_64_cxx
177-
CXX_x86_64-pc-nto-qnx710=qcc
178-
AR_x86_64_pc_nto_qnx710=ntox86_64-ar'
183+
export build_env=<see above>
179184

180185
# Disable tests that only work on the host or don't make sense for this target.
181186
# See also:

0 commit comments

Comments
 (0)