Author: Zachary Yedidia
Date: 2026-10-21T19:53:53-07:00
New Revision: 987ee202905055120a44348af86ca878c4f55722

URL: 
https://github.com/llvm/llvm-project/commit/987ee202905055120a44348af86ca878c4f55722
DIFF: 
https://github.com/llvm/llvm-project/commit/987ee202905055120a44348af86ca878c4f55722.diff

LOG: [LFI][libunwind] Enable x86_64_lfi for compiler-rt and skip reserved 
registers in libunwind (#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.

Added: 
    

Modified: 
    compiler-rt/cmake/builtin-config-ix.cmake
    compiler-rt/lib/builtins/CMakeLists.txt
    libunwind/src/UnwindRegistersRestore.S
    libunwind/src/UnwindRegistersSave.S

Removed: 
    


################################################################################
diff  --git a/compiler-rt/cmake/builtin-config-ix.cmake 
b/compiler-rt/cmake/builtin-config-ix.cmake
index 082ade13c595af..a9b38620cbee86 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 838a9b8665630b..ab9c707b3db44d 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -438,6 +438,9 @@ if (NOT MSVC)
   # Darwin x86_64 Haswell
   set(x86_64h_SOURCES ${x86_64_SOURCES})
 
+  # x86_64 LFI
+  set(x86_64_lfi_SOURCES ${x86_64_SOURCES})
+
   if (WIN32)
     set(x86_64_SOURCES
       ${x86_64_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