summaryrefslogtreecommitdiff
path: root/src/vm/frames.cpp
diff options
context:
space:
mode:
authorRahul Kumar <rahku@microsoft.com>2016-08-23 11:26:50 -0700
committerRahul Kumar <rahku@microsoft.com>2016-08-29 14:01:04 -0700
commitcd43ac9480985c6a08a127ad3ae43fd0e62d6d9c (patch)
treebc59d3e27a1c5b21f2c60f2ddd3b418faf52ff35 /src/vm/frames.cpp
parent66caba84fc2319f9741598a4e36034323f33f4a4 (diff)
downloadcoreclr-cd43ac9480985c6a08a127ad3ae43fd0e62d6d9c.tar.gz
coreclr-cd43ac9480985c6a08a127ad3ae43fd0e62d6d9c.tar.bz2
coreclr-cd43ac9480985c6a08a127ad3ae43fd0e62d6d9c.zip
Enable return address hijacking for arm64.
And also fixes a bug in HijackFrame::GCScanRoots
Diffstat (limited to 'src/vm/frames.cpp')
-rw-r--r--src/vm/frames.cpp14
1 files changed, 5 insertions, 9 deletions
diff --git a/src/vm/frames.cpp b/src/vm/frames.cpp
index a0410960f9..ec7e7be63c 100644
--- a/src/vm/frames.cpp
+++ b/src/vm/frames.cpp
@@ -1142,14 +1142,14 @@ void HijackFrame::GcScanRoots(promote_func *fn, ScanContext* sc)
_ASSERTE(IsValidReturnKind(returnKind));
int regNo = 0;
- bool moreRegisters;
+ bool moreRegisters = false;
do
{
- moreRegisters = false;
+ ReturnKind r = ExtractRegReturnKind(returnKind, regNo, moreRegisters);
PTR_PTR_Object objPtr = dac_cast<PTR_PTR_Object>(&m_Args->ReturnValue[regNo]);
- switch (returnKind)
+ switch (r)
{
#ifdef _TARGET_X86_
case RT_Float: // Fall through
@@ -1173,14 +1173,10 @@ void HijackFrame::GcScanRoots(promote_func *fn, ScanContext* sc)
break;
default:
-#ifdef FEATURE_MULTIREG_RETURN
- moreRegisters = true;
- regNo++;
- returnKind = ExtractRegReturnKind(returnKind, regNo);
-#else
_ASSERTE(!"Impossible two bit encoding");
-#endif
}
+
+ regNo++;
} while (moreRegisters);
}