Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions src/coreclr/debug/daccess/dacdbiimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -730,10 +730,6 @@ class DacDbiInterfaceImpl :
// DacDbi API: Get the context for a particular thread of the target process
HRESULT STDMETHODCALLTYPE GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContextBuffer);

// This is a simple helper function to convert a CONTEXT to a DebuggerREGDISPLAY. We need to do this
// inside DDI because the RS has no notion of REGDISPLAY.
HRESULT STDMETHODCALLTYPE ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive);

// Check if the given method is a DiagnosticHidden or an LCG method.
HRESULT STDMETHODCALLTYPE IsDiagnosticsHiddenOrLCGMethod(VMPTR_MethodDesc vmMethodDesc, OUT DynamicMethodType * pRetVal);

Expand Down
27 changes: 0 additions & 27 deletions src/coreclr/debug/daccess/dacdbiimplstackwalk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -727,30 +727,6 @@ HRESULT STDMETHODCALLTYPE DacDbiInterfaceImpl::IsLeafFrame(VMPTR_Thread vmThread
return hr;
}

// This is a simple helper function to convert a CONTEXT to a DebuggerREGDISPLAY. We need to do this
// inside DDI because the RS has no notion of REGDISPLAY.
HRESULT STDMETHODCALLTYPE DacDbiInterfaceImpl::ConvertContextToDebuggerRegDisplay(const DT_CONTEXT * pInContext, DebuggerREGDISPLAY * pOutDRD, BOOL fActive)
{
DD_ENTER_MAY_THROW;

HRESULT hr = S_OK;
EX_TRY
{

// This is a bit cumbersome. First we need to convert the CONTEXT into a REGDISPLAY. Then we need
// to convert the REGDISPLAY to a DebuggerREGDISPLAY.
T_CONTEXT tmpContext = { };
CopyMemory(&tmpContext, pInContext, sizeof(*pInContext));

REGDISPLAY rd;
FillRegDisplay(&rd, &tmpContext);

SetDebuggerREGDISPLAYFromREGDISPLAY(pOutDRD, &rd);
}
EX_CATCH_HRESULT(hr);
return hr;
}

