Skip to content

Commit 92638ef

Browse files
authored
Rollup merge of #56000 - hug-dev:armv8m.main, r=alexcrichton
Add Armv8-M Mainline targets This commit enables the Armv8-M Mainline architecture profile. It adds two targets: - `thumbv8m.main-none-eabi` - `thumbv8m.main-none-eabihf` The second one uses the Floating Point Unit for floating point operations. It mainly targets the Cortex-M33 processor, which can have the optional Floating Point Unit extension. It follows #55041 which does it for Baseline. I will rebase this branch on top of it when it is merged to not create conflicts as we have some files in common. To make it work, it still relies on the Cargo change to be merged (accepting "." in target names, rust-lang/cargo#6255). The goal would also be to add this target in the CI so that the `core` library is available for everybody. To do this, some changes will be needed to compile successfully the needed libraries: * `cc-rs` needs to be updated to allow compiling C code for Armv8-M architectures profiles. It is only a few lines to add [here](https://github.com/alexcrichton/cc-rs/blob/a76611ad9836fa8c44fa8220a1d2a96dd3b7d4b6/src/lib.rs#L1299). * Some assembly files in `builtins` in `compiler-rt` were not assembling for Armv8-M Mainline. I sent changes [upstream](https://reviews.llvm.org/D51854) to that project to fix that. The Rust version of `compiler-rt` will have to be updated to contain [that commit](llvm-mirror/compiler-rt@a34cdf8). I tested it using the [Musca-A Test Chip board](https://developer.arm.com/products/system-design/development-boards/iot-test-chips-and-boards/musca-a-test-chip-board) but more intensively on the [Armv8-M FVP](https://developer.arm.com/products/system-design/fixed-virtual-platforms) (emulation platform). I am going to try to release my test code soon, once I tidy it up 👍
2 parents a2fb99b + 0f47c2a commit 92638ef

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

src/librustc_target/spec/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,8 @@ supported_targets! {
400400
("thumbv7em-none-eabi", thumbv7em_none_eabi),
401401
("thumbv7em-none-eabihf", thumbv7em_none_eabihf),
402402
("thumbv8m.base-none-eabi", thumbv8m_base_none_eabi),
403+
("thumbv8m.main-none-eabi", thumbv8m_main_none_eabi),
404+
("thumbv8m.main-none-eabihf", thumbv8m_main_none_eabihf),
403405

404406
("msp430-none-elf", msp430_none_elf),
405407

src/librustc_target/spec/thumb_base.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
// - Cortex-M4(F)
1919
// - Cortex-M7(F)
2020
// - Cortex-M23
21+
// - Cortex-M33
2122
//
2223
// We have opted for these instead of one target per processor (e.g. `cortex-m0`, `cortex-m3`,
2324
// etc) because the differences between some processors like the cortex-m0 and cortex-m1 are almost
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Targets the Cortex-M33 processor (Armv8-M Mainline architecture profile),
12+
// without the Floating Point extension.
13+
14+
use spec::{LinkerFlavor, LldFlavor, Target, TargetOptions, TargetResult};
15+
16+
pub fn target() -> TargetResult {
17+
Ok(Target {
18+
llvm_target: "thumbv8m.main-none-eabi".to_string(),
19+
target_endian: "little".to_string(),
20+
target_pointer_width: "32".to_string(),
21+
target_c_int_width: "32".to_string(),
22+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
23+
arch: "arm".to_string(),
24+
target_os: "none".to_string(),
25+
target_env: String::new(),
26+
target_vendor: String::new(),
27+
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
28+
29+
options: TargetOptions {
30+
max_atomic_width: Some(32),
31+
.. super::thumb_base::opts()
32+
},
33+
})
34+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Targets the Cortex-M33 processor (Armv8-M Mainline architecture profile),
12+
// with the Floating Point extension.
13+
14+
use spec::{LinkerFlavor, LldFlavor, Target, TargetOptions, TargetResult};
15+
16+
pub fn target() -> TargetResult {
17+
Ok(Target {
18+
llvm_target: "thumbv8m.main-none-eabihf".to_string(),
19+
target_endian: "little".to_string(),
20+
target_pointer_width: "32".to_string(),
21+
target_c_int_width: "32".to_string(),
22+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
23+
arch: "arm".to_string(),
24+
target_os: "none".to_string(),
25+
target_env: String::new(),
26+
target_vendor: String::new(),
27+
linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld),
28+
29+
options: TargetOptions {
30+
// If the Floating Point extension is implemented in the Cortex-M33
31+
// processor, the Cortex-M33 Technical Reference Manual states that
32+
// the FPU uses the FPv5 architecture, single-precision instructions
33+
// and 16 D registers.
34+
// These parameters map to the following LLVM features.
35+
features: "+fp-armv8,+fp-only-sp,+d16".to_string(),
36+
max_atomic_width: Some(32),
37+
.. super::thumb_base::opts()
38+
},
39+
})
40+
}

0 commit comments

Comments
 (0)