[Lldb-commits] [lldb] [lldb][Windows] Fix x86_64 default unwind plan (PR #210076)

Charles Zablit via lldb-commits lldb-commits at lists.llvm.org
Fri Jul 17 06:15:48 PDT 2026


================
@@ -751,21 +751,15 @@ UnwindPlanSP ABIWindows_x86_64::CreateFunctionEntryUnwindPlan() {
 
 // Windows-x86_64 doesn't use %rbp
 // No available Unwind information for Windows-x86_64 (section .pdata)
-// Let's use SysV-x86_64 one for now
 UnwindPlanSP ABIWindows_x86_64::CreateDefaultUnwindPlan() {
-  uint32_t fp_reg_num = dwarf_rbp;
   uint32_t sp_reg_num = dwarf_rsp;
   uint32_t pc_reg_num = dwarf_rip;
 
   UnwindPlan::Row row;
-
-  const int32_t ptr_size = 8;
-  row.GetCFAValue().SetIsRegisterPlusOffset(dwarf_rbp, 2 * ptr_size);
   row.SetOffset(0);
   row.SetUnspecifiedRegistersAreUndefined(true);
-
-  row.SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
-  row.SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
+  row.GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 8);
+  row.SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -8, false);
   row.SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true);
----------------
charles-zablit wrote:

I copied the implementation from https://github.com/llvm/llvm-project/blob/a9e5bb572703780e3eea4a2759104a141ea73466/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp#L859-L862

As I understand, on Windows `CFA = rsp+8` and `pc = [CFA-8]` given the following:

1. https://llvm-mos.org/wiki/DWARF_implementation_guide#The_Canonical_Frame_Address:
> On most processors, the CFA is simply "the stack pointer value when this function was called." Local variables are at negative offsets from the CFA (below it on the stack), and the return address is at a fixed position relative to the CFA.

2.https://learn.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-170#prolog-code
> The code for a typical prolog might be:
> ```asm
> mov    [RSP + 8], RCX
>```


> Is it even right to say that rsp itself is spilled on the stack at row 0?

This is using the `Is` variant of the method, not the `At` variant. As I understand it, the register is not spilled on the stack (rightfully so). And that's why we don't see it in the diagram.

https://github.com/llvm/llvm-project/pull/210076


More information about the lldb-commits mailing list