@@ -2915,114 +2915,9 @@ impl DerefMut for Target {
2915
2915
}
2916
2916
2917
2917
impl Target {
2918
- /// Given a function ABI, turn it into the correct ABI for this target.
2919
- pub fn adjust_abi ( & self , abi : ExternAbi , c_variadic : bool ) -> ExternAbi {
2920
- use ExternAbi :: * ;
2921
- match abi {
2922
- // On Windows, `extern "system"` behaves like msvc's `__stdcall`.
2923
- // `__stdcall` only applies on x86 and on non-variadic functions:
2924
- // https://learn.microsoft.com/en-us/cpp/cpp/stdcall?view=msvc-170
2925
- System { unwind } => {
2926
- if self . is_like_windows && self . arch == "x86" && !c_variadic {
2927
- Stdcall { unwind }
2928
- } else {
2929
- C { unwind }
2930
- }
2931
- }
2932
-
2933
- EfiApi => {
2934
- if self . arch == "arm" {
2935
- Aapcs { unwind : false }
2936
- } else if self . arch == "x86_64" {
2937
- Win64 { unwind : false }
2938
- } else {
2939
- C { unwind : false }
2940
- }
2941
- }
2942
-
2943
- // See commentary in `is_abi_supported`.
2944
- Stdcall { unwind } | Thiscall { unwind } | Fastcall { unwind } => {
2945
- if self . arch == "x86" { abi } else { C { unwind } }
2946
- }
2947
- Vectorcall { unwind } => {
2948
- if [ "x86" , "x86_64" ] . contains ( & & * self . arch ) {
2949
- abi
2950
- } else {
2951
- C { unwind }
2952
- }
2953
- }
2954
-
2955
- // The Windows x64 calling convention we use for `extern "Rust"`
2956
- // <https://learn.microsoft.com/en-us/cpp/build/x64-software-conventions#register-volatility-and-preservation>
2957
- // expects the callee to save `xmm6` through `xmm15`, but `PreserveMost`
2958
- // (that we use by default for `extern "rust-cold"`) doesn't save any of those.
2959
- // So to avoid bloating callers, just use the Rust convention here.
2960
- RustCold if self . is_like_windows && self . arch == "x86_64" => Rust ,
2961
-
2962
- abi => abi,
2963
- }
2964
- }
2965
-
2966
2918
pub fn is_abi_supported ( & self , abi : ExternAbi ) -> bool {
2967
- use ExternAbi :: * ;
2968
- match abi {
2969
- Rust | C { .. } | System { .. } | RustCall | Unadjusted | Cdecl { .. } | RustCold => {
2970
- true
2971
- }
2972
- EfiApi => {
2973
- [ "arm" , "aarch64" , "riscv32" , "riscv64" , "x86" , "x86_64" ] . contains ( & & self . arch [ ..] )
2974
- }
2975
- X86Interrupt => [ "x86" , "x86_64" ] . contains ( & & self . arch [ ..] ) ,
2976
- Aapcs { .. } => "arm" == self . arch ,
2977
- CCmseNonSecureCall | CCmseNonSecureEntry => {
2978
- [ "thumbv8m.main-none-eabi" , "thumbv8m.main-none-eabihf" , "thumbv8m.base-none-eabi" ]
2979
- . contains ( & & self . llvm_target [ ..] )
2980
- }
2981
- Win64 { .. } | SysV64 { .. } => self . arch == "x86_64" ,
2982
- PtxKernel => self . arch == "nvptx64" ,
2983
- GpuKernel => [ "amdgpu" , "nvptx64" ] . contains ( & & self . arch [ ..] ) ,
2984
- Msp430Interrupt => self . arch == "msp430" ,
2985
- RiscvInterruptM | RiscvInterruptS => [ "riscv32" , "riscv64" ] . contains ( & & self . arch [ ..] ) ,
2986
- AvrInterrupt | AvrNonBlockingInterrupt => self . arch == "avr" ,
2987
- Thiscall { .. } => self . arch == "x86" ,
2988
- // On windows these fall-back to platform native calling convention (C) when the
2989
- // architecture is not supported.
2990
- //
2991
- // This is I believe a historical accident that has occurred as part of Microsoft
2992
- // striving to allow most of the code to "just" compile when support for 64-bit x86
2993
- // was added and then later again, when support for ARM architectures was added.
2994
- //
2995
- // This is well documented across MSDN. Support for this in Rust has been added in
2996
- // #54576. This makes much more sense in context of Microsoft's C++ than it does in
2997
- // Rust, but there isn't much leeway remaining here to change it back at the time this
2998
- // comment has been written.
2999
- //
3000
- // Following are the relevant excerpts from the MSDN documentation.
3001
- //
3002
- // > The __vectorcall calling convention is only supported in native code on x86 and
3003
- // x64 processors that include Streaming SIMD Extensions 2 (SSE2) and above.
3004
- // > ...
3005
- // > On ARM machines, __vectorcall is accepted and ignored by the compiler.
3006
- //
3007
- // -- https://docs.microsoft.com/en-us/cpp/cpp/vectorcall?view=msvc-160
3008
- //
3009
- // > On ARM and x64 processors, __stdcall is accepted and ignored by the compiler;
3010
- //
3011
- // -- https://docs.microsoft.com/en-us/cpp/cpp/stdcall?view=msvc-160
3012
- //
3013
- // > In most cases, keywords or compiler switches that specify an unsupported
3014
- // > convention on a particular platform are ignored, and the platform default
3015
- // > convention is used.
3016
- //
3017
- // -- https://docs.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions
3018
- Stdcall { .. } | Fastcall { .. } | Vectorcall { .. } if self . is_like_windows => true ,
3019
- // Outside of Windows we want to only support these calling conventions for the
3020
- // architectures for which these calling conventions are actually well defined.
3021
- Stdcall { .. } | Fastcall { .. } if self . arch == "x86" => true ,
3022
- Vectorcall { .. } if [ "x86" , "x86_64" ] . contains ( & & self . arch [ ..] ) => true ,
3023
- // Reject these calling conventions everywhere else.
3024
- Stdcall { .. } | Fastcall { .. } | Vectorcall { .. } => false ,
3025
- }
2919
+ let abi_map = AbiMap :: from_target ( self ) ;
2920
+ abi_map. canonize_abi ( abi, false ) . is_mapped ( )
3026
2921
}
3027
2922
3028
2923
/// Minimum integer size in bits that this target can perform atomic
0 commit comments