aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2013-11-20 12:57:33 -0500
committerJoel Brobecker <brobecker@adacore.com>2013-12-05 07:41:31 +0400
commit170d82c9517d608476e206425253939af4719273 (patch)
treeabf36f6a99dfae50a6953d35d60d76e3661fa47a
parenta5e619ec1f0a115ebc33cbb9cab3bc242cb70f3b (diff)
downloadfsf-binutils-gdb-170d82c9517d608476e206425253939af4719273.zip
fsf-binutils-gdb-170d82c9517d608476e206425253939af4719273.tar.gz
fsf-binutils-gdb-170d82c9517d608476e206425253939af4719273.tar.bz2
Allow Windows UNWIND_INFO version 2.
We've observed in Windows 2012 that ntdll.dll contains some unwind records with the version field set to 2. This patch adjusts the decoder to accept records flagged with this version as well. Version 2 appears to still be largely undocumented at this stage. However, apart from a mysterious opcode 6, everything else still seems to remain the same. So this patch also changes the decoder to ignore those opcodes; before this change, the debugger would silently stop the decoding, and let the frame unwinder make do with what it the decoder managed to decode up to that point. It's unclear at this point what we're losing by not being able to decode that opcode. But the information does not appear to be critical, at least as far as call unwinding is concerned. gdb/ChangeLog: (from Tristan Gingold <gingold@adacore.com>) (from Joel Brobecker <brobecker@adacore.com>) * amd64-windows-tdep.c (amd64_windows_frame_decode_insns): Accept version 2. Ignore operations using opcode 6.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/amd64-windows-tdep.c15
2 files changed, 19 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 380177a..f5ba7d3 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,4 +1,10 @@
2013-12-05 Joel Brobecker <brobecker@adacore.com>
+ Tristan Gingold <gingold@adacore.com>
+
+ * amd64-windows-tdep.c (amd64_windows_frame_decode_insns):
+ Accept version 2. Ignore operations using opcode 6.
+
+2013-12-05 Joel Brobecker <brobecker@adacore.com>
* ada-lex.l (find_dot_all): Fix coding style violations.
diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
index 359173a..6891e16 100644
--- a/gdb/amd64-windows-tdep.c
+++ b/gdb/amd64-windows-tdep.c
@@ -649,7 +649,8 @@ amd64_windows_frame_decode_insns (struct frame_info *this_frame,
ex_ui.CountOfCodes, ex_ui.FrameRegisterOffset);
/* Check version. */
- if (PEX64_UWI_VERSION (ex_ui.Version_Flags) != 1)
+ if (PEX64_UWI_VERSION (ex_ui.Version_Flags) != 1
+ && PEX64_UWI_VERSION (ex_ui.Version_Flags) != 2)
return;
if (j == 0
@@ -696,7 +697,17 @@ amd64_windows_frame_decode_insns (struct frame_info *this_frame,
return;
end_insns = &insns[codes_count * 2];
- for (p = insns; p < end_insns; p += 2)
+ p = insns;
+
+ /* Skip opcodes 6 of version 2. This opcode is not documented. */
+ if (PEX64_UWI_VERSION (ex_ui.Version_Flags) == 2)
+ {
+ for (; p < end_insns; p += 2)
+ if (PEX64_UNWCODE_CODE (p[1]) != 6)
+ break;
+ }
+
+ for (; p < end_insns; p += 2)
{
int reg;