[all-commits] [llvm/llvm-project] 0f6fd1: [libc] Add support for setjmp and longjmp in riscv

Mikhail R. Gadelha via All-commits all-commits at lists.llvm.org
Fri Mar 24 12:19:50 PDT 2023

  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 0f6fd1b704c014089f94271e08417a8179ee2b1c
  Author: Mikhail R. Gadelha <mikhail at igalia.com>
  Date:   2023-03-24 (Fri, 24 Mar 2023)

  Changed paths:
    M clang/docs/tools/clang-formatted-files.txt
    M libc/config/linux/riscv64/entrypoints.txt
    M libc/config/linux/riscv64/headers.txt
    M libc/include/llvm-libc-types/jmp_buf.h
    M libc/src/setjmp/CMakeLists.txt
    R libc/src/setjmp/longjmp.cpp
    A libc/src/setjmp/riscv64/CMakeLists.txt
    A libc/src/setjmp/riscv64/longjmp.cpp
    A libc/src/setjmp/riscv64/setjmp.cpp
    R libc/src/setjmp/setjmp.cpp
    A libc/src/setjmp/x86_64/CMakeLists.txt
    A libc/src/setjmp/x86_64/longjmp.cpp
    A libc/src/setjmp/x86_64/setjmp.cpp

  Log Message:
  [libc] Add support for setjmp and longjmp in riscv

This patch implements setjmp and longjmp in riscv using inline asm. The
following changes were required:

* Omit frame pointer: otherwise gcc won't allow us to use s0
* Use __attribute__((naked)): otherwise both gcc and clang will generate
function prologue and epilogue in both functions. This doesn't happen
in x86_64, so we guard it to only riscv

Furthermore, using __attribute__((naked)) causes two problems: we
can't use `return 0` (both gcc and clang) and the function arguments in
the function body (clang only), so we had to use a0 and a1 directly.

Reviewed By: sivachandra

Differential Revision: https://reviews.llvm.org/D145584

More information about the All-commits mailing list