https://github.com/zyedidia created 
https://github.com/llvm/llvm-project/pull/232552

This enables `x86_64_lfi` as a CMake target in compiler-rt and skips LFI's 
reserved registers for libunwind's save/restore sequence.

>From 4ea3b58609340cec9d6bb95994496f4c57de6810 Mon Sep 17 00:00:00 2001
From: Zachary Yedidia <[email protected]>
Date: Mon, 27 Apr 2026 12:47:02 -0700
Subject: [PATCH] [LFI] Enable x86_64_lfi for compiler-rt and reserve regs in
 libunwind

---
 compiler-rt/cmake/builtin-config-ix.cmake | 2 +-
 compiler-rt/lib/builtins/CMakeLists.txt   | 1 +
 libunwind/src/UnwindRegistersRestore.S    | 3 +++
 libunwind/src/UnwindRegistersSave.S       | 3 +++
 4 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/compiler-rt/cmake/builtin-config-ix.cmake 
b/compiler-rt/cmake/builtin-config-ix.cmake
index 4d560e48acacff..4a9bade8b5d630 100644
--- a/compiler-rt/cmake/builtin-config-ix.cmake
+++ b/compiler-rt/cmake/builtin-config-ix.cmake
@@ -83,7 +83,7 @@ set(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m 
armv7em armv7 armv7s armv
 set(AVR avr)
 set(HEXAGON hexagon)
 set(X86 i386)
-set(X86_64 x86_64)
+set(X86_64 x86_64 x86_64_lfi)
 set(LOONGARCH64 loongarch64)
 set(MIPS32 mips mipsel)
 set(MIPS64 mips64 mips64el)
diff --git a/compiler-rt/lib/builtins/CMakeLists.txt 
b/compiler-rt/lib/builtins/CMakeLists.txt
index bdc72d0053dc26..6802736dd3bb6e 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -891,6 +891,7 @@ set(arm64e_SOURCES ${aarch64_SOURCES})
 set(arm64_32_SOURCES ${aarch64_SOURCES})
 set(arm64ec_SOURCES ${aarch64_SOURCES})
 set(aarch64_lfi_SOURCES ${aarch64_SOURCES})
+set(x86_64_lfi_SOURCES ${x86_64_SOURCES})
 
 # macho_embedded archs
 set(armv6m_SOURCES ${thumb1_SOURCES})
diff --git a/libunwind/src/UnwindRegistersRestore.S 
b/libunwind/src/UnwindRegistersRestore.S
index b299bcd0a75949..6c9dcc48c309ad 100644
--- a/libunwind/src/UnwindRegistersRestore.S
+++ b/libunwind/src/UnwindRegistersRestore.S
@@ -113,8 +113,11 @@ 
DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_x86_64_jumpto)
   movq   88(%rdi), %r11
   movq   96(%rdi), %r12
   movq  104(%rdi), %r13
+# Skip reloading r14/r15 under LFI; reserved by LFI ABI.
+#if !defined(__LFI__)
   movq  112(%rdi), %r14
   movq  120(%rdi), %r15
+#endif
   # skip rflags
   # skip cs
   # skip fs
diff --git a/libunwind/src/UnwindRegistersSave.S 
b/libunwind/src/UnwindRegistersSave.S
index c51b5b8d176646..81d32009952895 100644
--- a/libunwind/src/UnwindRegistersSave.S
+++ b/libunwind/src/UnwindRegistersSave.S
@@ -145,8 +145,11 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
   movq  %r11, 88(PTR)
   movq  %r12, 96(PTR)
   movq  %r13,104(PTR)
+# Skip spilling r14/r15 under LFI; reserved by LFI ABI.
+#if !defined(__LFI__)
   movq  %r14,112(PTR)
   movq  %r15,120(PTR)
+#endif
   movq  (%rsp),TMP
   movq  TMP,128(PTR) # store return address as rip
   # skip rflags

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to