//---------------------------------------------------------------------------------------
//
// Fill in the structure with information about the current frame at which the stackwalker is stopped.
Expand Down Expand Up @@ -809,9 +785,6 @@ void DacDbiInterfaceImpl::InitFrameData(StackFrameIterator * pIter,

pFrameData->eType = Debugger_STRData::cMethodFrame;

_ASSERTE(pFrameData->rd != NULL);
SetDebuggerREGDISPLAYFromREGDISPLAY(pFrameData->rd, pCF->GetRegisterSet());

_ASSERTE(pFrameData->ctx != NULL);
GetStackWalkCurrentContext(pIter, pFrameData->ctx);

Expand Down
70 changes: 17 additions & 53 deletions src/coreclr/debug/di/amd64/cordbregisterset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,39 +133,39 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG64 mask, ULONG32 regCount,
switch( i )
{
case REGISTER_INSTRUCTION_POINTER:
regBuffer[iRegister++] = m_rd->PC; break;
regBuffer[iRegister++] = m_context.Rip; break;
case REGISTER_STACK_POINTER:
regBuffer[iRegister++] = m_rd->SP; break;
regBuffer[iRegister++] = m_context.Rsp; break;
case REGISTER_AMD64_RBP:
regBuffer[iRegister++] = m_rd->Rbp; break;
regBuffer[iRegister++] = m_context.Rbp; break;
case REGISTER_AMD64_RAX:
regBuffer[iRegister++] = m_rd->Rax; break;
regBuffer[iRegister++] = m_context.Rax; break;
case REGISTER_AMD64_RBX:
regBuffer[iRegister++] = m_rd->Rbx; break;
regBuffer[iRegister++] = m_context.Rbx; break;
case REGISTER_AMD64_RCX:
regBuffer[iRegister++] = m_rd->Rcx; break;
regBuffer[iRegister++] = m_context.Rcx; break;
case REGISTER_AMD64_RDX:
regBuffer[iRegister++] = m_rd->Rdx; break;
regBuffer[iRegister++] = m_context.Rdx; break;
case REGISTER_AMD64_RSI:
regBuffer[iRegister++] = m_rd->Rsi; break;
regBuffer[iRegister++] = m_context.Rsi; break;
case REGISTER_AMD64_RDI:
regBuffer[iRegister++] = m_rd->Rdi; break;
regBuffer[iRegister++] = m_context.Rdi; break;
case REGISTER_AMD64_R8:
regBuffer[iRegister++] = m_rd->R8; break;
regBuffer[iRegister++] = m_context.R8; break;
case REGISTER_AMD64_R9:
regBuffer[iRegister++] = m_rd->R9; break;
regBuffer[iRegister++] = m_context.R9; break;
case REGISTER_AMD64_R10:
regBuffer[iRegister++] = m_rd->R10; break;
regBuffer[iRegister++] = m_context.R10; break;
case REGISTER_AMD64_R11:
regBuffer[iRegister++] = m_rd->R11; break;
regBuffer[iRegister++] = m_context.R11; break;
case REGISTER_AMD64_R12:
regBuffer[iRegister++] = m_rd->R12; break;
regBuffer[iRegister++] = m_context.R12; break;
case REGISTER_AMD64_R13:
regBuffer[iRegister++] = m_rd->R13; break;
regBuffer[iRegister++] = m_context.R13; break;
case REGISTER_AMD64_R14:
regBuffer[iRegister++] = m_rd->R14; break;
regBuffer[iRegister++] = m_context.R14; break;
case REGISTER_AMD64_R15:
regBuffer[iRegister++] = m_rd->R15; break;
regBuffer[iRegister++] = m_context.R15; break;

case REGISTER_AMD64_XMM0:
case REGISTER_AMD64_XMM1:
Expand Down Expand Up @@ -215,39 +215,3 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG32 maskCount, BYTE mask[],
// Defer to adapter for v1.0 interface
return GetRegistersAdapter(maskCount, mask, regCount, regBuffer);
}


// This is just a convenience function to convert a regdisplay into a Context.
// Since a context has more info than a regdisplay, the conversion isn't perfect
// and the context can't be fully accurate.
void CordbRegisterSet::InternalCopyRDToContext(DT_CONTEXT *pInputContext)
{
INTERNAL_SYNC_API_ENTRY(GetProcess());
_ASSERTE(pInputContext);

if((pInputContext->ContextFlags & DT_CONTEXT_INTEGER)==DT_CONTEXT_INTEGER)
{
pInputContext->Rax = m_rd->Rax;
pInputContext->Rbx = m_rd->Rbx;
pInputContext->Rcx = m_rd->Rcx;
pInputContext->Rdx = m_rd->Rdx;
pInputContext->Rbp = m_rd->Rbp;
pInputContext->Rsi = m_rd->Rsi;
pInputContext->Rdi = m_rd->Rdi;
pInputContext->R8 = m_rd->R8;
pInputContext->R9 = m_rd->R9;
pInputContext->R10 = m_rd->R10;
pInputContext->R11 = m_rd->R11;
pInputContext->R12 = m_rd->R12;
pInputContext->R13 = m_rd->R13;
pInputContext->R14 = m_rd->R14;
pInputContext->R15 = m_rd->R15;
}


if((pInputContext->ContextFlags & DT_CONTEXT_CONTROL)==DT_CONTEXT_CONTROL)
{
pInputContext->Rip = m_rd->PC;
pInputContext->Rsp = m_rd->SP;
}
}
64 changes: 16 additions & 48 deletions src/coreclr/debug/di/arm/cordbregisterset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,37 +54,37 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG64 mask, ULONG32 regCount, CORDB_REG
switch (i)
{
case REGISTER_INSTRUCTION_POINTER:
regBuffer[iRegister++] = m_rd->PC; break;
regBuffer[iRegister++] = m_context.Pc; break;
case REGISTER_STACK_POINTER:
regBuffer[iRegister++] = m_rd->SP; break;
regBuffer[iRegister++] = m_context.Sp; break;
case REGISTER_ARM_R0:
regBuffer[iRegister++] = m_rd->R0; break;
regBuffer[iRegister++] = m_context.R0; break;
case REGISTER_ARM_R1:
regBuffer[iRegister++] = m_rd->R1; break;
regBuffer[iRegister++] = m_context.R1; break;
case REGISTER_ARM_R2:
regBuffer[iRegister++] = m_rd->R2; break;
regBuffer[iRegister++] = m_context.R2; break;
case REGISTER_ARM_R3:
regBuffer[iRegister++] = m_rd->R3; break;
regBuffer[iRegister++] = m_context.R3; break;
case REGISTER_ARM_R4:
regBuffer[iRegister++] = m_rd->R4; break;
regBuffer[iRegister++] = m_context.R4; break;
case REGISTER_ARM_R5:
regBuffer[iRegister++] = m_rd->R5; break;
regBuffer[iRegister++] = m_context.R5; break;
case REGISTER_ARM_R6:
regBuffer[iRegister++] = m_rd->R6; break;
regBuffer[iRegister++] = m_context.R6; break;
case REGISTER_ARM_R7:
regBuffer[iRegister++] = m_rd->R7; break;
regBuffer[iRegister++] = m_context.R7; break;
case REGISTER_ARM_R8:
regBuffer[iRegister++] = m_rd->R8; break;
regBuffer[iRegister++] = m_context.R8; break;
case REGISTER_ARM_R9:
regBuffer[iRegister++] = m_rd->R9; break;
regBuffer[iRegister++] = m_context.R9; break;
case REGISTER_ARM_R10:
regBuffer[iRegister++] = m_rd->R10; break;
regBuffer[iRegister++] = m_context.R10; break;
case REGISTER_ARM_R11:
regBuffer[iRegister++] = m_rd->R11; break;
regBuffer[iRegister++] = m_context.R11; break;
case REGISTER_ARM_R12:
regBuffer[iRegister++] = m_rd->R12; break;
regBuffer[iRegister++] = m_context.R12; break;
case REGISTER_ARM_LR:
regBuffer[iRegister++] = m_rd->LR; break;
regBuffer[iRegister++] = m_context.Lr; break;
}
}
}
Expand Down Expand Up @@ -115,35 +115,3 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG32 maskCount, BYTE mask[],
// Defer to adapter for v1.0 interface
return GetRegistersAdapter(maskCount, mask, regCount, regBuffer);
}

