Skip to content

Commit 0cba4a1

Browse files
authored
Do not encode safe points with -1 offset. (#110845)
* Do not record safe points with -1 adjustmnt * NORMALIZE_CODE_OFFSET on RISC * denormalize code offsets in ILCompiler.Reflection.ReadyToRun.Amd64 * bump the min R2R version and GCInfo version * Do not record Return Kind * m_ReturnKind is not needed in non-legacy GC encoder, regardless X86 or not.
1 parent 004f205 commit 0cba4a1

File tree

14 files changed

+105
-271
lines changed

14 files changed

+105
-271
lines changed

src/coreclr/gcinfo/gcinfoencoder.cpp

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -490,13 +490,6 @@ GcInfoEncoder::GcInfoEncoder(
490490
m_IsSlotTableFrozen = FALSE;
491491
#endif //_DEBUG
492492

493-
#ifndef TARGET_X86
494-
// If the compiler doesn't set the GCInfo, report RT_Unset.
495-
// This is used for compatibility with JITs that aren't updated to use the new API.
496-
m_ReturnKind = RT_Unset;
497-
#else
498-
m_ReturnKind = RT_Illegal;
499-
#endif // TARGET_X86
500493
m_CodeLength = 0;
501494
#ifdef FIXED_STACK_PARAMETER_SCRATCH_AREA
502495
m_SizeOfStackOutgoingAndScratchArea = -1;
@@ -776,13 +769,6 @@ void GcInfoEncoder::SetReversePInvokeFrameSlot(INT32 spOffset)
776769
m_ReversePInvokeFrameSlot = spOffset;
777770
}
778771

779-
void GcInfoEncoder::SetReturnKind(ReturnKind returnKind)
780-
{
781-
_ASSERTE(IsValidReturnKind(returnKind));
782-
783-
m_ReturnKind = returnKind;
784-
}
785-
786772
struct GcSlotDescAndId
787773
{
788774
GcSlotDesc m_SlotDesc;
@@ -1045,16 +1031,15 @@ void GcInfoEncoder::Build()
10451031
BOOL slimHeader = (!m_IsVarArg && !hasGSCookie && (m_PSPSymStackSlot == NO_PSP_SYM) &&
10461032
!hasContextParamType && (m_InterruptibleRanges.Count() == 0) && !hasReversePInvokeFrame &&
10471033
((m_StackBaseRegister == NO_STACK_BASE_REGISTER) || (NORMALIZE_STACK_BASE_REGISTER(m_StackBaseRegister) == 0))) &&
1048-
(m_SizeOfEditAndContinuePreservedArea == NO_SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA) &&
10491034
#ifdef TARGET_AMD64
10501035
!m_WantsReportOnlyLeaf &&
10511036
#elif defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
10521037
!m_HasTailCalls &&
10531038
#endif // TARGET_AMD64
1054-
!IsStructReturnKind(m_ReturnKind);
1039+
(m_SizeOfEditAndContinuePreservedArea == NO_SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA);
10551040

10561041
// All new code is generated for the latest GCINFO_VERSION.
1057-
// So, always encode RetunrKind and encode ReversePInvokeFrameSlot where applicable.
1042+
// So, always encode ReversePInvokeFrameSlot where applicable.
10581043
if (slimHeader)
10591044
{
10601045
// Slim encoding means nothing special, partially interruptible, maybe a default frame register
@@ -1065,8 +1050,6 @@ void GcInfoEncoder::Build()
10651050
assert(m_StackBaseRegister == 8 || 2 == m_StackBaseRegister);
10661051
#endif
10671052
GCINFO_WRITE(m_Info1, (m_StackBaseRegister == NO_STACK_BASE_REGISTER) ? 0 : 1, 1, FlagsSize);
1068-
1069-
GCINFO_WRITE(m_Info1, m_ReturnKind, SIZE_OF_RETURN_KIND_IN_SLIM_HEADER, RetKindSize);
10701053
}
10711054
else
10721055
{
@@ -1089,8 +1072,6 @@ void GcInfoEncoder::Build()
10891072
#endif // TARGET_AMD64
10901073
GCINFO_WRITE(m_Info1, ((m_SizeOfEditAndContinuePreservedArea != NO_SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA) ? 1 : 0), 1, FlagsSize);
10911074
GCINFO_WRITE(m_Info1, (hasReversePInvokeFrame ? 1 : 0), 1, FlagsSize);
1092-
1093-
GCINFO_WRITE(m_Info1, m_ReturnKind, SIZE_OF_RETURN_KIND_IN_FAT_HEADER, RetKindSize);
10941075
}
10951076

10961077
_ASSERTE( m_CodeLength > 0 );
@@ -1217,42 +1198,19 @@ void GcInfoEncoder::Build()
12171198

12181199
///////////////////////////////////////////////////////////////////////
12191200
// Normalize call sites
1220-
// Eliminate call sites that fall inside interruptible ranges
12211201
///////////////////////////////////////////////////////////////////////
12221202

1203+
_ASSERTE(m_NumCallSites == 0 || numInterruptibleRanges == 0);
1204+
12231205
UINT32 numCallSites = 0;
12241206
for(UINT32 callSiteIndex = 0; callSiteIndex < m_NumCallSites; callSiteIndex++)
12251207
{
12261208
UINT32 callSite = m_pCallSites[callSiteIndex];
1227-
// There's a contract with the EE that says for non-leaf stack frames, where the
1228-
// method is stopped at a call site, the EE will not query with the return PC, but
1229-
// rather the return PC *minus 1*.
1230-
// The reason is that variable/register liveness may change at the instruction immediately after the
1231-
// call, so we want such frames to appear as if they are "within" the call.
1232-
// Since we use "callSite" as the "key" when we search for the matching descriptor, also subtract 1 here
1233-
// (after, of course, adding the size of the call instruction to get the return PC).
1234-
callSite += m_pCallSiteSizes[callSiteIndex] - 1;
1209+
callSite += m_pCallSiteSizes[callSiteIndex];
12351210

12361211
_ASSERTE(DENORMALIZE_CODE_OFFSET(NORMALIZE_CODE_OFFSET(callSite)) == callSite);
12371212
UINT32 normOffset = NORMALIZE_CODE_OFFSET(callSite);
1238-
1239-
BOOL keepIt = TRUE;
1240-
1241-
for(UINT32 intRangeIndex = 0; intRangeIndex < numInterruptibleRanges; intRangeIndex++)
1242-
{
1243-
InterruptibleRange *pRange = &pRanges[intRangeIndex];
1244-
if(pRange->NormStopOffset > normOffset)
1245-
{
1246-
if(pRange->NormStartOffset <= normOffset)
1247-
{
1248-
keepIt = FALSE;
1249-
}
1250-
break;
1251-
}
1252-
}
1253-
1254-
if(keepIt)
1255-
m_pCallSites[numCallSites++] = normOffset;
1213+
m_pCallSites[numCallSites++] = normOffset;
12561214
}
12571215

12581216
GCINFO_WRITE_VARL_U(m_Info1, NORMALIZE_NUM_SAFE_POINTS(numCallSites), NUM_SAFE_POINTS_ENCBASE, NumCallSitesSize);
@@ -1419,7 +1377,7 @@ void GcInfoEncoder::Build()
14191377

14201378
for(pCurrent = pTransitions; pCurrent < pEndTransitions; )
14211379
{
1422-
if(pCurrent->CodeOffset > callSite)
1380+
if(pCurrent->CodeOffset >= callSite)
14231381
{
14241382
couldBeLive |= liveState;
14251383

@@ -1774,7 +1732,7 @@ void GcInfoEncoder::Build()
17741732
{
17751733
for(pCurrent = pTransitions; pCurrent < pEndTransitions; )
17761734
{
1777-
if(pCurrent->CodeOffset > callSite)
1735+
if(pCurrent->CodeOffset >= callSite)
17781736
{
17791737
// Time to record the call site
17801738

@@ -1873,7 +1831,7 @@ void GcInfoEncoder::Build()
18731831

18741832
for(pCurrent = pTransitions; pCurrent < pEndTransitions; )
18751833
{
1876-
if(pCurrent->CodeOffset > callSite)
1834+
if(pCurrent->CodeOffset >= callSite)
18771835
{
18781836
// Time to encode the call site
18791837

@@ -1920,7 +1878,7 @@ void GcInfoEncoder::Build()
19201878

19211879
for(pCurrent = pTransitions; pCurrent < pEndTransitions; )
19221880
{
1923-
if(pCurrent->CodeOffset > callSite)
1881+
if(pCurrent->CodeOffset >= callSite)
19241882
{
19251883
// Time to encode the call site
19261884
GCINFO_WRITE_VECTOR(m_Info1, liveState, CallSiteStateSize);

src/coreclr/inc/gcinfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const unsigned this_OFFSET_FLAG = 0x2; // the offset is "this"
3636
// The current GCInfo Version
3737
//-----------------------------------------------------------------------------
3838

39-
#define GCINFO_VERSION 3
39+
#define GCINFO_VERSION 4
4040

4141
//-----------------------------------------------------------------------------
4242
// GCInfoToken: A wrapper that contains the GcInfo data and version number.

src/coreclr/inc/gcinfoencoder.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -409,13 +409,6 @@ class GcInfoEncoder
409409
GcSlotState slotState
410410
);
411411

412-
413-
//------------------------------------------------------------------------
414-
// ReturnKind
415-
//------------------------------------------------------------------------
416-
417-
void SetReturnKind(ReturnKind returnKind);
418-
419412
//------------------------------------------------------------------------
420413
// Miscellaneous method information
421414
//------------------------------------------------------------------------
@@ -509,7 +502,6 @@ class GcInfoEncoder
509502
INT32 m_PSPSymStackSlot;
510503
INT32 m_GenericsInstContextStackSlot;
511504
GENERIC_CONTEXTPARAM_TYPE m_contextParamType;
512-
ReturnKind m_ReturnKind;
513505
UINT32 m_CodeLength;
514506
UINT32 m_StackBaseRegister;
515507
UINT32 m_SizeOfEditAndContinuePreservedArea;

src/coreclr/inc/gcinfotypes.h

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -637,8 +637,6 @@ void FASTCALL decodeCallPattern(int pattern,
637637
#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
638638
#define GS_COOKIE_STACK_SLOT_ENCBASE 6
639639
#define CODE_LENGTH_ENCBASE 8
640-
#define SIZE_OF_RETURN_KIND_IN_SLIM_HEADER 2
641-
#define SIZE_OF_RETURN_KIND_IN_FAT_HEADER 4
642640
#define STACK_BASE_REGISTER_ENCBASE 3
643641
#define SIZE_OF_STACK_AREA_ENCBASE 3
644642
#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 4
@@ -679,8 +677,8 @@ void FASTCALL decodeCallPattern(int pattern,
679677
#define NORMALIZE_SIZE_OF_STACK_AREA(x) ((x)>>2)
680678
#define DENORMALIZE_SIZE_OF_STACK_AREA(x) ((x)<<2)
681679
#define CODE_OFFSETS_NEED_NORMALIZATION 1
682-
#define NORMALIZE_CODE_OFFSET(x) (x) // Instructions are 2/4 bytes long in Thumb/ARM states,
683-
#define DENORMALIZE_CODE_OFFSET(x) (x) // but the safe-point offsets are encoded with a -1 adjustment.
680+
#define NORMALIZE_CODE_OFFSET(x) ((x)>>1) // Instructions are 2/4 bytes long in Thumb/ARM states,
681+
#define DENORMALIZE_CODE_OFFSET(x) ((x)<<1)
684682
#define NORMALIZE_REGISTER(x) (x)
685683
#define DENORMALIZE_REGISTER(x) (x)
686684
#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
@@ -695,8 +693,6 @@ void FASTCALL decodeCallPattern(int pattern,
695693
#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 5
696694
#define GS_COOKIE_STACK_SLOT_ENCBASE 5
697695
#define CODE_LENGTH_ENCBASE 7
698-
#define SIZE_OF_RETURN_KIND_IN_SLIM_HEADER 2
699-
#define SIZE_OF_RETURN_KIND_IN_FAT_HEADER 2
700696
#define STACK_BASE_REGISTER_ENCBASE 1
701697
#define SIZE_OF_STACK_AREA_ENCBASE 3
702698
#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 3
@@ -735,9 +731,9 @@ void FASTCALL decodeCallPattern(int pattern,
735731
#define DENORMALIZE_STACK_BASE_REGISTER(x) ((x)^29)
736732
#define NORMALIZE_SIZE_OF_STACK_AREA(x) ((x)>>3)
737733
#define DENORMALIZE_SIZE_OF_STACK_AREA(x) ((x)<<3)
738-
#define CODE_OFFSETS_NEED_NORMALIZATION 0
739-
#define NORMALIZE_CODE_OFFSET(x) (x) // Instructions are 4 bytes long, but the safe-point
740-
#define DENORMALIZE_CODE_OFFSET(x) (x) // offsets are encoded with a -1 adjustment.
734+
#define CODE_OFFSETS_NEED_NORMALIZATION 1
735+
#define NORMALIZE_CODE_OFFSET(x) ((x)>>2) // Instructions are 4 bytes long
736+
#define DENORMALIZE_CODE_OFFSET(x) ((x)<<2)
741737
#define NORMALIZE_REGISTER(x) (x)
742738
#define DENORMALIZE_REGISTER(x) (x)
743739
#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
@@ -750,8 +746,6 @@ void FASTCALL decodeCallPattern(int pattern,
750746
#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
751747
#define GS_COOKIE_STACK_SLOT_ENCBASE 6
752748
#define CODE_LENGTH_ENCBASE 8
753-
#define SIZE_OF_RETURN_KIND_IN_SLIM_HEADER 2
754-
#define SIZE_OF_RETURN_KIND_IN_FAT_HEADER 4
755749
#define STACK_BASE_REGISTER_ENCBASE 2 // FP encoded as 0, SP as 2.
756750
#define SIZE_OF_STACK_AREA_ENCBASE 3
757751
#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 4
@@ -790,9 +784,9 @@ void FASTCALL decodeCallPattern(int pattern,
790784
#define DENORMALIZE_STACK_BASE_REGISTER(x) ((x) == 0 ? 22 : 3)
791785
#define NORMALIZE_SIZE_OF_STACK_AREA(x) ((x)>>3)
792786
#define DENORMALIZE_SIZE_OF_STACK_AREA(x) ((x)<<3)
793-
#define CODE_OFFSETS_NEED_NORMALIZATION 0
794-
#define NORMALIZE_CODE_OFFSET(x) (x) // Instructions are 4 bytes long, but the safe-point
795-
#define DENORMALIZE_CODE_OFFSET(x) (x) // offsets are encoded with a -1 adjustment.
787+
#define CODE_OFFSETS_NEED_NORMALIZATION 1
788+
#define NORMALIZE_CODE_OFFSET(x) ((x)>>2) // Instructions are 4 bytes long
789+
#define DENORMALIZE_CODE_OFFSET(x) ((x)<<2)
796790
#define NORMALIZE_REGISTER(x) (x)
797791
#define DENORMALIZE_REGISTER(x) (x)
798792
#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
@@ -805,8 +799,6 @@ void FASTCALL decodeCallPattern(int pattern,
805799
#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
806800
#define GS_COOKIE_STACK_SLOT_ENCBASE 6
807801
#define CODE_LENGTH_ENCBASE 8
808-
#define SIZE_OF_RETURN_KIND_IN_SLIM_HEADER 2
809-
#define SIZE_OF_RETURN_KIND_IN_FAT_HEADER 4
810802
// FP/SP encoded as 0 or 1.
811803
#define STACK_BASE_REGISTER_ENCBASE 2
812804
#define SIZE_OF_STACK_AREA_ENCBASE 3
@@ -845,9 +837,9 @@ void FASTCALL decodeCallPattern(int pattern,
845837
#define DENORMALIZE_STACK_BASE_REGISTER(x) ((x) == 0 ? 8 : 2)
846838
#define NORMALIZE_SIZE_OF_STACK_AREA(x) ((x)>>3)
847839
#define DENORMALIZE_SIZE_OF_STACK_AREA(x) ((x)<<3)
848-
#define CODE_OFFSETS_NEED_NORMALIZATION 0
849-
#define NORMALIZE_CODE_OFFSET(x) (x) // Instructions are 4 bytes long, but the safe-point
850-
#define DENORMALIZE_CODE_OFFSET(x) (x) // offsets are encoded with a -1 adjustment.
840+
#define CODE_OFFSETS_NEED_NORMALIZATION 1
841+
#define NORMALIZE_CODE_OFFSET(x) ((x)>>2) // Instructions are 4 bytes long
842+
#define DENORMALIZE_CODE_OFFSET(x) ((x)<<2)
851843
#define NORMALIZE_REGISTER(x) (x)
852844
#define DENORMALIZE_REGISTER(x) (x)
853845
#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
@@ -860,8 +852,6 @@ void FASTCALL decodeCallPattern(int pattern,
860852
#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
861853
#define GS_COOKIE_STACK_SLOT_ENCBASE 6
862854
#define CODE_LENGTH_ENCBASE 8
863-
#define SIZE_OF_RETURN_KIND_IN_SLIM_HEADER 2
864-
#define SIZE_OF_RETURN_KIND_IN_FAT_HEADER 4
865855
#define STACK_BASE_REGISTER_ENCBASE 2
866856
// FP encoded as 0, SP as 1
867857
#define SIZE_OF_STACK_AREA_ENCBASE 3
@@ -924,8 +914,6 @@ PORTABILITY_WARNING("Please specialize these definitions for your platform!")
924914
#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
925915
#define GS_COOKIE_STACK_SLOT_ENCBASE 6
926916
#define CODE_LENGTH_ENCBASE 6
927-
#define SIZE_OF_RETURN_KIND_IN_SLIM_HEADER 2
928-
#define SIZE_OF_RETURN_KIND_IN_FAT_HEADER 2
929917
#define STACK_BASE_REGISTER_ENCBASE 3
930918
#define SIZE_OF_STACK_AREA_ENCBASE 6
931919
#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 3

src/coreclr/inc/readytorun.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
// src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.h
2020
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
2121
// and handle pending work.
22-
#define READYTORUN_MAJOR_VERSION 10
23-
#define READYTORUN_MINOR_VERSION 0x0001
22+
#define READYTORUN_MAJOR_VERSION 11
23+
#define READYTORUN_MINOR_VERSION 0x0000
2424

25-
#define MINIMUM_READYTORUN_MAJOR_VERSION 10
25+
#define MINIMUM_READYTORUN_MAJOR_VERSION 11
2626

2727
// R2R Version 2.1 adds the InliningInfo section
2828
// R2R Version 2.2 adds the ProfileDataInfo section
@@ -38,6 +38,7 @@
3838
// uses GCInfo v3, which makes safe points in partially interruptible code interruptible.
3939
// R2R Version 10.0 adds support for the statics being allocated on a per type basis instead of on a per module basis, disable support for LogMethodEnter helper
4040
// R2R Version 10.1 adds Unbox_TypeTest helper
41+
// R2R Version 11 uses GCInfo v4, which encodes safe points without -1 offset and does not track return kinds in GCInfo
4142

4243
struct READYTORUN_CORE_HEADER
4344
{

src/coreclr/jit/gcencode.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3709,15 +3709,6 @@ class GcInfoEncoderWithLogging
37093709
}
37103710
}
37113711

3712-
void SetReturnKind(ReturnKind returnKind)
3713-
{
3714-
m_gcInfoEncoder->SetReturnKind(returnKind);
3715-
if (m_doLogging)
3716-
{
3717-
printf("Set ReturnKind to %s.\n", ReturnKindToString(returnKind));
3718-
}
3719-
}
3720-
37213712
void SetStackBaseRegister(UINT32 registerNumber)
37223713
{
37233714
m_gcInfoEncoder->SetStackBaseRegister(registerNumber);
@@ -3832,8 +3823,6 @@ void GCInfo::gcInfoBlockHdrSave(GcInfoEncoder* gcInfoEncoder, unsigned methodSiz
38323823

38333824
gcInfoEncoderWithLog->SetCodeLength(methodSize);
38343825

3835-
gcInfoEncoderWithLog->SetReturnKind(getReturnKind());
3836-
38373826
if (compiler->isFramePointerUsed())
38383827
{
38393828
gcInfoEncoderWithLog->SetStackBaseRegister(REG_FPBASE);

src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ struct ReadyToRunHeaderConstants
1111
{
1212
static const uint32_t Signature = 0x00525452; // 'RTR'
1313

14-
static const uint32_t CurrentMajorVersion = 10;
15-
static const uint32_t CurrentMinorVersion = 1;
14+
static const uint32_t CurrentMajorVersion = 11;
15+
static const uint32_t CurrentMinorVersion = 0;
1616
};
1717

1818
struct ReadyToRunHeader

src/coreclr/nativeaot/Runtime/unix/UnixNativeCodeManager.cpp

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -213,44 +213,18 @@ void UnixNativeCodeManager::EnumGcRefs(MethodInfo * pMethodInfo,
213213

214214
#ifdef TARGET_ARM
215215
// Ensure that code offset doesn't have the Thumb bit set. We need
216-
// it to be aligned to instruction start to make the !isActiveStackFrame
217-
// branch below work.
216+
// it to be aligned to instruction start
218217
ASSERT(((uintptr_t)codeOffset & 1) == 0);
219218
#endif
220219

221-
bool executionAborted = ((UnixNativeMethodInfo*)pMethodInfo)->executionAborted;
222-
223-
if (!isActiveStackFrame && !executionAborted)
224-
{
225-
// the reasons for this adjustment are explained in EECodeManager::EnumGcRefs
226-
codeOffset--;
227-
}
228-
229220
GcInfoDecoder decoder(
230221
GCInfoToken(gcInfo),
231222
GcInfoDecoderFlags(DECODE_GC_LIFETIMES | DECODE_SECURITY_OBJECT | DECODE_VARARG),
232223
codeOffset
233224
);
234225

235-
if (isActiveStackFrame)
236-
{
237-
// CONSIDER: We can optimize this by remembering the need to adjust in IsSafePoint and propagating into here.
238-
// Or, better yet, maybe we should change the decoder to not require this adjustment.
239-
// The scenario that adjustment tries to handle (fallthrough into BB with random liveness)
240-
// does not seem possible.
241-
if (!decoder.HasInterruptibleRanges())
242-
{
243-
decoder = GcInfoDecoder(
244-
GCInfoToken(gcInfo),
245-
GcInfoDecoderFlags(DECODE_GC_LIFETIMES | DECODE_SECURITY_OBJECT | DECODE_VARARG),
246-
codeOffset - 1
247-
);
248-
249-
assert(decoder.IsSafePoint());
250-
}
251-
}
252-
253226
ICodeManagerFlags flags = (ICodeManagerFlags)0;
227+
bool executionAborted = ((UnixNativeMethodInfo*)pMethodInfo)->executionAborted;
254228
if (executionAborted)
255229
flags = ICodeManagerFlags::ExecutionAborted;
256230

0 commit comments

Comments
 (0)