Makes FCallMemcpy unwindable (dotnet/coreclr#6753)
authorJonghyun Park <parjong@gmail.com>
Wed, 17 Aug 2016 06:32:41 +0000 (15:32 +0900)
committerJan Kotas <jkotas@microsoft.com>
Wed, 17 Aug 2016 06:32:41 +0000 (23:32 -0700)
FCallMemcpy function in vm/arm/memcpy.S creates an stack frame that
libunwind cannot recognize, which leads to the issue in dotnet/coreclr#6752.

This commit makes the stack frame of FCallMemcpy unwindable to fix
issue dotnet/coreclr#6752.

Commit migrated from https://github.com/dotnet/coreclr/commit/a641d3aa4e90ef59b89511705c43d2a036a9c0d4

src/coreclr/src/pal/inc/unixasmmacrosarm.inc
src/coreclr/src/vm/arm/memcpy.S

index c983d7f..14b0b41 100644 (file)
@@ -21,6 +21,10 @@ C_FUNC(\Name):
         LEAF_END \Name, \Section
 .endm
 
+.macro NESTED_END_MARKED Name, Section
+        LEAF_END_MARKED \Name, \Section
+.endm
+
 .macro PATCH_LABEL Name
         .thumb_func
         .global C_FUNC(\Name)
index b09d61c..b978860 100644 (file)
 // Copy a block of memory in a forward direction.
 //
 
-    LEAF_ENTRY FCallMemcpy, _TEXT
+    NESTED_ENTRY FCallMemcpy, _TEXT, NoHandler
         cmp r2, #0
         
         beq LOCAL_LABEL(GC_POLL)
+
+        PROLOG_PUSH  "{r7, lr}"
+        PROLOG_STACK_SAVE r7
         
         ldr r3, [r0]
         ldr r3, [r1]
         
-        push {r7, lr} // r7 as a dummy to make SP aligned
         blx C_FUNC(memcpy)
-        pop {r7, lr}
+
+        EPILOG_POP   "{r7, pc}"
 
 LOCAL_LABEL(GC_POLL):
         ldr r0, =g_TrapReturningThreads
@@ -33,4 +36,4 @@ LOCAL_LABEL(GC_POLL):
         it ne
         bne C_FUNC(FCallMemCpy_GCPoll)
         bx lr
-    LEAF_END_MARKED FCallMemcpy, _TEXT
+    NESTED_END_MARKED FCallMemcpy, _TEXT