// This is just a convenience function to convert a regdisplay into a Context.
// Since a context has more info than a regdisplay, the conversion isn't perfect
// and the context can't be fully accurate.
void CordbRegisterSet::InternalCopyRDToContext(DT_CONTEXT * pInputContext)
{
INTERNAL_SYNC_API_ENTRY(GetProcess());
_ASSERTE(pInputContext);

if ((pInputContext->ContextFlags & DT_CONTEXT_INTEGER) == DT_CONTEXT_INTEGER)
{
pInputContext->R0 = m_rd->R0;
pInputContext->R1 = m_rd->R1;
pInputContext->R2 = m_rd->R2;
pInputContext->R3 = m_rd->R3;
pInputContext->R4 = m_rd->R4;
pInputContext->R5 = m_rd->R5;
pInputContext->R6 = m_rd->R6;
pInputContext->R7 = m_rd->R7;
pInputContext->R8 = m_rd->R8;
pInputContext->R9 = m_rd->R9;
pInputContext->R10 = m_rd->R10;
pInputContext->R11 = m_rd->R11;
}

if ((pInputContext->ContextFlags & DT_CONTEXT_CONTROL) == DT_CONTEXT_CONTROL)
{
pInputContext->Sp = m_rd->SP;
pInputContext->Lr = m_rd->LR;
pInputContext->Pc = m_rd->PC;
}
}
45 changes: 10 additions & 35 deletions src/coreclr/debug/di/arm64/cordbregisterset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG64 mask, ULONG32 regCount,

if ((i >= REGISTER_ARM64_X0) && (i <= REGISTER_ARM64_X28))
{
regBuffer[iRegister++] = m_rd->X[i - REGISTER_ARM64_X0];
regBuffer[iRegister++] = m_context.X[i - REGISTER_ARM64_X0];
continue;
}

Expand Down Expand Up @@ -133,13 +133,13 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG64 mask, ULONG32 regCount,
switch (i)
{
case REGISTER_ARM64_PC:
regBuffer[iRegister++] = m_rd->PC; break;
regBuffer[iRegister++] = m_context.Pc; break;
case REGISTER_ARM64_SP:
regBuffer[iRegister++] = m_rd->SP; break;
regBuffer[iRegister++] = m_context.Sp; break;
case REGISTER_ARM64_FP:
regBuffer[iRegister++] = m_rd->FP; break;
regBuffer[iRegister++] = m_context.Fp; break;
case REGISTER_ARM64_LR:
regBuffer[iRegister++] = m_rd->LR; break;
regBuffer[iRegister++] = m_context.Lr; break;
default:
_ASSERTE(false); break;
}
Expand Down Expand Up @@ -193,7 +193,7 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG32 maskCount, BYTE mask[],

if ((i >= REGISTER_ARM64_X0) && (i <= REGISTER_ARM64_X28))
{
regBuffer[iRegister++] = m_rd->X[i - REGISTER_ARM64_X0];
regBuffer[iRegister++] = m_context.X[i - REGISTER_ARM64_X0];
continue;
}

