diff options
author | Jonghyun Park <parjong@gmail.com> | 2017-02-02 18:41:46 +0900 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2017-02-02 10:41:46 +0100 |
commit | 009c70f81d2899848ea254fd39969de91fd33519 (patch) | |
tree | cf727ddb11225065815d12c30fae91362b0a9c9f /src/unwinder | |
parent | ef36ea764e445c2c0665784749d1fd48ecd657c8 (diff) | |
download | coreclr-009c70f81d2899848ea254fd39969de91fd33519.tar.gz coreclr-009c70f81d2899848ea254fd39969de91fd33519.tar.bz2 coreclr-009c70f81d2899848ea254fd39969de91fd33519.zip |
[x86/Linux] Do NOT use pXXX fields (#9121)
* [x86/Linux] Do NOT use pXXX fields
* Fix x86/Windows build error
* Fix another x86/Windows build error
* Fix typo
* Do NOT trash EBP
* Reflect the original semantics of EHContext::UpdateFrame
* Unify ReadXXX/LocateXXX into GetXXXLocation, and RestoreXXX/TrashXXX into SetXXXLocation
* Revert the order of pXXX fields
* Revise cgenx86.cpp
* Revert unnecessary changes
* Remove direct accesses to CALLEE_SAVED_REGISTERS_TAG
* Do NOT update pCurrentContext inside SetXXXLocation
* Update RegPtr via offset
* Unify REG_METHODS (and revise UpdateRegDisplay methods accordingly)
* Revise per feedback
* Fix x86/Windows build error
Diffstat (limited to 'src/unwinder')
-rw-r--r-- | src/unwinder/i386/unwinder_i386.cpp | 40 |
1 files changed, 12 insertions, 28 deletions
diff --git a/src/unwinder/i386/unwinder_i386.cpp b/src/unwinder/i386/unwinder_i386.cpp index f4490ace7e..b506c61c4c 100644 --- a/src/unwinder/i386/unwinder_i386.cpp +++ b/src/unwinder/i386/unwinder_i386.cpp @@ -75,26 +75,14 @@ OOPStackUnwinderX86::VirtualUnwind( REGDISPLAY rd; - if (ContextPointers != NULL) - { -#define CALLEE_SAVED_REGISTER(reg) rd.p##reg = ContextPointers->reg; - ENUM_CALLEE_SAVED_REGISTERS(); -#undef CALLEE_SAVED_REGISTER - } - else - { -#define CALLEE_SAVED_REGISTER(reg) rd.p##reg = NULL; - ENUM_CALLEE_SAVED_REGISTERS(); -#undef CALLEE_SAVED_REGISTER - } + FillRegDisplay(&rd, ContextRecord); + + rd.PCTAddr = (UINT_PTR)&(ContextRecord->Eip); - if (rd.pEbp == NULL) + if (ContextPointers) { - rd.pEbp = &(ContextRecord->Ebp); + rd.pCurrentContextPointers = ContextPointers; } - rd.SP = ContextRecord->Esp; - rd.ControlPC = (PCODE)(ContextRecord->Eip); - rd.PCTAddr = (UINT_PTR)&(ContextRecord->Eip); CodeManState codeManState; codeManState.dwIsSet = 0; @@ -107,22 +95,18 @@ OOPStackUnwinderX86::VirtualUnwind( return HRESULT_FROM_WIN32(ERROR_READ_FAULT); } -#define CALLEE_SAVED_REGISTER(reg) if (rd.p##reg != NULL) { ContextRecord->reg = *rd.p##reg; } + ContextRecord->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; + +#define ARGUMENT_AND_SCRATCH_REGISTER(reg) if (rd.pCurrentContextPointers->reg) ContextRecord->reg = *rd.pCurrentContextPointers->reg; + ENUM_ARGUMENT_AND_SCRATCH_REGISTERS(); +#undef ARGUMENT_AND_SCRATCH_REGISTER + +#define CALLEE_SAVED_REGISTER(reg) if (rd.pCurrentContextPointers->reg) ContextRecord->reg = *rd.pCurrentContextPointers->reg; ENUM_CALLEE_SAVED_REGISTERS(); #undef CALLEE_SAVED_REGISTER - - if (ContextPointers != NULL) - { -#define CALLEE_SAVED_REGISTER(reg) if (rd.p##reg != &(ContextRecord->reg)) { ContextPointers->reg = rd.p##reg; } - ENUM_CALLEE_SAVED_REGISTERS(); -#undef CALLEE_SAVED_REGISTER - } - - ContextRecord->ContextFlags |= CONTEXT_UNWOUND_TO_CALL; ContextRecord->Esp = rd.SP; ContextRecord->Eip = rd.ControlPC; - ContextRecord->Ebp = *rd.pEbp; return S_OK; } |