From 7aa3cad29fa4a226d0be66aac9921515bda4fced Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Fri, 2 Aug 2024 23:25:44 -0700 Subject: [PATCH 1/3] [libc] enable most of the entrypoints on aarch64 --- libc/cmake/modules/LLVMLibCTestRules.cmake | 6 +- libc/config/linux/aarch64/entrypoints.txt | 120 +++++++++++++++++---- libc/src/stdlib/CMakeLists.txt | 14 +-- 3 files changed, 112 insertions(+), 28 deletions(-) diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake index a8b0c61d2236a..539ed0429549f 100644 --- a/libc/cmake/modules/LLVMLibCTestRules.cmake +++ b/libc/cmake/modules/LLVMLibCTestRules.cmake @@ -22,7 +22,11 @@ function(get_object_files_for_test result skipped_entrypoints_list) foreach(dep IN LISTS unchecked_list) if (NOT TARGET ${dep}) # Skip tests with undefined dependencies. - list(APPEND skipped_list ${dep}) + # Compiler-RT targets are added only if they are enabled. However, such targets may not be defined + # at the time of the libc build. We should skip checking such targets. + if (NOT ${dep} MATCHES "^RTScudo.*|^RTGwp.*") + list(APPEND skipped_list ${dep}) + endif() continue() endif() get_target_property(aliased_target ${dep} "ALIASED_TARGET") diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index ebdaa0f6de7fd..4db1367c7cc30 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -68,6 +68,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.string.strchr libc.src.string.strchrnul libc.src.string.strcmp + libc.src.string.strcoll libc.src.string.strcpy libc.src.string.strcspn libc.src.string.strdup @@ -90,6 +91,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.string.strstr libc.src.string.strtok libc.src.string.strtok_r + libc.src.string.strxfrm # inttypes.h entrypoints libc.src.inttypes.imaxabs @@ -185,6 +187,9 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.stdlib.qsort_r libc.src.stdlib.rand libc.src.stdlib.srand + libc.src.stdlib.strfromd + libc.src.stdlib.strfromf + libc.src.stdlib.strfroml libc.src.stdlib.strtod libc.src.stdlib.strtof libc.src.stdlib.strtol @@ -202,18 +207,34 @@ set(TARGET_LIBC_ENTRYPOINTS # stdio.h entrypoints libc.src.stdio.fdopen - #libc.src.stdio.fscanf + libc.src.stdio.fileno + libc.src.stdio.fprintf + libc.src.stdio.fscanf + libc.src.stdio.printf libc.src.stdio.remove libc.src.stdio.rename + libc.src.stdio.scanf libc.src.stdio.snprintf libc.src.stdio.sprintf libc.src.stdio.asprintf - #libc.src.stdio.scanf - #libc.src.stdio.sscanf + libc.src.stdio.sscanf + libc.src.stdio.vsscanf + libc.src.stdio.vfprintf + libc.src.stdio.vprintf libc.src.stdio.vsnprintf libc.src.stdio.vsprintf libc.src.stdio.vasprintf + # sys/epoll.h entrypoints + libc.src.sys.epoll.epoll_create + libc.src.sys.epoll.epoll_create1 + libc.src.sys.epoll.epoll_ctl + libc.src.sys.epoll.epoll_pwait + libc.src.sys.epoll.epoll_wait + # TODO: Need to check if pwait2 is available before providing. + # https://github.com/llvm/llvm-project/issues/80060 + # libc.src.sys.epoll.epoll_pwait2 + # sys/mman.h entrypoints libc.src.sys.mman.madvise libc.src.sys.mman.mincore @@ -250,6 +271,10 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.sys.stat.mkdirat libc.src.sys.stat.stat + # sys/statvfs.h + libc.src.sys.statvfs.fstatvfs + libc.src.sys.statvfs.statvfs + # sys/utsname.h entrypoints libc.src.sys.utsname.uname @@ -264,12 +289,6 @@ set(TARGET_LIBC_ENTRYPOINTS # sys/auxv.h entrypoints libc.src.sys.auxv.getauxval - # sys/epoll.h entrypoints - # Disabled due to epoll_wait syscalls not being available on this platform. - # libc.src.sys.epoll.epoll_wait - # libc.src.sys.epoll.epoll_pwait - # libc.src.sys.epoll.epoll_pwait2 - # termios.h entrypoints libc.src.termios.cfgetispeed libc.src.termios.cfgetospeed @@ -306,6 +325,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.unistd.linkat libc.src.unistd.lseek libc.src.unistd.pathconf + libc.src.unistd.pipe libc.src.unistd.pread libc.src.unistd.pwrite libc.src.unistd.read @@ -319,6 +339,9 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.unistd.unlink libc.src.unistd.unlinkat libc.src.unistd.write + + # wchar.h entrypoints + libc.src.wchar.wctob ) set(TARGET_LIBM_ENTRYPOINTS @@ -552,17 +575,25 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.canonicalizef16 libc.src.math.ceilf16 libc.src.math.copysignf16 + libc.src.math.expf16 libc.src.math.f16add libc.src.math.f16addf + libc.src.math.f16addl libc.src.math.f16div libc.src.math.f16divf + libc.src.math.f16divl + libc.src.math.f16fma libc.src.math.f16fmaf + libc.src.math.f16fmal libc.src.math.f16mul libc.src.math.f16mulf + libc.src.math.f16mull libc.src.math.f16sqrt libc.src.math.f16sqrtf + libc.src.math.f16sqrtl libc.src.math.f16sub libc.src.math.f16subf + libc.src.math.f16subl libc.src.math.fabsf16 libc.src.math.fdimf16 libc.src.math.floorf16 @@ -576,6 +607,7 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.fminimum_magf16 libc.src.math.fminimum_numf16 libc.src.math.fminimumf16 + libc.src.math.fmodf16 libc.src.math.frexpf16 libc.src.math.fromfpf16 libc.src.math.fromfpxf16 @@ -588,15 +620,12 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.logbf16 libc.src.math.lrintf16 libc.src.math.lroundf16 - # libc.src.math.modff16 + libc.src.math.modff16 libc.src.math.nanf16 libc.src.math.nearbyintf16 libc.src.math.nextafterf16 libc.src.math.nextdownf16 - # Temporarily disable nexttowardf16 on aarch64 because the conversion - # between _Float16 and long double will crash clang-11. This is fixed in - # clang-12 and after: https://godbolt.org/z/8ceT9454c - # libc.src.math.nexttowardf16 + libc.src.math.nexttowardf16 libc.src.math.nextupf16 libc.src.math.remainderf16 libc.src.math.remquof16 @@ -613,16 +642,30 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.ufromfpf16 libc.src.math.ufromfpxf16 ) + + if(LIBC_TYPES_HAS_FLOAT128) + list(APPEND TARGET_LIBM_ENTRYPOINTS + # math.h C23 mixed _Float16 and _Float128 entrypoints + libc.src.math.f16addf128 + libc.src.math.f16divf128 + libc.src.math.f16fmaf128 + libc.src.math.f16mulf128 + libc.src.math.f16sqrtf128 + libc.src.math.f16subf128 + ) + endif() endif() if(LIBC_TYPES_HAS_FLOAT128) list(APPEND TARGET_LIBM_ENTRYPOINTS # math.h C23 _Float128 entrypoints + libc.src.math.canonicalizef128 libc.src.math.ceilf128 libc.src.math.copysignf128 libc.src.math.daddf128 libc.src.math.ddivf128 libc.src.math.dfmaf128 + libc.src.math.dmulf128 libc.src.math.dsqrtf128 libc.src.math.dsubf128 libc.src.math.fabsf128 @@ -639,9 +682,11 @@ if(LIBC_TYPES_HAS_FLOAT128) libc.src.math.fminimum_numf128 libc.src.math.fminimumf128 libc.src.math.fmodf128 + libc.src.math.fmulf128 libc.src.math.frexpf128 libc.src.math.fromfpf128 libc.src.math.fromfpxf128 + libc.src.math.fsqrtf128 libc.src.math.getpayloadf128 libc.src.math.ilogbf128 libc.src.math.ldexpf128 @@ -659,8 +704,8 @@ if(LIBC_TYPES_HAS_FLOAT128) libc.src.math.nextupf128 libc.src.math.remquof128 libc.src.math.rintf128 - libc.src.math.roundf128 libc.src.math.roundevenf128 + libc.src.math.roundf128 libc.src.math.scalbnf128 libc.src.math.setpayloadf128 libc.src.math.sqrtf128 @@ -674,9 +719,18 @@ endif() if(LLVM_LIBC_FULL_BUILD) list(APPEND TARGET_LIBC_ENTRYPOINTS + # assert.h entrypoints + libc.src.assert.__assert_fail + # compiler entrypoints (no corresponding header) libc.src.compiler.__stack_chk_fail + # dirent.h entrypoints + libc.src.dirent.closedir + libc.src.dirent.dirfd + libc.src.dirent.opendir + libc.src.dirent.readdir + # network.h entrypoints libc.src.network.htonl libc.src.network.htons @@ -695,6 +749,12 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.pthread.pthread_attr_setguardsize libc.src.pthread.pthread_attr_setstack libc.src.pthread.pthread_attr_setstacksize + libc.src.pthread.pthread_condattr_destroy + libc.src.pthread.pthread_condattr_getclock + libc.src.pthread.pthread_condattr_getpshared + libc.src.pthread.pthread_condattr_init + libc.src.pthread.pthread_condattr_setclock + libc.src.pthread.pthread_condattr_setpshared libc.src.pthread.pthread_create libc.src.pthread.pthread_detach libc.src.pthread.pthread_equal @@ -755,7 +815,8 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.stdio.ferror_unlocked libc.src.stdio.fflush libc.src.stdio.fgetc - libc.src.stdio.fileno + libc.src.stdio.fgetc_unlocked + libc.src.stdio.fgets libc.src.stdio.flockfile libc.src.stdio.fopen libc.src.stdio.fopencookie @@ -764,29 +825,34 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.stdio.fread libc.src.stdio.fread_unlocked libc.src.stdio.fseek + libc.src.stdio.fseeko + libc.src.stdio.ftell + libc.src.stdio.ftello libc.src.stdio.funlockfile libc.src.stdio.fwrite libc.src.stdio.fwrite_unlocked + libc.src.stdio.getc + libc.src.stdio.getc_unlocked libc.src.stdio.getchar libc.src.stdio.getchar_unlocked - #TODO: Look into if fprintf can be enabled for overlay on aarch64 - libc.src.stdio.fprintf - libc.src.stdio.printf libc.src.stdio.putc libc.src.stdio.putchar libc.src.stdio.puts + libc.src.stdio.setbuf + libc.src.stdio.setvbuf libc.src.stdio.stderr libc.src.stdio.stdin libc.src.stdio.stdout - libc.src.stdio.vfprintf - libc.src.stdio.vprintf + libc.src.stdio.ungetc # stdlib.h entrypoints libc.src.stdlib._Exit libc.src.stdlib.abort + libc.src.stdlib.at_quick_exit libc.src.stdlib.atexit libc.src.stdlib.exit libc.src.stdlib.getenv + libc.src.stdlib.quick_exit # signal.h entrypoints libc.src.signal.kill @@ -800,6 +866,14 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.signal.signal libc.src.signal.sigprocmask + # spawn.h entrypoints + libc.src.spawn.posix_spawn + libc.src.spawn.posix_spawn_file_actions_addclose + libc.src.spawn.posix_spawn_file_actions_adddup2 + libc.src.spawn.posix_spawn_file_actions_addopen + libc.src.spawn.posix_spawn_file_actions_destroy + libc.src.spawn.posix_spawn_file_actions_init + # search.h entrypoints libc.src.search.hcreate libc.src.search.hcreate_r @@ -860,6 +934,10 @@ if(LLVM_LIBC_FULL_BUILD) # sys/select.h entrypoints libc.src.sys.select.select + + # sys/socket.h entrypoints + libc.src.sys.socket.bind + libc.src.sys.socket.socket ) endif() diff --git a/libc/src/stdlib/CMakeLists.txt b/libc/src/stdlib/CMakeLists.txt index 0f363eecc6251..29789f5e2adc2 100644 --- a/libc/src/stdlib/CMakeLists.txt +++ b/libc/src/stdlib/CMakeLists.txt @@ -350,12 +350,14 @@ if(NOT LIBC_TARGET_OS_IS_GPU) list(APPEND SCUDO_DEPS RTScudoStandalone.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} RTScudoStandaloneCWrappers.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO}) - - list(APPEND SCUDO_DEPS - RTGwpAsan.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} - RTGwpAsanBacktraceLibc.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} - RTGwpAsanSegvHandler.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} - ) + + if (COMPILER_RT_BUILD_GWP_ASAN) + list(APPEND SCUDO_DEPS + RTGwpAsan.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} + RTGwpAsanBacktraceLibc.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} + RTGwpAsanSegvHandler.${LIBC_TARGET_ARCHITECTURE_FOR_SCUDO} + ) + endif() add_entrypoint_external( malloc From 684d67b5e8b8408d36a7910aa7faa2ac26155e94 Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Sat, 3 Aug 2024 10:32:27 -0700 Subject: [PATCH 2/3] [libc] undo f16 entrypoints --- libc/config/linux/aarch64/entrypoints.txt | 49 +++++++++++++---------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 4db1367c7cc30..ea0edaa575e5e 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -575,25 +575,27 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.canonicalizef16 libc.src.math.ceilf16 libc.src.math.copysignf16 - libc.src.math.expf16 + # TODO: aarch64 bug + # Please see https://github.com/llvm/llvm-project/pull/100632#issuecomment-2258772681 + # libc.src.math.expf16 libc.src.math.f16add libc.src.math.f16addf - libc.src.math.f16addl + # libc.src.math.f16addl libc.src.math.f16div libc.src.math.f16divf - libc.src.math.f16divl - libc.src.math.f16fma + # libc.src.math.f16divl + # libc.src.math.f16fma libc.src.math.f16fmaf - libc.src.math.f16fmal + # libc.src.math.f16fmal libc.src.math.f16mul libc.src.math.f16mulf - libc.src.math.f16mull + # libc.src.math.f16mull libc.src.math.f16sqrt libc.src.math.f16sqrtf - libc.src.math.f16sqrtl + # libc.src.math.f16sqrtl libc.src.math.f16sub libc.src.math.f16subf - libc.src.math.f16subl + # libc.src.math.f16subl libc.src.math.fabsf16 libc.src.math.fdimf16 libc.src.math.floorf16 @@ -607,7 +609,7 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.fminimum_magf16 libc.src.math.fminimum_numf16 libc.src.math.fminimumf16 - libc.src.math.fmodf16 + # libc.src.math.fmodf16 libc.src.math.frexpf16 libc.src.math.fromfpf16 libc.src.math.fromfpxf16 @@ -620,12 +622,15 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.logbf16 libc.src.math.lrintf16 libc.src.math.lroundf16 - libc.src.math.modff16 + # libc.src.math.modff16 libc.src.math.nanf16 libc.src.math.nearbyintf16 libc.src.math.nextafterf16 libc.src.math.nextdownf16 - libc.src.math.nexttowardf16 + # Temporarily disable nexttowardf16 on aarch64 because the conversion + # between _Float16 and long double will crash clang-11. This is fixed in + # clang-12 and after: https://godbolt.org/z/8ceT9454c + # libc.src.math.nexttowardf16 libc.src.math.nextupf16 libc.src.math.remainderf16 libc.src.math.remquof16 @@ -643,17 +648,17 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.ufromfpxf16 ) - if(LIBC_TYPES_HAS_FLOAT128) - list(APPEND TARGET_LIBM_ENTRYPOINTS - # math.h C23 mixed _Float16 and _Float128 entrypoints - libc.src.math.f16addf128 - libc.src.math.f16divf128 - libc.src.math.f16fmaf128 - libc.src.math.f16mulf128 - libc.src.math.f16sqrtf128 - libc.src.math.f16subf128 - ) - endif() + # if(LIBC_TYPES_HAS_FLOAT128) + # list(APPEND TARGET_LIBM_ENTRYPOINTS + # # math.h C23 mixed _Float16 and _Float128 entrypoints + # libc.src.math.f16addf128 + # libc.src.math.f16divf128 + # libc.src.math.f16fmaf128 + # libc.src.math.f16mulf128 + # libc.src.math.f16sqrtf128 + # libc.src.math.f16subf128 + # ) + # endif() endif() if(LIBC_TYPES_HAS_FLOAT128) From 71d54dd04dae839581a379fbb79649979ce22dd0 Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Sat, 3 Aug 2024 11:23:45 -0700 Subject: [PATCH 3/3] [libc] address CR --- libc/config/linux/aarch64/entrypoints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index ea0edaa575e5e..6a23ecbfa784b 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -584,7 +584,7 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.f16div libc.src.math.f16divf # libc.src.math.f16divl - # libc.src.math.f16fma + libc.src.math.f16fma libc.src.math.f16fmaf # libc.src.math.f16fmal libc.src.math.f16mul