Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c14eaf7

Browse files
Merge branch 'main' into json-indent-text
2 parents 4964a53 + 1063fc2 commit c14eaf7

File tree

178 files changed

+12341
-1323
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

178 files changed

+12341
-1323
lines changed

src/coreclr/jit/compiler.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9515,7 +9515,9 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
95159515
{
95169516
Memset,
95179517
Memcpy,
9518-
Memmove
9518+
Memmove,
9519+
ProfiledMemmove,
9520+
ProfiledMemcmp
95199521
};
95209522

95219523
//------------------------------------------------------------------------
@@ -9589,6 +9591,13 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
95899591
threshold = maxRegSize * 4;
95909592
}
95919593

9594+
// For profiled memcmp/memmove we don't want to unroll too much as it's just a guess,
9595+
// and it works better for small sizes.
9596+
if ((type == UnrollKind::ProfiledMemcmp) || (type == UnrollKind::ProfiledMemmove))
9597+
{
9598+
threshold = maxRegSize * 2;
9599+
}
9600+
95929601
return threshold;
95939602
}
95949603

src/coreclr/jit/fgprofile.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,9 +1950,13 @@ class ValueHistogramProbeVisitor final : public GenTreeVisitor<ValueHistogramPro
19501950
Compiler::fgWalkResult PreOrderVisit(GenTree** use, GenTree* user)
19511951
{
19521952
GenTree* const node = *use;
1953-
if (node->IsCall() && node->AsCall()->IsSpecialIntrinsic(m_compiler, NI_System_Buffer_Memmove))
1953+
if (node->IsCall() && node->AsCall()->IsSpecialIntrinsic())
19541954
{
1955-
m_functor(m_compiler, node);
1955+
const NamedIntrinsic ni = m_compiler->lookupNamedIntrinsic(node->AsCall()->gtCallMethHnd);
1956+
if ((ni == NI_System_Buffer_Memmove) || (ni == NI_System_SpanHelpers_SequenceEqual))
1957+
{
1958+
m_functor(m_compiler, node);
1959+
}
19561960
}
19571961
return Compiler::WALK_CONTINUE;
19581962
}
@@ -2276,8 +2280,8 @@ class ValueHistogramProbeInserter
22762280
return;
22772281
}
22782282

2279-
// Only Buffer.Memmove call is currently expected
2280-
assert(node->IsCall() && (node->AsCall()->IsSpecialIntrinsic(compiler, NI_System_Buffer_Memmove)));
2283+
assert(node->AsCall()->IsSpecialIntrinsic(compiler, NI_System_Buffer_Memmove) ||
2284+
node->AsCall()->IsSpecialIntrinsic(compiler, NI_System_SpanHelpers_SequenceEqual));
22812285

