summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorBen Pye <ben@curlybracket.co.uk>2015-07-14 21:52:13 +0100
committerBen Pye <ben@curlybracket.co.uk>2015-07-31 15:44:36 +0100
commitbb1d4ca091d129968f367bbf03755441ce5036ab (patch)
treebfe291a8ed5e41c38005c471839166d12758dd52 /src/vm
parent2cf141dce5c3a22efd148e88f8a732835ee68336 (diff)
downloadcoreclr-bb1d4ca091d129968f367bbf03755441ce5036ab.tar.gz
coreclr-bb1d4ca091d129968f367bbf03755441ce5036ab.tar.bz2
coreclr-bb1d4ca091d129968f367bbf03755441ce5036ab.zip
Modify unwinder to provide RtlVirtualUnwind.
Use PAL_VirtualUnwind on Linux ARM Add assembler annotation for unwinding
Diffstat (limited to 'src/vm')
-rw-r--r--src/vm/arm/asmhelpers.S56
-rw-r--r--src/vm/arm/ehhelpers.S12
-rw-r--r--src/vm/arm/stubs.cpp5
3 files changed, 39 insertions, 34 deletions
diff --git a/src/vm/arm/asmhelpers.S b/src/vm/arm/asmhelpers.S
index 4e6e46b211..d625f6bbf5 100644
--- a/src/vm/arm/asmhelpers.S
+++ b/src/vm/arm/asmhelpers.S
@@ -32,8 +32,8 @@
//-----------------------------------------------------------------------------
//void CallDescrWorkerInternal(CallDescrData * pCallDescrData)//
NESTED_ENTRY CallDescrWorkerInternal,_TEXT,NoHandler
- push {r4,r5,r7,lr}
- mov r7, sp
+ PROLOG_PUSH "{r4,r5,r7,lr}"
+ PROLOG_STACK_SAVE r7
mov r5,r0 // save pCallDescrData in r5
@@ -130,8 +130,8 @@ LOCAL_LABEL(LReturnDone):
vldm sp, {d0-d3}
#endif
- mov sp, r7
- pop {r4,r5,r7,pc}
+ EPILOG_STACK_RESTORE r7
+ EPILOG_POP "{r4,r5,r7,pc}"
NESTED_END CallDescrWorkerInternal,_TEXT
@@ -173,9 +173,9 @@ LOCAL_LABEL(LReturnDone):
//
// Spill callee saved registers and return address.
- push {r4-r11,lr}
+ PROLOG_PUSH "{r4-r11,lr}"
- mov r7, sp
+ PROLOG_STACK_SAVE r7
//
// This is the code that would have to run to setup this frame
@@ -242,8 +242,8 @@ LOCAL_LABEL(GoodGSCookie):
//
// epilog
//
- mov sp, r7
- pop {r4-r11,lr}
+ EPILOG_STACK_RESTORE r7
+ EPILOG_POP "{r4-r11,lr}"
bx lr
NESTED_END TailCallHelperStub, _TEXT
@@ -310,9 +310,9 @@ LOCAL_LABEL(LNullThis):
// r12 = UMEntryThunk*
//
NESTED_ENTRY UMThunkStub,_TEXT,NoHandler
- push {r4,r5,r7,r11,lr}
- push {r0-r3,r12}
- mov r7, sp
+ PROLOG_PUSH "{r4,r5,r7,r11,lr}"
+ push {r0-r3,r12}
+ PROLOG_STACK_SAVE r7
//GBLA UMThunkStub_HiddenArg // offset of saved UMEntryThunk *
//GBLA UMThunkStub_StackArgs // offset of original stack args (total size of UMThunkStub frame)
@@ -375,9 +375,9 @@ LOCAL_LABEL(UMThunkStub_PostCall):
mov r4, 0
str r4, [r5, #Thread__m_fPreemptiveGCDisabled]
- mov sp, r7
- add sp, sp, #(4 * 5)
- pop {r4,r5,r7,r11,pc}
+ EPILOG_STACK_RESTORE r7
+ free_stack 4 * 5
+ EPILOG_POP "{r4,r5,r7,r11,pc}"
LOCAL_LABEL(UMThunkStub_DoThreadSetup):
sub sp, #SIZEOF__FloatArgumentRegisters
@@ -424,8 +424,8 @@ LOCAL_LABEL(UMThunkStub_WrongAppDomain):
NESTED_ENTRY UM2MThunk_WrapperHelper, _TEXT, NoHandler
- push {r4-r7,r11,lr}
- mov r7, sp
+ PROLOG_PUSH "{r4-r7,r11,lr}"
+ PROLOG_STACK_SAVE r7
CHECK_STACK_ALIGNMENT
@@ -481,8 +481,8 @@ LOCAL_LABEL(UM2MThunk_WrapperHelper_ArgumentsSetup):
vldm sp, {d0-d3}
#endif
- mov sp, r7
- pop {r4-r7,r11,pc}
+ EPILOG_STACK_RESTORE r7
+ EPILOG_POP "{r4-r7,r11,pc}"
NESTED_END UM2MThunk_WrapperHelper, _TEXT
@@ -543,7 +543,7 @@ ThePreStubPatchLabel:
// r12 = FixupPrecode *
- push {r0-r1}
+ PROLOG_PUSH "{r0-r1}"
// Inline computation done by FixupPrecode::GetMethodDesc()
ldrb r0, [r12, #3] // m_PrecodeChunkIndex
@@ -554,7 +554,7 @@ ThePreStubPatchLabel:
ldr r0, [r0,#8]
add r12,r0,r1,lsl #2
- pop {r0-r1}
+ EPILOG_POP "{r0-r1}"
b C_FUNC(ThePreStub)
NESTED_END PrecodeFixupThunk, _TEXT
@@ -676,9 +676,9 @@ LOCAL_LABEL(Done):
NESTED_ENTRY RedirectedHandledJITCaseFor\reason\()_Stub, _TEXT, NoHandler
- push {r7,lr} // return address
- alloc_stack 4 // stack slot to save the CONTEXT *
- mov r7, sp
+ PROLOG_PUSH "{r7,lr}" // return address
+ alloc_stack 4 // stack slot to save the CONTEXT *
+ PROLOG_STACK_SAVE r7
//REDIRECTSTUB_SP_OFFSET_CONTEXT is defined in asmconstants.h
//If CONTEXT is not saved at 0 offset from SP it must be changed as well.
@@ -762,7 +762,7 @@ LOCAL_LABEL(checkStack_neg):
NESTED_END checkStack, _TEXT
NESTED_ENTRY stackProbe, _TEXT, NoHandler
- push {r5,r6}
+ PROLOG_PUSH "{r5,r6}"
mov r6, r12
bfc r6, #0, #0xc // align down (4K)
LOCAL_LABEL(stackProbe_loop):
@@ -770,7 +770,7 @@ LOCAL_LABEL(stackProbe_loop):
ldr r5,[r4] // try to read ... this should move the guard page
cmp r4,r6
bne LOCAL_LABEL(stackProbe_loop)
- pop {r5,r6}
+ EPILOG_POP "{r5,r6}"
sub r4,sp,r12
bx lr
NESTED_END stackProbe, _TEXT
@@ -907,15 +907,15 @@ LOCAL_LABEL(stackProbe_loop):
//
NESTED_ENTRY JIT_RareDisableHelper, _TEXT, NoHandler
- push {r0-r1, r11, lr} // save integer return value
- vpush {d0-d3} // floating point return value
+ PROLOG_PUSH "{r0-r1, r11, lr}" // save integer return value
+ vpush {d0-d3} // floating point return value
CHECK_STACK_ALIGNMENT
bl C_FUNC(JIT_RareDisableHelperWorker)
vpop {d0-d3}
- pop {r0-r1, r11, pc}
+ EPILOG_POP "{r0-r1, r11, pc}"
NESTED_END JIT_RareDisableHelper, _TEXT
diff --git a/src/vm/arm/ehhelpers.S b/src/vm/arm/ehhelpers.S
index aaa464e243..a15f7cc4ac 100644
--- a/src/vm/arm/ehhelpers.S
+++ b/src/vm/arm/ehhelpers.S
@@ -39,7 +39,7 @@ OFFSET_OF_FRAME=(4 + SIZEOF__GSCookie)
// IN: lr: original IP before redirect
//
- push {r4,r7,lr}
+ PROLOG_PUSH "{r4,r7,lr}"
alloc_stack OFFSET_OF_FRAME + SIZEOF__FaultingExceptionFrame
// At this point, the stack maybe misaligned if the thread abort was asynchronously
@@ -47,7 +47,7 @@ OFFSET_OF_FRAME=(4 + SIZEOF__GSCookie)
// align the stack before calling into the VM.
//
// Runtime check for 8-byte alignment.
- mov r7, sp
+ PROLOG_STACK_SAVE r7
and r0, r7, #4
sub sp, sp, r0
@@ -99,7 +99,7 @@ OFFSET_OF_FRAME=(4 + SIZEOF__GSCookie)
// This helper enables us to call into a funclet after applying the non-volatiles
NESTED_ENTRY CallEHFunclet, _TEXT, NoHandler
- push {r4-r11, lr}
+ PROLOG_PUSH "{r4-r11, lr}"
alloc_stack 4
// On entry:
@@ -117,7 +117,7 @@ OFFSET_OF_FRAME=(4 + SIZEOF__GSCookie)
blx r1
free_stack 4
- pop {r4-r11, pc}
+ EPILOG_POP "{r4-r11, pc}"
NESTED_END CallEHFunclet, _TEXT
@@ -125,7 +125,7 @@ OFFSET_OF_FRAME=(4 + SIZEOF__GSCookie)
// frame pointer for accessing the locals in the parent method.
NESTED_ENTRY CallEHFilterFunclet, _TEXT, NoHandler
- push {lr}
+ PROLOG_PUSH "{lr}"
alloc_stack 4
// On entry:
@@ -141,6 +141,6 @@ OFFSET_OF_FRAME=(4 + SIZEOF__GSCookie)
blx r2
free_stack 4
- pop {pc}
+ EPILOG_POP "{pc}"
NESTED_END CallEHFilterFunclet, _TEXT
diff --git a/src/vm/arm/stubs.cpp b/src/vm/arm/stubs.cpp
index 91a3d7097d..368e6cf810 100644
--- a/src/vm/arm/stubs.cpp
+++ b/src/vm/arm/stubs.cpp
@@ -533,7 +533,12 @@ void LazyMachState::unwindLazyState(LazyMachState* baseState,
do
{
+#ifndef FEATURE_PAL
pvControlPc = Thread::VirtualUnwindCallFrame(&ctx, &nonVolRegPtrs);
+#else // !FEATURE_PAL
+ PAL_VirtualUnwind(&ctx, &nonVolRegPtrs);
+ pvControlPc = GetIP(&ctx);
+#endif // !FEATURE_PAL
if (funCallDepth > 0)
{