Skip to content

Commit 3dbeb51

Browse files
authored
Parallel change to the diagnostic update for GC Info decoder. (#113888)
* parallel change to diagnostic update * decoder does not need to worry about parsing GCInfo V1 * fix for unix * clarified a comment
1 parent c1ae86d commit 3dbeb51

File tree

5 files changed

+130
-19
lines changed

5 files changed

+130
-19
lines changed

src/coreclr/gcdump/gcdumpnonx86.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ size_t GCDump::DumpGCTable(PTR_CBYTE gcInfoBlock,
361361
| DECODE_GENERICS_INST_CONTEXT
362362
| DECODE_GC_LIFETIMES
363363
| DECODE_PROLOG_LENGTH
364+
| DECODE_RETURN_KIND
364365
#if defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)
365366
| DECODE_HAS_TAILCALLS
366367
#endif
@@ -501,6 +502,12 @@ size_t GCDump::DumpGCTable(PTR_CBYTE gcInfoBlock,
501502
gcPrintf("Size of parameter area: %x\n", hdrdecoder.GetSizeOfStackParameterArea());
502503
#endif
503504

505+
if (hdrdecoder.Version() < 4)
506+
{
507+
ReturnKind returnKind = hdrdecoder.GetReturnKind();
508+
gcPrintf("Return Kind: %s\n", ReturnKindToString(returnKind));
509+
}
510+
504511
UINT32 cbEncodedMethodSize = hdrdecoder.GetCodeLength();
505512
gcPrintf("Code size: %x\n", cbEncodedMethodSize);
506513

src/coreclr/inc/gcinfo.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// ******************************************************************************
55
// WARNING!!!: These values are used by SOS in the diagnostics repo. Values should
66
// added or removed in a backwards and forwards compatible way.
7+
// There are scenarios in diagnostics that support parsing of old GC Info formats.
78
// See: https://github.com/dotnet/diagnostics/blob/main/src/shared/inc/gcinfo.h
89
// ******************************************************************************
910

@@ -38,6 +39,17 @@ const unsigned this_OFFSET_FLAG = 0x2; // the offset is "this"
3839

3940
#define GCINFO_VERSION 4
4041

42+
#ifdef SOS_INCLUDE
43+
extern bool IsRuntimeVersionAtLeast(DWORD major);
44+
inline int GCInfoVersion()
45+
{
46+
// In SOS we only care about ability to parse/dump the GC Info.
47+
// Since v2 and v3 had the same file format and v1 is no longer supported,
48+
// we can assume that everything before net10.0 uses GCInfo v3.
49+
return IsRuntimeVersionAtLeast(10) ? 4 : 3;
50+
}
51+
#endif
52+
4153
//-----------------------------------------------------------------------------
4254
// GCInfoToken: A wrapper that contains the GcInfo data and version number.
4355
//
@@ -67,7 +79,11 @@ struct GCInfoToken
6779

6880
static uint32_t ReadyToRunVersionToGcInfoVersion(uint32_t readyToRunMajorVersion, uint32_t readyToRunMinorVersion)
6981
{
82+
#ifdef SOS_INCLUDE
83+
return GCInfoVersion();
84+
#else
7085
return GCINFO_VERSION;
86+
#endif
7187
}
7288
};
7389

src/coreclr/inc/gcinfodecoder.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
#ifndef _GC_INFO_DECODER_
1717
#define _GC_INFO_DECODER_
1818

19+
#ifdef SOS_INCLUDE
20+
#define DECODE_OLD_FORMATS
21+
#endif
22+
1923
#define _max(a, b) (((a) > (b)) ? (a) : (b))
2024
#define _min(a, b) (((a) < (b)) ? (a) : (b))
2125

@@ -222,6 +226,7 @@ enum GcInfoDecoderFlags
222226
DECODE_PROLOG_LENGTH = 0x400, // length of the prolog (used to avoid reporting generics context)
223227
DECODE_EDIT_AND_CONTINUE = 0x800,
224228
DECODE_REVERSE_PINVOKE_VAR = 0x1000,
229+
DECODE_RETURN_KIND = 0x2000, // Unused starting with v4 format
225230
#if defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
226231
DECODE_HAS_TAILCALLS = 0x4000,
227232
#endif // TARGET_ARM || TARGET_ARM64 || TARGET_LOONGARCH64
@@ -247,7 +252,6 @@ enum GcInfoHeaderFlags
247252
GC_INFO_HAS_EDIT_AND_CONTINUE_INFO = 0x100,
248253
GC_INFO_REVERSE_PINVOKE_FRAME = 0x200,
249254

250-
GC_INFO_FLAGS_BIT_SIZE_VERSION_1 = 9,
251255
GC_INFO_FLAGS_BIT_SIZE = 10,
252256
};
253257

@@ -584,6 +588,7 @@ class TGcInfoDecoder
584588
#if defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
585589
bool HasTailCalls();
586590
#endif // TARGET_ARM || TARGET_ARM64 || TARGET_LOONGARCH64 || defined(TARGET_RISCV64)
591+
ReturnKind GetReturnKind();
587592
UINT32 GetCodeLength();
588593
UINT32 GetStackBaseRegister();
589594
UINT32 GetSizeOfEditAndContinuePreservedArea();
@@ -596,6 +601,10 @@ class TGcInfoDecoder
596601
UINT32 GetSizeOfStackParameterArea();
597602
#endif // FIXED_STACK_PARAMETER_SCRATCH_AREA
598603

604+
inline UINT32 Version()
605+
{
606+
return m_Version;
607+
}
599608

600609
private:
601610
BitStreamReader m_Reader;
@@ -616,6 +625,8 @@ class TGcInfoDecoder
616625
#ifdef TARGET_ARM64
617626
UINT32 m_SizeOfEditAndContinueFixedStackFrame;
618627
#endif
628+
// Unused starting with v4 format
629+
ReturnKind m_ReturnKind;
619630
#ifdef PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED
620631
UINT32 m_NumSafePoints;
621632
UINT32 m_SafePointIndex;
@@ -634,6 +645,24 @@ class TGcInfoDecoder
634645
#endif
635646
UINT32 m_Version;
636647

648+
inline UINT32 NormalizeCodeOffset(UINT32 offset)
649+
{
650+
#ifdef DECODE_OLD_FORMATS
651+
if (Version() < 4)
652+
return offset;
653+
#endif
654+
return GcInfoEncoding::NORMALIZE_CODE_OFFSET(offset);
655+
}
656+
657+
inline UINT32 DenormalizeCodeOffset(UINT32 offset)
658+
{
659+
#ifdef DECODE_OLD_FORMATS
660+
if (Version() < 4)
661+
return offset;
662+
#endif
663+
return GcInfoEncoding::DENORMALIZE_CODE_OFFSET(offset);
664+
}
665+
637666
bool PredecodeFatHeader(int remainingFlags);
638667

639668
static bool SetIsInterruptibleCB (UINT32 startOffset, UINT32 stopOffset, void * hCallback);

src/coreclr/inc/gcinfotypes.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#define __GCINFOTYPES_H__
77

88
// HACK: debugreturn.h breaks constexpr
9-
#ifdef debug_instrumented_return
9+
#if defined(debug_instrumented_return) || defined(_DEBUGRETURN_H_)
1010
#undef return
1111
#endif // debug_instrumented_return
1212

@@ -643,6 +643,8 @@ struct AMD64GcInfoEncoding {
643643
static const int SECURITY_OBJECT_STACK_SLOT_ENCBASE = 6;
644644
static const int GS_COOKIE_STACK_SLOT_ENCBASE = 6;
645645
static const int CODE_LENGTH_ENCBASE = 8;
646+
static const int SIZE_OF_RETURN_KIND_IN_SLIM_HEADER = 2;
647+
static const int SIZE_OF_RETURN_KIND_IN_FAT_HEADER = 4;
646648
static const int STACK_BASE_REGISTER_ENCBASE = 3;
647649
static const int SIZE_OF_STACK_AREA_ENCBASE = 3;
648650
static const int SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE = 4;
@@ -698,6 +700,8 @@ struct ARM32GcInfoEncoding {
698700
static const int SECURITY_OBJECT_STACK_SLOT_ENCBASE = 5;
699701
static const int GS_COOKIE_STACK_SLOT_ENCBASE = 5;
700702
static const int CODE_LENGTH_ENCBASE = 7;
703+
static const int SIZE_OF_RETURN_KIND_IN_SLIM_HEADER = 2;
704+
static const int SIZE_OF_RETURN_KIND_IN_FAT_HEADER = 2;
701705
static const int STACK_BASE_REGISTER_ENCBASE = 1;
702706
static const int SIZE_OF_STACK_AREA_ENCBASE = 3;
703707
static const int SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE = 3;
@@ -754,6 +758,8 @@ struct ARM64GcInfoEncoding {
754758
static const int SECURITY_OBJECT_STACK_SLOT_ENCBASE = 6;
755759
static const int GS_COOKIE_STACK_SLOT_ENCBASE = 6;
756760
static const int CODE_LENGTH_ENCBASE = 8;
761+
static const int SIZE_OF_RETURN_KIND_IN_SLIM_HEADER = 2;
762+
static const int SIZE_OF_RETURN_KIND_IN_FAT_HEADER = 4;
757763
// FP encoded as 0, SP as 2.
758764
static const int STACK_BASE_REGISTER_ENCBASE = 2;
759765
static const int SIZE_OF_STACK_AREA_ENCBASE = 3;
@@ -811,6 +817,8 @@ struct LoongArch64GcInfoEncoding {
811817
static const int SECURITY_OBJECT_STACK_SLOT_ENCBASE = 6;
812818
static const int GS_COOKIE_STACK_SLOT_ENCBASE = 6;
813819
static const int CODE_LENGTH_ENCBASE = 8;
820+
static const int SIZE_OF_RETURN_KIND_IN_SLIM_HEADER = 2;
821+
static const int SIZE_OF_RETURN_KIND_IN_FAT_HEADER = 4;
814822
// FP/SP encoded as 0 or 1.
815823
static const int STACK_BASE_REGISTER_ENCBASE = 2;
816824
static const int SIZE_OF_STACK_AREA_ENCBASE = 3;
@@ -867,6 +875,8 @@ struct RISCV64GcInfoEncoding {
867875
static const int SECURITY_OBJECT_STACK_SLOT_ENCBASE = 6;
868876
static const int GS_COOKIE_STACK_SLOT_ENCBASE = 6;
869877
static const int CODE_LENGTH_ENCBASE = 8;
878+
static const int SIZE_OF_RETURN_KIND_IN_SLIM_HEADER = 2;
879+
static const int SIZE_OF_RETURN_KIND_IN_FAT_HEADER = 4;
870880
static const int STACK_BASE_REGISTER_ENCBASE = 2;
871881
// FP encoded as 0, SP as 1
872882
static const int SIZE_OF_STACK_AREA_ENCBASE = 3;
@@ -927,6 +937,8 @@ struct X86GcInfoEncoding {
927937
static const int SECURITY_OBJECT_STACK_SLOT_ENCBASE = 6;
928938
static const int GS_COOKIE_STACK_SLOT_ENCBASE = 6;
929939
static const int CODE_LENGTH_ENCBASE = 6;
940+
static const int SIZE_OF_RETURN_KIND_IN_SLIM_HEADER = 2;
941+
static const int SIZE_OF_RETURN_KIND_IN_FAT_HEADER = 2;
930942
static const int STACK_BASE_REGISTER_ENCBASE = 3;
931943
static const int SIZE_OF_STACK_AREA_ENCBASE = 6;
932944
static const int SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE = 3;

src/coreclr/vm/gcinfodecoder.cpp

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,15 @@ template <typename GcInfoEncoding> bool TGcInfoDecoder<GcInfoEncoding>::SetIsInt
9292
// returns true if we decoded all that was asked;
9393
template <typename GcInfoEncoding> bool TGcInfoDecoder<GcInfoEncoding>::PredecodeFatHeader(int remainingFlags)
9494
{
95-
int numFlagBits = (m_Version == 1) ? GC_INFO_FLAGS_BIT_SIZE_VERSION_1 : GC_INFO_FLAGS_BIT_SIZE;
96-
m_headerFlags = (GcInfoHeaderFlags)m_Reader.Read(numFlagBits);
95+
m_headerFlags = (GcInfoHeaderFlags)m_Reader.Read(GC_INFO_FLAGS_BIT_SIZE);
9796

98-
remainingFlags &= ~DECODE_VARARG;
97+
#ifdef DECODE_OLD_FORMATS
98+
if (Version() < 4)
99+
{
100+
m_ReturnKind = (ReturnKind)((UINT32)m_Reader.Read(GcInfoEncoding::SIZE_OF_RETURN_KIND_IN_FAT_HEADER));
101+
}
102+
#endif
103+
remainingFlags &= ~(DECODE_RETURN_KIND | DECODE_VARARG);
99104
#if defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
100105
remainingFlags &= ~DECODE_HAS_TAILCALLS;
101106
#endif
@@ -117,21 +122,21 @@ template <typename GcInfoEncoding> bool TGcInfoDecoder<GcInfoEncoding>::Predecod
117122
{
118123
// Note that normalization as a code offset can be different than
119124
// normalization as code length
120-
UINT32 normCodeLength = GcInfoEncoding::NORMALIZE_CODE_OFFSET(m_CodeLength);
125+
UINT32 normCodeLength = NormalizeCodeOffset(m_CodeLength);
121126

122127
// Decode prolog/epilog information
123128
UINT32 normPrologSize = (UINT32)m_Reader.DecodeVarLengthUnsigned(GcInfoEncoding::NORM_PROLOG_SIZE_ENCBASE) + 1;
124129
UINT32 normEpilogSize = (UINT32)m_Reader.DecodeVarLengthUnsigned(GcInfoEncoding::NORM_EPILOG_SIZE_ENCBASE);
125130

126-
m_ValidRangeStart = GcInfoEncoding::DENORMALIZE_CODE_OFFSET(normPrologSize);
127-
m_ValidRangeEnd = GcInfoEncoding::DENORMALIZE_CODE_OFFSET(normCodeLength - normEpilogSize);
131+
m_ValidRangeStart = DenormalizeCodeOffset(normPrologSize);
132+
m_ValidRangeEnd = DenormalizeCodeOffset(normCodeLength - normEpilogSize);
128133
_ASSERTE(m_ValidRangeStart < m_ValidRangeEnd);
129134
}
130135
else if ((m_headerFlags & GC_INFO_HAS_GENERICS_INST_CONTEXT_MASK) != GC_INFO_HAS_GENERICS_INST_CONTEXT_NONE)
131136
{
132137
// Decode prolog information
133138
UINT32 normPrologSize = (UINT32)m_Reader.DecodeVarLengthUnsigned(GcInfoEncoding::NORM_PROLOG_SIZE_ENCBASE) + 1;
134-
m_ValidRangeStart = GcInfoEncoding::DENORMALIZE_CODE_OFFSET(normPrologSize);
139+
m_ValidRangeStart = DenormalizeCodeOffset(normPrologSize);
135140
// satisfy asserts that assume m_GSCookieValidRangeStart != 0 ==> m_GSCookieValidRangeStart < m_GSCookieValidRangeEnd
136141
m_ValidRangeEnd = m_ValidRangeStart + 1;
137142
}
@@ -262,6 +267,7 @@ TGcInfoDecoder<GcInfoEncoding>::TGcInfoDecoder(
262267
: m_Reader(dac_cast<PTR_CBYTE>(gcInfoToken.Info))
263268
, m_InstructionOffset(breakOffset)
264269
, m_IsInterruptible(false)
270+
, m_ReturnKind(RT_Illegal)
265271
#ifdef _DEBUG
266272
, m_Flags( flags )
267273
, m_GcInfoAddress(dac_cast<PTR_CBYTE>(gcInfoToken.Info))
@@ -301,7 +307,13 @@ TGcInfoDecoder<GcInfoEncoding>::TGcInfoDecoder(
301307
m_StackBaseRegister = NO_STACK_BASE_REGISTER;
302308
}
303309

304-
remainingFlags &= ~DECODE_VARARG;
310+
#ifdef DECODE_OLD_FORMATS
311+
if (Version() < 4)
312+
{
313+
m_ReturnKind = (ReturnKind)((UINT32)m_Reader.Read(GcInfoEncoding::SIZE_OF_RETURN_KIND_IN_SLIM_HEADER));
314+
}
315+
#endif
316+
remainingFlags &= ~(DECODE_RETURN_KIND | DECODE_VARARG);
305317
#if defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
306318
remainingFlags &= ~DECODE_HAS_TAILCALLS;
307319
#endif
@@ -369,14 +381,25 @@ TGcInfoDecoder<GcInfoEncoding>::TGcInfoDecoder(
369381
{
370382
if(m_NumSafePoints)
371383
{
384+
#ifdef DECODE_OLD_FORMATS
385+
if (Version() < 4)
386+
{
387+
// Safepoints are encoded with a -1 adjustment
388+
// DECODE_GC_LIFETIMES adjusts the offset accordingly, but DECODE_INTERRUPTIBILITY does not
389+
// adjust here
390+
UINT32 offset = flags & DECODE_INTERRUPTIBILITY ? m_InstructionOffset - 1 : m_InstructionOffset;
391+
m_SafePointIndex = FindSafePoint(offset);
392+
}
393+
#else
372394
m_SafePointIndex = FindSafePoint(m_InstructionOffset);
395+
#endif
373396
}
374397
}
375398
else if(flags & DECODE_FOR_RANGES_CALLBACK)
376399
{
377400
// Note that normalization as a code offset can be different than
378401
// normalization as code length
379-
UINT32 normCodeLength = GcInfoEncoding::NORMALIZE_CODE_OFFSET(m_CodeLength);
402+
UINT32 normCodeLength = NormalizeCodeOffset(m_CodeLength);
380403

381404
UINT32 numBitsPerOffset = CeilOfLog2(normCodeLength);
382405
m_Reader.Skip(m_NumSafePoints * numBitsPerOffset);
@@ -445,6 +468,14 @@ template <typename GcInfoEncoding> bool TGcInfoDecoder<GcInfoEncoding>::IsSafePo
445468
if(m_NumSafePoints == 0)
446469
return false;
447470

471+
#ifdef DECODE_OLD_FORMATS
472+
if (Version() < 4)
473+
{
474+
// Safepoints are encoded with a -1 adjustment, adjust before searching.
475+
codeOffset--;
476+
}
477+
#endif
478+
448479
size_t savedPos = m_Reader.GetCurrentPos();
449480
UINT32 safePointIndex = FindSafePoint(codeOffset);
450481
m_Reader.SetCurrentPos(savedPos);
@@ -466,7 +497,7 @@ UINT32 TGcInfoDecoder<GcInfoEncoding>::NarrowSafePointSearch(size_t savedPos, UI
466497
INT32 low = 0;
467498
INT32 high = (INT32)m_NumSafePoints;
468499

469-
const UINT32 numBitsPerOffset = CeilOfLog2(GcInfoEncoding::NORMALIZE_CODE_OFFSET(m_CodeLength));
500+
const UINT32 numBitsPerOffset = CeilOfLog2(NormalizeCodeOffset(m_CodeLength));
470501
while (high - low > MAX_LINEAR_SEARCH)
471502
{
472503
const INT32 mid = (low + high) / 2;
@@ -490,9 +521,9 @@ template <typename GcInfoEncoding> UINT32 TGcInfoDecoder<GcInfoEncoding>::FindSa
490521
_ASSERTE(m_NumSafePoints > 0);
491522
UINT32 result = m_NumSafePoints;
492523
const size_t savedPos = m_Reader.GetCurrentPos();
493-
const UINT32 numBitsPerOffset = CeilOfLog2(GcInfoEncoding::NORMALIZE_CODE_OFFSET(m_CodeLength));
524+
const UINT32 numBitsPerOffset = CeilOfLog2(NormalizeCodeOffset(m_CodeLength));
494525

495-
const UINT32 normBreakOffset = GcInfoEncoding::NORMALIZE_CODE_OFFSET(breakOffset);
526+
const UINT32 normBreakOffset = NormalizeCodeOffset(breakOffset);
496527
UINT32 linearSearchStart = 0;
497528
UINT32 linearSearchEnd = m_NumSafePoints;
498529
if (linearSearchEnd - linearSearchStart > MAX_LINEAR_SEARCH)
@@ -527,12 +558,21 @@ template <typename GcInfoEncoding> void TGcInfoDecoder<GcInfoEncoding>::Enumerat
527558
if(m_NumSafePoints == 0)
528559
return;
529560

530-
const UINT32 numBitsPerOffset = CeilOfLog2(GcInfoEncoding::NORMALIZE_CODE_OFFSET(m_CodeLength));
561+
const UINT32 numBitsPerOffset = CeilOfLog2(NormalizeCodeOffset(m_CodeLength));
531562

532563
for(UINT32 i = 0; i < m_NumSafePoints; i++)
533564
{
534565
UINT32 normOffset = (UINT32)m_Reader.Read(numBitsPerOffset);
535-
UINT32 offset = GcInfoEncoding::DENORMALIZE_CODE_OFFSET(normOffset);
566+
UINT32 offset = DenormalizeCodeOffset(normOffset);
567+
568+
#ifdef DECODE_OLD_FORMATS
569+
if (Version() < 4)
570+
{
571+
// Safepoints are encoded with a -1 adjustment, adjust before reporting
572+
offset++;
573+
}
574+
#endif
575+
536576
pCallback(this, offset, hCallback);
537577
}
538578
}
@@ -555,8 +595,8 @@ template <typename GcInfoEncoding> void TGcInfoDecoder<GcInfoEncoding>::Enumerat
555595
UINT32 rangeStartOffsetNormalized = lastInterruptibleRangeStopOffsetNormalized + normStartDelta;
556596
UINT32 rangeStopOffsetNormalized = rangeStartOffsetNormalized + normStopDelta;
557597

558-
UINT32 rangeStartOffset = GcInfoEncoding::DENORMALIZE_CODE_OFFSET(rangeStartOffsetNormalized);
559-
UINT32 rangeStopOffset = GcInfoEncoding::DENORMALIZE_CODE_OFFSET(rangeStopOffsetNormalized);
598+
UINT32 rangeStartOffset = DenormalizeCodeOffset(rangeStartOffsetNormalized);
599+
UINT32 rangeStopOffset = DenormalizeCodeOffset(rangeStopOffsetNormalized);
560600

561601
bool fStop = pCallback(rangeStartOffset, rangeStopOffset, hCallback);
562602
if (fStop)
@@ -639,6 +679,13 @@ template <typename GcInfoEncoding> UINT32 TGcInfoDecoder<GcInfoEncoding>::GetCod
639679
return m_CodeLength;
640680
}
641681

682+
template <typename GcInfoEncoding> ReturnKind TGcInfoDecoder<GcInfoEncoding>::GetReturnKind()
683+
{
684+
// SUPPORTS_DAC;
685+
_ASSERTE(m_Flags & DECODE_RETURN_KIND);
686+
return m_ReturnKind;
687+
}
688+
642689
template <typename GcInfoEncoding> UINT32 TGcInfoDecoder<GcInfoEncoding>::GetStackBaseRegister()
643690
{
644691
return m_StackBaseRegister;
@@ -702,7 +749,7 @@ template <typename GcInfoEncoding> bool TGcInfoDecoder<GcInfoEncoding>::Enumerat
702749

703750
GcSlotDecoder<GcInfoEncoding> slotDecoder;
704751

705-
UINT32 normBreakOffset = GcInfoEncoding::NORMALIZE_CODE_OFFSET(m_InstructionOffset);
752+
UINT32 normBreakOffset = NormalizeCodeOffset(m_InstructionOffset);
706753

707754
// Normalized break offset
708755
// Relative to interruptible ranges #if PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED

0 commit comments

Comments
 (0)