22822286
const ICorJitInfo::PgoInstrumentationSchema& countEntry = m_schema[*m_currentSchemaIndex];
22832287
if (countEntry.ILOffset !=

src/coreclr/jit/importercalls.cpp

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,6 +1440,32 @@ var_types Compiler::impImportCall(OPCODE opcode,
14401440
{
14411441
impSpillSideEffects(true, CHECK_SPILL_ALL DEBUGARG("non-inline candidate call"));
14421442
}
1443+
1444+
if (JitConfig.JitProfileValues() && call->IsCall() &&
1445+
call->AsCall()->IsSpecialIntrinsic(this, NI_System_SpanHelpers_SequenceEqual))
1446+
{
1447+
if (opts.IsOptimizedWithProfile())
1448+
{
1449+
call = impDuplicateWithProfiledArg(call->AsCall(), rawILOffset);
1450+
if (call->OperIs(GT_QMARK))
1451+
{
1452+
// QMARK has to be a root node
1453+
unsigned tmp = lvaGrabTemp(true DEBUGARG("Grabbing temp for Qmark"));
1454+
impStoreTemp(tmp, call, CHECK_SPILL_ALL);
1455+
call = gtNewLclvNode(tmp, call->TypeGet());
1456+
}
1457+
}
1458+
else if (opts.IsInstrumented())
1459+
{
1460+
// We might want to instrument it for optimized versions too, but we don't currently.
1461+
HandleHistogramProfileCandidateInfo* pInfo =
1462+
new (this, CMK_Inlining) HandleHistogramProfileCandidateInfo;
1463+
pInfo->ilOffset = rawILOffset;
1464+
pInfo->probeIndex = 0;
1465+
call->AsCall()->gtHandleHistogramProfileCandidateInfo = pInfo;
1466+
compCurBB->SetFlags(BBF_HAS_VALUE_PROFILE);
1467+
}
1468+
}
14431469
}
14441470

14451471
//-------------------------------------------------------------------------
@@ -1536,7 +1562,15 @@ GenTree* Compiler::impDuplicateWithProfiledArg(GenTreeCall* call, IL_OFFSET ilOf
15361562
argNum = 2;
15371563

15381564
minValue = 1; // TODO: enable for 0 as well.
1539-
maxValue = (ssize_t)getUnrollThreshold(Memmove);
1565+
maxValue = (ssize_t)getUnrollThreshold(ProfiledMemmove);
1566+
}
1567+
else if (call->IsSpecialIntrinsic(this, NI_System_SpanHelpers_SequenceEqual))
1568+
{
1569+
// dst(0), src(1), len(2)
1570+
argNum = 2;
1571+
1572+
minValue = 1; // TODO: enable for 0 as well.
1573+
maxValue = (ssize_t)getUnrollThreshold(ProfiledMemcmp);
15401574
}
15411575
else
15421576
{
@@ -2729,7 +2763,8 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis,
27292763
break;
27302764

27312765
case NI_System_Buffer_Memmove:
2732-
// We're going to instrument this one
2766+
case NI_System_SpanHelpers_SequenceEqual:
2767+
// We're going to instrument these
27332768
betterToExpand = opts.IsInstrumented();
27342769
break;
27352770

src/coreclr/nativeaot/Runtime/AsmOffsets.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ ASM_OFFSET( 2c, 40, Thread, m_pTransitionFrame)
5252
ASM_OFFSET( 30, 48, Thread, m_pDeferredTransitionFrame)
5353
ASM_OFFSET( 40, 68, Thread, m_ppvHijackedReturnAddressLocation)
5454
ASM_OFFSET( 44, 70, Thread, m_pvHijackedReturnAddress)
55-
#ifdef HOST_64BIT
56-
ASM_OFFSET( 0, 78, Thread, m_uHijackedReturnValueFlags)
57-
#endif
58-
ASM_OFFSET( 48, 80, Thread, m_pExInfoStackHead)
59-
ASM_OFFSET( 4c, 88, Thread, m_threadAbortException)
55+
ASM_OFFSET( 48, 78, Thread, m_uHijackedReturnValueFlags)
56+
ASM_OFFSET( 4c, 80, Thread, m_pExInfoStackHead)
57+
ASM_OFFSET( 50, 88, Thread, m_threadAbortException)
6058

6159
ASM_SIZEOF( 14, 20, EHEnum)
6260

src/coreclr/nativeaot/Runtime/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,9 @@ endif()
236236
add_definitions(-DFEATURE_BASICFREEZE)
237237
add_definitions(-DFEATURE_CONSERVATIVE_GC)
238238
add_definitions(-DFEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP)
239-
add_definitions(-DFEATURE_MANUALLY_MANAGED_CARD_BUNDLES)
239+
if(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)
240+
add_definitions(-DFEATURE_MANUALLY_MANAGED_CARD_BUNDLES)
241+
endif(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)
240242

241243
add_definitions(-DFEATURE_CUSTOM_IMPORTS)
242244
add_definitions(-DFEATURE_DYNAMIC_CODE)
@@ -245,6 +247,9 @@ add_definitions(-DFEATURE_NATIVEAOT)
245247
add_definitions(-DVERIFY_HEAP)
246248
add_definitions(-DNATIVEAOT)
247249
add_definitions(-DFEATURE_CACHED_INTERFACE_DISPATCH)
250+
if(CLR_CMAKE_TARGET_ARCH_X86 OR CLR_CMAKE_TARGET_ARCH_ARM)
251+
add_definitions(-DINTERFACE_DISPATCH_CACHE_HAS_CELL_BACKPOINTER)
252+
endif(CLR_CMAKE_TARGET_ARCH_X86 OR CLR_CMAKE_TARGET_ARCH_ARM)
248253
add_definitions(-D_LIB)
249254

250255
# there is a problem with undefined symbols when this is set

src/coreclr/nativeaot/Runtime/CachedInterfaceDispatch.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@ struct InterfaceDispatchCacheEntry
2626
// the owning interface dispatch indirection cell) and a list entry used to link the caches in one of a couple
2727
// of lists related to cache reclamation.
2828

29-
#if defined(HOST_ARM) || defined(HOST_X86)
30-
// On ARM and x86 the slow path in the stubs needs to reload the cell pointer from the cache due to the lack
31-
// of available (volatile non-argument) registers.
32-
#define INTERFACE_DISPATCH_CACHE_HAS_CELL_BACKPOINTER
33-
#endif // defined(HOST_ARM) || defined(HOST_X86)
34-
3529
#pragma warning(push)
3630
#pragma warning(disable:4200) // nonstandard extension used: zero-sized array in struct/union
3731
struct InterfaceDispatchCell;
@@ -42,6 +36,8 @@ struct InterfaceDispatchCache
4236
{
4337
InterfaceDispatchCache * m_pNextFree; // next in free list
4438
#ifdef INTERFACE_DISPATCH_CACHE_HAS_CELL_BACKPOINTER
39+
// On ARM and x86 the slow path in the stubs needs to reload the cell pointer from the cache due to the lack
40+
// of available (volatile non-argument) registers.
4541
InterfaceDispatchCell * m_pCell; // pointer back to interface dispatch cell
4642
#endif
4743
};

src/coreclr/nativeaot/Runtime/ICodeManager.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,26 @@ inline GCRefKind TransitionFrameFlagsToReturnKind(uint64_t transFrameFlags)
9191
return returnKind;
9292
}
9393

94+
#elif defined(TARGET_ARM)
95+
96+
// Verify that we can use bitwise shifts to convert from GCRefKind to PInvokeTransitionFrameFlags and back
97+
C_ASSERT(PTFF_R0_IS_GCREF == ((uint64_t)GCRK_Object << 14));
98+
C_ASSERT(PTFF_R0_IS_BYREF == ((uint64_t)GCRK_Byref << 14));
99+
100+
inline uint64_t ReturnKindToTransitionFrameFlags(GCRefKind returnKind)
101+
{
102+
// just need to report gc ref bits here.
103+
// appropriate PTFF_SAVE_ bits will be added by the frame building routine.
104+
return ((uint64_t)returnKind << 14);
105+
}
106+
107+
inline GCRefKind TransitionFrameFlagsToReturnKind(uint64_t transFrameFlags)
108+
{
109+
GCRefKind returnKind = (GCRefKind)((transFrameFlags & (PTFF_R0_IS_GCREF | PTFF_R0_IS_BYREF)) >> 14);
110+
ASSERT((returnKind == GCRK_Scalar) || (transFrameFlags & PTFF_SAVE_R0));
111+
return returnKind;
112+
}
113+
94114
#endif
95115

96116
// Extract individual GCRefKind components from a composite return kind

src/coreclr/nativeaot/Runtime/arm/AsmOffsetsCpu.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@
77
//
88
// NOTE: the offsets MUST be in hex notation WITHOUT the 0x prefix
99

10-
PLAT_ASM_SIZEOF(13c, ExInfo)
10+
PLAT_ASM_SIZEOF(140, ExInfo)
1111
PLAT_ASM_OFFSET(0, ExInfo, m_pPrevExInfo)
1212
PLAT_ASM_OFFSET(4, ExInfo, m_pExContext)
1313
PLAT_ASM_OFFSET(8, ExInfo, m_exception)
1414
PLAT_ASM_OFFSET(0c, ExInfo, m_kind)
1515
PLAT_ASM_OFFSET(0d, ExInfo, m_passNumber)
1616
PLAT_ASM_OFFSET(10, ExInfo, m_idxCurClause)
1717
PLAT_ASM_OFFSET(18, ExInfo, m_frameIter)
18-
PLAT_ASM_OFFSET(134, ExInfo, m_notifyDebuggerSP)
18+
PLAT_ASM_OFFSET(138, ExInfo, m_notifyDebuggerSP)
1919

2020
PLAT_ASM_OFFSET(4, PInvokeTransitionFrame, m_RIP)
2121
PLAT_ASM_OFFSET(8, PInvokeTransitionFrame, m_FramePointer)
2222
PLAT_ASM_OFFSET(0c, PInvokeTransitionFrame, m_pThread)
2323
PLAT_ASM_OFFSET(10, PInvokeTransitionFrame, m_Flags)
2424
PLAT_ASM_OFFSET(14, PInvokeTransitionFrame, m_PreservedRegs)
2525

26-
PLAT_ASM_SIZEOF(11c, StackFrameIterator)
26+
PLAT_ASM_SIZEOF(120, StackFrameIterator)
2727
PLAT_ASM_OFFSET(08, StackFrameIterator, m_FramePointer)
2828
PLAT_ASM_OFFSET(0c, StackFrameIterator, m_ControlPC)
2929
PLAT_ASM_OFFSET(10, StackFrameIterator, m_RegDisplay)

src/coreclr/nativeaot/Runtime/arm/GcProbe.S

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,31 @@
44
#include <unixasmmacros.inc>
55
#include "AsmOffsets.inc"
66

7-
.global RhpGcPoll2
7+
.global RhpGcPoll2
88

9-
LEAF_ENTRY RhpGcPoll
10-
ldr r0, =RhpTrapThreads
11-
ldr r0, [r0]
12-
cmp r0, #TrapThreadsFlags_None
13-
bne RhpGcPollRare
14-
bx lr
15-
LEAF_END RhpGcPoll
9+
LEAF_ENTRY RhpGcPoll
10+
ldr r0, =RhpTrapThreads
11+
ldr r0, [r0]
12+
cmp r0, #TrapThreadsFlags_None
13+
bne RhpGcPollRare
14+
bx lr
15+
LEAF_END RhpGcPoll
1616

17-
NESTED_ENTRY RhpGcPollRare, _TEXT, NoHandler
18-
PUSH_COOP_PINVOKE_FRAME r0
19-
bl RhpGcPoll2
20-
POP_COOP_PINVOKE_FRAME
21-
bx lr
22-
NESTED_END RhpGcPollRare
17+
NESTED_ENTRY RhpGcPollRare, _TEXT, NoHandler
18+
PUSH_COOP_PINVOKE_FRAME r0
19+
bl RhpGcPoll2
20+
POP_COOP_PINVOKE_FRAME
21+
bx lr
22+
NESTED_END RhpGcPollRare
23+
24+
NESTED_ENTRY RhpGcProbeHijack, _TEXT, NoHandler
25+
// Not implemented
26+
EMIT_BREAKPOINT
27+
NESTED_END RhpGcProbeHijack
28+
29+
#ifdef FEATURE_GC_STRESS
30+
LEAF_ENTRY RhpGcStressHijack
31+
// Not implemented
32+
EMIT_BREAKPOINT
33+
LEAF_END RhpGcStressHijack
34+
#endif

src/coreclr/nativeaot/Runtime/thread.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ struct ThreadBuffer
9494
HANDLE m_hPalThread; // WARNING: this may legitimately be INVALID_HANDLE_VALUE
9595
void ** m_ppvHijackedReturnAddressLocation;
9696
void * m_pvHijackedReturnAddress;
97-
uintptr_t m_uHijackedReturnValueFlags;
97+
uintptr_t m_uHijackedReturnValueFlags;
9898
PTR_ExInfo m_pExInfoStackHead;
9999
Object* m_threadAbortException; // ThreadAbortException instance -set only during thread abort
100100
Object* m_pThreadLocalStatics;

0 commit comments

Comments
 (0)