Always specify llvm_abiname
for RISC-V targets
This commit is contained in:
parent
7342830c05
commit
3ea91c05db
16 changed files with 71 additions and 1 deletions
|
@ -20,6 +20,7 @@ pub(crate) fn target() -> Target {
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
atomic_cas: false,
|
atomic_cas: false,
|
||||||
features: "+forced-atomics".into(),
|
features: "+forced-atomics".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
emit_debug_gdb_scripts: false,
|
emit_debug_gdb_scripts: false,
|
||||||
|
|
|
@ -29,6 +29,7 @@ pub(crate) fn target() -> Target {
|
||||||
atomic_cas: true,
|
atomic_cas: true,
|
||||||
|
|
||||||
features: "+m".into(),
|
features: "+m".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
executables: true,
|
executables: true,
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
|
|
|
@ -20,6 +20,7 @@ pub(crate) fn target() -> Target {
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
atomic_cas: false,
|
atomic_cas: false,
|
||||||
features: "+m,+forced-atomics".into(),
|
features: "+m,+forced-atomics".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
emit_debug_gdb_scripts: false,
|
emit_debug_gdb_scripts: false,
|
||||||
|
|
|
@ -19,6 +19,7 @@ pub(crate) fn target() -> Target {
|
||||||
cpu: "generic-rv32".into(),
|
cpu: "generic-rv32".into(),
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
features: "+m,+a".into(),
|
features: "+m,+a".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
emit_debug_gdb_scripts: false,
|
emit_debug_gdb_scripts: false,
|
||||||
|
|
|
@ -27,6 +27,7 @@ pub(crate) fn target() -> Target {
|
||||||
atomic_cas: true,
|
atomic_cas: true,
|
||||||
|
|
||||||
features: "+m,+a,+c".into(),
|
features: "+m,+a,+c".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
emit_debug_gdb_scripts: false,
|
emit_debug_gdb_scripts: false,
|
||||||
|
|
|
@ -19,6 +19,7 @@ pub(crate) fn target() -> Target {
|
||||||
cpu: "generic-rv32".into(),
|
cpu: "generic-rv32".into(),
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
features: "+m,+a,+c".into(),
|
features: "+m,+a,+c".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
emit_debug_gdb_scripts: false,
|
emit_debug_gdb_scripts: false,
|
||||||
|
|
|
@ -21,6 +21,7 @@ pub(crate) fn target() -> Target {
|
||||||
cpu: "generic-rv32".into(),
|
cpu: "generic-rv32".into(),
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
features: "+m,+a,+c".into(),
|
features: "+m,+a,+c".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Unwind,
|
panic_strategy: PanicStrategy::Unwind,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|
|
@ -20,6 +20,7 @@ pub(crate) fn target() -> Target {
|
||||||
cpu: "generic-rv32".into(),
|
cpu: "generic-rv32".into(),
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
features: "+m,+a,+c".into(),
|
features: "+m,+a,+c".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Unwind,
|
panic_strategy: PanicStrategy::Unwind,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|
|
@ -30,6 +30,7 @@ pub(crate) fn target() -> Target {
|
||||||
atomic_cas: true,
|
atomic_cas: true,
|
||||||
|
|
||||||
features: "+m,+c".into(),
|
features: "+m,+c".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
emit_debug_gdb_scripts: false,
|
emit_debug_gdb_scripts: false,
|
||||||
|
|
|
@ -20,6 +20,7 @@ pub(crate) fn target() -> Target {
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
atomic_cas: false,
|
atomic_cas: false,
|
||||||
features: "+m,+c,+forced-atomics".into(),
|
features: "+m,+c,+forced-atomics".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
emit_debug_gdb_scripts: false,
|
emit_debug_gdb_scripts: false,
|
||||||
|
|
|
@ -21,6 +21,7 @@ pub(crate) fn target() -> Target {
|
||||||
cpu: "generic-rv32".into(),
|
cpu: "generic-rv32".into(),
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
features: "+m,+c".into(),
|
features: "+m,+c".into(),
|
||||||
|
llvm_abiname: "ilp32".into(),
|
||||||
panic_strategy: PanicStrategy::Unwind,
|
panic_strategy: PanicStrategy::Unwind,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|
|
@ -22,6 +22,7 @@ pub(crate) fn target() -> Target {
|
||||||
cpu: "generic-rv64".into(),
|
cpu: "generic-rv64".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
features: "+m,+a,+c".into(),
|
features: "+m,+a,+c".into(),
|
||||||
|
llvm_abiname: "lp64".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
code_model: Some(CodeModel::Medium),
|
code_model: Some(CodeModel::Medium),
|
||||||
|
|
|
@ -24,6 +24,7 @@ pub(crate) fn target() -> Target {
|
||||||
cpu: "generic-rv64".into(),
|
cpu: "generic-rv64".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
features: "+m,+a,+c".into(),
|
features: "+m,+a,+c".into(),
|
||||||
|
llvm_abiname: "lp64".into(),
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
relocation_model: RelocModel::Static,
|
relocation_model: RelocModel::Static,
|
||||||
code_model: Some(CodeModel::Medium),
|
code_model: Some(CodeModel::Medium),
|
||||||
|
|
|
@ -152,6 +152,17 @@ impl Target {
|
||||||
if self.crt_static_default || self.crt_static_allows_dylibs {
|
if self.crt_static_default || self.crt_static_allows_dylibs {
|
||||||
assert!(self.crt_static_respected);
|
assert!(self.crt_static_respected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that RISC-V targets always specify which ABI they use.
|
||||||
|
match &*self.arch {
|
||||||
|
"riscv32" => {
|
||||||
|
assert_matches!(&*self.llvm_abiname, "ilp32" | "ilp32f" | "ilp32d" | "ilp32e")
|
||||||
|
}
|
||||||
|
"riscv64" => {
|
||||||
|
assert_matches!(&*self.llvm_abiname, "lp64" | "lp64f" | "lp64d" | "lp64q")
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add your target to the whitelist if it has `std` library
|
// Add your target to the whitelist if it has `std` library
|
||||||
|
|
46
tests/assembly/riscv-soft-abi-with-float-features.rs
Normal file
46
tests/assembly/riscv-soft-abi-with-float-features.rs
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
//@ assembly-output: emit-asm
|
||||||
|
//@ compile-flags: --target riscv64imac-unknown-none-elf -Ctarget-feature=+f,+d
|
||||||
|
//@ needs-llvm-components: riscv
|
||||||
|
|
||||||
|
#![feature(no_core, lang_items, f16)]
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
#![no_core]
|
||||||
|
|
||||||
|
#[lang = "sized"]
|
||||||
|
trait Sized {}
|
||||||
|
|
||||||
|
#[lang = "copy"]
|
||||||
|
trait Copy {}
|
||||||
|
|
||||||
|
impl Copy for f16 {}
|
||||||
|
impl Copy for f32 {}
|
||||||
|
impl Copy for f64 {}
|
||||||
|
|
||||||
|
// This test checks that the floats are all returned in `a0` as required by the `lp64` ABI.
|
||||||
|
|
||||||
|
// CHECK-LABEL: read_f16
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn read_f16(x: &f16) -> f16 {
|
||||||
|
// CHECK: lh a0, 0(a0)
|
||||||
|
// CHECK-NEXT: lui a1, 1048560
|
||||||
|
// CHECK-NEXT: or a0, a0, a1
|
||||||
|
// CHECK-NEXT: ret
|
||||||
|
*x
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: read_f32
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn read_f32(x: &f32) -> f32 {
|
||||||
|
// CHECK: flw fa5, 0(a0)
|
||||||
|
// CHECK-NEXT: fmv.x.w a0, fa5
|
||||||
|
// CHECK-NEXT: ret
|
||||||
|
*x
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: read_f64
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn read_f64(x: &f64) -> f64 {
|
||||||
|
// CHECK: ld a0, 0(a0)
|
||||||
|
// CHECK-NEXT: ret
|
||||||
|
*x
|
||||||
|
}
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
//@[riscv32imac] compile-flags: --target=riscv32imac-unknown-none-elf
|
//@[riscv32imac] compile-flags: --target=riscv32imac-unknown-none-elf
|
||||||
//@[riscv32imac] needs-llvm-components: riscv
|
//@[riscv32imac] needs-llvm-components: riscv
|
||||||
// riscv32imac-NOT: !"target-abi"
|
// riscv32imac: !{i32 1, !"target-abi", !"ilp32"}
|
||||||
|
|
||||||
#![feature(no_core, lang_items)]
|
#![feature(no_core, lang_items)]
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
|
|
Loading…
Add table
Reference in a new issue