Allow Windows UNWIND_INFO version 2.
authorJoel Brobecker <brobecker@adacore.com>
Wed, 20 Nov 2013 17:57:33 +0000 (12:57 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Thu, 5 Dec 2013 03:41:31 +0000 (07:41 +0400)
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.

gdb/ChangeLog
gdb/amd64-windows-tdep.c

index 380177ac0ddb1ef8567587fd8c0389d433b8de21..f5ba7d3692171c916977dcae4d3c7025f92e4e8d 100644 (file)
@@ -1,3 +1,9 @@
+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.
index 359173affbb4586d8c19d3e724582e6eaf794a5d..6891e1691866e86794be3f58df50c4feab61876b 100644 (file)
@@ -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;