summaryrefslogtreecommitdiff
path: root/src/unwinder
diff options
context:
space:
mode:
authorJonghyun Park <parjong@gmail.com>2017-02-02 18:41:46 +0900
committerJan Vorlicek <janvorli@microsoft.com>2017-02-02 10:41:46 +0100
commit009c70f81d2899848ea254fd39969de91fd33519 (patch)
treecf727ddb11225065815d12c30fae91362b0a9c9f /src/unwinder
parentef36ea764e445c2c0665784749d1fd48ecd657c8 (diff)
downloadcoreclr-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.cpp40
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;
}