Skip to content

Commit

Permalink
[x86/Linux] Revise asmhelper.S using macro (dotnet/coreclr#8523)
Browse files Browse the repository at this point in the history
* [x86/Linux] Revise asmhelper.S using macro

This commit revises asmhelper.S using macros that inserts CFI
directives.

Commit migrated from dotnet/coreclr@eae81ba
  • Loading branch information
parjong authored and jkotas committed Dec 9, 2016
1 parent b5399c0 commit 071e149
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 21 deletions.
30 changes: 30 additions & 0 deletions src/coreclr/src/pal/inc/unixasmmacrosx86.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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
60 changes: 39 additions & 21 deletions src/coreclr/src/vm/i386/asmhelpers.S
Original file line number Diff line number Diff line change
Expand Up @@ -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

//
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 071e149

Please sign in to comment.