llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang 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