Skip to content

Commit 0fbe382

Browse files
committed
Add targets thumbv7neon-linux-androideabi and thumbv7neon-unknown-linux-gnueabihf
These two targets enable both thumb-mode and NEON for ARMv7 CPUs.
1 parent 9fe5cb5 commit 0fbe382

File tree

12 files changed

+114
-2
lines changed

12 files changed

+114
-2
lines changed

src/bootstrap/cc_detect.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,10 @@ fn set_compiler(cfg: &mut cc::Build,
143143
// compiler already takes into account the triple in question.
144144
t if t.contains("android") => {
145145
if let Some(ndk) = config.and_then(|c| c.ndk.as_ref()) {
146-
let target = target.replace("armv7", "arm");
146+
let target = target.replace("armv7neon", "arm")
147+
.replace("armv7", "arm")
148+
.replace("thumbv7neon", "arm")
149+
.replace("thumbv7", "arm");
147150
let compiler = format!("{}-{}", target, compiler.clang());
148151
cfg.compiler(ndk.join("bin").join(compiler));
149152
}

src/bootstrap/configure.py

+2
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ def v(*args):
107107
"arm-linux-androideabi NDK standalone path")
108108
v("armv7-linux-androideabi-ndk", "target.armv7-linux-androideabi.android-ndk",
109109
"armv7-linux-androideabi NDK standalone path")
110+
v("thumbv7neon-linux-androideabi-ndk", "target.thumbv7neon-linux-androideabi.android-ndk",
111+
"thumbv7neon-linux-androideabi NDK standalone path")
110112
v("aarch64-linux-android-ndk", "target.aarch64-linux-android.android-ndk",
111113
"aarch64-linux-android NDK standalone path")
112114
v("x86_64-linux-android-ndk", "target.x86_64-linux-android.android-ndk",

src/ci/docker/dist-android/Dockerfile

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ RUN . /scripts/android-ndk.sh && \
1616
# env
1717
ENV TARGETS=arm-linux-androideabi
1818
ENV TARGETS=$TARGETS,armv7-linux-androideabi
19+
ENV TARGETS=$TARGETS,thumbv7neon-linux-androideabi
1920
ENV TARGETS=$TARGETS,i686-linux-android
2021
ENV TARGETS=$TARGETS,aarch64-linux-android
2122
ENV TARGETS=$TARGETS,x86_64-linux-android
@@ -24,6 +25,7 @@ ENV RUST_CONFIGURE_ARGS \
2425
--enable-extended \
2526
--arm-linux-androideabi-ndk=/android/ndk/arm-14 \
2627
--armv7-linux-androideabi-ndk=/android/ndk/arm-14 \
28+
--thumbv7neon-linux-androideabi-ndk=/android/ndk/arm-14 \
2729
--i686-linux-android-ndk=/android/ndk/x86-14 \
2830
--aarch64-linux-android-ndk=/android/ndk/arm64-21 \
2931
--x86_64-linux-android-ndk=/android/ndk/x86_64-21 \

src/librustc_target/spec/armv7_linux_androideabi.rs

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010

1111
use spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
1212

13+
// This target if is for the baseline of the Android v7a ABI
14+
// in thumb mode. It's named armv7-* instead of thumbv7-*
15+
// for historical reasons. See the thumbv7neon variant for
16+
// enabling NEON.
17+
1318
// See https://developer.android.com/ndk/guides/abis.html#v7a
1419
// for target ABI requirements.
1520

src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010

1111
use spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
1212

13+
// This target is for glibc Linux on ARMv7 without NEON or
14+
// thumb-mode. See the thumbv7neon variant for enabling both.
15+
1316
pub fn target() -> TargetResult {
1417
let base = super::linux_base::opts();
1518
Ok(Target {

src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
use spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
1212

13+
// This target is for musl Linux on ARMv7 without thumb-mode or NEON.
14+
1315
pub fn target() -> TargetResult {
1416
let base = super::linux_musl_base::opts();
1517
Ok(Target {

src/librustc_target/spec/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ supported_targets! {
313313
("armv5te-unknown-linux-gnueabi", armv5te_unknown_linux_gnueabi),
314314
("armv5te-unknown-linux-musleabi", armv5te_unknown_linux_musleabi),
315315
("armv7-unknown-linux-gnueabihf", armv7_unknown_linux_gnueabihf),
316+
("thumbv7neon-unknown-linux-gnueabihf", thumbv7neon_unknown_linux_gnueabihf),
316317
("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
317318
("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
318319

@@ -330,6 +331,7 @@ supported_targets! {
330331
("x86_64-linux-android", x86_64_linux_android),
331332
("arm-linux-androideabi", arm_linux_androideabi),
332333
("armv7-linux-androideabi", armv7_linux_androideabi),
334+
("thumbv7neon-linux-androideabi", thumbv7neon_linux_androideabi),
333335
("aarch64-linux-android", aarch64_linux_android),
334336

335337
("aarch64-unknown-freebsd", aarch64_unknown_freebsd),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright 2016 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+
use spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
12+
13+
// This target if is for the Android v7a ABI in thumb mode with
14+
// NEON unconditionally enabled and, therefore, with 32 FPU registers
15+
// enabled as well. See section A2.6.2 on page A2-56 in
16+
// https://static.docs.arm.com/ddi0406/cd/DDI0406C_d_armv7ar_arm.pdf
17+
18+
// See https://developer.android.com/ndk/guides/abis.html#v7a
19+
// for target ABI requirements.
20+
21+
pub fn target() -> TargetResult {
22+
let mut base = super::android_base::opts();
23+
base.features = "+v7,+thumb-mode,+thumb2,+vfp3,+neon".to_string();
24+
base.max_atomic_width = Some(64);
25+
base.pre_link_args
26+
.get_mut(&LinkerFlavor::Gcc).unwrap().push("-march=armv7-a".to_string());
27+
28+
Ok(Target {
29+
llvm_target: "armv7-none-linux-android".to_string(),
30+
target_endian: "little".to_string(),
31+
target_pointer_width: "32".to_string(),
32+
target_c_int_width: "32".to_string(),
33+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
34+
arch: "arm".to_string(),
35+
target_os: "android".to_string(),
36+
target_env: "".to_string(),
37+
target_vendor: "unknown".to_string(),
38+
linker_flavor: LinkerFlavor::Gcc,
39+
options: TargetOptions {
40+
abi_blacklist: super::arm_base::abi_blacklist(),
41+
.. base
42+
},
43+
})
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright 2016 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+
use spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
12+
13+
// This target is for glibc Linux on ARMv7 with thumb mode enabled
14+
// (for consistency with Android and Debian-based distributions)
15+
// and with NEON unconditionally enabled and, therefore, with 32 FPU
16+
// registers enabled as well. See section A2.6.2 on page A2-56 in
17+
// https://static.docs.arm.com/ddi0406/cd/DDI0406C_d_armv7ar_arm.pdf
18+
19+
pub fn target() -> TargetResult {
20+
let base = super::linux_base::opts();
21+
Ok(Target {
22+
llvm_target: "armv7-unknown-linux-gnueabihf".to_string(),
23+
target_endian: "little".to_string(),
24+
target_pointer_width: "32".to_string(),
25+
target_c_int_width: "32".to_string(),
26+
data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
27+
arch: "arm".to_string(),
28+
target_os: "linux".to_string(),
29+
target_env: "gnu".to_string(),
30+
target_vendor: "unknown".to_string(),
31+
linker_flavor: LinkerFlavor::Gcc,
32+
33+
options: TargetOptions {
34+
// Info about features at https://wiki.debian.org/ArmHardFloatPort
35+
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".to_string(),
36+
cpu: "generic".to_string(),
37+
max_atomic_width: Some(64),
38+
abi_blacklist: super::arm_base::abi_blacklist(),
39+
.. base
40+
}
41+
})
42+
}

src/test/run-make-fulldeps/atomic-lock-free/Makefile

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ ifeq ($(filter arm,$(LLVM_COMPONENTS)),arm)
1818
nm "$(TMPDIR)/libatomic_lock_free.rlib" | $(CGREP) -v __atomic_fetch_add
1919
$(RUSTC) --target=armv7-unknown-linux-gnueabihf atomic_lock_free.rs
2020
nm "$(TMPDIR)/libatomic_lock_free.rlib" | $(CGREP) -v __atomic_fetch_add
21+
$(RUSTC) --target=thumbv7neon-unknown-linux-gnueabihf atomic_lock_free.rs
22+
nm "$(TMPDIR)/libatomic_lock_free.rlib" | $(CGREP) -v __atomic_fetch_add
2123
endif
2224
ifeq ($(filter aarch64,$(LLVM_COMPONENTS)),aarch64)
2325
$(RUSTC) --target=aarch64-unknown-linux-gnu atomic_lock_free.rs

src/tools/build-manifest/src/main.rs

+2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ static TARGETS: &'static [&'static str] = &[
6161
"armv5te-unknown-linux-musleabi",
6262
"armv7-apple-ios",
6363
"armv7-linux-androideabi",
64+
"thumbv7neon-linux-androideabi",
6465
"armv7-unknown-linux-gnueabihf",
66+
"thumbv7neon-unknown-linux-gnueabihf",
6567
"armv7-unknown-linux-musleabihf",
6668
"armebv7r-none-eabi",
6769
"armebv7r-none-eabihf",

src/tools/compiletest/src/runtest.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,10 @@ pub fn make_diff(expected: &str, actual: &str, context_size: usize) -> Vec<Misma
168168

169169
pub fn run(config: Config, testpaths: &TestPaths, revision: Option<&str>) {
170170
match &*config.target {
171-
"arm-linux-androideabi" | "armv7-linux-androideabi" | "aarch64-linux-android" => {
171+
"arm-linux-androideabi"
172+
| "armv7-linux-androideabi"
173+
| "thumbv7neon-linux-androideabi"
174+
| "aarch64-linux-android" => {
172175
if !config.adb_device_status {
173176
panic!("android device not available");
174177
}

0 commit comments

Comments
 (0)