[llvm] [DRAFT] Changing register initial status as undefined (PR #209032)

David Zheng via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 12 09:38:35 PDT 2026


https://github.com/davidzhengyes updated https://github.com/llvm/llvm-project/pull/209032

>From cfd23685b847d09fa0331e40a8fd92503ea86291 Mon Sep 17 00:00:00 2001
From: David Zheng <zhengdavid05 at gmail.com>
Date: Sun, 12 Jul 2026 12:36:37 -0400
Subject: [PATCH] Changing register initial status as undefined as per DWARF
 spec 6.4.1. Users can overwrite this default assumption inside the prologue.

---
 llvm/lib/DWARFCFIChecker/DWARFCFIAnalysis.cpp | 19 +++----------------
 .../DWARFCFIChecker/X86/cfa-corner-cases.s    |  4 ----
 llvm/test/DWARFCFIChecker/X86/nested-frames.s |  7 +++----
 .../X86/single-func-cfa-mistake.s             |  4 ----
 .../X86/single-func-missed-cfi-directive.s    |  4 ++--
 llvm/test/DWARFCFIChecker/X86/single-func.s   |  4 ----
 6 files changed, 8 insertions(+), 34 deletions(-)

diff --git a/llvm/lib/DWARFCFIChecker/DWARFCFIAnalysis.cpp b/llvm/lib/DWARFCFIChecker/DWARFCFIAnalysis.cpp
index 24ae7c21098f9..7a43ac9f78698 100644
--- a/llvm/lib/DWARFCFIChecker/DWARFCFIAnalysis.cpp
+++ b/llvm/lib/DWARFCFIChecker/DWARFCFIAnalysis.cpp
@@ -91,11 +91,9 @@ DWARFCFIAnalysis::DWARFCFIAnalysis(MCContext *Context, MCInstrInfo const &MCII,
       continue;
 
     DWARFRegNum Reg = MCRI->getDwarfRegNum(LLVMReg, IsEH);
-    // TODO: this should be `undefined` instead of `same_value`, but because
-    // initial frame state doesn't have any directives about callee saved
-    // registers, every register is tracked. After initial frame state is
-    // corrected, this should be changed.
-    State.update(MCCFIInstruction::createSameValue(nullptr, Reg));
+    // This should be undefined by default, letting user write inside prologue
+    // if they want same_value assumption
+    State.update(MCCFIInstruction::createUndefined(nullptr, Reg));
   }
 
   // TODO: Ignoring PC should be in the initial frame state.
@@ -106,17 +104,6 @@ DWARFCFIAnalysis::DWARFCFIAnalysis(MCContext *Context, MCInstrInfo const &MCII,
        Context->getAsmInfo().getInitialFrameState())
     State.update(InitialFrameStateCFIDirective);
 
-  auto MaybeCurrentRow = State.getCurrentUnwindRow();
-  assert(MaybeCurrentRow && "there should be at least one row");
-  auto MaybeCFA = getCFARegOffsetInfo(*MaybeCurrentRow);
-  assert(MaybeCFA &&
-         "the CFA information should be describable in [reg + offset] in here");
-  auto CFA = *MaybeCFA;
-
-  // TODO: CFA register callee value is CFA's value, this should be in initial
-  // frame state.
-  State.update(MCCFIInstruction::createOffset(nullptr, CFA.Reg, 0));
-
   // Applying the prologue after default assumptions to overwrite them.
   for (auto &&Directive : Prologue)
     State.update(Directive);
diff --git a/llvm/test/DWARFCFIChecker/X86/cfa-corner-cases.s b/llvm/test/DWARFCFIChecker/X86/cfa-corner-cases.s
index e9ae5a29d006f..d6ac1bd44d736 100644
--- a/llvm/test/DWARFCFIChecker/X86/cfa-corner-cases.s
+++ b/llvm/test/DWARFCFIChecker/X86/cfa-corner-cases.s
@@ -6,10 +6,6 @@
         .type   f, @function
 f:
         .cfi_startproc
-        
-        ## TODO: Remove these lines when the initial frame directives set the callee saved registers
-        .cfi_undefined %rax
-        .cfi_undefined %flags
 
         .cfi_val_offset %rbp, -8 
 
diff --git a/llvm/test/DWARFCFIChecker/X86/nested-frames.s b/llvm/test/DWARFCFIChecker/X86/nested-frames.s
index 52eb6f8844f58..b62eba309f3f0 100644
--- a/llvm/test/DWARFCFIChecker/X86/nested-frames.s
+++ b/llvm/test/DWARFCFIChecker/X86/nested-frames.s
@@ -4,8 +4,8 @@
 .pushsection A
 f: 
 .cfi_startproc
-## TODO: Remove this line when the initial frame directives set the callee saved registers
-.cfi_undefined %flags
+.cfi_same_value %rbp
+.cfi_same_value %rsi
 addq $10, %rbp
 # CHECK: error: changed register RBP, that register RBP's unwinding rule uses, but there is no CFI directives about it
 nop
@@ -14,8 +14,7 @@ nop
 .pushsection B
 g: 
 .cfi_startproc
-## TODO: Remove this line when the initial frame directives set the callee saved registers
-.cfi_undefined %flags
+.cfi_same_value %rbp
 addq $10, %rbp
 # CHECK: error: changed register RBP, that register RBP's unwinding rule uses, but there is no CFI directives about it
 nop
diff --git a/llvm/test/DWARFCFIChecker/X86/single-func-cfa-mistake.s b/llvm/test/DWARFCFIChecker/X86/single-func-cfa-mistake.s
index fa81e9d485886..dd89e22936e12 100644
--- a/llvm/test/DWARFCFIChecker/X86/single-func-cfa-mistake.s
+++ b/llvm/test/DWARFCFIChecker/X86/single-func-cfa-mistake.s
@@ -7,10 +7,6 @@
 f:
         .cfi_startproc
 
-        ## TODO: Remove these lines when the initial frame directives set the callee saved registers
-        .cfi_undefined %rax
-        .cfi_undefined %flags
-
         pushq   %rbp
         # CHECK: warning: CFA offset is changed from 8 to 17, and CFA register RSP is modified, but validating the modification amount is not implemented yet
         # CHECK: warning: validating changes happening to register RBP unwinding rule structure is not implemented yet
diff --git a/llvm/test/DWARFCFIChecker/X86/single-func-missed-cfi-directive.s b/llvm/test/DWARFCFIChecker/X86/single-func-missed-cfi-directive.s
index 292b66e6d489f..da2e5185abf83 100644
--- a/llvm/test/DWARFCFIChecker/X86/single-func-missed-cfi-directive.s
+++ b/llvm/test/DWARFCFIChecker/X86/single-func-missed-cfi-directive.s
@@ -7,8 +7,8 @@
 f:
         .cfi_startproc
         
-        .cfi_undefined %rax
-        
+        .cfi_same_value %rbp
+
         pushq   %rbp
         .cfi_def_cfa_offset 16
         
diff --git a/llvm/test/DWARFCFIChecker/X86/single-func.s b/llvm/test/DWARFCFIChecker/X86/single-func.s
index 20f1e4d7cac47..57a539a123351 100644
--- a/llvm/test/DWARFCFIChecker/X86/single-func.s
+++ b/llvm/test/DWARFCFIChecker/X86/single-func.s
@@ -7,10 +7,6 @@
 f:
         .cfi_startproc
         
-        ## TODO: Remove these lines when the initial frame directives set the callee saved registers
-        .cfi_undefined %rax
-        .cfi_undefined %flags
-        
         pushq   %rbp
         # CHECK: warning: CFA offset is changed from 8 to 16, and CFA register RSP is modified, but validating the modification amount is not implemented yet
         # CHECK:  warning: validating changes happening to register RBP unwinding rule structure is not implemented yet



More information about the llvm-commits mailing list