Skip to content

Commit 07e0c36

Browse files
committed
Auto merge of #61946 - BaoshanPang:vxworks, r=alexcrichton
port rust for vxWorks The supporting for vxWorks has been enabled in this branch. Although there are still a lots of work to do, I would like to upstream the code and fix the problems later. Please let me know if there is anything I have to do before upstream the code. r? @alexcrichton Thanks, Baoshan
2 parents 96234d5 + 4c0c0f6 commit 07e0c36

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+8791
-3
lines changed

src/bootstrap/cc_detect.rs

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ fn cc2ar(cc: &Path, target: &str) -> Option<PathBuf> {
4545
Some(PathBuf::from("ar"))
4646
} else if target.contains("openbsd") {
4747
Some(PathBuf::from("ar"))
48+
} else if target.contains("vxworks") {
49+
Some(PathBuf::from("vx-ar"))
4850
} else {
4951
let parent = cc.parent().unwrap();
5052
let file = cc.file_name().unwrap().to_str().unwrap();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.max_atomic_width = Some(128);
6+
7+
Ok(Target {
8+
llvm_target: "aarch64-unknown-linux-gnu".to_string(),
9+
target_endian: "little".to_string(),
10+
target_pointer_width: "64".to_string(),
11+
target_c_int_width: "32".to_string(),
12+
target_env: "gnu".to_string(),
13+
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
14+
arch: "aarch64".to_string(),
15+
target_os: "vxworks".to_string(),
16+
target_vendor: "unknown".to_string(),
17+
linker_flavor: LinkerFlavor::Gcc,
18+
options: TargetOptions {
19+
abi_blacklist: super::arm_base::abi_blacklist(),
20+
target_mcount: "\u{1}_mcount".to_string(),
21+
.. base
22+
},
23+
})
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
// This target is for glibc Linux on ARMv7 without NEON or
4+
// thumb-mode. See the thumbv7neon variant for enabling both.
5+
6+
pub fn target() -> TargetResult {
7+
let base = super::vxworks_base::opts();
8+
Ok(Target {
9+
llvm_target: "armv7-unknown-linux-gnueabihf".to_string(),
10+
target_endian: "little".to_string(),
11+
target_pointer_width: "32".to_string(),
12+
target_c_int_width: "32".to_string(),
13+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
14+
arch: "arm".to_string(),
15+
target_os: "vxworks".to_string(),
16+
target_env: "gnu".to_string(),
17+
target_vendor: "unknown".to_string(),
18+
linker_flavor: LinkerFlavor::Gcc,
19+
20+
options: TargetOptions {
21+
// Info about features at https://wiki.debian.org/ArmHardFloatPort
22+
features: "+v7,+vfp3,+d16,+thumb2,-neon".to_string(),
23+
cpu: "generic".to_string(),
24+
max_atomic_width: Some(64),
25+
abi_blacklist: super::arm_base::abi_blacklist(),
26+
target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
27+
// tls_model: "local-exec".to_string(),
28+
position_independent_executables: false,
29+
.. base
30+
}
31+
})
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.max_atomic_width = Some(64);
6+
Ok(Target {
7+
llvm_target: "arm-unknown-linux-gnueabi".to_string(),
8+
target_endian: "little".to_string(),
9+
target_pointer_width: "32".to_string(),
10+
target_c_int_width: "32".to_string(),
11+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
12+
arch: "arm".to_string(),
13+
target_os: "vxworks".to_string(),
14+
target_env: "gnu".to_string(),
15+
target_vendor: "unknown".to_string(),
16+
linker_flavor: LinkerFlavor::Gcc,
17+
18+
options: TargetOptions {
19+
features: "+strict-align,+v6".to_string(),
20+
abi_blacklist: super::arm_base::abi_blacklist(),
21+
target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
22+
.. base
23+
},
24+
})
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
// This target is for glibc Linux on ARMv7 without NEON or
4+
// thumb-mode. See the thumbv7neon variant for enabling both.
5+
6+
pub fn target() -> TargetResult {
7+
let base = super::vxworks_base::opts();
8+
Ok(Target {
9+
llvm_target: "armv7-unknown-linux-gnueabihf".to_string(),
10+
target_endian: "little".to_string(),
11+
target_pointer_width: "32".to_string(),
12+
target_c_int_width: "32".to_string(),
13+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
14+
arch: "arm".to_string(),
15+
target_os: "vxworks".to_string(),
16+
target_env: "gnu".to_string(),
17+
target_vendor: "unknown".to_string(),
18+
linker_flavor: LinkerFlavor::Gcc,
19+
20+
options: TargetOptions {
21+
// Info about features at https://wiki.debian.org/ArmHardFloatPort
22+
features: "+v7,+vfp3,+d16,+thumb2,-neon".to_string(),
23+
cpu: "generic".to_string(),
24+
max_atomic_width: Some(64),
25+
abi_blacklist: super::arm_base::abi_blacklist(),
26+
target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
27+
// tls_model: "local-exec".to_string(),
28+
position_independent_executables: false,
29+
.. base
30+
}
31+
})
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
use crate::spec::TargetResult;
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::i686_wrs_vxworks::target()?;
5+
base.options.cpu = "pentium".to_string();
6+
base.llvm_target = "i586-unknown-linux-gnu".to_string();
7+
Ok(base)
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.cpu = "pentium4".to_string();
6+
base.max_atomic_width = Some(64);
7+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
8+
base.stack_probes = true;
9+
10+
Ok(Target {
11+
llvm_target: "i686-unknown-linux-gnu".to_string(),
12+
target_endian: "little".to_string(),
13+
target_pointer_width: "32".to_string(),
14+
target_c_int_width: "32".to_string(),
15+
data_layout: "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128".to_string(),
16+
arch: "x86".to_string(),
17+
target_os: "vxworks".to_string(),
18+
target_env: "gnu".to_string(),
19+
target_vendor: "unknown".to_string(),
20+
linker_flavor: LinkerFlavor::Gcc,
21+
options: base,
22+
})
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.cpu = "pentium4".to_string();
6+
base.max_atomic_width = Some(64);
7+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
8+
base.stack_probes = true;
9+
10+
Ok(Target {
11+
llvm_target: "i686-unknown-linux-gnu".to_string(),
12+
target_endian: "little".to_string(),
13+
target_pointer_width: "32".to_string(),
14+
target_c_int_width: "32".to_string(),
15+
data_layout: "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128".to_string(),
16+
arch: "x86".to_string(),
17+
target_os: "vxworks".to_string(),
18+
target_env: "gnu".to_string(),
19+
target_vendor: "unknown".to_string(),
20+
linker_flavor: LinkerFlavor::Gcc,
21+
options: base,
22+
})
23+
}

src/librustc_target/spec/mod.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ mod fuchsia_base;
6666
mod redox_base;
6767
mod riscv_base;
6868
mod wasm32_base;
69+
mod vxworks_base;
6970

7071
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Hash,
7172
RustcEncodable, RustcDecodable)]
@@ -361,7 +362,6 @@ supported_targets! {
361362
("thumbv7neon-unknown-linux-gnueabihf", thumbv7neon_unknown_linux_gnueabihf),
362363
("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
363364
("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
364-
365365
("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
366366
("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
367367
("i686-unknown-linux-musl", i686_unknown_linux_musl),
@@ -476,6 +476,15 @@ supported_targets! {
476476
("x86_64-unknown-uefi", x86_64_unknown_uefi),
477477

478478
("nvptx64-nvidia-cuda", nvptx64_nvidia_cuda),
479+
480+
("x86_64-wrs-vxworks", x86_64_wrs_vxworks),
481+
("i686-wrs-vxworks", i686_wrs_vxworks),
482+
("i586-wrs-vxworks", i586_wrs_vxworks),
483+
("armv7-wrs-vxworks", armv7_wrs_vxworks),
484+
("aarch64-wrs-vxworks", aarch64_wrs_vxworks),
485+
("powerpc-wrs-vxworks", powerpc_wrs_vxworks),
486+
("powerpc-wrs-vxworks-spe", powerpc_wrs_vxworks_spe),
487+
("powerpc64-wrs-vxworks", powerpc64_wrs_vxworks),
479488
}
480489

481490
/// Everything `rustc` knows about how to compile for a specific target.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.cpu = "ppc64".to_string();
6+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
7+
base.max_atomic_width = Some(64);
8+
9+
Ok(Target {
10+
llvm_target: "powerpc64-unknown-linux-gnu".to_string(),
11+
target_endian: "big".to_string(),
12+
target_pointer_width: "64".to_string(),
13+
target_c_int_width: "32".to_string(),
14+
data_layout: "E-m:e-i64:64-n32:64".to_string(),
15+
arch: "powerpc64".to_string(),
16+
target_os: "vxworks".to_string(),
17+
target_env: "gnu".to_string(),
18+
target_vendor: "unknown".to_string(),
19+
linker_flavor: LinkerFlavor::Gcc,
20+
options: TargetOptions {
21+
target_mcount: "_mcount".to_string(),
22+
.. base
23+
},
24+
})
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.cpu = "ppc64".to_string();
6+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
7+
base.max_atomic_width = Some(64);
8+
9+
Ok(Target {
10+
llvm_target: "powerpc64-unknown-linux-gnu".to_string(),
11+
target_endian: "big".to_string(),
12+
target_pointer_width: "64".to_string(),
13+
target_c_int_width: "32".to_string(),
14+
data_layout: "E-m:e-i64:64-n32:64".to_string(),
15+
arch: "powerpc64".to_string(),
16+
target_os: "vxworks".to_string(),
17+
target_env: "gnu".to_string(),
18+
target_vendor: "unknown".to_string(),
19+
linker_flavor: LinkerFlavor::Gcc,
20+
options: TargetOptions {
21+
features: "-hard-float".to_string(),
22+
target_mcount: "_mcount".to_string(),
23+
.. base
24+
},
25+
})
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
6+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("--secure-plt".to_string());
7+
base.max_atomic_width = Some(32);
8+
9+
Ok(Target {
10+
llvm_target: "powerpc-unknown-linux-gnu".to_string(),
11+
target_endian: "big".to_string(),
12+
target_pointer_width: "32".to_string(),
13+
target_c_int_width: "32".to_string(),
14+
data_layout: "E-m:e-p:32:32-i64:64-n32".to_string(),
15+
arch: "powerpc".to_string(),
16+
target_os: "vxworks".to_string(),
17+
target_env: "gnu".to_string(),
18+
target_vendor: "wrs".to_string(),
19+
linker_flavor: LinkerFlavor::Gcc,
20+
options: TargetOptions {
21+
features: "+secure-plt".to_string(),
22+
target_mcount: "_mcount".to_string(),
23+
.. base
24+
},
25+
})
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
6+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("--secure-plt".to_string());
7+
base.max_atomic_width = Some(32);
8+
9+
Ok(Target {
10+
llvm_target: "powerpc-unknown-linux-gnu".to_string(),
11+
target_endian: "big".to_string(),
12+
target_pointer_width: "32".to_string(),
13+
target_c_int_width: "32".to_string(),
14+
data_layout: "E-m:e-p:32:32-i64:64-n32".to_string(),
15+
arch: "powerpc".to_string(),
16+
target_os: "vxworks".to_string(),
17+
target_env: "gnu".to_string(),
18+
target_vendor: "wrs".to_string(),
19+
linker_flavor: LinkerFlavor::Gcc,
20+
options: TargetOptions {
21+
features: "+secure-plt,-hard-float".to_string(),
22+
target_mcount: "_mcount".to_string(),
23+
.. base
24+
},
25+
})
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-mspe".to_string());
6+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("--secure-plt".to_string());
7+
base.max_atomic_width = Some(32);
8+
9+
Ok(Target {
10+
llvm_target: "powerpc-unknown-linux-gnuspe".to_string(),
11+
target_endian: "big".to_string(),
12+
target_pointer_width: "32".to_string(),
13+
target_c_int_width: "32".to_string(),
14+
data_layout: "E-m:e-p:32:32-i64:64-n32".to_string(),
15+
arch: "powerpc".to_string(),
16+
target_os: "vxworks".to_string(),
17+
target_env: "gnu".to_string(),
18+
target_vendor: "wrs".to_string(),
19+
linker_flavor: LinkerFlavor::Gcc,
20+
options: TargetOptions {
21+
// feature msync would disable instruction 'fsync' which is not supported by fsl_p1p2
22+
features: "+secure-plt,+msync,-hard-float".to_string(),
23+
target_mcount: "_mcount".to_string(),
24+
.. base
25+
},
26+
})
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
2+
3+
pub fn target() -> TargetResult {
4+
let mut base = super::vxworks_base::opts();
5+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-mspe".to_string());
6+
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("--secure-plt".to_string());
7+
base.max_atomic_width = Some(32);
8+
9+
Ok(Target {
10+
llvm_target: "powerpc-unknown-linux-gnuspe".to_string(),
11+
target_endian: "big".to_string(),
12+
target_pointer_width: "32".to_string(),
13+
target_c_int_width: "32".to_string(),
14+
data_layout: "E-m:e-p:32:32-i64:64-n32".to_string(),
15+
arch: "powerpc".to_string(),
16+
target_os: "vxworks".to_string(),
17+
target_env: "gnu".to_string(),
18+
target_vendor: "wrs".to_string(),
19+
linker_flavor: LinkerFlavor::Gcc,
20+
options: TargetOptions {
21+
// feature msync would disable instruction 'fsync' which is not supported by fsl_p1p2
22+
features: "+secure-plt,+msync".to_string(),
23+
target_mcount: "_mcount".to_string(),
24+
.. base
25+
},
26+
})
27+
}

0 commit comments

Comments
 (0)