@@ -23,7 +23,6 @@ enum class EEApiId
23
23
GetMangledFilterFuncletName,
24
24
GetSignatureForMethodSymbol,
25
25
AddCodeReloc,
26
- IsRuntimeImport,
27
26
GetPrimitiveTypeForTrivialWasmStruct,
28
27
GetTypeDescriptor,
29
28
GetAlternativeFunctionName,
@@ -174,31 +173,6 @@ GCInfo* Llvm::getGCInfo()
174
173
return _gcInfo;
175
174
}
176
175
177
- bool Llvm::callRequiresShadowStackSave (const GenTreeCall* call) const
178
- {
179
- // In general, if the call is itself not managed (does not have a shadow stack argument) **and** may call
180
- // back into managed code, we need to save the shadow stack pointer, so that the RPI frame can pick it up.
181
- // Another case where the save/restore is required is when calling into native runtime code that can trigger
182
- // a GC (canonical example: allocators), to communicate shadow stack bounds to the roots scan.
183
- //
184
- if (call->IsHelperCall ())
185
- {
186
- return helperCallRequiresShadowStackSave (call->GetHelperNum ());
187
- }
188
-
189
- // SPGCT calls are assumed to never RPI by contract.
190
- return !callHasShadowStackArg (call) && !call->IsSuppressGCTransition ();
191
- }
192
-
193
- bool Llvm::helperCallRequiresShadowStackSave (CorInfoHelpFunc helperFunc) const
194
- {
195
- // Save/restore is needed if the helper doesn't have a shadow stack argument, unless we know it won't call
196
- // back into managed code or has special semantics. TODO-LLVM-CQ: mark (make, if required) more helpers
197
- // "HFIF_NO_RPI_OR_GC".
198
- unsigned helperFlags = getHelperFuncInfo (helperFunc).Flags ;
199
- return (helperFlags & (HFIF_SS_ARG | HFIF_NO_RPI_OR_GC)) == HFIF_NONE;
200
- }
201
-
202
176
bool Llvm::callHasShadowStackArg (const GenTreeCall* call) const
203
177
{
204
178
return callHasManagedCallingConvention (call);
@@ -216,12 +190,6 @@ bool Llvm::callHasManagedCallingConvention(const GenTreeCall* call) const
216
190
return helperCallHasManagedCallingConvention (call->GetHelperNum ());
217
191
}
218
192
219
- // Runtime imports are effectively unmanaged but are not tracked as such.
220
- if ((call->gtCallType == CT_USER_FUNC) && IsRuntimeImport (call->gtCallMethHnd ))
221
- {
222
- return false ;
223
- }
224
-
225
193
return !call->IsUnmanaged ();
226
194
}
227
195
@@ -275,10 +243,10 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
275
243
{ FUNC (CORINFO_HELP_UMOD) CORINFO_TYPE_UINT, { CORINFO_TYPE_UINT, CORINFO_TYPE_UINT }, HFIF_SS_ARG },
276
244
277
245
// Implemented in "Runtime\MathHelpers.cpp".
278
- { FUNC (CORINFO_HELP_LLSH) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_INT } },
279
- { FUNC (CORINFO_HELP_LRSH) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_INT } },
280
- { FUNC (CORINFO_HELP_LRSZ) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_INT } },
281
- { FUNC (CORINFO_HELP_LMUL) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_LONG } },
246
+ { FUNC (CORINFO_HELP_LLSH) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_INT }, HFIF_SS_ARG },
247
+ { FUNC (CORINFO_HELP_LRSH) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_INT }, HFIF_SS_ARG },
248
+ { FUNC (CORINFO_HELP_LRSZ) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_INT }, HFIF_SS_ARG },
249
+ { FUNC (CORINFO_HELP_LMUL) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_LONG }, HFIF_SS_ARG },
282
250
283
251
// Implemented in "CoreLib\src\Internal\Runtime\CompilerHelpers\MathHelpers.cs".
284
252
{ FUNC (CORINFO_HELP_LMUL_OVF) CORINFO_TYPE_LONG, { CORINFO_TYPE_LONG, CORINFO_TYPE_LONG }, HFIF_SS_ARG },
@@ -289,36 +257,36 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
289
257
{ FUNC (CORINFO_HELP_ULMOD) CORINFO_TYPE_ULONG, { CORINFO_TYPE_ULONG, CORINFO_TYPE_ULONG }, HFIF_SS_ARG },
290
258
291
259
// Implemented in "Runtime\MathHelpers.cpp".
292
- { FUNC (CORINFO_HELP_LNG2DBL) CORINFO_TYPE_DOUBLE, { CORINFO_TYPE_LONG } },
293
- { FUNC (CORINFO_HELP_ULNG2DBL) CORINFO_TYPE_DOUBLE, { CORINFO_TYPE_ULONG } },
294
- { FUNC (CORINFO_HELP_DBL2INT) CORINFO_TYPE_INT, { CORINFO_TYPE_DOUBLE } },
260
+ { FUNC (CORINFO_HELP_LNG2DBL) CORINFO_TYPE_DOUBLE, { CORINFO_TYPE_LONG }, HFIF_SS_ARG },
261
+ { FUNC (CORINFO_HELP_ULNG2DBL) CORINFO_TYPE_DOUBLE, { CORINFO_TYPE_ULONG }, HFIF_SS_ARG },
262
+ { FUNC (CORINFO_HELP_DBL2INT) CORINFO_TYPE_INT, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
295
263
296
264
// Implemented in "CoreLib\src\Internal\Runtime\CompilerHelpers\MathHelpers.cs".
297
265
{ FUNC (CORINFO_HELP_DBL2INT_OVF) CORINFO_TYPE_INT, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
298
266
299
267
// Implemented in "Runtime\MathHelpers.cpp".
300
- { FUNC (CORINFO_HELP_DBL2LNG) CORINFO_TYPE_LONG, { CORINFO_TYPE_DOUBLE } },
268
+ { FUNC (CORINFO_HELP_DBL2LNG) CORINFO_TYPE_LONG, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
301
269
302
270
// Implemented in "CoreLib\src\Internal\Runtime\CompilerHelpers\MathHelpers.cs".
303
271
{ FUNC (CORINFO_HELP_DBL2LNG_OVF) CORINFO_TYPE_LONG, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
304
272
305
273
// Implemented in "Runtime\MathHelpers.cpp".
306
- { FUNC (CORINFO_HELP_DBL2UINT) CORINFO_TYPE_UINT, { CORINFO_TYPE_DOUBLE } },
274
+ { FUNC (CORINFO_HELP_DBL2UINT) CORINFO_TYPE_UINT, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
307
275
308
276
// Implemented in "CoreLib\src\Internal\Runtime\CompilerHelpers\MathHelpers.cs".
309
277
{ FUNC (CORINFO_HELP_DBL2UINT_OVF) CORINFO_TYPE_UINT, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
310
278
311
279
// Implemented in "Runtime\MathHelpers.cpp".
312
- { FUNC (CORINFO_HELP_DBL2ULNG) CORINFO_TYPE_ULONG, { CORINFO_TYPE_DOUBLE } },
280
+ { FUNC (CORINFO_HELP_DBL2ULNG) CORINFO_TYPE_ULONG, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
313
281
314
282
// Implemented in "CoreLib\src\Internal\Runtime\CompilerHelpers\MathHelpers.cs".
315
283
{ FUNC (CORINFO_HELP_DBL2ULNG_OVF) CORINFO_TYPE_ULONG, { CORINFO_TYPE_DOUBLE }, HFIF_SS_ARG },
316
284
317
- // Implemented in "Runtime\MathHelpers.cpp ".
318
- { FUNC (CORINFO_HELP_FLTREM) CORINFO_TYPE_FLOAT, { CORINFO_TYPE_FLOAT, CORINFO_TYPE_FLOAT } },
319
- { FUNC (CORINFO_HELP_DBLREM) CORINFO_TYPE_DOUBLE, { CORINFO_TYPE_DOUBLE, CORINFO_TYPE_DOUBLE } },
320
- { FUNC (CORINFO_HELP_FLTROUND) CORINFO_TYPE_FLOAT, { CORINFO_TYPE_FLOAT } },
321
- { FUNC (CORINFO_HELP_DBLROUND) CORINFO_TYPE_DOUBLE, { CORINFO_TYPE_DOUBLE } },
285
+ // Implemented as "fmodf"/"fmod ".
286
+ { FUNC (CORINFO_HELP_FLTREM) CORINFO_TYPE_FLOAT, { CORINFO_TYPE_FLOAT, CORINFO_TYPE_FLOAT }, HFIF_NO_RPI_OR_GC },
287
+ { FUNC (CORINFO_HELP_DBLREM) CORINFO_TYPE_DOUBLE, { CORINFO_TYPE_DOUBLE, CORINFO_TYPE_DOUBLE }, HFIF_NO_RPI_OR_GC },
288
+ { FUNC (CORINFO_HELP_FLTROUND) },
289
+ { FUNC (CORINFO_HELP_DBLROUND) },
322
290
323
291
// Runtime export, implemented in "Runtime.Base\src\System\Runtime\RuntimeExports.cs".
324
292
{ FUNC (CORINFO_HELP_NEWFAST) CORINFO_TYPE_CLASS, { CORINFO_TYPE_PTR }, HFIF_SS_ARG },
@@ -380,7 +348,7 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
380
348
{ FUNC (CORINFO_HELP_RETHROW) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_SS_ARG },
381
349
382
350
// Implemented in "Runtime\MiscHelpers.cpp".
383
- { FUNC (CORINFO_HELP_USER_BREAKPOINT) CORINFO_TYPE_VOID, { } },
351
+ { FUNC (CORINFO_HELP_USER_BREAKPOINT) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG },
384
352
385
353
// Implemented in "Runtime.Base\src\System\ThrowHelpers.cs".
386
354
{ FUNC (CORINFO_HELP_RNGCHKFAIL) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG },
@@ -393,7 +361,7 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
393
361
{ FUNC (CORINFO_HELP_VERIFICATION) },
394
362
395
363
// Implemented in "Runtime\EHHelpers.cpp".
396
- { FUNC (CORINFO_HELP_FAIL_FAST) CORINFO_TYPE_VOID, { }, HFIF_NO_RPI_OR_GC },
364
+ { FUNC (CORINFO_HELP_FAIL_FAST) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG | HFIF_NO_RPI_OR_GC },
397
365
398
366
// NYI in NativeAOT.
399
367
{ FUNC (CORINFO_HELP_METHOD_ACCESS_EXCEPTION) },
@@ -415,10 +383,10 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
415
383
{ FUNC (CORINFO_HELP_STOP_FOR_GC) },
416
384
417
385
// (Not) implemented in "Runtime\portable.cpp".
418
- { FUNC (CORINFO_HELP_POLL_GC) CORINFO_TYPE_VOID, { } },
386
+ { FUNC (CORINFO_HELP_POLL_GC) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG },
419
387
420
388
// Debug-only helpers, implemented in "Runtime\wasm\GcStress.cpp".
421
- { FUNC (CORINFO_HELP_STRESS_GC) CORINFO_TYPE_BYREF, { CORINFO_TYPE_BYREF, CORINFO_TYPE_PTR } },
389
+ { FUNC (CORINFO_HELP_STRESS_GC) CORINFO_TYPE_BYREF, { CORINFO_TYPE_BYREF, CORINFO_TYPE_PTR }, HFIF_SS_ARG },
422
390
{ FUNC (CORINFO_HELP_CHECK_OBJ) CORINFO_TYPE_CLASS, { CORINFO_TYPE_CLASS }, HFIF_NO_RPI_OR_GC },
423
391
424
392
// Write barriers, implemented in "Runtime\portable.cpp".
@@ -493,7 +461,7 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
493
461
{ FUNC (CORINFO_HELP_MEMCPY) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_PTR, CORINFO_TYPE_NATIVEUINT }, HFIF_SS_ARG },
494
462
495
463
// Implemented as plain "memset".
496
- { FUNC (CORINFO_HELP_NATIVE_MEMSET) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_INT, CORINFO_TYPE_NATIVEUINT } },
464
+ { FUNC (CORINFO_HELP_NATIVE_MEMSET) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_INT, CORINFO_TYPE_NATIVEUINT }, HFIF_NO_RPI_OR_GC },
497
465
498
466
// Not used in NativeAOT.
499
467
{ FUNC (CORINFO_HELP_RUNTIMEHANDLE_METHOD) },
@@ -528,7 +496,7 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
528
496
{ FUNC (CORINFO_HELP_READYTORUN_THREADSTATIC_BASE) CORINFO_TYPE_PTR, { }, HFIF_SS_ARG },
529
497
{ FUNC (CORINFO_HELP_READYTORUN_THREADSTATIC_BASE_NOCTOR) CORINFO_TYPE_PTR, { }, HFIF_SS_ARG },
530
498
{ FUNC (CORINFO_HELP_READYTORUN_NONGCTHREADSTATIC_BASE) CORINFO_TYPE_PTR, { }, HFIF_SS_ARG },
531
- { FUNC (CORINFO_HELP_READYTORUN_VIRTUAL_FUNC_PTR) CORINFO_TYPE_PTR, { CORINFO_TYPE_CLASS } },
499
+ { FUNC (CORINFO_HELP_READYTORUN_VIRTUAL_FUNC_PTR) CORINFO_TYPE_PTR, { CORINFO_TYPE_CLASS }, HFIF_SS_ARG },
532
500
{ FUNC (CORINFO_HELP_READYTORUN_GENERIC_HANDLE) CORINFO_TYPE_PTR, { CORINFO_TYPE_PTR }, HFIF_SS_ARG | HFIF_THROW_OR_NO_RPI_OR_GC },
533
501
{ FUNC (CORINFO_HELP_READYTORUN_DELEGATE_CTOR) CORINFO_TYPE_VOID, { CORINFO_TYPE_CLASS, CORINFO_TYPE_CLASS, CORINFO_TYPE_PTR }, HFIF_SS_ARG | HFIF_VAR_ARG },
534
502
{ FUNC (CORINFO_HELP_READYTORUN_GENERIC_STATIC_BASE) CORINFO_TYPE_PTR, { CORINFO_TYPE_PTR }, HFIF_SS_ARG },
@@ -571,10 +539,10 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
571
539
// [R]PI helpers, implemented in "Runtime\thread.cpp".
572
540
{ FUNC (CORINFO_HELP_JIT_PINVOKE_BEGIN) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_SS_ARG | HFIF_NO_RPI_OR_GC },
573
541
{ FUNC (CORINFO_HELP_JIT_PINVOKE_END) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC },
574
- { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR } },
575
- { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER_TRACK_TRANSITIONS) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR } },
576
- { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC },
577
- { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT_TRACK_TRANSITIONS) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR } },
542
+ { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_SS_ARG },
543
+ { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER_TRACK_TRANSITIONS) },
544
+ { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC },
545
+ { FUNC (CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT_TRACK_TRANSITIONS) },
578
546
579
547
// Implemented in "CoreLib\src\System\Runtime\TypeLoaderExports.cs".
580
548
{ FUNC (CORINFO_HELP_GVMLOOKUP_FOR_SLOT) CORINFO_TYPE_NATIVEINT, { CORINFO_TYPE_CLASS, CORINFO_TYPE_RT_HANDLE }, HFIF_SS_ARG }, // Oddity: IntPtr used for a pointer.
@@ -597,7 +565,6 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
597
565
{ FUNC (CORINFO_HELP_DISPATCH_INDIRECT_CALL) },
598
566
599
567
{ FUNC (CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP) CORINFO_TYPE_PTR, { }, HFIF_NO_RPI_OR_GC },
600
- { FUNC (CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC },
601
568
{ FUNC (CORINFO_HELP_LLVM_EH_CATCH) CORINFO_TYPE_CLASS, { CORINFO_TYPE_NATIVEUINT }, HFIF_SS_ARG },
602
569
{ FUNC (CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG },
603
570
{ FUNC (CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_PTR, CORINFO_TYPE_NATIVEUINT }, HFIF_NO_RPI_OR_GC },
@@ -611,6 +578,25 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const
611
578
// Make sure our array is up-to-date.
612
579
static_assert_no_msg (ArrLen (s_infos) == CORINFO_HELP_COUNT);
613
580
581
+ #ifdef DEBUG
582
+ static bool s_infosVerified = false ;
583
+ if (!s_infosVerified)
584
+ {
585
+ for (const HelperFuncInfo& info : s_infos)
586
+ {
587
+ if (info.IsInitialized ())
588
+ {
589
+ unsigned flags = info.Flags ;
590
+
591
+ // Only helpers that will never call managed code are allowed to not have the shadow stack argument.
592
+ assert (((flags & HFIF_SS_ARG) != 0 ) || ((flags & HFIF_NO_RPI_OR_GC) != 0 ));
593
+ }
594
+ }
595
+
596
+ s_infosVerified = true ;
597
+ }
598
+ #endif // DEBUG
599
+
614
600
assert (helperFunc < CORINFO_HELP_COUNT);
615
601
const HelperFuncInfo& info = s_infos[helperFunc];
616
602
@@ -812,11 +798,6 @@ void Llvm::AddCodeReloc(void* handle)
812
798
CallEEApi<EEApiId::AddCodeReloc, void >(m_pEECorInfo, handle);
813
799
}
814
800
815
- bool Llvm::IsRuntimeImport (CORINFO_METHOD_HANDLE methodHandle) const
816
- {
817
- return CallEEApi<EEApiId::IsRuntimeImport, uint32_t >(m_pEECorInfo, methodHandle) != 0 ;
818
- }
819
-
820
801
CorInfoType Llvm::GetPrimitiveTypeForTrivialWasmStruct (CORINFO_CLASS_HANDLE structHandle)
821
802
{
822
803
return CallEEApi<EEApiId::GetPrimitiveTypeForTrivialWasmStruct, CorInfoType>(m_pEECorInfo, structHandle);
0 commit comments