summaryrefslogtreecommitdiff
path: root/src/vm/i386
diff options
context:
space:
mode:
authorKoundinya Veluri <kouvel@users.noreply.github.com>2017-11-06 14:28:41 -0800
committerGitHub <noreply@github.com>2017-11-06 14:28:41 -0800
commit1a67e84aca889cf94c716a7847cfe0b4d1ee62d6 (patch)
treeee24ebe93ec1ea69c456b729c495f1ead37394de /src/vm/i386
parentaee95b5490f55512635f8f87c21e54e164fb9a2f (diff)
downloadcoreclr-1a67e84aca889cf94c716a7847cfe0b4d1ee62d6.tar.gz
coreclr-1a67e84aca889cf94c716a7847cfe0b4d1ee62d6.tar.bz2
coreclr-1a67e84aca889cf94c716a7847cfe0b4d1ee62d6.zip
Fix GC reporting for slow tail call arguments of type `Span<T>` (#14826)
Fix GC reporting for slow tail call arguments of type `Span<T>` Fixes https://github.com/dotnet/coreclr/issues/9032: - Refactored by-ref-like method table walking to find offsets of by-ref pointers in siginfo.hpp/cpp - Reused that for appending GC layout when creating the copy-args helper for a slow tail call
Diffstat (limited to 'src/vm/i386')
-rw-r--r--src/vm/i386/stublinkerx86.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/vm/i386/stublinkerx86.cpp b/src/vm/i386/stublinkerx86.cpp
index e07b6e1c37..14b9701a29 100644
--- a/src/vm/i386/stublinkerx86.cpp
+++ b/src/vm/i386/stublinkerx86.cpp
@@ -5925,6 +5925,17 @@ static void AppendGCLayout(ULONGARRAY &gcLayout, size_t baseOffset, BOOL fIsType
_ASSERTE(pMT);
_ASSERTE(pMT->IsValueType());
+ if (pMT->IsByRefLike())
+ {
+ FindByRefPointerOffsetsInByRefLikeObject(
+ pMT,
+ baseOffset,
+ [&](size_t pointerOffset)
+ {
+ *gcLayout.AppendThrowing() = (ULONG)(pointerOffset | 1); // "| 1" to mark it as an interior pointer
+ });
+ }
+
// walk the GC descriptors, reporting the correct offsets
if (pMT->ContainsPointers())
{