diff options
| author | Stella Stamenova <stilis@microsoft.com> | 2018-05-17 21:42:37 +0000 |
|---|---|---|
| committer | Stella Stamenova <stilis@microsoft.com> | 2018-05-17 21:42:37 +0000 |
| commit | 5b5350ddee0957db31812f544655f06570fa436d (patch) | |
| tree | b007bc2b29c04c4a18099c7aa5459c55fefea585 /lldb/source/Plugins/Process/Windows/Common | |
| parent | 0fd67b537bdf5afe09dff10ff3fe325c1a949efe (diff) | |
| download | bcm5719-llvm-5b5350ddee0957db31812f544655f06570fa436d.tar.gz bcm5719-llvm-5b5350ddee0957db31812f544655f06570fa436d.zip | |
[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
llvm-svn: 332671
Diffstat (limited to 'lldb/source/Plugins/Process/Windows/Common')
| -rw-r--r-- | lldb/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/lldb/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp b/lldb/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp index 1b07ea8a938..fa7fa43122a 100644 --- a/lldb/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp +++ b/lldb/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp @@ -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 = llvm::array_lengthof(g_register_infos); 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", |

