summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyungwoo Lee <kyulee@microsoft.com>2016-04-12 09:11:53 -0700
committerKyungwoo Lee <kyulee@microsoft.com>2016-04-12 09:12:15 -0700
commit63554209e89d38785f2a1241939c490370e3efed (patch)
tree6dfce29fc6277e813385aa8cb34b8ed58ffe083d
parentff26d6801b3ce0dec5918a5ad0d3ab90f9656e28 (diff)
downloadcoreclr-63554209e89d38785f2a1241939c490370e3efed.tar.gz
coreclr-63554209e89d38785f2a1241939c490370e3efed.tar.bz2
coreclr-63554209e89d38785f2a1241939c490370e3efed.zip
ARM64: Fix for recording SP for handler.
Fixes https://github.com/dotnet/coreclr/issues/3701. When GC occurs in a catch handler, we compare the current frame with the one saved before the funclet was invoked. The recorded SP address was wrong (offset by 16 byte), which caused FindParentStackFrameForStackWalk to null frame. So, we ended up with assert on `ExceptionTracker::HasFrameBeenUnwoundByAnyActiveException(&m_crawl)`. The issue was assembly helper, CallEHFunclet records FP instead of SP while SP is adjusted in prolog.
-rw-r--r--src/vm/arm64/asmhelpers.asm3
-rw-r--r--tests/arm64/Tests.lst30
2 files changed, 17 insertions, 16 deletions
diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm
index a12a484d6a..55df26aa74 100644
--- a/src/vm/arm64/asmhelpers.asm
+++ b/src/vm/arm64/asmhelpers.asm
@@ -972,7 +972,8 @@ UM2MThunk_WrapperHelper_RegArgumentsSetup
; X2 = address of X19 register in CONTEXT record; used to restore the non-volatile registers of CrawlFrame
; X3 = address of the location where the SP of funclet's caller (i.e. this helper) should be saved.
;
- ; Save the SP of this function
+ ; Save the SP of this function. We cannot store SP directly.
+ mov fp, sp
str fp, [x3]
ldr fp, [x2, #80] ; offset of fp in CONTEXT relative to X19
diff --git a/tests/arm64/Tests.lst b/tests/arm64/Tests.lst
index 4d52ab5c78..7f209c947d 100644
--- a/tests/arm64/Tests.lst
+++ b/tests/arm64/Tests.lst
@@ -2657,7 +2657,7 @@ RelativePath=JIT\Directed\ExcepFilters\fault\fault\fault.cmd
WorkingDir=JIT\Directed\ExcepFilters\fault\fault
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;JIT;EXPECTED_PASS
HostStyle=0
[mixed.cmd_388]
RelativePath=JIT\Directed\ExcepFilters\mixed\mixed\mixed.cmd
@@ -2685,7 +2685,7 @@ RelativePath=JIT\Directed\FaultHandlers\Nesting\Nesting\Nesting.cmd
WorkingDir=JIT\Directed\FaultHandlers\Nesting\Nesting
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;JIT;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;JIT;EXPECTED_PASS
HostStyle=0
[Simple.cmd_392]
RelativePath=JIT\Directed\FaultHandlers\Simple\Simple\Simple.cmd
@@ -13101,7 +13101,7 @@ RelativePath=JIT\jit64\regress\ndpw\14888\objectusedonlyinhandler\objectusedonly
WorkingDir=JIT\jit64\regress\ndpw\14888\objectusedonlyinhandler
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[simple.cmd_1901]
RelativePath=JIT\jit64\regress\ndpw\160545\simple\simple.cmd
@@ -20549,28 +20549,28 @@ RelativePath=JIT\Methodical\eh\interactions\gcincatch_d\gcincatch_d.cmd
WorkingDir=JIT\Methodical\eh\interactions\gcincatch_d
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[gcincatch_do.cmd_2994]
RelativePath=JIT\Methodical\eh\interactions\gcincatch_do\gcincatch_do.cmd
WorkingDir=JIT\Methodical\eh\interactions\gcincatch_do
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[gcincatch_r.cmd_2995]
RelativePath=JIT\Methodical\eh\interactions\gcincatch_r\gcincatch_r.cmd
WorkingDir=JIT\Methodical\eh\interactions\gcincatch_r
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[gcincatch_ro.cmd_2996]
RelativePath=JIT\Methodical\eh\interactions\gcincatch_ro\gcincatch_ro.cmd
WorkingDir=JIT\Methodical\eh\interactions\gcincatch_ro
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[rangecheckinfinally_d.cmd_2997]
RelativePath=JIT\Methodical\eh\interactions\rangecheckinfinally_d\rangecheckinfinally_d.cmd
@@ -21452,28 +21452,28 @@ RelativePath=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_d\
WorkingDir=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_d
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;GC_GEN0;ISSUE_3701;REL_PASS
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[throwinfinallyrecursive_20_do.cmd_3123]
RelativePath=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_do\throwinfinallyrecursive_20_do.cmd
WorkingDir=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_do
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;GC_GEN0;ISSUE_3701;REL_PASS
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[throwinfinallyrecursive_20_r.cmd_3124]
RelativePath=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_r\throwinfinallyrecursive_20_r.cmd
WorkingDir=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_r
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;GC_GEN0;ISSUE_3701;REL_PASS
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[throwinfinallyrecursive_20_ro.cmd_3125]
RelativePath=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_ro\throwinfinallyrecursive_20_ro.cmd
WorkingDir=JIT\Methodical\eh\nested\nonlocalexit\throwinfinallyrecursive_20_ro
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;GC_GEN0;ISSUE_3701;REL_PASS
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[throwinfinally_50_d.cmd_3126]
RelativePath=JIT\Methodical\eh\nested\nonlocalexit\throwinfinally_50_d\throwinfinally_50_d.cmd
@@ -23734,7 +23734,7 @@ RelativePath=JIT\Methodical\flowgraph\dev10_bug679008\fgloop\fgloop.cmd
WorkingDir=JIT\Methodical\flowgraph\dev10_bug679008\fgloop
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS;ISSUE_3701
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[fgloop2.cmd_3449]
RelativePath=JIT\Methodical\flowgraph\dev10_bug679008\fgloop2\fgloop2.cmd
@@ -36656,7 +36656,7 @@ RelativePath=JIT\Regression\CLR-x86-JIT\V1-M13-RTM\b92289\b92289\b92289.cmd
WorkingDir=JIT\Regression\CLR-x86-JIT\V1-M13-RTM\b92289\b92289
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[b92568.cmd_5330]
RelativePath=JIT\Regression\CLR-x86-JIT\V1-M13-RTM\b92568\b92568\b92568.cmd
@@ -37174,7 +37174,7 @@ RelativePath=JIT\Regression\CLR-x86-JIT\V1.2-M01\b16473\b16473\b16473.cmd
WorkingDir=JIT\Regression\CLR-x86-JIT\V1.2-M01\b16473\b16473
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri0;EXPECTED_FAIL;REL_PASS
+Categories=Pri0;EXPECTED_PASS
HostStyle=0
[b16570.cmd_5408]
RelativePath=JIT\Regression\CLR-x86-JIT\V1.2-M01\b16570\b16570\b16570.cmd
@@ -58279,7 +58279,7 @@ RelativePath=Regressions\coreclr\0080\delete_next_card_table\delete_next_card_ta
WorkingDir=Regressions\coreclr\0080\delete_next_card_table
Expected=0
MaxAllowedDurationSeconds=600
-Categories=Pri1;RT;EXPECTED_FAIL;NEED_TRIAGE;ISSUE_3104;ISSUE_3701
+Categories=Pri1;RT;EXPECTED_PASS
HostStyle=0
[genrecur.cmd_8426]
RelativePath=Regressions\coreclr\0211\genrecur\genrecur.cmd