llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: None (lntue)

<details>
<summary>Changes</summary>

A draft PR to make `__builtin_expf` constexpr using LLVM libc math 
implementation.

---

Patch is 244.33 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/140841.diff


429 Files Affected:

- (modified) clang/include/clang/Basic/Builtins.td (+16-2) 
- (modified) clang/lib/AST/ByteCode/InterpBuiltin.cpp (+22) 
- (modified) clang/lib/AST/ExprConstant.cpp (+19) 
- (modified) clang/test/CMakeLists.txt (+1) 
- (modified) clang/test/Preprocessor/feature_tests.cpp (+10) 
- (added) clang/test/Sema/constant-builtins-exp.cpp (+12) 
- (modified) clang/test/lit.cfg.py (+3) 
- (modified) clang/test/lit.site.cfg.py.in (+1) 
- (modified) libc/cmake/modules/LLVMLibCCompileOptionRules.cmake (+4) 
- (modified) libc/cmake/modules/LLVMLibCTestRules.cmake (+3-1) 
- (modified) libc/docs/configure.rst (+1-1) 
- (modified) libc/docs/dev/code_style.rst (+2-2) 
- (added) libc/shared/math.h (+22) 
- (modified) libc/src/__support/CMakeLists.txt (+2) 
- (modified) libc/src/__support/FPUtil/FEnvImpl.h (+1-1) 
- (modified) libc/src/__support/File/dir.cpp (+1-1) 
- (modified) libc/src/__support/File/file.cpp (+1-1) 
- (modified) libc/src/__support/File/linux/file.cpp (+1-1) 
- (modified) libc/src/__support/File/linux/lseekImpl.h (+1-1) 
- (modified) libc/src/__support/HashTable/randomness.h (+1-1) 
- (modified) libc/src/__support/OSUtil/linux/fcntl.cpp (+1-1) 
- (modified) libc/src/__support/OSUtil/linux/vdso.cpp (+1-1) 
- (modified) libc/src/__support/StringUtil/tables/linux_extension_errors.h 
(+1-1) 
- (added) libc/src/__support/libc_errno.h (+93) 
- (added) libc/src/__support/math/CMakeLists.txt () 
- (added) libc/src/__support/math/exp_float_constants.h (+145) 
- (added) libc/src/__support/math/expf.h (+116) 
- (modified) libc/src/__support/threads/linux/thread.cpp (+1-1) 
- (modified) libc/src/dirent/closedir.cpp (+1-1) 
- (modified) libc/src/dirent/opendir.cpp (+1-1) 
- (modified) libc/src/dirent/readdir.cpp (+1-1) 
- (modified) libc/src/errno/CMakeLists.txt (-15) 
- (modified) libc/src/errno/libc_errno.cpp (+5-46) 
- (removed) libc/src/errno/libc_errno.h (-47) 
- (modified) libc/src/fcntl/linux/creat.cpp (+1-1) 
- (modified) libc/src/fcntl/linux/open.cpp (+1-1) 
- (modified) libc/src/fcntl/linux/openat.cpp (+1-1) 
- (modified) libc/src/inttypes/strtoimax.cpp (+1-1) 
- (modified) libc/src/inttypes/strtoumax.cpp (+1-1) 
- (modified) libc/src/math/generic/exp10m1f.cpp (+1-1) 
- (modified) libc/src/math/generic/exp2m1f.cpp (+1-1) 
- (modified) libc/src/math/generic/expf.cpp (+2-95) 
- (modified) libc/src/math/generic/nan.cpp (+1-1) 
- (modified) libc/src/math/generic/nanf.cpp (+1-1) 
- (modified) libc/src/math/generic/nanf128.cpp (+1-1) 
- (modified) libc/src/math/generic/nanf16.cpp (+1-1) 
- (modified) libc/src/math/generic/nanl.cpp (+1-1) 
- (modified) libc/src/poll/linux/poll.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_atfork.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_attr_setdetachstate.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_attr_setguardsize.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_attr_setstack.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_attr_setstacksize.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_condattr_setclock.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_condattr_setpshared.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_create.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_key_create.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_key_delete.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_mutexattr_setpshared.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_mutexattr_setrobust.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_mutexattr_settype.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_rwlock_timedrdlock.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_rwlock_trywrlock.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_rwlock_unlock.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_rwlockattr_setkind_np.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_rwlockattr_setpshared.cpp (+1-1) 
- (modified) libc/src/pthread/pthread_setspecific.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_get_priority_max.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_get_priority_min.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_getaffinity.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_getparam.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_getscheduler.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_rr_get_interval.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_setaffinity.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_setparam.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_setscheduler.cpp (+1-1) 
- (modified) libc/src/sched/linux/sched_yield.cpp (+1-1) 
- (modified) libc/src/search/hcreate.cpp (+1-1) 
- (modified) libc/src/search/hcreate_r.cpp (+1-1) 
- (modified) libc/src/search/hdestroy_r.cpp (+1-1) 
- (modified) libc/src/search/hsearch.cpp (+1-1) 
- (modified) libc/src/search/hsearch_r.cpp (+1-1) 
- (modified) libc/src/signal/linux/kill.cpp (+1-1) 
- (modified) libc/src/signal/linux/sigaction.cpp (+1-1) 
- (modified) libc/src/signal/linux/sigaddset.cpp (+1-1) 
- (modified) libc/src/signal/linux/sigaltstack.cpp (+1-1) 
- (modified) libc/src/signal/linux/sigdelset.cpp (+1-1) 
- (modified) libc/src/signal/linux/sigemptyset.cpp (+1-1) 
- (modified) libc/src/signal/linux/sigfillset.cpp (+1-1) 
- (modified) libc/src/signal/linux/sigprocmask.cpp (+1-1) 
- (modified) libc/src/spawn/posix_spawn_file_actions_addclose.cpp (+1-1) 
- (modified) libc/src/spawn/posix_spawn_file_actions_adddup2.cpp (+1-1) 
- (modified) libc/src/spawn/posix_spawn_file_actions_addopen.cpp (+1-1) 
- (modified) libc/src/spawn/posix_spawn_file_actions_destroy.cpp (+1-1) 
- (modified) libc/src/stdio/fopencookie.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fclose.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fflush.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fgetc.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fgetc_unlocked.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fgets.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fopen.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fputc.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fputs.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fread.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fread_unlocked.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fseek.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fseeko.cpp (+1-1) 
- (modified) libc/src/stdio/generic/ftell.cpp (+1-1) 
- (modified) libc/src/stdio/generic/ftello.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fwrite.cpp (+1-1) 
- (modified) libc/src/stdio/generic/fwrite_unlocked.cpp (+1-1) 
- (modified) libc/src/stdio/generic/getc.cpp (+1-1) 
- (modified) libc/src/stdio/generic/getc_unlocked.cpp (+1-1) 
- (modified) libc/src/stdio/generic/getchar.cpp (+1-1) 
- (modified) libc/src/stdio/generic/getchar_unlocked.cpp (+1-1) 
- (modified) libc/src/stdio/generic/putc.cpp (+1-1) 
- (modified) libc/src/stdio/generic/putchar.cpp (+1-1) 
- (modified) libc/src/stdio/generic/puts.cpp (+1-1) 
- (modified) libc/src/stdio/gpu/fprintf.cpp (+1-1) 
- (modified) libc/src/stdio/gpu/fputs.cpp (+1-1) 
- (modified) libc/src/stdio/gpu/printf.cpp (+1-1) 
- (modified) libc/src/stdio/gpu/puts.cpp (+1-1) 
- (modified) libc/src/stdio/gpu/vfprintf.cpp (+1-1) 
- (modified) libc/src/stdio/gpu/vprintf.cpp (+1-1) 
- (modified) libc/src/stdio/linux/fdopen.cpp (+1-1) 
- (modified) libc/src/stdio/linux/remove.cpp (+1-1) 
- (modified) libc/src/stdio/linux/rename.cpp (+1-1) 
- (modified) libc/src/stdio/printf_core/parser.h (+1-1) 
- (modified) libc/src/stdio/setbuf.cpp (+1-1) 
- (modified) libc/src/stdio/setvbuf.cpp (+1-1) 
- (modified) libc/src/stdlib/atof.cpp (+1-1) 
- (modified) libc/src/stdlib/atoi.cpp (+1-1) 
- (modified) libc/src/stdlib/atol.cpp (+1-1) 
- (modified) libc/src/stdlib/atoll.cpp (+1-1) 
- (modified) libc/src/stdlib/strtod.cpp (+1-1) 
- (modified) libc/src/stdlib/strtod_l.cpp (+1-1) 
- (modified) libc/src/stdlib/strtof.cpp (+1-1) 
- (modified) libc/src/stdlib/strtof_l.cpp (+1-1) 
- (modified) libc/src/stdlib/strtol.cpp (+1-1) 
- (modified) libc/src/stdlib/strtol_l.cpp (+1-1) 
- (modified) libc/src/stdlib/strtold.cpp (+1-1) 
- (modified) libc/src/stdlib/strtold_l.cpp (+1-1) 
- (modified) libc/src/stdlib/strtoll.cpp (+1-1) 
- (modified) libc/src/stdlib/strtoll_l.cpp (+1-1) 
- (modified) libc/src/stdlib/strtoul.cpp (+1-1) 
- (modified) libc/src/stdlib/strtoul_l.cpp (+1-1) 
- (modified) libc/src/stdlib/strtoull.cpp (+1-1) 
- (modified) libc/src/stdlib/strtoull_l.cpp (+1-1) 
- (modified) libc/src/string/strdup.cpp (+1-1) 
- (modified) libc/src/sys/auxv/linux/getauxval.cpp (+1-1) 
- (modified) libc/src/sys/epoll/linux/epoll_create.cpp (+1-1) 
- (modified) libc/src/sys/epoll/linux/epoll_create1.cpp (+1-1) 
- (modified) libc/src/sys/epoll/linux/epoll_ctl.cpp (+1-1) 
- (modified) libc/src/sys/epoll/linux/epoll_pwait.cpp (+1-1) 
- (modified) libc/src/sys/epoll/linux/epoll_pwait2.cpp (+1-1) 
- (modified) libc/src/sys/epoll/linux/epoll_wait.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/madvise.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/mincore.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/mlock.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/mlock2.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/mlockall.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/mmap.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/mprotect.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/mremap.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/msync.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/munlock.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/munlockall.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/munmap.cpp (+2-2) 
- (modified) libc/src/sys/mman/linux/remap_file_pages.cpp (+1-1) 
- (modified) libc/src/sys/mman/linux/shm_common.h (+1-1) 
- (modified) libc/src/sys/prctl/linux/prctl.cpp (+1-1) 
- (modified) libc/src/sys/random/linux/getrandom.cpp (+1-1) 
- (modified) libc/src/sys/resource/linux/getrlimit.cpp (+1-1) 
- (modified) libc/src/sys/resource/linux/setrlimit.cpp (+1-1) 
- (modified) libc/src/sys/select/linux/select.cpp (+1-1) 
- (modified) libc/src/sys/sendfile/linux/sendfile.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/bind.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/recv.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/recvfrom.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/recvmsg.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/send.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/sendmsg.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/sendto.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/socket.cpp (+1-1) 
- (modified) libc/src/sys/socket/linux/socketpair.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/chmod.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/fchmod.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/fchmodat.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/fstat.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/lstat.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/mkdir.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/mkdirat.cpp (+1-1) 
- (modified) libc/src/sys/stat/linux/stat.cpp (+1-1) 
- (modified) libc/src/sys/statvfs/linux/statfs_utils.h (+1-1) 
- (modified) libc/src/sys/time/linux/getitimer.cpp (+1-1) 
- (modified) libc/src/sys/time/linux/setitimer.cpp (+1-1) 
- (modified) libc/src/sys/time/linux/utimes.cpp (+1-1) 
- (modified) libc/src/sys/uio/linux/readv.cpp (+1-1) 
- (modified) libc/src/sys/uio/linux/writev.cpp (+1-1) 
- (modified) libc/src/sys/utsname/linux/uname.cpp (+1-1) 
- (modified) libc/src/sys/wait/wait4Impl.h (+1-1) 
- (modified) libc/src/termios/linux/cfsetispeed.cpp (+1-1) 
- (modified) libc/src/termios/linux/cfsetospeed.cpp (+1-1) 
- (modified) libc/src/termios/linux/tcdrain.cpp (+1-1) 
- (modified) libc/src/termios/linux/tcflow.cpp (+1-1) 
- (modified) libc/src/termios/linux/tcflush.cpp (+1-1) 
- (modified) libc/src/termios/linux/tcgetattr.cpp (+1-1) 
- (modified) libc/src/termios/linux/tcgetsid.cpp (+1-1) 
- (modified) libc/src/termios/linux/tcsendbreak.cpp (+1-1) 
- (modified) libc/src/termios/linux/tcsetattr.cpp (+1-1) 
- (modified) libc/src/threads/thrd_create.cpp (+1-1) 
- (modified) libc/src/time/linux/clock.cpp (+1-1) 
- (modified) libc/src/time/linux/clock_gettime.cpp (+1-1) 
- (modified) libc/src/time/linux/gettimeofday.cpp (+1-1) 
- (modified) libc/src/time/linux/nanosleep.cpp (+1-1) 
- (modified) libc/src/time/linux/timespec_get.cpp (+1-1) 
- (modified) libc/src/time/time.cpp (+1-1) 
- (modified) libc/src/time/time_utils.h (+1-1) 
- (modified) libc/src/time/windows/clock_getres.cpp (+1-1) 
- (modified) libc/src/unistd/linux/access.cpp (+1-1) 
- (modified) libc/src/unistd/linux/chdir.cpp (+1-1) 
- (modified) libc/src/unistd/linux/close.cpp (+1-1) 
- (modified) libc/src/unistd/linux/dup.cpp (+1-1) 
- (modified) libc/src/unistd/linux/dup2.cpp (+1-1) 
- (modified) libc/src/unistd/linux/dup3.cpp (+1-1) 
- (modified) libc/src/unistd/linux/execv.cpp (+1-1) 
- (modified) libc/src/unistd/linux/execve.cpp (+1-1) 
- (modified) libc/src/unistd/linux/fchdir.cpp (+1-1) 
- (modified) libc/src/unistd/linux/fork.cpp (+1-1) 
- (modified) libc/src/unistd/linux/fsync.cpp (+1-1) 
- (modified) libc/src/unistd/linux/ftruncate.cpp (+1-1) 
- (modified) libc/src/unistd/linux/getcwd.cpp (+1-1) 
- (modified) libc/src/unistd/linux/getentropy.cpp (+1-1) 
- (modified) libc/src/unistd/linux/getsid.cpp (+1-1) 
- (modified) libc/src/unistd/linux/isatty.cpp (+1-1) 
- (modified) libc/src/unistd/linux/link.cpp (+1-1) 
- (modified) libc/src/unistd/linux/linkat.cpp (+1-1) 
- (modified) libc/src/unistd/linux/lseek.cpp (+1-1) 
- (modified) libc/src/unistd/linux/pathconf.cpp (+1-1) 
- (modified) libc/src/unistd/linux/pathconf_utils.cpp (+1-1) 
- (modified) libc/src/unistd/linux/pipe.cpp (+2-2) 
- (modified) libc/src/unistd/linux/pipe2.cpp (+1-1) 
- (modified) libc/src/unistd/linux/pread.cpp (+3-3) 
- (modified) libc/src/unistd/linux/pwrite.cpp (+1-1) 
- (modified) libc/src/unistd/linux/read.cpp (+2-2) 
- (modified) libc/src/unistd/linux/readlink.cpp (+1-1) 
- (modified) libc/src/unistd/linux/readlinkat.cpp (+1-1) 
- (modified) libc/src/unistd/linux/rmdir.cpp (+1-1) 
- (modified) libc/src/unistd/linux/symlink.cpp (+1-1) 
- (modified) libc/src/unistd/linux/symlinkat.cpp (+1-1) 
- (modified) libc/src/unistd/linux/syscall.cpp (+1-1) 
- (modified) libc/src/unistd/linux/sysconf.cpp (+1-1) 
- (modified) libc/src/unistd/linux/truncate.cpp (+1-1) 
- (modified) libc/src/unistd/linux/unlink.cpp (+1-1) 
- (modified) libc/src/unistd/linux/unlinkat.cpp (+1-1) 
- (modified) libc/src/unistd/linux/write.cpp (+1-1) 
- (modified) libc/src/unistd/windows/getentropy.cpp (+1-1) 
- (modified) libc/test/UnitTest/ErrnoCheckingTest.h (+1-1) 
- (modified) libc/test/UnitTest/ErrnoSetterMatcher.h (+1-1) 
- (modified) libc/test/integration/src/pthread/pthread_create_test.cpp (+1-1) 
- (modified) libc/test/integration/src/pthread/pthread_join_test.cpp (+1-1) 
- (modified) libc/test/integration/src/pthread/pthread_name_test.cpp (+1-1) 
- (modified) libc/test/integration/src/unistd/getcwd_test.cpp (+1-1) 
- (modified) libc/test/integration/startup/linux/tls_test.cpp (+1-1) 
- (modified) libc/test/src/__support/str_to_fp_test.h (+1-1) 
- (modified) libc/test/src/__support/str_to_integer_test.cpp (+1-1) 
- (modified) libc/test/src/dirent/dirent_test.cpp (+1-1) 
- (modified) libc/test/src/errno/errno_test.cpp (+1-1) 
- (modified) libc/test/src/fcntl/creat_test.cpp (+1-1) 
- (modified) libc/test/src/fcntl/fcntl_test.cpp (+1-1) 
- (modified) libc/test/src/fcntl/openat_test.cpp (+1-1) 
- (modified) libc/test/src/math/acosf_test.cpp (+1-1) 
- (modified) libc/test/src/math/acoshf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/acoshf_test.cpp (+1-1) 
- (modified) libc/test/src/math/asinf_test.cpp (+1-1) 
- (modified) libc/test/src/math/asinhf_test.cpp (+1-1) 
- (modified) libc/test/src/math/atanf_test.cpp (+1-1) 
- (modified) libc/test/src/math/atanhf_test.cpp (+1-1) 
- (modified) libc/test/src/math/cosf_test.cpp (+1-1) 
- (modified) libc/test/src/math/coshf_test.cpp (+1-1) 
- (modified) libc/test/src/math/cospif_test.cpp (+1-1) 
- (modified) libc/test/src/math/exp10_test.cpp (+1-1) 
- (modified) libc/test/src/math/exp10f_test.cpp (+1-1) 
- (modified) libc/test/src/math/exp10m1f_test.cpp (+1-1) 
- (modified) libc/test/src/math/exp2_test.cpp (+1-1) 
- (modified) libc/test/src/math/exp2f_test.cpp (+1-1) 
- (modified) libc/test/src/math/exp2m1f_test.cpp (+1-1) 
- (modified) libc/test/src/math/exp_test.cpp (+1-1) 
- (modified) libc/test/src/math/expf_test.cpp (+1-1) 
- (modified) libc/test/src/math/expm1_test.cpp (+1-1) 
- (modified) libc/test/src/math/expm1f_test.cpp (+1-1) 
- (modified) libc/test/src/math/log10_test.cpp (+1-1) 
- (modified) libc/test/src/math/log1p_test.cpp (+1-1) 
- (modified) libc/test/src/math/log1pf_test.cpp (+1-1) 
- (modified) libc/test/src/math/log2_test.cpp (+1-1) 
- (modified) libc/test/src/math/log2f_test.cpp (+1-1) 
- (modified) libc/test/src/math/log_test.cpp (+1-1) 
- (modified) libc/test/src/math/sincosf_test.cpp (+1-1) 
- (modified) libc/test/src/math/sinf_test.cpp (+1-1) 
- (modified) libc/test/src/math/sinhf_test.cpp (+1-1) 
- (modified) libc/test/src/math/sinpif_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/FModTest.h (+1-1) 
- (modified) libc/test/src/math/smoke/acos_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/acosf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/acosf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/acoshf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/acoshf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/acospif16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/asinf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/asinf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/asinhf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/asinhf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/atan2f_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/atanf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/atanhf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/atanhf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/cosf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/cosf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/coshf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/coshf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/cospif16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/cospif_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp10_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp10f16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp10f_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp10m1f16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp10m1f_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp2_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp2f16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp2f_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp2m1f16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp2m1f_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/exp_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/expf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/expf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/expm1_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/expm1f16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/expm1f_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log10_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log10f16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log1p_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log1pf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log2_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log2f16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log2f_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/log_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/logf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/sincosf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/sinf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/sinf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/sinhf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/sinhf_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/sinpif16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/sinpif_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/tanf16_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/tanf_test.cpp (+1-1) 


