@@ -35,8 +35,6 @@ fn do_check_simd_vector_abi<'tcx>(
35
35
is_call : bool ,
36
36
loc : impl Fn ( ) -> ( Span , HirId ) ,
37
37
) {
38
- // We check this on all functions, including those using the "Rust" ABI.
39
- // For the "Rust" ABI it would be a bug if the lint ever triggered, but better safe than sorry.
40
38
let feature_def = tcx. sess . target . features_for_correct_vector_abi ( ) ;
41
39
let codegen_attrs = tcx. codegen_fn_attrs ( def_id) ;
42
40
let have_feature = |feat : Symbol | {
@@ -123,8 +121,9 @@ fn do_check_wasm_abi<'tcx>(
123
121
is_call : bool ,
124
122
loc : impl Fn ( ) -> ( Span , HirId ) ,
125
123
) {
126
- // Only proceed for `extern "C" fn` on wasm32-unknown-unknown (same check as what `adjust_for_foreign_abi` uses to call `compute_wasm_abi_info`),
127
- // and only proceed if `wasm_c_abi_opt` indicates we should emit the lint.
124
+ // Only proceed for `extern "C" fn` on wasm32-unknown-unknown (same check as what
125
+ // `adjust_for_foreign_abi` uses to call `compute_wasm_abi_info`), and only proceed if
126
+ // `wasm_c_abi_opt` indicates we should emit the lint.
128
127
if !( tcx. sess . target . arch == "wasm32"
129
128
&& tcx. sess . target . os == "unknown"
130
129
&& tcx. wasm_c_abi_opt ( ) == WasmCAbi :: Legacy { with_lint : true }
@@ -157,8 +156,15 @@ fn check_instance_abi<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) {
157
156
else {
158
157
// An error will be reported during codegen if we cannot determine the ABI of this
159
158
// function.
159
+ tcx. dcx ( ) . delayed_bug ( "ABI computation failure should lead to compilation failure" ) ;
160
160
return ;
161
161
} ;
162
+ // Unlike the call-site check, we do also check "Rust" ABI functions here.
163
+ // This should never trigger, *except* if we start making use of vector registers
164
+ // for the "Rust" ABI and the user disables those vector registers (which should trigger a
165
+ // warning as that's clearly disabling a "required" target feature for this target).
166
+ // Using such a function is where disabling the vector register actually can start leading
167
+ // to soundness issues, so erroring here seems good.
162
168
let loc = || {
163
169
let def_id = instance. def_id ( ) ;
164
170
(
@@ -179,7 +185,8 @@ fn check_call_site_abi<'tcx>(
179
185
loc : impl Fn ( ) -> ( Span , HirId ) + Copy ,
180
186
) {
181
187
if callee. fn_sig ( tcx) . abi ( ) . is_rustic_abi ( ) {
182
- // we directly handle the soundness of Rust ABIs
188
+ // We directly handle the soundness of Rust ABIs -- so let's skip the majority of
189
+ // call sites to avoid a perf regression.
183
190
return ;
184
191
}
185
192
let typing_env = ty:: TypingEnv :: fully_monomorphized ( ) ;
0 commit comments