[compiler-rt] [libunwind] [LFI][libunwind] Enable x86_64_lfi for compiler-rt and skip reserved registers in libunwind (PR #232552)
Zachary Yedidia via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 15 17:02:05 PDT 2026
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 <zyedidia at gmail.com>
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
More information about the cfe-commits
mailing list