Skip to content

Commit 14348d9

Browse files
author
Kjetil Kjeka
committed
NVPTX: Avoid PassMode::Direct for C ABI
1 parent bf8fff7 commit 14348d9

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

compiler/rustc_target/src/abi/call/nvptx64.rs

+39-8
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,54 @@
11
use crate::abi::call::{ArgAbi, FnAbi, PassMode, Reg, Size, Uniform};
22
use crate::abi::{HasDataLayout, TyAbiInterface};
33

4+
use super::{ArgAttribute, ArgAttributes, ArgExtension, CastTarget};
5+
46
fn classify_ret<Ty>(ret: &mut ArgAbi<'_, Ty>) {
5-
if ret.layout.is_aggregate() && ret.layout.size.bits() > 64 {
6-
ret.make_indirect();
7-
} else {
8-
// FIXME: this is wrong! Need to decide which ABI we really want here.
9-
ret.make_direct_deprecated();
7+
if ret.layout.is_aggregate() && ret.layout.is_sized() {
8+
classify_aggregate(ret)
9+
} else if ret.layout.size.bits() < 32 && ret.layout.is_sized() {
10+
ret.extend_integer_width_to(32);
1011
}
1112
}
1213

1314
fn classify_arg<Ty>(arg: &mut ArgAbi<'_, Ty>) {
14-
if arg.layout.is_aggregate() {
15-
arg.make_indirect_byval(None);
16-
} else if arg.layout.size.bits() < 32 {
15+
if arg.layout.is_aggregate() && arg.layout.is_sized() {
16+
classify_aggregate(arg)
17+
} else if arg.layout.size.bits() < 32 && arg.layout.is_sized() {
1718
arg.extend_integer_width_to(32);
1819
}
1920
}
2021

22+
/// the pass mode used for aggregates in arg and ret position
23+
fn classify_aggregate<Ty>(arg: &mut ArgAbi<'_, Ty>) {
24+
let align_bytes = arg.layout.align.abi.bytes();
25+
let size = arg.layout.size;
26+
27+
let reg = match align_bytes {
28+
1 => Reg::i8(),
29+
2 => Reg::i16(),
30+
4 => Reg::i32(),
31+
8 => Reg::i64(),
32+
16 => Reg::i128(),
33+
_ => unreachable!("Align is given as power of 2 no larger than 16 bytes"),
34+
};
35+
36+
if align_bytes == size.bytes() {
37+
arg.cast_to(CastTarget {
38+
prefix: [Some(reg), None, None, None, None, None, None, None],
39+
rest: Uniform::new(Reg::i8(), Size::from_bytes(0)),
40+
attrs: ArgAttributes {
41+
regular: ArgAttribute::default(),
42+
arg_ext: ArgExtension::None,
43+
pointee_size: Size::ZERO,
44+
pointee_align: None,
45+
},
46+
});
47+
} else {
48+
arg.cast_to(Uniform::new(reg, size));
49+
}
50+
}
51+
2152
fn classify_arg_kernel<'a, Ty, C>(_cx: &C, arg: &mut ArgAbi<'a, Ty>)
2253
where
2354
Ty: TyAbiInterface<'a, C> + Copy,

tests/assembly/nvptx-c-abi-ret-v7.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//@ assembly-output: ptx-linker
22
//@ compile-flags: --crate-type cdylib -C target-cpu=sm_86 -Z unstable-options -Clinker-flavor=llbc
33
//@ only-nvptx64
4-
//@ ignore-nvptx64
54

65
// The PTX ABI stability is tied to major versions of the PTX ISA
76
// These tests assume major version 7

tests/ui/abi/compatibility.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,9 @@
5555
//@ revisions: csky
5656
//@[csky] compile-flags: --target csky-unknown-linux-gnuabiv2
5757
//@[csky] needs-llvm-components: csky
58-
59-
// FIXME: disabled on nvptx64 since the target ABI fails the sanity check
60-
// see https://github.com/rust-lang/rust/issues/117480
61-
/* revisions: nvptx64
62-
[nvptx64] compile-flags: --target nvptx64-nvidia-cuda
63-
[nvptx64] needs-llvm-components: nvptx
64-
*/
58+
//@ revisions: nvptx64
59+
//@[nvptx64] compile-flags: --target nvptx64-nvidia-cuda
60+
//@[nvptx64] needs-llvm-components: nvptx
6561
#![feature(rustc_attrs, unsized_fn_params, transparent_unions)]
6662
#![cfg_attr(not(host), feature(no_core, lang_items), no_std, no_core)]
6763
#![allow(unused, improper_ctypes_definitions, internal_features)]

0 commit comments

Comments
 (0)