From 071e1490b1614c5c537fabb4982c292cf981103c Mon Sep 17 00:00:00 2001 From: Jonghyun Park Date: Fri, 9 Dec 2016 10:03:07 +0900 Subject: [PATCH] [x86/Linux] Revise asmhelper.S using macro (dotnet/coreclr#8523) * [x86/Linux] Revise asmhelper.S using macro This commit revises asmhelper.S using macros that inserts CFI directives. Commit migrated from https://github.com/dotnet/coreclr/commit/eae81ba831eb020d84194f46a41b3a685820b2d4 --- src/coreclr/src/pal/inc/unixasmmacrosx86.inc | 30 ++++++++++++++ src/coreclr/src/vm/i386/asmhelpers.S | 60 ++++++++++++++++++---------- 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/src/coreclr/src/pal/inc/unixasmmacrosx86.inc b/src/coreclr/src/pal/inc/unixasmmacrosx86.inc index 2cff7d1..d7d5304 100644 --- a/src/coreclr/src/pal/inc/unixasmmacrosx86.inc +++ b/src/coreclr/src/pal/inc/unixasmmacrosx86.inc @@ -35,3 +35,33 @@ C_FUNC(\Name\()_End): .global C_FUNC(\Name\()_End) LEAF_END \Name, \Section .endm + +.macro PROLOG_BEG + push ebp + .cfi_def_cfa_offset 8 + .cfi_offset ebp, -8 + mov ebp, esp +.endm + +.macro PROLOG_PUSH Reg + push \Reg + .cfi_adjust_cfa_offset 4 + .cfi_rel_offset \Reg, 0 +.endm + +.macro PROLOG_END + .cfi_def_cfa_register ebp + .cfi_def_cfa_offset 8 +.endm + +.macro EPILOG_BEG +.endm + +.macro EPILOG_POP Reg + pop \Reg + .cfi_restore \Reg +.endm + +.macro EPILOG_END + pop ebp +.endm diff --git a/src/coreclr/src/vm/i386/asmhelpers.S b/src/coreclr/src/vm/i386/asmhelpers.S index 3ca95b6..4b08698 100644 --- a/src/coreclr/src/vm/i386/asmhelpers.S +++ b/src/coreclr/src/vm/i386/asmhelpers.S @@ -11,32 +11,39 @@ // .macro STUB_PROLOG // push ebp-frame - push ebp - mov ebp, esp + PROLOG_BEG // save CalleeSavedRegisters - push ebx - push esi - push edi + PROLOG_PUSH ebx + PROLOG_PUSH esi + PROLOG_PUSH edi // push ArgumentRegisters - push ecx - push edx + PROLOG_PUSH ecx + PROLOG_PUSH edx + + // set frame pointer + PROLOG_END .endm // // FramedMethodFrame epilog // .macro STUB_EPILOG + // restore stack pointer + EPILOG_BEG + // pop ArgumentRegisters - pop edx - pop ecx + EPILOG_POP edx + EPILOG_POP ecx // pop CalleeSavedRegisters - pop edi - pop esi - pop ebx - pop ebp + EPILOG_POP edi + EPILOG_POP esi + EPILOG_POP ebx + + // pop ebp-frame + EPILOG_END .endm // @@ -392,8 +399,11 @@ LEAF_END ArrayOpStubTypeMismatchException, _TEXT // ------------------------------------------------------------------------------ // void STDCALL CallDescrWorkerInternal(CallDescrWorkerParams * pParams) NESTED_ENTRY CallDescrWorkerInternal, _TEXT, NoHandler + PROLOG_BEG + PROLOG_PUSH ebx + PROLOG_END - mov ebx, [esp + 4] // pParams = esp + 4 + mov ebx, [esp + ((2 + 1) * 4)] // copy the stack mov ecx, [ebx +CallDescrData__numStackSlots] @@ -445,6 +455,9 @@ LOCAL_LABEL(ReturnsInt): mov [ebx + CallDescrData__returnValue + 4], edx LOCAL_LABEL(Epilog): + EPILOG_BEG + EPILOG_POP ebx + EPILOG_END ret 4 LOCAL_LABEL(ReturnsFloat): @@ -944,23 +957,28 @@ NESTED_ENTRY VirtualMethodFixupStub, _TEXT, NoHandler sub eax, 5 // Push ebp frame to get good callstack under debugger - push ebp - mov ebp, esp + PROLOG_BEG // Preserve argument registers - push ecx - push edx + PROLOG_PUSH ecx + PROLOG_PUSH edx + + // Set frame pointer + PROLOG_END push eax // address of the thunk push ecx // this ptr call C_FUNC(VirtualMethodFixupWorker) + // Restore stack pointer + EPILOG_BEG + // Restore argument registers - pop edx - pop ecx + EPILOG_POP edx + EPILOG_POP ecx // Pop ebp frame - pop ebp + EPILOG_END PATCH_LABEL VirtualMethodFixupPatchLabel // Proceed to execute the actual method. -- 2.7.4