diff options
author | David Mason <davmason@microsoft.com> | 2021-06-08 12:55:52 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-08 12:55:52 +0300 |
commit | 86719086d9fa65e004763b85a8bb560ec505ec2b (patch) | |
tree | 33faf6ae865cd911781f0f353dad2d98a2991ab3 /src/coreclr/vm | |
parent | d52f925042937397bef2db312d11ae0c2ed76c7f (diff) |
add support for unwinding function fragments in the dac (#53765)
Diffstat (limited to 'src/coreclr/vm')
-rw-r--r-- | src/coreclr/vm/codeman.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/coreclr/vm/codeman.cpp b/src/coreclr/vm/codeman.cpp index 592ff2e1c38..06b942e8337 100644 --- a/src/coreclr/vm/codeman.cpp +++ b/src/coreclr/vm/codeman.cpp @@ -4078,6 +4078,23 @@ void GetUnmanagedStackWalkInfo(IN ULONG64 ControlPc, else { _ASSERTE(pFuncEntry); +#ifdef _TARGET_AMD64_ + // On amd64, match RtlLookupFunctionEntry behavior by resolving indirect function entries + // back to the associated owning function entry. + if ((functionEntry.UnwindData & RUNTIME_FUNCTION_INDIRECT) != 0) + { + DWORD dwRvaOfOwningFunctionEntry = (functionEntry.UnwindData & ~RUNTIME_FUNCTION_INDIRECT); + taFuncEntry = peDecoder.GetRvaData(dwRvaOfOwningFunctionEntry); + hr = DacReadAll(taFuncEntry, &functionEntry, sizeof(functionEntry), false); + if (FAILED(hr)) + { + return; + } + + _ASSERTE((functionEntry.UnwindData & RUNTIME_FUNCTION_INDIRECT) == 0); + } +#endif // _TARGET_AMD64_ + *pFuncEntry = (UINT_PTR)(T_RUNTIME_FUNCTION*)PTR_RUNTIME_FUNCTION(taFuncEntry); break; } |