Skip to content

Instantly share code, notes, and snippets.

@kangaroo
Created March 18, 2015 20:24
Show Gist options
  • Save kangaroo/8c0164bf35283b998f5b to your computer and use it in GitHub Desktop.
Save kangaroo/8c0164bf35283b998f5b to your computer and use it in GitHub Desktop.
diff --git a/src/debug/di/amd64/floatconversion.S b/src/debug/di/amd64/floatconversion.S
index ae02176..932fcf3 100644
--- a/src/debug/di/amd64/floatconversion.S
+++ b/src/debug/di/amd64/floatconversion.S
@@ -9,4 +9,4 @@
LEAF_ENTRY FPFillR8, _TEXT
movdqa xmm0, [rdi]
ret
-LEAF_END FPFillR8, _TEXT
+LEAF_END FPFillR8, _TEXT, Unwind
diff --git a/src/debug/ee/amd64/dbghelpers.S b/src/debug/ee/amd64/dbghelpers.S
index 7debc0e..facb784 100644
--- a/src/debug/ee/amd64/dbghelpers.S
+++ b/src/debug/ee/amd64/dbghelpers.S
@@ -33,7 +33,7 @@ NESTED_ENTRY FuncEvalHijack, _TEXT, FuncEvalHijackPersonalityRoutine
//
add rsp, 20h
TAILJMP_RAX
-NESTED_END FuncEvalHijack, _TEXT
+NESTED_END FuncEvalHijack, _TEXT, Unwind
//extern ExceptionHijackWorker:proc
@@ -91,7 +91,7 @@ NESTED_ENTRY ExceptionHijack, _TEXT, ExceptionHijackPersonalityRoutine
// Put a label here to tell the debugger where the end of this function is.
PATCH_LABEL ExceptionHijackEnd
-NESTED_END ExceptionHijack, _TEXT
+NESTED_END ExceptionHijack, _TEXT, Unwind
//
// Flares for interop debugging.
@@ -105,7 +105,7 @@ LEAF_ENTRY SignalHijackStartedFlare, _TEXT
// make sure that the basic block is unique
test rax,1
ret
-LEAF_END SignalHijackStartedFlare, _TEXT
+LEAF_END SignalHijackStartedFlare, _TEXT, Unwind
// Start the handoff
LEAF_ENTRY ExceptionForRuntimeHandoffStartFlare, _TEXT
@@ -113,7 +113,7 @@ LEAF_ENTRY ExceptionForRuntimeHandoffStartFlare, _TEXT
// make sure that the basic block is unique
test rax,2
ret
-LEAF_END ExceptionForRuntimeHandoffStartFlare, _TEXT
+LEAF_END ExceptionForRuntimeHandoffStartFlare, _TEXT, Unwind
// Finish the handoff.
LEAF_ENTRY ExceptionForRuntimeHandoffCompleteFlare, _TEXT
@@ -121,7 +121,7 @@ LEAF_ENTRY ExceptionForRuntimeHandoffCompleteFlare, _TEXT
// make sure that the basic block is unique
test rax,3
ret
-LEAF_END ExceptionForRuntimeHandoffCompleteFlare, _TEXT
+LEAF_END ExceptionForRuntimeHandoffCompleteFlare, _TEXT, Unwind
// Signal execution return to unhijacked state
LEAF_ENTRY SignalHijackCompleteFlare, _TEXT
@@ -129,7 +129,7 @@ LEAF_ENTRY SignalHijackCompleteFlare, _TEXT
// make sure that the basic block is unique
test rax,4
ret
-LEAF_END SignalHijackCompleteFlare, _TEXT
+LEAF_END SignalHijackCompleteFlare, _TEXT, Unwind
// This exception is from unmanaged code.
LEAF_ENTRY ExceptionNotForRuntimeFlare, _TEXT
@@ -137,7 +137,7 @@ LEAF_ENTRY ExceptionNotForRuntimeFlare, _TEXT
// make sure that the basic block is unique
test rax,5
ret
-LEAF_END ExceptionNotForRuntimeFlare, _TEXT
+LEAF_END ExceptionNotForRuntimeFlare, _TEXT, Unwind
// The Runtime is synchronized.
LEAF_ENTRY NotifyRightSideOfSyncCompleteFlare, _TEXT
@@ -145,4 +145,4 @@ LEAF_ENTRY NotifyRightSideOfSyncCompleteFlare, _TEXT
// make sure that the basic block is unique
test rax,6
ret
-LEAF_END NotifyRightSideOfSyncCompleteFlare, _TEXT
+LEAF_END NotifyRightSideOfSyncCompleteFlare, _TEXT, Unwind
diff --git a/src/pal/inc/unixasmmacros.inc b/src/pal/inc/unixasmmacros.inc
index 22b4f7e..eac29e0 100644
--- a/src/pal/inc/unixasmmacros.inc
+++ b/src/pal/inc/unixasmmacros.inc
@@ -48,7 +48,7 @@ C_FUNC(\Name):
.macro LEAF_ENTRY Name, Section
.global C_FUNC(\Name)
#if defined(__APPLE__)
- .text
+ .section __TEXT,__text,regular,pure_instructions
#else
.type \Name, %function
#endif
@@ -56,17 +56,28 @@ C_FUNC(\Name):
.cfi_startproc
.endm
-.macro LEAF_END_MARKED Name, Section
+.macro LEAF_END_MARKED Name, Section, EmitUnwind
C_FUNC(\Name\()_End):
.global C_FUNC(\Name\()_End)
#if !defined(__APPLE__)
.size \Name, .-\Name
#endif
.cfi_endproc
+#if defined(__APPLE__)
+ .ifnc \EmitUnwind, NoUnwind
+ .section __LD,__compact_unwind,regular,debug
+ .quad C_FUNC(\Name)
+ .set C_FUNC(\Name\()_Size), C_FUNC(\Name\()_End) - C_FUNC(\Name)
+ .long C_FUNC(\Name\()_Size)
+ .long 0x04000000 # DWARF
+ .quad 0
+ .quad 0
+ .endif
+#endif
.endm
-.macro LEAF_END Name, Section
- LEAF_END_MARKED \Name, \Section
+.macro LEAF_END Name, Section, EmitUnwind
+ LEAF_END_MARKED \Name, \Section, \EmitUnwind
.endm
.macro PREPARE_EXTERNAL_VAR Name, HelperReg
@@ -92,8 +103,8 @@ C_FUNC(\Name\()_End):
.endif
.endm
-.macro NESTED_END Name, Section
- LEAF_END \Name, \Section
+.macro NESTED_END Name, Section, EmitUnwind
+ LEAF_END \Name, \Section, \EmitUnwind
.endm
.macro END_PROLOGUE
diff --git a/src/pal/src/arch/i386/context2.S b/src/pal/src/arch/i386/context2.S
index c1aaf73..904f089 100644
--- a/src/pal/src/arch/i386/context2.S
+++ b/src/pal/src/arch/i386/context2.S
@@ -146,12 +146,12 @@ LEAF_ENTRY CONTEXT_CaptureContext, _TEXT
mov [rdi + CONTEXT_Dr7], rdx
4:
ret
-LEAF_END CONTEXT_CaptureContext, _TEXT
+LEAF_END CONTEXT_CaptureContext, _TEXT, Unwind
LEAF_ENTRY RtlCaptureContext, _TEXT
mov DWORD PTR [rdi + CONTEXT_ContextFlags], (CONTEXT_AMD64 | CONTEXT_FULL | CONTEXT_SEGMENTS)
jmp C_FUNC(CONTEXT_CaptureContext)
-LEAF_END RtlCaptureContext, _TEXT
+LEAF_END RtlCaptureContext, _TEXT, Unwind
#else
diff --git a/src/vm/amd64/calldescrworkeramd64.S b/src/vm/amd64/calldescrworkeramd64.S
index efee6f3..3211fb6 100644
--- a/src/vm/amd64/calldescrworkeramd64.S
+++ b/src/vm/amd64/calldescrworkeramd64.S
@@ -37,7 +37,7 @@ NESTED_ENTRY FastCallFinalizeWorker, _TEXT, NoHandler
ret
-NESTED_END FastCallFinalizeWorker, _TEXT
+NESTED_END FastCallFinalizeWorker, _TEXT, Unwind
//extern "C" void CallDescrWorkerInternal(CallDescrData * pCallDescrData);
@@ -129,6 +129,4 @@ LOCAL_LABEL(ReturnsDouble):
movsd real8 ptr [rbx+CallDescrData__returnValue], xmm0
jmp LOCAL_LABEL(Epilog)
-NESTED_END CallDescrWorkerInternal, _TEXT
-
-
+NESTED_END CallDescrWorkerInternal, _TEXT, Unwind
diff --git a/src/vm/amd64/crthelpers.S b/src/vm/amd64/crthelpers.S
index 5183e30..c6d4704 100644
--- a/src/vm/amd64/crthelpers.S
+++ b/src/vm/amd64/crthelpers.S
@@ -26,7 +26,7 @@ LEAF_ENTRY JIT_MemSet, _TEXT
Exit_MemSet:
ret
-LEAF_END_MARKED JIT_MemSet, _TEXT
+LEAF_END_MARKED JIT_MemSet, _TEXT, Unwind
LEAF_ENTRY JIT_MemCpy, _TEXT
test rdx, rdx
@@ -40,4 +40,4 @@ LEAF_ENTRY JIT_MemCpy, _TEXT
Exit_MemCpy:
ret
-LEAF_END_MARKED JIT_MemCpy, _TEXT
+LEAF_END_MARKED JIT_MemCpy, _TEXT, Unwind
diff --git a/src/vm/amd64/externalmethodfixupthunk.S b/src/vm/amd64/externalmethodfixupthunk.S
index ed58f70..2538004 100644
--- a/src/vm/amd64/externalmethodfixupthunk.S
+++ b/src/vm/amd64/externalmethodfixupthunk.S
@@ -26,7 +26,7 @@ NESTED_ENTRY ExternalMethodFixupStub, _TEXT, ProcessCLRException
PATCH_LABEL ExternalMethodFixupPatchLabel
TAILJMP_RAX
-NESTED_END ExternalMethodFixupStub, _TEXT
+NESTED_END ExternalMethodFixupStub, _TEXT, Unwind
//============================================================================================
@@ -44,4 +44,4 @@ NESTED_ENTRY VirtualMethodFixupStub, _TEXT, ProcessCLRException
PATCH_LABEL VirtualMethodFixupPatchLabel
TAILJMP_RAX
-NESTED_END VirtualMethodFixupStub, _TEXT
+NESTED_END VirtualMethodFixupStub, _TEXT, Unwind
diff --git a/src/vm/amd64/getstate.S b/src/vm/amd64/getstate.S
index 25ba115..ec12ff7 100644
--- a/src/vm/amd64/getstate.S
+++ b/src/vm/amd64/getstate.S
@@ -13,7 +13,7 @@ LEAF_ENTRY GetCurrentSP, _TEXT
add rax, 8
ret
-LEAF_END GetCurrentSP, _TEXT
+LEAF_END GetCurrentSP, _TEXT, Unwind
LEAF_ENTRY GetCurrentIP, _TEXT
@@ -21,7 +21,7 @@ LEAF_ENTRY GetCurrentIP, _TEXT
mov rax, [rsp]
ret
-LEAF_END GetCurrentIP, _TEXT
+LEAF_END GetCurrentIP, _TEXT, Unwind
// EXTERN_C void LazyMachStateCaptureState(struct LazyMachState *pState)
@@ -45,4 +45,4 @@ LEAF_ENTRY LazyMachStateCaptureState, _TEXT
ret
-LEAF_END LazyMachStateCaptureState, _TEXT
+LEAF_END LazyMachStateCaptureState, _TEXT, Unwind
diff --git a/src/vm/amd64/jithelpers_fast.S b/src/vm/amd64/jithelpers_fast.S
index a981254..2e71e51 100644
--- a/src/vm/amd64/jithelpers_fast.S
+++ b/src/vm/amd64/jithelpers_fast.S
@@ -9,7 +9,7 @@
// Mark start of the code region that we patch at runtime
LEAF_ENTRY JIT_PatchedCodeStart, _TEXT
ret
-LEAF_END JIT_PatchedCodeStart, _TEXT
+LEAF_END JIT_PatchedCodeStart, _TEXT, NoUnwind
// This is used by the mechanism to hold either the JIT_WriteBarrier_PreGrow
// or JIT_WriteBarrier_PostGrow code (depending on the state of the GC). It _WILL_
@@ -73,12 +73,12 @@ LEAF_ENTRY JIT_WriteBarrier, _TEXT
// make sure this guy is bigger than any of the other guys
.balign 16
nop
-LEAF_END_MARKED JIT_WriteBarrier, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier, _TEXT, NoUnwind
// Mark start of the code region that we patch at runtime
LEAF_ENTRY JIT_PatchedCodeLast, _TEXT
ret
-LEAF_END JIT_PatchedCodeLast, _TEXT
+LEAF_END JIT_PatchedCodeLast, _TEXT, NoUnwind
// There is an even more optimized version of these helpers possible which takes
// advantage of knowledge of which way the ephemeral heap is growing to only do 1/2
@@ -115,7 +115,7 @@ LEAF_ENTRY JIT_CheckedWriteBarrier, _TEXT
// See comment above about possible AV
mov [rdi], rsi
ret
-LEAF_END_MARKED JIT_CheckedWriteBarrier, _TEXT
+LEAF_END_MARKED JIT_CheckedWriteBarrier, _TEXT, NoUnwind
// JIT_ByRefWriteBarrier has weird symantics, see usage in StubLinkerX86.cpp
//
@@ -248,4 +248,4 @@ LEAF_ENTRY JIT_ByRefWriteBarrier, _TEXT
add rsi, 8h
pop rax
ret
-LEAF_END JIT_ByRefWriteBarrier, _TEXT
+LEAF_END JIT_ByRefWriteBarrier, _TEXT, NoUnwind
diff --git a/src/vm/amd64/jithelpers_fastwritebarriers.S b/src/vm/amd64/jithelpers_fastwritebarriers.S
index 1e225b0..0e710d0 100644
--- a/src/vm/amd64/jithelpers_fastwritebarriers.S
+++ b/src/vm/amd64/jithelpers_fastwritebarriers.S
@@ -38,7 +38,7 @@ PATCH_LABEL JIT_WriteBarrier_PreGrow32_PatchLabel_CardTable_Update
.balign 16
Exit_PreGrow32:
REPRET
-LEAF_END_MARKED JIT_WriteBarrier_PreGrow32, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier_PreGrow32, _TEXT, NoUnwind
.balign 8
LEAF_ENTRY JIT_WriteBarrier_PreGrow64, _TEXT
@@ -79,7 +79,7 @@ PATCH_LABEL JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable
.balign 16
Exit_PreGrow64:
REPRET
-LEAF_END_MARKED JIT_WriteBarrier_PreGrow64, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier_PreGrow64, _TEXT, NoUnwind
.balign 8
// See comments for JIT_WriteBarrier_PreGrow (above).
@@ -133,7 +133,7 @@ PATCH_LABEL JIT_WriteBarrier_PostGrow64_Patch_Label_CardTable
.balign 16
Exit_PostGrow64:
REPRET
-LEAF_END_MARKED JIT_WriteBarrier_PostGrow64, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier_PostGrow64, _TEXT, NoUnwind
.balign 4
LEAF_ENTRY JIT_WriteBarrier_PostGrow32, _TEXT
@@ -178,7 +178,7 @@ PATCH_LABEL JIT_WriteBarrier_PostGrow32_PatchLabel_UpdateCardTable
.balign 16
Exit_PostGrow32:
REPRET
-LEAF_END_MARKED JIT_WriteBarrier_PostGrow32, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier_PostGrow32, _TEXT, NoUnwind
.balign 4
@@ -212,7 +212,7 @@ PATCH_LABEL JIT_WriteBarrier_SVR32_PatchLabel_UpdateCardTable
UpdateCardTable_SVR32:
mov byte ptr [rdi + 0F0F0F0F0h], 0FFh
ret
-LEAF_END_MARKED JIT_WriteBarrier_SVR32, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier_SVR32, _TEXT, NoUnwind
.balign 8
LEAF_ENTRY JIT_WriteBarrier_SVR64, _TEXT
@@ -244,4 +244,4 @@ PATCH_LABEL JIT_WriteBarrier_SVR64_PatchLabel_CardTable
UpdateCardTable_SVR64:
mov byte ptr [rdi + rax], 0FFh
ret
-LEAF_END_MARKED JIT_WriteBarrier_SVR64, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier_SVR64, _TEXT, NoUnwind
diff --git a/src/vm/amd64/jithelpers_slow.S b/src/vm/amd64/jithelpers_slow.S
index 0cd5768..b9d9a44 100644
--- a/src/vm/amd64/jithelpers_slow.S
+++ b/src/vm/amd64/jithelpers_slow.S
@@ -95,6 +95,6 @@ LEAF_ENTRY JIT_WriteBarrier_Debug, _TEXT
.balign 16
Exit_Debug:
REPRET
-LEAF_END_MARKED JIT_WriteBarrier_Debug, _TEXT
+LEAF_END_MARKED JIT_WriteBarrier_Debug, _TEXT, NoUnwind
#endif
diff --git a/src/vm/amd64/theprestubamd64.S b/src/vm/amd64/theprestubamd64.S
index dd9a042..6082167 100644
--- a/src/vm/amd64/theprestubamd64.S
+++ b/src/vm/amd64/theprestubamd64.S
@@ -20,12 +20,12 @@ NESTED_ENTRY ThePreStub, _TEXT, ProcessCLRException
EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
TAILJMP_RAX
-NESTED_END ThePreStub, _TEXT
+NESTED_END ThePreStub, _TEXT, Unwind
LEAF_ENTRY ThePreStubPatch, _TEXT
// make sure that the basic block is unique
test eax,34
PATCH_LABEL ThePreStubPatchLabel
ret
-LEAF_END ThePreStubPatch, _TEXT
+LEAF_END ThePreStubPatch, _TEXT, Unwind
diff --git a/src/vm/amd64/umthunkstub.S b/src/vm/amd64/umthunkstub.S
index 724cef7..e6d9281 100644
--- a/src/vm/amd64/umthunkstub.S
+++ b/src/vm/amd64/umthunkstub.S
@@ -28,7 +28,7 @@ NESTED_ENTRY TheUMEntryPrestub, _TEXT, UMEntryPrestubUnwindFrameChainHandler
POP_ARGUMENT_REGISTERS
TAILJMP_RAX
-NESTED_END TheUMEntryPrestub, _TEXT
+NESTED_END TheUMEntryPrestub, _TEXT , Unwind
//
// METHODDESC_REGISTER: UMEntryThunk*
@@ -189,7 +189,7 @@ LOCAL_LABEL(WrongAppDomain):
int3
#endif
-NESTED_END UMThunkStub, _TEXT
+NESTED_END UMThunkStub, _TEXT, Unwind
//
// EXTERN_C void __stdcall UM2MThunk_WrapperHelper(
@@ -201,4 +201,4 @@ NESTED_END UMThunkStub, _TEXT
//
NESTED_ENTRY UM2MThunk_WrapperHelper, _TEXT, NoHandler
int3
-NESTED_END UM2MThunk_WrapperHelper, _TEXT
+NESTED_END UM2MThunk_WrapperHelper, _TEXT, Unwind
diff --git a/src/vm/amd64/unixasmhelpers.S b/src/vm/amd64/unixasmhelpers.S
index fb96845..ced3a09 100644
--- a/src/vm/amd64/unixasmhelpers.S
+++ b/src/vm/amd64/unixasmhelpers.S
@@ -29,7 +29,7 @@ LEAF_ENTRY PrecodeFixupThunk, _TEXT
// Tail call to prestub
jmp C_FUNC(ThePreStub)
-LEAF_END PrecodeFixupThunk, _TEXT
+LEAF_END PrecodeFixupThunk, _TEXT, Unwind
// EXTERN_C int __fastcall HelperMethodFrameRestoreState(
// INDEBUG_COMMA(HelperMethodFrame *pFrame)
@@ -82,7 +82,7 @@ DoRestore:
xor eax, eax
ret
-LEAF_END HelperMethodFrameRestoreState, _TEXT
+LEAF_END HelperMethodFrameRestoreState, _TEXT, Unwind
//////////////////////////////////////////////////////////////////////////
//
@@ -132,7 +132,7 @@ NESTED_ENTRY NDirectImportThunk, _TEXT, NoHandler
POP_ARGUMENT_REGISTERS
TAILJMP_RAX
-NESTED_END NDirectImportThunk, _TEXT
+NESTED_END NDirectImportThunk, _TEXT, Unwind
// EXTERN_C void moveOWord(LPVOID* src, LPVOID* target);
// <NOTE>
@@ -143,7 +143,7 @@ LEAF_ENTRY moveOWord, _TEXT
movdqu [rsi], xmm0
ret
-LEAF_END moveOWord, _TEXT
+LEAF_END moveOWord, _TEXT, Unwind
//------------------------------------------------
// JIT_RareDisableHelper
@@ -172,7 +172,7 @@ NESTED_ENTRY JIT_RareDisableHelper, _TEXT, NoHandler
pop_register rax
ret
-NESTED_END JIT_RareDisableHelper, _TEXT
+NESTED_END JIT_RareDisableHelper, _TEXT, Unwind
LEAF_ENTRY SinglecastDelegateInvokeStub, _TEXT
@@ -189,7 +189,7 @@ NullObject:
mov rdi, CORINFO_NullReferenceException_ASM
jmp C_FUNC(JIT_InternalThrow)
-LEAF_END SinglecastDelegateInvokeStub, _TEXT
+LEAF_END SinglecastDelegateInvokeStub, _TEXT, Unwind
//////////////////////////////////////////////////////////////////////////
//
@@ -227,5 +227,5 @@ LEAF_ENTRY StartUnwindingNativeFrames, _TEXT
push_register rax
push_nonvol_reg rbp
call EXTERNAL_C_FUNC(__cxa_rethrow)
-LEAF_END StartUnwindingNativeFrames, _TEXT
+LEAF_END StartUnwindingNativeFrames, _TEXT, Unwind
diff --git a/src/vm/amd64/virtualcallstubamd64.S b/src/vm/amd64/virtualcallstubamd64.S
index 043d12b..b79d3cc 100644
--- a/src/vm/amd64/virtualcallstubamd64.S
+++ b/src/vm/amd64/virtualcallstubamd64.S
@@ -41,7 +41,7 @@ NESTED_ENTRY ResolveWorkerAsmStub, _TEXT, NoHandler
EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
TAILJMP_RAX
-NESTED_END ResolveWorkerAsmStub, _TEXT
+NESTED_END ResolveWorkerAsmStub, _TEXT, Unwind
// extern void ResolveWorkerChainLookupAsmStub()
LEAF_ENTRY ResolveWorkerChainLookupAsmStub, _TEXT
@@ -87,7 +87,7 @@ Fail_RWCLAS:
jmp C_FUNC(ResolveWorkerAsmStub)
-LEAF_END ResolveWorkerChainLookupAsmStub, _TEXT
+LEAF_END ResolveWorkerChainLookupAsmStub, _TEXT, Unwind
#ifdef FEATURE_PREJIT
NESTED_ENTRY StubDispatchFixupStub, _TEXT, ProcessCLRException
@@ -106,5 +106,5 @@ NESTED_ENTRY StubDispatchFixupStub, _TEXT, ProcessCLRException
PATCH_LABEL StubDispatchFixupPatchLabel
TAILJMP_RAX
-NESTED_END StubDispatchFixupStub, _TEXT
+NESTED_END StubDispatchFixupStub, _TEXT, Unwind
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment