@@ -10,7 +10,7 @@ use rustc_middle::ty::layout::LayoutOf;
10
10
#[ cfg( feature = "master" ) ]
11
11
use rustc_session:: config;
12
12
#[ cfg( feature = "master" ) ]
13
- use rustc_target:: callconv:: Conv ;
13
+ use rustc_target:: callconv:: { Conv , RiscvInterruptKind } ;
14
14
use rustc_target:: callconv:: { ArgAttributes , CastTarget , FnAbi , PassMode } ;
15
15
16
16
use crate :: builder:: Builder ;
@@ -240,38 +240,58 @@ impl<'gcc, 'tcx> FnAbiGccExt<'gcc, 'tcx> for FnAbi<'tcx, Ty<'tcx>> {
240
240
241
241
#[ cfg( feature = "master" ) ]
242
242
pub fn conv_to_fn_attribute < ' gcc > ( conv : Conv , arch : & str ) -> Option < FnAttribute < ' gcc > > {
243
- // TODO: handle the calling conventions returning None.
244
243
let attribute = match conv {
245
- Conv :: C
246
- | Conv :: Rust
247
- | Conv :: CCmseNonSecureCall
248
- | Conv :: CCmseNonSecureEntry
249
- | Conv :: RiscvInterrupt { .. } => return None ,
250
- Conv :: Cold => return None ,
244
+ Conv :: C | Conv :: Rust => return None ,
245
+ Conv :: CCmseNonSecureCall => {
246
+ if arch == "arm" {
247
+ FnAttribute :: ArmCmseNonsecureCall
248
+ } else {
249
+ return None ;
250
+ }
251
+ } ,
252
+ Conv :: CCmseNonSecureEntry => {
253
+ if arch == "arm" {
254
+ FnAttribute :: ArmCmseNonsecureEntry
255
+ } else {
256
+ return None ;
257
+ }
258
+ } ,
259
+ Conv :: Cold => FnAttribute :: Cold ,
260
+ // NOTE: the preserve attributes are not yet implemented in GCC:
261
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110899
251
262
Conv :: PreserveMost => return None ,
252
263
Conv :: PreserveAll => return None ,
253
264
Conv :: GpuKernel => {
254
- // TODO(antoyo): remove clippy allow attribute when this is implemented.
255
- #[ allow( clippy:: if_same_then_else) ]
256
265
if arch == "amdgpu" {
257
- return None ;
266
+ FnAttribute :: GcnAmdGpuHsaKernel
258
267
} else if arch == "nvptx64" {
259
- return None ;
268
+ FnAttribute :: NvptxKernel
260
269
} else {
261
270
panic ! ( "Architecture {} does not support GpuKernel calling convention" , arch) ;
262
271
}
263
272
}
264
- Conv :: AvrInterrupt => return None ,
265
- Conv :: AvrNonBlockingInterrupt => return None ,
266
- Conv :: ArmAapcs => return None ,
267
- Conv :: Msp430Intr => return None ,
268
- Conv :: X86Fastcall => return None ,
269
- Conv :: X86Intr => return None ,
270
- Conv :: X86Stdcall => return None ,
271
- Conv :: X86ThisCall => return None ,
273
+ // TODO(antoyo): check if those AVR attributes are mapped correctly.
274
+ Conv :: AvrInterrupt => FnAttribute :: AvrSignal ,
275
+ Conv :: AvrNonBlockingInterrupt => FnAttribute :: AvrInterrupt ,
276
+ Conv :: ArmAapcs => FnAttribute :: ArmPcs ( "aapcs" ) ,
277
+ Conv :: Msp430Intr => FnAttribute :: Msp430Interrupt ,
278
+ Conv :: RiscvInterrupt { kind } => {
279
+ let kind =
280
+ match kind {
281
+ RiscvInterruptKind :: Machine => "machine" ,
282
+ RiscvInterruptKind :: Supervisor => "supervisor" ,
283
+ } ;
284
+ FnAttribute :: RiscvInterrupt ( kind)
285
+ } ,
286
+ Conv :: X86Fastcall => FnAttribute :: X86FastCall ,
287
+ Conv :: X86Intr => FnAttribute :: X86Interrupt ,
288
+ Conv :: X86Stdcall => FnAttribute :: X86Stdcall ,
289
+ Conv :: X86ThisCall => FnAttribute :: X86ThisCall ,
290
+ // NOTE: the vectorcall calling convention is not yet implemented in GCC:
291
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
272
292
Conv :: X86VectorCall => return None ,
273
- Conv :: X86_64SysV => FnAttribute :: SysvAbi ,
274
- Conv :: X86_64Win64 => FnAttribute :: MsAbi ,
293
+ Conv :: X86_64SysV => FnAttribute :: X86SysvAbi ,
294
+ Conv :: X86_64Win64 => FnAttribute :: X86MsAbi ,
275
295
} ;
276
296
Some ( attribute)
277
297
}
0 commit comments