``````````diff
diff --git a/clang/include/clang/Basic/Builtins.td 
b/clang/include/clang/Basic/Builtins.td
index 187d3b5ed24a7..bbb443e249fae 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -161,7 +161,22 @@ def ErfcF128 : Builtin {
   let Prototype = "__float128(__float128)";
 }
 
-def ExpF16F128 : Builtin, F16F128MathTemplate {
+def BIExpF : Builtin {
+  let Spellings = ["__builtin_expf"];
+#ifdef LLVM_INTEGRATE_LIBC
+  let Attributes = [FunctionWithBuiltinPrefix, NoThrow, Const, Constexpr];
+#else
+  let Attributes = [FunctionWithBuiltinPrefix, NoThrow,
+                    ConstIgnoringErrnoAndExceptions];
+#endif // LLVM_INTEGRATE_LIBC
+  let Prototype = "float(float)";
+}
+
+def BIExp
+    : Builtin,
+      Template<["double", "long double", "_Float16", "__float128"], ["", "l",
+                                                                     "f16",
+                                                                     "f128"]> {
   let Spellings = ["__builtin_exp"];
   let Attributes = [FunctionWithBuiltinPrefix, NoThrow, 
ConstIgnoringErrnoAndExceptions];
   let Prototype = "T(T)";
@@ -3742,7 +3757,6 @@ def Exp : FPMathTemplate, LibBuiltin<"math.h"> {
   let Spellings = ["exp"];
   let Attributes = [NoThrow, ConstIgnoringErrnoAndExceptions];
   let Prototype = "T(T)";
-  let AddBuiltinPrefixedAlias = 1;
 }
 
 def Exp2 : FPMathTemplate, LibBuiltin<"math.h"> {
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp 
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 8edc6248dcbfd..be64d93fb1345 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -18,6 +18,7 @@
 #include "clang/Basic/TargetBuiltins.h"
 #include "clang/Basic/TargetInfo.h"
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/Config/llvm-config.h"
 #include "llvm/Support/SipHash.h"
 
 namespace clang {
@@ -419,6 +420,13 @@ static bool interp__builtin_copysign(InterpState &S, 
CodePtr OpPC,
   return true;
 }
 
+static bool interp__builtin_exp(InterpState &S, CodePtr OpPC,
+                                const InterpFrame *Frame) {
+  APFloat Result = exp(S.Stk.peek<Floating>().getAPFloat());
+  S.Stk.push<Floating>(Floating(Result));
+  return true;
+}
+
 static bool interp__builtin_fmin(InterpState &S, CodePtr OpPC,
                                  const InterpFrame *Frame, bool IsNumBuiltin) {
   const Floating &LHS = S.Stk.peek<Floating>(align(primSize(PT_Float)) * 2);
@@ -2315,6 +2323,20 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, 
const CallExpr *Call,
       return false;
     break;
 
+  case Builtin::BI__builtin_exp:
+  case Builtin::BI__builtin_expl:
+  case Builtin::BI__builtin_expf16:
+  case Builtin::BI__builtin_expf128:
+    return false;
+  case Builtin::BI__builtin_expf:
+#ifdef LLVM_INTEGRATE_LIBC
+    if (!interp__builtin_exp(S, OpPC, Frame))
+      return false;
+    break;
+#else
+    return false;
+#endif // LLVM_INTEGRATE_LIBC
+
   case Builtin::BI__builtin_fmin:
   case Builtin::BI__builtin_fminf:
   case Builtin::BI__builtin_fminl:
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index e9a269337404a..f37e916f67560 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -57,6 +57,7 @@
 #include "llvm/ADT/Sequence.h"
 #include "llvm/ADT/SmallBitVector.h"
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/Config/llvm-config.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/SaveAndRestore.h"
@@ -15711,6 +15712,24 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr 
*E) {
     return true;
   }
 
+  // FIXME: allow other __builtin_exp* to be constexpr.
+  case Builtin::BI__builtin_exp:
+  case Builtin::BI__builtin_expl:
+  case Builtin::BI__builtin_expf16:
+  case Builtin::BI__builtin_expf128:
+    return false;
+  case Builtin::BI__builtin_expf: {
+#ifdef LLVM_INTEGRATE_LIBC
+    APFloat Input(0.);
+    if (!EvaluateFloat(E->getArg(0), Input, Info))
+      return false;
+    Result = exp(Input);
+    return true;
+#else
+    return false;
+#endif // LLVM_INTEGRATE_LIBC
+  }
+
   case Builtin::BI__builtin_fmax:
   case Builtin::BI__builtin_fmaxf:
   case Builtin::BI__builtin_fmaxl:
diff --git a/clang/test/CMakeLists.txt b/clang/test/CMakeLists.txt
index 35a8042ac0e0a..5960601a90e8d 100644
--- a/clang/test/CMakeLists.txt
+++ b/clang/test/CMakeLists.txt
@@ -27,6 +27,7 @@ llvm_canonicalize_cmake_booleans(
   LLVM_TOOL_LLVM_DRIVER_BUILD
   LLVM_INCLUDE_SPIRV_TOOLS_TESTS
   LLVM_EXPERIMENTAL_KEY_INSTRUCTIONS
+  LLVM_INTEGRATE_LIBC
   )
 
 configure_lit_site_cfg(
diff --git a/clang/test/Preprocessor/feature_tests.cpp 
b/clang/test/Preprocessor/feature_tests.cpp
index 029f446113af4..7fec4fef9835b 100644
--- a/clang/test/Preprocessor/feature_tests.cpp
+++ b/clang/test/Preprocessor/feature_tests.cpp
@@ -64,6 +64,16 @@
 #error Clang should have these constexpr builtins
 #endif
 
+#ifdef LLVM_INTEGRATE_LIBC
+#if !__has_constexpr_builtin(__builtin_expf)
+#error Clang should have these constexpr builtins
+#endif
+#else
+#if __has_constexpr_builtin(__builtin_expf)
+#error This builtin should not be constexpr in Clang
+#endif
+#endif // LLVM_INTEGRATE_LIBC
+
 #if !__has_constexpr_builtin(__builtin_convertvector)
 #error Clang should have these constexpr builtins
 #endif
diff --git a/clang/test/Sema/constant-builtins-exp.cpp 
b/clang/test/Sema/constant-builtins-exp.cpp
new file mode 100644
index 0000000000000..6e9a2a070c192
--- /dev/null
+++ b/clang/test/Sema/constant-builtins-exp.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify 
-fexperimental-new-constant-interpreter %s
+// REQUIRES: llvm_integrate_libc
+// expected-no-diagnostics
+
+constexpr float Inf = __builtin_inff();
+constexpr float NegInf = -__builtin_inff();
+
+static_assert(Inf == __builtin_expf(Inf));
+static_assert(0.0f == __builtin_expf(NegInf));
+static_assert(1.0f == __builtin_expf(0.0f));
+static_assert(0x1.5bf0a8p1f == __builtin_expf(1.0f));
diff --git a/clang/test/lit.cfg.py b/clang/test/lit.cfg.py
index 2b35bb5dcbdaf..a57e33ae70802 100644
--- a/clang/test/lit.cfg.py
+++ b/clang/test/lit.cfg.py
@@ -385,3 +385,6 @@ def calculate_arch_features(arch_string):
 # possibly be present in system and user configuration files, so disable
 # default configs for the test runs.
 config.environment["CLANG_NO_DEFAULT_CONFIG"] = "1"
+
+if config.llvm_integrate_libc:
+    config.available_features.add("llvm_integrate_libc")
diff --git a/clang/test/lit.site.cfg.py.in b/clang/test/lit.site.cfg.py.in
index 77c5f27f47c92..294d1b077ddf2 100644
--- a/clang/test/lit.site.cfg.py.in
+++ b/clang/test/lit.site.cfg.py.in
@@ -49,6 +49,7 @@ config.have_llvm_driver = @LLVM_TOOL_LLVM_DRIVER_BUILD@
 config.spirv_tools_tests = @LLVM_INCLUDE_SPIRV_TOOLS_TESTS@
 config.substitutions.append(("%llvm-version-major", "@LLVM_VERSION_MAJOR@"))
 config.has_key_instructions = @LLVM_EXPERIMENTAL_KEY_INSTRUCTIONS@
+config.llvm_integrate_libc = @LLVM_INTEGRATE_LIBC@
 
 import lit.llvm
 lit.llvm.initialize(lit_config, config)
diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake 
b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
index 0facb0b9be0c1..a98e7276bef80 100644
--- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
+++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
@@ -106,6 +106,10 @@ function(_get_compile_options_from_config output_var)
     list(APPEND config_options "-DLIBC_MATH=${LIBC_CONF_MATH_OPTIMIZATIONS}")
   endif()
 
+  if(LIBC_CONF_ERRNO_MODE)
+    set(APPEND config_options "-DLIBC_ERRNO_MODE=${LIBC_CONF_ERRNO_MODE}")
+  endif()
+
   set(${output_var} ${config_options} PARENT_SCOPE)
 endfunction(_get_compile_options_from_config)
 
diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake 
b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 3f804694b5bae..0bef0763ec999 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -1,5 +1,6 @@
 function(_get_common_test_compile_options output_var c_test flags)
   _get_compile_options_from_flags(compile_flags ${flags})
+  _get_compile_options_from_config(config_flags)
 
   # Remove -fno-math-errno if it was added.
   if(LIBC_ADD_FNO_MATH_ERRNO)
@@ -9,7 +10,8 @@ function(_get_common_test_compile_options output_var c_test 
flags)
   set(compile_options
       ${LIBC_COMPILE_OPTIONS_DEFAULT}
       ${LIBC_TEST_COMPILE_OPTIONS_DEFAULT}
-      ${compile_flags})
+      ${compile_flags}
+      ${config_flags})
 
   if(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE)
     list(APPEND compile_options "-fpie")
diff --git a/libc/docs/configure.rst b/libc/docs/configure.rst
index 8d53390ae19bf..dee9a63101eb9 100644
--- a/libc/docs/configure.rst
+++ b/libc/docs/configure.rst
@@ -33,7 +33,7 @@ to learn about the defaults for your platform and target.
 * **"general" options**
     - ``LIBC_ADD_NULL_CHECKS``: Add nullptr checks in the library's 
implementations to some functions for which passing nullptr is undefined 
behavior.
 * **"math" options**
-    - ``LIBC_CONF_FREXP_INF_NAN_EXPONENT``: The value written back to the 
second parameter when calling frexp/frexpf/frexpl` with `+/-Inf`/`NaN` is 
unspecified.  Configure an explicit exp value for Inf/NaN inputs.
+    - ``LIBC_CONF_FREXP_INF_NAN_EXPONENT``: The value written back to the 
second parameter when calling frexp/frexpf/frexpl` with `+/-Inf`/`NaN` is 
unspecified.  Configue an explicit exp value for Inf/NaN inputs.
     - ``LIBC_CONF_MATH_OPTIMIZATIONS``: Configures optimizations for math 
functions. Values accepted are LIBC_MATH_SKIP_ACCURATE_PASS, 
LIBC_MATH_SMALL_TABLES, LIBC_MATH_NO_ERRNO, LIBC_MATH_NO_EXCEPT, and 
LIBC_MATH_FAST.
 * **"printf" options**
     - ``LIBC_CONF_PRINTF_DISABLE_FIXED_POINT``: Disable printing fixed point 
values in printf and friends.
diff --git a/libc/docs/dev/code_style.rst b/libc/docs/dev/code_style.rst
index 0bd3a69ae3ffe..86247966552f9 100644
--- a/libc/docs/dev/code_style.rst
+++ b/libc/docs/dev/code_style.rst
@@ -101,7 +101,7 @@ test infrastructure itself can be affected. To avoid 
perturbing the unit test
 infrastructure around the setting of ``errno``, the following rules are to be
 followed:
 
-#. A special macro named ``libc_errno`` defined in ``src/errno/libc_errno.h``
+#. A special macro named ``libc_errno`` defined in 
``src/__support/libc_errno.h``
    should be used when setting ``errno`` from libc runtime code. For example,
    code to set ``errno`` to ``EINVAL`` should be:
 
@@ -117,7 +117,7 @@ followed:
    `ErrorOr 
<https://github.com/llvm/llvm-project/blob/main/libc/src/__support/error_or.h>`_
    to return error values.
 
-#. The header file ``src/errno/libc_errno.h`` is shipped as part of the target
+#. The header file ``src/__support/libc_errno.h`` is shipped as part of the 
target
    corresponding to the ``errno`` entrypoint ``libc.src.errno.errno``. We do
    not in general allow dependencies between entrypoints. However, the 
``errno``
    entrypoint is the only exceptional entrypoint on which other entrypoints
diff --git a/libc/shared/math.h b/libc/shared/math.h
new file mode 100644
index 0000000000000..19c49bb23bc39
--- /dev/null
+++ b/libc/shared/math.h
@@ -0,0 +1,22 @@
+//===-- Floating point math functions ---------------------------*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SHARED_MATH_H
+#define LLVM_LIBC_SHARED_MATH_H
+
+#include "src/__support/math/expf.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using math::expf;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SHARED_FP_BITS_H
diff --git a/libc/src/__support/CMakeLists.txt 
b/libc/src/__support/CMakeLists.txt
index f92499fdbf451..e4a3a7983e4de 100644
--- a/libc/src/__support/CMakeLists.txt
+++ b/libc/src/__support/CMakeLists.txt
@@ -381,3 +381,5 @@ add_subdirectory(HashTable)
 add_subdirectory(fixed_point)
 
 add_subdirectory(time)
+
+add_subdirectory(math)
diff --git a/libc/src/__support/FPUtil/FEnvImpl.h 
b/libc/src/__support/FPUtil/FEnvImpl.h
index 4c8f34a435bdf..50a101f833c55 100644
--- a/libc/src/__support/FPUtil/FEnvImpl.h
+++ b/libc/src/__support/FPUtil/FEnvImpl.h
@@ -12,10 +12,10 @@
 #include "hdr/fenv_macros.h"
 #include "hdr/math_macros.h"
 #include "hdr/types/fenv_t.h"
+#include "src/__support/libc_errno.h"
 #include "src/__support/macros/attributes.h" // LIBC_INLINE
 #include "src/__support/macros/config.h"
 #include "src/__support/macros/properties/architectures.h"
-#include "src/errno/libc_errno.h"
 
 #if defined(LIBC_TARGET_ARCH_IS_AARCH64) && defined(__ARM_FP)
 #if defined(__APPLE__)
diff --git a/libc/src/__support/File/dir.cpp b/libc/src/__support/File/dir.cpp
index 21b0106f70106..aea8862c15f7f 100644
--- a/libc/src/__support/File/dir.cpp
+++ b/libc/src/__support/File/dir.cpp
@@ -11,8 +11,8 @@
 #include "src/__support/CPP/mutex.h" // lock_guard
 #include "src/__support/CPP/new.h"
 #include "src/__support/error_or.h"
+#include "src/__support/libc_errno.h" // For error macros
 #include "src/__support/macros/config.h"
-#include "src/errno/libc_errno.h" // For error macros
 
 namespace LIBC_NAMESPACE_DECL {
 
diff --git a/libc/src/__support/File/file.cpp b/libc/src/__support/File/file.cpp
index 528542cccf324..303852dbbb717 100644
--- a/libc/src/__support/File/file.cpp
+++ b/libc/src/__support/File/file.cpp
@@ -13,8 +13,8 @@
 #include "hdr/types/off_t.h"
 #include "src/__support/CPP/new.h"
 #include "src/__support/CPP/span.h"
+#include "src/__support/libc_errno.h" // For error macros
 #include "src/__support/macros/config.h"
-#include "src/errno/libc_errno.h" // For error macros
 
 namespace LIBC_NAMESPACE_DECL {
 
diff --git a/libc/src/__support/File/linux/file.cpp 
b/libc/src/__support/File/linux/file.cpp
index 824c1f200e8c5..761e352f74ead 100644
--- a/libc/src/__support/File/linux/file.cpp
+++ b/libc/src/__support/File/linux/file.cpp
@@ -15,8 +15,8 @@
 #include "src/__support/File/linux/lseekImpl.h"
 #include "src/__support/OSUtil/fcntl.h"
 #include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/libc_errno.h"     // For error macros
 #include "src/__support/macros/config.h"
-#include "src/errno/libc_errno.h" // For error macros
 
 #include "hdr/fcntl_macros.h" // For mode_t and other flags to the open syscall
 #include <sys/stat.h>    // For S_IS*, S_IF*, and S_IR* flags.
diff --git a/libc/src/__support/File/linux/lseekImpl.h 
b/libc/src/__support/File/linux/lseekImpl.h
index a034913d9f6ec..300e5c5dd55bf 100644
--- a/libc/src/__support/File/linux/lseekImpl.h
+++ b/libc/src/__support/File/linux/lseekImpl.h
@@ -13,8 +13,8 @@
 #include "src/__support/OSUtil/syscall.h" // For internal syscall function.
 #include "src/__support/common.h"
 #include "src/__support/error_or.h"
+#include "src/__support/libc_errno.h"
 #include "src/__support/macros/config.h"
-#include "src/errno/libc_errno.h"
 
 #include <stdint.h>      // For uint64_t.
 #include <sys/syscall.h> // For syscall numbers.
diff --git a/libc/src/__support/HashTable/randomness.h 
b/libc/src/__support/HashTable/randomness.h
index 244dd41be3eec..6b58a4125f785 100644
--- a/libc/src/__support/HashTable/randomness.h
+++ b/libc/src/__support/HashTable/randomness.h
@@ -14,7 +14,7 @@
 #include "src/__support/macros/attributes.h"
 #include "src/__support/macros/config.h"
 #if defined(LIBC_HASHTABLE_USE_GETRANDOM)
-#include "src/errno/libc_errno.h"
+#include "src/__support/libc_errno.h"
 #include "src/sys/random/getrandom.h"
 #endif
 
diff --git a/libc/src/__support/OSUtil/linux/fcntl.cpp 
b/libc/src/__support/OSUtil/linux/fcntl.cpp
index 4742b2a00220b..99e16ad58c918 100644
--- a/libc/src/__support/OSUtil/linux/fcntl.cpp
+++ b/libc/src/__support/OSUtil/linux/fcntl.cpp
@@ -15,8 +15,8 @@
 #include "hdr/types/struct_flock64.h"
 #include "src/__support/OSUtil/syscall.h" // For internal syscall function.
 #include "src/__support/common.h"
+#include "src/__support/libc_errno.h"
 #include "src/__support/macros/config.h"
-#include "src/errno/libc_errno.h"
 
 #include <stdarg.h>
 #include <sys/syscall.h> // For syscall numbers.
diff --git a/libc/src/__support/OSUtil/linux/vdso.cpp 
b/libc/src/__support/OSUtil/linux/vdso.cpp
index 8c9bd3e1bcc72..e4e53c3c2a0f2 100644
--- a/libc/src/__support/OSUtil/linux/vdso.cpp
+++ b/libc/src/__support/OSUtil/linux/vdso.cpp
@@ -11,9 +11,9 @@
 #include "src/__support/CPP/array.h"
 #include "src/__support/CPP/optional.h"
 #include "src/__support/CPP/string_view.h"
+#include "src/__support/libc_errno.h"
 #include "src/__support/threads/callonce.h"
 #include "src/__support/threads/linux/futex_word.h"
-#include "src/errno/libc_errno.h"
 #include "src/sys/auxv/getauxval.h"
 #include <linux/auxvec.h>
 
diff --git a/libc/src/__support/StringUtil/tables/linux_extension_errors.h 
b/libc/src/__support/StringUtil/tables/linux_extension_errors.h
index 425590f6e91c9..de637d60bea97 100644
--- a/libc/src/__support/StringUtil/tables/linux_extension_errors.h
+++ b/libc/src/__support/StringUtil/tables/linux_extension_errors.h
@@ -10,8 +10,8 @@
 #define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_ERRORS_H
 
 #include "src/__support/StringUtil/message_mapper.h"
+#include "src/__support/libc_errno.h"
 #include "src/__support/macros/config.h"
-#include "src/errno/libc_errno.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
diff --git a/libc/src/__support/libc_errno.h b/libc/src/__support/libc_errno.h
new file mode 100644
index 0000000000000..cf971d0bd1ae3
--- /dev/null
+++ b/libc/src/__support/libc_errno.h
@@ -0,0 +1,93 @@
+//===-- Implementation header for libc_errno --------------------*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_LIBC_ERRNO_H
+#define LLVM_LIBC_SRC___SUPPORT_LIBC_ERRNO_H
+
+#include "src/__support/macros/attributes.h"
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/architectures.h"
+
+#include "hdr/errno_macros.h"
+
+// This header is to be consumed by internal implementations, in which all of
+// them should refer to `libc_errno` instead of using `errno` directly from
+// <errno.h> header.
+
+// Unit and hermetic tests should:
+// - #include "src/__support/libc_errno.h"
+// - NOT #include <errno.h>
+// - Only use `libc_errno` in the code
+// - Depend on libc.src.errno.errno
+
+// Integration tests should:
+// - NOT #include "src/__support/libc_errno.h"
+// - #include <errno.h>
+// - Use regular `errno` in the code
+// - Still depend on libc.src.errno.errno
+
+// libc uses a fallback default value, either system or thread local.
+#define LIBC_ERRNO_MODE_DEFAULT 0
+// libc never stores a value; `errno` macro uses get link-time failure.
+#define LIBC_ERRNO_MODE_UNDEFINED 1
+// libc maintains per-thread state (requires C++ `thread_local` support).
+#define LIBC_ERRNO_MODE_THREAD_LOCAL 2
+// libc maintains shared state used by all threads, contrary to standard C
+// semantics unless always single-threaded; nothing prevents data races.
+#define LIBC_ERRNO_MODE_SHARED 3
+// libc doesn't maintain any internal state, instead the embedder must define
+// `int *__llvm_libc_errno(void);` C function.
+#define LIBC_ERRNO_MODE_EXTERNAL 4
+// libc uses system `<errno.h>` `errno` macro directly in the overlay mode; in
+// fullbuild mode, effectively the same as `LIBC_ERRNO_MODE_EXTERNAL`.
+#define LIBC_ERRNO_MODE_SYSTEM 5
+
+#if !defined(LIBC_ERRNO_MODE) || LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_DEFAULT
+#undef LIBC_ERRNO_MODE
+#if defined(LIBC_FULL_BUILD) || !defined(LIBC_COPT_PUBLIC_PACKAGING)
+#define LIBC_ERRNO_MODE LIBC_ERRNO_MODE_THREAD_LOCAL
+#else
+#define LIBC_ERRNO_MODE LIBC_ERRNO_MODE_SYSTEM
+#endif
+#endif // LIBC_ERRNO_MODE
+
+#if LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_DEFAULT &&                              
\
+    LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_UNDEFINED &&                            
\
+    LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_THREAD_LOCAL &&                         
\
+    LIBC...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/140841
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to