Skip to content

Commit 8ee6ab7

Browse files
authored
[libc][c23][fenv] implement fesetexcept (#87603)
Closes #87564
1 parent 0aa982f commit 8ee6ab7

File tree

18 files changed

+110
-2
lines changed

18 files changed

+110
-2
lines changed

libc/config/baremetal/arm/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ set(TARGET_LIBM_ENTRYPOINTS
196196
libc.src.fenv.fegetround
197197
libc.src.fenv.feholdexcept
198198
libc.src.fenv.fesetenv
199+
libc.src.fenv.fesetexcept
199200
libc.src.fenv.fesetexceptflag
200201
libc.src.fenv.fesetround
201202
libc.src.fenv.feraiseexcept

libc/config/baremetal/riscv/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ set(TARGET_LIBM_ENTRYPOINTS
196196
libc.src.fenv.fegetround
197197
libc.src.fenv.feholdexcept
198198
libc.src.fenv.fesetenv
199+
libc.src.fenv.fesetexcept
199200
libc.src.fenv.fesetexceptflag
200201
libc.src.fenv.fesetround
201202
libc.src.fenv.feraiseexcept

libc/config/darwin/arm/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ set(TARGET_LIBM_ENTRYPOINTS
107107
libc.src.fenv.fegetround
108108
libc.src.fenv.feholdexcept
109109
libc.src.fenv.fesetenv
110+
libc.src.fenv.fesetexcept
110111
libc.src.fenv.fesetexceptflag
111112
libc.src.fenv.fesetround
112113
libc.src.fenv.feraiseexcept

libc/config/darwin/x86_64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ set(TARGET_LIBM_ENTRYPOINTS
101101
# libc.src.fenv.fegetround
102102
# libc.src.fenv.feholdexcept
103103
# libc.src.fenv.fesetenv
104+
# libc.src.fenv.fesetexcept
104105
# libc.src.fenv.fesetexceptflag
105106
# libc.src.fenv.fesetround
106107
# libc.src.fenv.feraiseexcept

libc/config/linux/aarch64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ set(TARGET_LIBM_ENTRYPOINTS
319319
libc.src.fenv.fegetround
320320
libc.src.fenv.feholdexcept
321321
libc.src.fenv.fesetenv
322+
libc.src.fenv.fesetexcept
322323
libc.src.fenv.fesetexceptflag
323324
libc.src.fenv.fesetround
324325
libc.src.fenv.feraiseexcept

libc/config/linux/arm/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ set(TARGET_LIBM_ENTRYPOINTS
187187
libc.src.fenv.fegetround
188188
libc.src.fenv.feholdexcept
189189
libc.src.fenv.fesetenv
190+
libc.src.fenv.fesetexcept
190191
libc.src.fenv.fesetexceptflag
191192
libc.src.fenv.fesetround
192193
libc.src.fenv.feraiseexcept

libc/config/linux/riscv/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ set(TARGET_LIBM_ENTRYPOINTS
327327
libc.src.fenv.fegetround
328328
libc.src.fenv.feholdexcept
329329
libc.src.fenv.fesetenv
330+
libc.src.fenv.fesetexcept
330331
libc.src.fenv.fesetexceptflag
331332
libc.src.fenv.fesetround
332333
libc.src.fenv.feraiseexcept

libc/config/linux/x86_64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ set(TARGET_LIBM_ENTRYPOINTS
337337
libc.src.fenv.fegetround
338338
libc.src.fenv.feholdexcept
339339
libc.src.fenv.fesetenv
340+
libc.src.fenv.fesetexcept
340341
libc.src.fenv.fesetexceptflag
341342
libc.src.fenv.fesetround
342343
libc.src.fenv.feraiseexcept

libc/config/windows/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ set(TARGET_LIBM_ENTRYPOINTS
105105
libc.src.fenv.fegetround
106106
libc.src.fenv.feholdexcept
107107
libc.src.fenv.fesetenv
108+
libc.src.fenv.fesetexcept
108109
libc.src.fenv.fesetexceptflag
109110
libc.src.fenv.fesetround
110111
libc.src.fenv.feraiseexcept

libc/docs/c23.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Additions:
2020

2121
* fenv.h
2222

23-
* fesetexcept
23+
* fesetexcept |check|
2424
* fetestexceptflag
2525
* fegetmode
2626
* fesetmode

libc/spec/stdc.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ def StdC : StandardSpec<"stdc"> {
179179
RetValSpec<IntType>,
180180
[ArgSpec<FExceptTPtr>, ArgSpec<IntType>]
181181
>,
182+
FunctionSpec<
183+
"fesetexcept",
184+
RetValSpec<IntType>,
185+
[ArgSpec<IntType>]
186+
>,
182187
FunctionSpec<
183188
"fesetexceptflag",
184189
RetValSpec<IntType>,

libc/src/fenv/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ add_entrypoint_object(
102102
-O2
103103
)
104104

105+
add_entrypoint_object(
106+
fesetexcept
107+
SRCS
108+
fesetexcept.cpp
109+
HDRS
110+
fesetexcept.h
111+
DEPENDS
112+
libc.include.fenv
113+
libc.src.__support.FPUtil.fenv_impl
114+
COMPILE_OPTIONS
115+
-O2
116+
)
117+
105118
add_entrypoint_object(
106119
fesetexceptflag
107120
SRCS

libc/src/fenv/fesetexcept.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//===-- Implementation of fesetexcept function ----------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "src/fenv/fesetexcept.h"
10+
#include "src/__support/FPUtil/FEnvImpl.h"
11+
#include "src/__support/common.h"
12+
13+
namespace LIBC_NAMESPACE {
14+
15+
LLVM_LIBC_FUNCTION(int, fesetexcept, (int excepts)) {
16+
return fputil::set_except(excepts);
17+
}
18+
19+
} // namespace LIBC_NAMESPACE

libc/src/fenv/fesetexcept.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//===-- Implementation header for fesetexcept -------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_LIBC_SRC_FENV_FESETEXCEPT_H
10+
#define LLVM_LIBC_SRC_FENV_FESETEXCEPT_H
11+
12+
namespace LIBC_NAMESPACE {
13+
14+
int fesetexcept(int excepts);
15+
16+
} // namespace LIBC_NAMESPACE
17+
18+
#endif // LLVM_LIBC_SRC_FENV_FESETEXCEPT_H

libc/test/src/fenv/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ add_libc_unittest(
2020
DEPENDS
2121
libc.src.fenv.feclearexcept
2222
libc.src.fenv.feraiseexcept
23+
libc.src.fenv.fesetexcept
2324
libc.src.fenv.fetestexcept
2425
libc.src.__support.FPUtil.fenv_impl
2526
)

libc/test/src/fenv/exception_status_test.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
//===-- Unittests for feclearexcept, feraiseexcept and fetestexpect -------===//
1+
//===-- Unittests for feclearexcept, feraiseexcept, fetestexpect ----------===//
2+
//===-- and fesetexcept ---------------------------------------------------===//
23
//
34
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45
// See https://llvm.org/LICENSE.txt for license information.
@@ -8,6 +9,7 @@
89

910
#include "src/fenv/feclearexcept.h"
1011
#include "src/fenv/feraiseexcept.h"
12+
#include "src/fenv/fesetexcept.h"
1113
#include "src/fenv/fetestexcept.h"
1214

1315
#include "src/__support/FPUtil/FEnvImpl.h"
@@ -38,6 +40,11 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndTest) {
3840
ASSERT_EQ(r, 0);
3941
s = LIBC_NAMESPACE::fetestexcept(e);
4042
ASSERT_EQ(s, 0);
43+
44+
r = LIBC_NAMESPACE::fesetexcept(e);
45+
ASSERT_EQ(r, 0);
46+
s = LIBC_NAMESPACE::fetestexcept(e);
47+
ASSERT_EQ(s, e);
4148
}
4249

4350
for (int e1 : excepts) {
@@ -52,6 +59,11 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndTest) {
5259
ASSERT_EQ(r, 0);
5360
s = LIBC_NAMESPACE::fetestexcept(e);
5461
ASSERT_EQ(s, 0);
62+
63+
r = LIBC_NAMESPACE::fesetexcept(e);
64+
ASSERT_EQ(r, 0);
65+
s = LIBC_NAMESPACE::fetestexcept(e);
66+
ASSERT_EQ(s, e);
5567
}
5668
}
5769

@@ -68,6 +80,11 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndTest) {
6880
ASSERT_EQ(r, 0);
6981
s = LIBC_NAMESPACE::fetestexcept(e);
7082
ASSERT_EQ(s, 0);
83+
84+
r = LIBC_NAMESPACE::fesetexcept(e);
85+
ASSERT_EQ(r, 0);
86+
s = LIBC_NAMESPACE::fetestexcept(e);
87+
ASSERT_EQ(s, e);
7188
}
7289
}
7390
}
@@ -86,6 +103,11 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndTest) {
86103
ASSERT_EQ(r, 0);
87104
s = LIBC_NAMESPACE::fetestexcept(e);
88105
ASSERT_EQ(s, 0);
106+
107+
r = LIBC_NAMESPACE::fesetexcept(e);
108+
ASSERT_EQ(r, 0);
109+
s = LIBC_NAMESPACE::fetestexcept(e);
110+
ASSERT_EQ(s, e);
89111
}
90112
}
91113
}
@@ -106,6 +128,11 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndTest) {
106128
ASSERT_EQ(r, 0);
107129
s = LIBC_NAMESPACE::fetestexcept(e);
108130
ASSERT_EQ(s, 0);
131+
132+
r = LIBC_NAMESPACE::fesetexcept(e);
133+
ASSERT_EQ(r, 0);
134+
s = LIBC_NAMESPACE::fetestexcept(e);
135+
ASSERT_EQ(s, e);
109136
}
110137
}
111138
}
@@ -116,4 +143,9 @@ TEST(LlvmLibcExceptionStatusTest, RaiseAndTest) {
116143
ASSERT_EQ(r, 0);
117144
int s = LIBC_NAMESPACE::fetestexcept(ALL_EXCEPTS);
118145
ASSERT_EQ(s, ALL_EXCEPTS);
146+
147+
r = LIBC_NAMESPACE::fesetexcept(ALL_EXCEPTS);
148+
ASSERT_EQ(r, 0);
149+
s = LIBC_NAMESPACE::fetestexcept(ALL_EXCEPTS);
150+
ASSERT_EQ(s, ALL_EXCEPTS);
119151
}

utils/bazel/llvm-project-overlay/libc/BUILD.bazel

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,16 @@ libc_function(
11941194
],
11951195
)
11961196

1197+
libc_function(
1198+
name = "fesetexcept",
1199+
srcs = ["src/fenv/fesetexcept.cpp"],
1200+
hdrs = ["src/fenv/fesetexcept.h"],
1201+
deps = [
1202+
":__support_common",
1203+
":__support_fputil_fenv_impl",
1204+
],
1205+
)
1206+
11971207
libc_function(
11981208
name = "fegetexceptflag",
11991209
srcs = ["src/fenv/fegetexceptflag.cpp"],

utils/bazel/llvm-project-overlay/libc/test/src/fenv/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ libc_test(
1616
libc_function_deps = [
1717
"//libc:feclearexcept",
1818
"//libc:feraiseexcept",
19+
"//libc:fesetexcept",
1920
"//libc:fetestexcept",
2021
],
2122
deps = [

0 commit comments

Comments
 (0)