Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Mason <davmason@microsoft.com>2021-06-08 12:55:52 +0300
committerGitHub <noreply@github.com>2021-06-08 12:55:52 +0300
commit86719086d9fa65e004763b85a8bb560ec505ec2b (patch)
tree33faf6ae865cd911781f0f353dad2d98a2991ab3 /src/coreclr/vm
parentd52f925042937397bef2db312d11ae0c2ed76c7f (diff)
add support for unwinding function fragments in the dac (#53765)
Diffstat (limited to 'src/coreclr/vm')
-rw-r--r--src/coreclr/vm/codeman.cpp17
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;
}