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