Expand Down Expand Up @@ -223,13 +223,13 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG32 maskCount, BYTE mask[],
switch (i)
{
case REGISTER_ARM64_PC:
regBuffer[iRegister++] = m_rd->PC; break;
regBuffer[iRegister++] = m_context.Pc; break;
case REGISTER_ARM64_SP:
regBuffer[iRegister++] = m_rd->SP; break;
regBuffer[iRegister++] = m_context.Sp; break;
case REGISTER_ARM64_FP:
regBuffer[iRegister++] = m_rd->FP; break;
regBuffer[iRegister++] = m_context.Fp; break;
case REGISTER_ARM64_LR:
regBuffer[iRegister++] = m_rd->LR; break;
regBuffer[iRegister++] = m_context.Lr; break;
default:
_ASSERTE(false); break;
}
Expand All @@ -239,28 +239,3 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG32 maskCount, BYTE mask[],

return S_OK;
}


// This is just a convenience function to convert a regdisplay into a Context.
// Since a context has more info than a regdisplay, the conversion isn't perfect
// and the context can't be fully accurate.
void CordbRegisterSet::InternalCopyRDToContext(DT_CONTEXT *pInputContext)
{ INTERNAL_SYNC_API_ENTRY(GetProcess());
_ASSERTE(pInputContext);

if ((pInputContext->ContextFlags & DT_CONTEXT_INTEGER) == DT_CONTEXT_INTEGER)
{
for (int i = 0 ; i < 29 ; ++i)
{
pInputContext->X[i] = m_rd->X[i];
}
}

if ((pInputContext->ContextFlags & DT_CONTEXT_CONTROL) == DT_CONTEXT_CONTROL)
{
pInputContext->Sp = m_rd->SP;
pInputContext->Lr = m_rd->LR;
pInputContext->Pc = m_rd->PC;
pInputContext->Fp = m_rd->FP;
}
}
48 changes: 9 additions & 39 deletions src/coreclr/debug/di/i386/cordbregisterset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,23 +104,23 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG64 mask, ULONG32 regCount,
switch( i )
{
case REGISTER_INSTRUCTION_POINTER:
regBuffer[iRegister++] = m_rd->PC; break;
regBuffer[iRegister++] = m_context.Eip; break;
case REGISTER_STACK_POINTER:
regBuffer[iRegister++] = m_rd->SP; break;
regBuffer[iRegister++] = m_context.Esp; break;
case REGISTER_FRAME_POINTER:
regBuffer[iRegister++] = m_rd->FP; break;
regBuffer[iRegister++] = m_context.Ebp; break;
case REGISTER_X86_EAX:
regBuffer[iRegister++] = m_rd->Eax; break;
regBuffer[iRegister++] = m_context.Eax; break;
case REGISTER_X86_EBX:
regBuffer[iRegister++] = m_rd->Ebx; break;
regBuffer[iRegister++] = m_context.Ebx; break;
case REGISTER_X86_ECX:
regBuffer[iRegister++] = m_rd->Ecx; break;
regBuffer[iRegister++] = m_context.Ecx; break;
case REGISTER_X86_EDX:
regBuffer[iRegister++] = m_rd->Edx; break;
regBuffer[iRegister++] = m_context.Edx; break;
case REGISTER_X86_ESI:
regBuffer[iRegister++] = m_rd->Esi; break;
regBuffer[iRegister++] = m_context.Esi; break;
case REGISTER_X86_EDI:
regBuffer[iRegister++] = m_rd->Edi; break;
regBuffer[iRegister++] = m_context.Edi; break;

//for floats, copy the bits, not the integer part of
//the value, into the register
Expand Down Expand Up @@ -189,33 +189,3 @@ HRESULT CordbRegisterSet::GetRegisters(ULONG32 maskCount, BYTE mask[],
// Defer to adapter for v1.0 interface
return GetRegistersAdapter(maskCount, mask, regCount, regBuffer);
}


// This is just a convenience function to convert a regdisplay into a Context.
// Since a context has more info than a regdisplay, the conversion isn't perfect
// and the context can't be fully accurate.
void CordbRegisterSet::InternalCopyRDToContext(DT_CONTEXT * pInputContext)
{
INTERNAL_SYNC_API_ENTRY(GetProcess());
_ASSERTE(pInputContext);

//now update the registers based on the current frame
if((pInputContext->ContextFlags & DT_CONTEXT_INTEGER)==DT_CONTEXT_INTEGER)
{
pInputContext->Eax = m_rd->Eax;
pInputContext->Ebx = m_rd->Ebx;
pInputContext->Ecx = m_rd->Ecx;
pInputContext->Edx = m_rd->Edx;
pInputContext->Esi = m_rd->Esi;
pInputContext->Edi = m_rd->Edi;
}


if((pInputContext->ContextFlags & DT_CONTEXT_CONTROL)==DT_CONTEXT_CONTROL)
{
pInputContext->Eip = m_rd->PC;
pInputContext->Esp = m_rd->SP;
pInputContext->Ebp = m_rd->FP;
}
}

Loading
Loading