Skip to content

Commit 2d9ca38

Browse files
address CRs
1 parent 1bde1ba commit 2d9ca38

File tree

5 files changed

+92
-61
lines changed

5 files changed

+92
-61
lines changed

libc/include/llvm-libc-types/jmp_buf.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,20 @@ typedef struct {
5252
#else
5353
#error "__jmp_buf not available for your target architecture."
5454
#endif
55+
// TODO: implement sigjmp_buf related functions
56+
#if defined(__i386__) || defined(__x86_64__)
5557
// return address
5658
void *sig_retaddr;
5759
// extra register buffer to avoid indefinite stack growth in sigsetjmp
5860
void *sig_extra;
5961
// signal masks
6062
sigset_t sigmask;
63+
#endif
6164
} __jmp_buf;
6265

6366
typedef __jmp_buf jmp_buf[1];
64-
typedef __jmp_buf sigjmp_buf[1];
6567

68+
#if defined(__i386__) || defined(__x86_64__)
69+
typedef __jmp_buf sigjmp_buf[1];
70+
#endif
6671
#endif // LLVM_LIBC_TYPES_JMP_BUF_H

libc/include/setjmp.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ functions:
2323
- type: jmp_buf
2424
- name: sigsetjmp
2525
standards:
26-
- stdc
26+
- POSIX
2727
return_type: int
2828
attributes:
2929
- _Returns_twice
@@ -32,7 +32,7 @@ functions:
3232
- type: int
3333
- name: siglongjmp
3434
standards:
35-
- stdc
35+
- POSIX
3636
return_type: _Noreturn void
3737
arguments:
3838
- type: sigjmp_buf

libc/src/setjmp/x86_64/sigsetjmp.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "src/setjmp/sigsetjmp.h"
10-
#include "include/llvm-libc-macros/offsetof-macro.h"
1110
#include "src/__support/common.h"
1211
#include "src/__support/macros/config.h"
1312
#include "src/setjmp/setjmp_impl.h"
1413
#include "src/setjmp/sigsetjmp_epilogue.h"
1514

