@@ -9,9 +9,9 @@ use rustc_middle::ty::Ty;
9
9
use rustc_middle:: ty:: layout:: LayoutOf ;
10
10
#[ cfg( feature = "master" ) ]
11
11
use rustc_session:: config;
12
- #[ cfg( feature = "master" ) ]
13
- use rustc_target:: callconv:: Conv ;
14
12
use rustc_target:: callconv:: { ArgAttributes , CastTarget , FnAbi , PassMode } ;
13
+ #[ cfg( feature = "master" ) ]
14
+ use rustc_target:: callconv:: { Conv , RiscvInterruptKind } ;
15
15
16
16
use crate :: builder:: Builder ;
17
17
use crate :: context:: CodegenCx ;
@@ -240,38 +240,57 @@ 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 = match kind {
280
+ RiscvInterruptKind :: Machine => "machine" ,
281
+ RiscvInterruptKind :: Supervisor => "supervisor" ,
282
+ } ;
283
+ FnAttribute :: RiscvInterrupt ( kind)
284
+ }
285
+ Conv :: X86Fastcall => FnAttribute :: X86FastCall ,
286
+ Conv :: X86Intr => FnAttribute :: X86Interrupt ,
287
+ Conv :: X86Stdcall => FnAttribute :: X86Stdcall ,
288
+ Conv :: X86ThisCall => FnAttribute :: X86ThisCall ,
289
+ // NOTE: the vectorcall calling convention is not yet implemented in GCC:
290
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
272
291
Conv :: X86VectorCall => return None ,
273
- Conv :: X86_64SysV => FnAttribute :: SysvAbi ,
274
- Conv :: X86_64Win64 => FnAttribute :: MsAbi ,
292
+ Conv :: X86_64SysV => FnAttribute :: X86SysvAbi ,
293
+ Conv :: X86_64Win64 => FnAttribute :: X86MsAbi ,
275
294
} ;
276
295
Some ( attribute)
277
296
}
0 commit comments