[Lldb-commits] [lldb] r332671 - [Windows, Process] LLDB reads wrong registers on 64bit Windows

Stella Stamenova via lldb-commits lldb-commits at lists.llvm.org
Thu May 17 14:42:37 PDT 2018


Author: stella.stamenova
Date: Thu May 17 14:42:37 2018
New Revision: 332671

URL: http://llvm.org/viewvc/llvm-project?rev=332671&view=rev
Log:
[Windows, Process] LLDB reads wrong registers on 64bit Windows

Summary: LLDB reads wrong registers on 64bit Windows because RegisterContextWindows_x64::GetRegisterInfoAtIndex returns wrong reference.
I encountered broken backtrace when the program stopped at function which does not have prologue code, such as compiled with '-fomit-frame-pointer'.
In this situation, CFA is equal to rsp but LLDB reads r9.

RegisterContextWindows_x64::GetRegisterInfoAtIndex depends the order of lldb_XXX_x86_64 values, but RegisterIndex/g_register_infos/g_gpr_reg_indices does not follow order.

In source/Plugins/Process/Utility/lldb-x86-register-enums.h
The order of GPRs is rax, rbx, rcx, rdx, rdi, rsi, rbp, rsp, r8, ...

In source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp
The order of GPRs is rax, rbx, rcx, rdx, rdi, rsi, r8, r9, r10, ...

Patch by Kenji Koyanagi

Modified:
    lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp

Modified: lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp?rev=332671&r1=332670&r2=332671&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp Thu May 17 14:42:37 2018
@@ -41,6 +41,8 @@ enum RegisterIndex {
   eRegisterIndexRdx,
   eRegisterIndexRdi,
   eRegisterIndexRsi,
+  eRegisterIndexRbp,
+  eRegisterIndexRsp,
   eRegisterIndexR8,
   eRegisterIndexR9,
   eRegisterIndexR10,
@@ -49,8 +51,6 @@ enum RegisterIndex {
   eRegisterIndexR13,
   eRegisterIndexR14,
   eRegisterIndexR15,
-  eRegisterIndexRbp,
-  eRegisterIndexRsp,
   eRegisterIndexRip,
   eRegisterIndexRflags
 };
@@ -93,6 +93,16 @@ RegisterInfo g_register_infos[] = {
       LLDB_INVALID_REGNUM, lldb_rsi_x86_64},
      nullptr,
      nullptr},
+    {DEFINE_GPR(rbp, "fp"),
+     {dwarf_rbp_x86_64, dwarf_rbp_x86_64, LLDB_REGNUM_GENERIC_FP,
+      LLDB_INVALID_REGNUM, lldb_rbp_x86_64},
+     nullptr,
+     nullptr},
+    {DEFINE_GPR(rsp, "sp"),
+     {dwarf_rsp_x86_64, dwarf_rsp_x86_64, LLDB_REGNUM_GENERIC_SP,
+      LLDB_INVALID_REGNUM, lldb_rsp_x86_64},
+     nullptr,
+     nullptr},
     {DEFINE_GPR(r8, nullptr),
      {dwarf_r8_x86_64, dwarf_r8_x86_64, LLDB_INVALID_REGNUM,
       LLDB_INVALID_REGNUM, lldb_r8_x86_64},
@@ -133,16 +143,6 @@ RegisterInfo g_register_infos[] = {
       LLDB_INVALID_REGNUM, lldb_r15_x86_64},
      nullptr,
      nullptr},
-    {DEFINE_GPR(rbp, "fp"),
-     {dwarf_rbp_x86_64, dwarf_rbp_x86_64, LLDB_REGNUM_GENERIC_FP,
-      LLDB_INVALID_REGNUM, lldb_rbp_x86_64},
-     nullptr,
-     nullptr},
-    {DEFINE_GPR(rsp, "sp"),
-     {dwarf_rsp_x86_64, dwarf_rsp_x86_64, LLDB_REGNUM_GENERIC_SP,
-      LLDB_INVALID_REGNUM, lldb_rsp_x86_64},
-     nullptr,
-     nullptr},
     {DEFINE_GPR(rip, "pc"),
      {dwarf_rip_x86_64, dwarf_rip_x86_64, LLDB_REGNUM_GENERIC_PC,
       LLDB_INVALID_REGNUM, lldb_rip_x86_64},
@@ -162,10 +162,10 @@ static size_t k_num_register_infos = llv
 uint32_t g_gpr_reg_indices[] = {
     eRegisterIndexRax, eRegisterIndexRbx, eRegisterIndexRcx,
     eRegisterIndexRdx, eRegisterIndexRdi, eRegisterIndexRsi,
-    eRegisterIndexR8,  eRegisterIndexR9,  eRegisterIndexR10,
-    eRegisterIndexR11, eRegisterIndexR12, eRegisterIndexR13,
-    eRegisterIndexR14, eRegisterIndexR15, eRegisterIndexRbp,
-    eRegisterIndexRsp, eRegisterIndexRip, eRegisterIndexRflags};
+    eRegisterIndexRbp, eRegisterIndexRsp, eRegisterIndexR8,
+    eRegisterIndexR9,  eRegisterIndexR10, eRegisterIndexR11,
+    eRegisterIndexR12, eRegisterIndexR13, eRegisterIndexR14,
+    eRegisterIndexR15, eRegisterIndexRip, eRegisterIndexRflags};
 
 RegisterSet g_register_sets[] = {
     {"General Purpose Registers", "gpr",




More information about the lldb-commits mailing list