15+
#define __need_offsetof
16+
#include <stddef.h> // compiler resource header
17+
1618
#if !defined(LIBC_TARGET_ARCH_IS_X86)
1719
#error "Invalid file include"
1820
#endif
19-
2021
namespace LIBC_NAMESPACE_DECL {
21-
2222
#ifdef __i386__
2323
[[gnu::naked]]
2424
LLVM_LIBC_FUNCTION(int, sigsetjmp, (sigjmp_buf buf)) {

libc/test/src/setjmp/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ add_libc_unittest(
3030
libc.src.setjmp.sigsetjmp
3131
libc.src.setjmp.siglongjmp
3232
libc.src.signal.sigprocmask
33-
libc.src.string.memory_utils.inline_memset
34-
libc.src.string.memory_utils.inline_memcmp
33+
libc.src.string.memset
34+
libc.src.string.memcmp
3535
libc.hdr.types.sigset_t
3636
)

libc/test/src/setjmp/sigsetjmp_test.cpp

Lines changed: 79 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
#include "src/setjmp/siglongjmp.h"
1010
#include "src/setjmp/sigsetjmp.h"
1111
#include "src/signal/sigprocmask.h"
12-
#include "src/string/memory_utils/inline_memcmp.h"
13-
#include "src/string/memory_utils/inline_memset.h"
12+
#include "src/string/memcmp.h"
13+
#include "src/string/memset.h"
1414
#include "test/UnitTest/Test.h"
1515

1616
constexpr int MAX_LOOP = 123;
@@ -21,56 +21,82 @@ void jump_back(jmp_buf buf, int n) {
2121
LIBC_NAMESPACE::siglongjmp(buf, n); // Will return |n| out of setjmp
2222
}
2323

24-
#define SMOKE_TESTS(SUFFIX, FLAG) \
25-
TEST(LlvmLibcSetJmpTest, SigSetAndJumpBack##SUFFIX) { \
26-
jmp_buf buf; \
27-
longjmp_called = 0; \
28-
volatile int n = 0; \
29-
sigset_t old; \
30-
sigset_t mask_all; \
31-
sigset_t recovered; \
32-
LIBC_NAMESPACE::inline_memset(&mask_all, 0xFF, sizeof(mask_all)); \
33-
LIBC_NAMESPACE::inline_memset(&old, 0, sizeof(old)); \
34-
LIBC_NAMESPACE::inline_memset(&recovered, 0, sizeof(recovered)); \
35-
LIBC_NAMESPACE::sigprocmask(0, nullptr, &old); \
36-
if (LIBC_NAMESPACE::sigsetjmp(buf, FLAG) <= MAX_LOOP) { \
37-
if (FLAG) { \
38-
LIBC_NAMESPACE::sigprocmask(0, nullptr, &recovered); \
39-
ASSERT_EQ( \
40-
0, LIBC_NAMESPACE::inline_memcmp(&old, &recovered, sizeof(old))); \
41-
} \
42-
n = n + 1; \
43-
if (FLAG) \
44-
LIBC_NAMESPACE::sigprocmask(SIG_BLOCK, &mask_all, nullptr); \
45-
jump_back(buf, n); \
46-
} \
47-
ASSERT_EQ(longjmp_called, n); \
48-
ASSERT_EQ(n, MAX_LOOP + 1); \
49-
} \
50-
TEST(LlvmLibcSetJmpTest, SigSetAndJumpBackValOne##SUFFIX) { \
51-
jmp_buf buf; \
52-
longjmp_called = 0; \
53-
sigset_t old; \
54-
sigset_t mask_all; \
55-
sigset_t recovered; \
56-
LIBC_NAMESPACE::inline_memset(&mask_all, 0xFF, sizeof(mask_all)); \
57-
LIBC_NAMESPACE::inline_memset(&old, 0, sizeof(old)); \
58-
LIBC_NAMESPACE::inline_memset(&recovered, 0, sizeof(recovered)); \
59-
LIBC_NAMESPACE::sigprocmask(0, nullptr, &old); \
60-
int val = LIBC_NAMESPACE::sigsetjmp(buf, FLAG); \
61-
if (val == 0) { \
62-
if (FLAG) \
63-
LIBC_NAMESPACE::sigprocmask(SIG_BLOCK, &mask_all, nullptr); \
64-
jump_back(buf, val); \
65-
} \
66-
if (FLAG) { \
67-
LIBC_NAMESPACE::sigprocmask(0, nullptr, &recovered); \
68-
ASSERT_EQ(0, \
69-
LIBC_NAMESPACE::inline_memcmp(&old, &recovered, sizeof(old))); \
70-
} \
71-
ASSERT_EQ(longjmp_called, 1); \
72-
ASSERT_EQ(val, 1); \
24+
TEST(LlvmLibcSetJmpTest, SigSetAndJumpBackSaveSigs) {
25+
jmp_buf buf;
26+
longjmp_called = 0;
27+
volatile int n = 0;
28+
sigset_t old;
29+
sigset_t mask_all;
30+
sigset_t recovered;
31+
LIBC_NAMESPACE::memset(&mask_all, 0xFF, sizeof(mask_all));
32+
LIBC_NAMESPACE::memset(&old, 0, sizeof(old));
33+
LIBC_NAMESPACE::memset(&recovered, 0, sizeof(recovered));
34+
LIBC_NAMESPACE::sigprocmask(0, nullptr, &old);
35+
if (LIBC_NAMESPACE::sigsetjmp(buf, 1) <= MAX_LOOP) {
36+
LIBC_NAMESPACE::sigprocmask(0, nullptr, &recovered);
37+
ASSERT_EQ(0, LIBC_NAMESPACE::memcmp(&old, &recovered, sizeof(old)));
38+
n = n + 1;
39+
LIBC_NAMESPACE::sigprocmask(SIG_BLOCK, &mask_all, nullptr);
40+
jump_back(buf, n);
7341
}
42+
ASSERT_EQ(longjmp_called, n);
43+
ASSERT_EQ(n, MAX_LOOP + 1);
44+
}
7445

75-
SMOKE_TESTS(SaveSigs, 1)
76-
SMOKE_TESTS(NoSaveSigs, 0)
46+
TEST(LlvmLibcSetJmpTest, SigSetAndJumpBackValOneSaveSigs) {
47+
jmp_buf buf;
48+
longjmp_called = 0;
49+
sigset_t old;
50+
sigset_t mask_all;
51+
sigset_t recovered;
52+
LIBC_NAMESPACE::memset(&mask_all, 0xFF, sizeof(mask_all));
53+
LIBC_NAMESPACE::memset(&old, 0, sizeof(old));
54+
LIBC_NAMESPACE::memset(&recovered, 0, sizeof(recovered));
55+
LIBC_NAMESPACE::sigprocmask(0, nullptr, &old);
56+
int val = LIBC_NAMESPACE::sigsetjmp(buf, 1);
57+
if (val == 0) {
58+
LIBC_NAMESPACE::sigprocmask(SIG_BLOCK, &mask_all, nullptr);
59+
jump_back(buf, val);
60+
}
61+
LIBC_NAMESPACE::sigprocmask(0, nullptr, &recovered);
62+
ASSERT_EQ(0, LIBC_NAMESPACE::memcmp(&old, &recovered, sizeof(old)));
63+
ASSERT_EQ(longjmp_called, 1);
64+
ASSERT_EQ(val, 1);
65+
}
66+
67+
TEST(LlvmLibcSetJmpTest, SigSetAndJumpBackNoSaveSigs) {
68+
jmp_buf buf;
69+
longjmp_called = 0;
70+
volatile int n = 0;
71+
sigset_t old;
72+
sigset_t mask_all;
73+
sigset_t recovered;
74+
LIBC_NAMESPACE::memset(&mask_all, 0xFF, sizeof(mask_all));
75+
LIBC_NAMESPACE::memset(&old, 0, sizeof(old));
76+
LIBC_NAMESPACE::memset(&recovered, 0, sizeof(recovered));
77+
LIBC_NAMESPACE::sigprocmask(0, nullptr, &old);
78+
if (LIBC_NAMESPACE::sigsetjmp(buf, 0) <= MAX_LOOP) {
79+
n = n + 1;
80+
jump_back(buf, n);
81+
}
82+
ASSERT_EQ(longjmp_called, n);
83+
ASSERT_EQ(n, MAX_LOOP + 1);
84+
}
85+
86+
TEST(LlvmLibcSetJmpTest, SigSetAndJumpBackValOneNoSaveSigs) {
87+
jmp_buf buf;
88+
longjmp_called = 0;
89+
sigset_t old;
90+
sigset_t mask_all;
91+
sigset_t recovered;
92+
LIBC_NAMESPACE::memset(&mask_all, 0xFF, sizeof(mask_all));
93+
LIBC_NAMESPACE::memset(&old, 0, sizeof(old));
94+
LIBC_NAMESPACE::memset(&recovered, 0, sizeof(recovered));
95+
LIBC_NAMESPACE::sigprocmask(0, nullptr, &old);
96+
int val = LIBC_NAMESPACE::sigsetjmp(buf, 0);
97+
if (val == 0) {
98+
jump_back(buf, val);
99+
}
100+
ASSERT_EQ(longjmp_called, 1);
101+
ASSERT_EQ(val, 1);
102+
}

0 commit comments

Comments
 (0)