1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
From d768ef837a0a4f13cec786f0d8aa7278abf10bdb Mon Sep 17 00:00:00 2001
From: Jonghyun Park <parjong@gmail.com>
Date: Tue, 19 Sep 2017 17:17:10 +0900
Subject: [PATCH] Disable VSD Stub Kind Prediction on H/W Exception (#14051)
* Disable VSD Stub Kind Prediction on H/W Exception
* Add a comment on a false argument
* Use BOOL (instead of bool) for consistency
* Replace remaining bool/true/false with BOOL/TRUE/FALSE
---
src/vm/exceptionhandling.cpp | 2 +-
src/vm/virtualcallstub.cpp | 8 ++++----
src/vm/virtualcallstub.h | 7 ++++---
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/src/vm/exceptionhandling.cpp b/src/vm/exceptionhandling.cpp
index abea194..2802f73 100644
--- a/src/vm/exceptionhandling.cpp
+++ b/src/vm/exceptionhandling.cpp
@@ -5146,7 +5146,7 @@ static BOOL IsIPinVirtualStub(PCODE f_IP)
}
VirtualCallStubManager::StubKind sk;
- VirtualCallStubManager::FindStubManager(f_IP, &sk);
+ VirtualCallStubManager::FindStubManager(f_IP, &sk, FALSE /* usePredictStubKind */);
if (sk == VirtualCallStubManager::SK_DISPATCH)
{
diff --git a/src/vm/virtualcallstub.cpp b/src/vm/virtualcallstub.cpp
index e753860..e659e35 100644
--- a/src/vm/virtualcallstub.cpp
+++ b/src/vm/virtualcallstub.cpp
@@ -970,7 +970,7 @@ void VirtualCallStubManager::Reclaim()
//----------------------------------------------------------------------------
/* static */
-VirtualCallStubManager *VirtualCallStubManager::FindStubManager(PCODE stubAddress, StubKind* wbStubKind)
+VirtualCallStubManager *VirtualCallStubManager::FindStubManager(PCODE stubAddress, StubKind* wbStubKind, BOOL usePredictStubKind)
{
CONTRACTL {
NOTHROW;
@@ -995,7 +995,7 @@ VirtualCallStubManager *VirtualCallStubManager::FindStubManager(PCODE stubAddres
// VirtualCallStubManager::isDispatchingStub
//
CONTRACT_VIOLATION(SOToleranceViolation);
- kind = pCur->getStubKind(stubAddress);
+ kind = pCur->getStubKind(stubAddress, usePredictStubKind);
if (kind != SK_UNKNOWN)
{
if (wbStubKind)
@@ -1007,7 +1007,7 @@ VirtualCallStubManager *VirtualCallStubManager::FindStubManager(PCODE stubAddres
// See if we are managed by the shared domain
//
pCur = SharedDomain::GetDomain()->GetLoaderAllocator()->GetVirtualCallStubManager();
- kind = pCur->getStubKind(stubAddress);
+ kind = pCur->getStubKind(stubAddress, usePredictStubKind);
if (kind != SK_UNKNOWN)
{
if (wbStubKind)
@@ -1022,7 +1022,7 @@ VirtualCallStubManager *VirtualCallStubManager::FindStubManager(PCODE stubAddres
{
_ASSERTE(pCur != NULL);
- kind = pCur->getStubKind(stubAddress);
+ kind = pCur->getStubKind(stubAddress, usePredictStubKind);
if (kind != SK_UNKNOWN)
{
if (wbStubKind)
diff --git a/src/vm/virtualcallstub.h b/src/vm/virtualcallstub.h
index 7b6fedf..b8984ea 100644
--- a/src/vm/virtualcallstub.h
+++ b/src/vm/virtualcallstub.h
@@ -317,7 +317,7 @@ public:
/* know thine own stubs. It is possible that when multiple
virtualcallstub managers are built that these may need to become
non-static, and the callers modified accordingly */
- StubKind getStubKind(PCODE stubStartAddress)
+ StubKind getStubKind(PCODE stubStartAddress, BOOL usePredictStubKind = TRUE)
{
WRAPPER_NO_CONTRACT;
SUPPORTS_DAC;
@@ -329,7 +329,7 @@ public:
// Rather than calling IsInRange(stubStartAddress) for each possible stub kind
// we can peek at the assembly code and predict which kind of a stub we have
- StubKind predictedKind = predictStubKind(stubStartAddress);
+ StubKind predictedKind = (usePredictStubKind) ? predictStubKind(stubStartAddress) : SK_UNKNOWN;
if (predictedKind == SK_DISPATCH)
{
@@ -732,7 +732,8 @@ private:
public:
// Given a stub address, find the VCSManager that owns it.
static VirtualCallStubManager *FindStubManager(PCODE addr,
- StubKind* wbStubKind = NULL);
+ StubKind* wbStubKind = NULL,
+ BOOL usePredictStubKind = TRUE);
#ifndef DACCESS_COMPILE
// insert a linked list of indirection cells at the beginning of m_RecycledIndCellList
--
2.7.4
|