[libc-commits] [libc] y (PR #112443)

Nick Desaulniers via libc-commits libc-commits at lists.llvm.org
Tue Oct 15 15:04:30 PDT 2024


https://github.com/nickdesaulniers created https://github.com/llvm/llvm-project/pull/112443

Even though I just added it in 66f968cf3725 (and fixed up in 46200fcf941d),
while writing the i386 version, I found that simply using "m" constraints
allowed for me to avoid offsetof and naked function attribute, while generating
the same exact disassembly. Simplify x86_64 setjmp using this style.


>From 6e36ed81196498fbb4cf9f9597701f0aff86fbbf Mon Sep 17 00:00:00 2001
From: Nick Desaulniers <ndesaulniers at google.com>
Date: Tue, 15 Oct 2024 15:01:57 -0700
Subject: [PATCH] [libc][setjmp] remove naked fn attr

Even though I just added it in 66f968cf3725 (and fixed up in 46200fcf941d),
while writing the i386 version, I found that simply using "m" constraints
allowed for me to avoid offsetof and naked function attribute, while generating
the same exact disassembly. Simplify x86_64 setjmp using this style.
---
 libc/src/setjmp/setjmp_impl.h         | 12 ---------
 libc/src/setjmp/x86_64/CMakeLists.txt |  1 +
 libc/src/setjmp/x86_64/setjmp.cpp     | 35 ++++++++++++++-------------
 3 files changed, 19 insertions(+), 29 deletions(-)

diff --git a/libc/src/setjmp/setjmp_impl.h b/libc/src/setjmp/setjmp_impl.h
index d035409e581954..1d9b9e3b5ca5b2 100644
--- a/libc/src/setjmp/setjmp_impl.h
+++ b/libc/src/setjmp/setjmp_impl.h
@@ -17,18 +17,6 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
-// TODO(https://github.com/llvm/llvm-project/issues/112427)
-// Some of the architecture-specific definitions are marked `naked`, which in
-// GCC implies `nothrow`.
-//
-// Right now, our aliases aren't marked `nothrow`, so we wind up in a situation
-// where clang will emit -Wmissing-exception-spec if we add `nothrow` here, but
-// GCC will emit -Wmissing-attributes here without `nothrow`. We need to update
-// LLVM_LIBC_FUNCTION to denote when a function throws or not.
-
-#ifdef LIBC_COMPILER_IS_GCC
-[[gnu::nothrow]]
-#endif
 int setjmp(jmp_buf buf);
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/setjmp/x86_64/CMakeLists.txt b/libc/src/setjmp/x86_64/CMakeLists.txt
index b5b0d9ba65599c..464144758cbbea 100644
--- a/libc/src/setjmp/x86_64/CMakeLists.txt
+++ b/libc/src/setjmp/x86_64/CMakeLists.txt
@@ -8,6 +8,7 @@ add_entrypoint_object(
     libc.hdr.types.jmp_buf
   COMPILE_OPTIONS
     -O3
+    -fomit-frame-pointer
 )
 
 add_entrypoint_object(
diff --git a/libc/src/setjmp/x86_64/setjmp.cpp b/libc/src/setjmp/x86_64/setjmp.cpp
index f6e82642edd7da..489aadffd05321 100644
--- a/libc/src/setjmp/x86_64/setjmp.cpp
+++ b/libc/src/setjmp/x86_64/setjmp.cpp
@@ -6,7 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "include/llvm-libc-macros/offsetof-macro.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
 #include "src/setjmp/setjmp_impl.h"
@@ -17,29 +16,31 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
-[[gnu::naked]]
 LLVM_LIBC_FUNCTION(int, setjmp, (jmp_buf buf)) {
   asm(R"(
-      mov %%rbx, %c[rbx](%%rdi)
-      mov %%rbp, %c[rbp](%%rdi)
-      mov %%r12, %c[r12](%%rdi)
-      mov %%r13, %c[r13](%%rdi)
-      mov %%r14, %c[r14](%%rdi)
-      mov %%r15, %c[r15](%%rdi)
+      mov %%rbx, %[rbx]
+      mov %%rbp, %[rbp]
+      mov %%r12, %[r12]
+      mov %%r13, %[r13]
+      mov %%r14, %[r14]
+      mov %%r15, %[r15]
 
       lea 8(%%rsp), %%rax
-      mov %%rax, %c[rsp](%%rdi)
+      mov %%rax, %[rsp]
 
       mov (%%rsp), %%rax
-      mov %%rax, %c[rip](%%rdi)
-
-      xorl %%eax, %%eax
-      retq)" ::[rbx] "i"(offsetof(__jmp_buf, rbx)),
-      [rbp] "i"(offsetof(__jmp_buf, rbp)), [r12] "i"(offsetof(__jmp_buf, r12)),
-      [r13] "i"(offsetof(__jmp_buf, r13)), [r14] "i"(offsetof(__jmp_buf, r14)),
-      [r15] "i"(offsetof(__jmp_buf, r15)), [rsp] "i"(offsetof(__jmp_buf, rsp)),
-      [rip] "i"(offsetof(__jmp_buf, rip))
+      mov %%rax, %[rip]
+      )" ::
+      [rbx] "m"(buf->rbx),
+      [rbp] "m"(buf->rbp),
+      [r12] "m"(buf->r12),
+      [r13] "m"(buf->r13),
+      [r14] "m"(buf->r14),
+      [r15] "m"(buf->r15),
+      [rsp] "m"(buf->rsp),
+      [rip] "m"(buf->rip)
       : "rax");
+  return 0;
 }
 
 } // namespace LIBC_NAMESPACE_DECL



More information about the libc-commits mailing list