Merge "Fix error checking in __system_property_foreach() implementation." into main
diff --git a/benchmarks/ctype_benchmark.cpp b/benchmarks/ctype_benchmark.cpp
index c6c23b0..b162ea7 100644
--- a/benchmarks/ctype_benchmark.cpp
+++ b/benchmarks/ctype_benchmark.cpp
@@ -16,81 +16,47 @@
#include <ctype.h>
+#include <array>
+#include <numeric>
+#include <random>
+
#include <benchmark/benchmark.h>
#include "util.h"
-// Avoid optimization.
-volatile int A = 'A';
-volatile int a = 'a';
-volatile int X = 'X';
-volatile int x = 'x';
-volatile int backspace = '\b';
-volatile int del = '\x7f';
-volatile int space = ' ';
-volatile int tab = '\t';
-volatile int zero = '0';
-volatile int underscore = '_';
-volatile int top_bit_set = 0x88;
+static std::array<int, 128> RandomAscii() {
+ std::array<int, 128> result;
+ std::iota(result.begin(), result.end(), 0);
+ std::shuffle(result.begin(), result.end(), std::mt19937{std::random_device{}()});
+ return result;
+}
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isalnum_y1, isalnum(A));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isalnum_y2, isalnum(a));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isalnum_y3, isalnum(zero));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isalnum_n, isalnum(underscore));
+#define CTYPE_BENCHMARK(__benchmark, fn) \
+ static void __benchmark##_##fn(benchmark::State& state) { \
+ auto chars = RandomAscii(); \
+ for (auto _ : state) { \
+ for (char ch : chars) { \
+ benchmark::DoNotOptimize(fn(ch)); \
+ } \
+ } \
+ state.SetBytesProcessed(state.iterations() * chars.size()); \
+ } \
+ BIONIC_BENCHMARK(__benchmark##_##fn)
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isalpha_y1, isalpha(A));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isalpha_y2, isalpha(a));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isalpha_n, isalpha(underscore));
+CTYPE_BENCHMARK(BM_ctype, isalpha);
+CTYPE_BENCHMARK(BM_ctype, isalnum);
+CTYPE_BENCHMARK(BM_ctype, isascii);
+CTYPE_BENCHMARK(BM_ctype, isblank);
+CTYPE_BENCHMARK(BM_ctype, iscntrl);
+CTYPE_BENCHMARK(BM_ctype, isgraph);
+CTYPE_BENCHMARK(BM_ctype, islower);
+CTYPE_BENCHMARK(BM_ctype, isprint);
+CTYPE_BENCHMARK(BM_ctype, ispunct);
+CTYPE_BENCHMARK(BM_ctype, isspace);
+CTYPE_BENCHMARK(BM_ctype, isupper);
+CTYPE_BENCHMARK(BM_ctype, isxdigit);
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isascii_y, isascii(x));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isascii_n, isascii(top_bit_set));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isblank_y1, isblank(space));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isblank_y2, isblank(tab));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isblank_n, isblank(underscore));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_iscntrl_y1, iscntrl(backspace));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_iscntrl_y2, iscntrl(del));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_iscntrl_n, iscntrl(underscore));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isdigit_y, iscntrl(zero));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isdigit_n, iscntrl(underscore));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isgraph_y1, isgraph(A));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isgraph_y2, isgraph(a));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isgraph_y3, isgraph(zero));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isgraph_y4, isgraph(underscore));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isgraph_n, isgraph(space));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_islower_y, islower(x));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_islower_n, islower(X));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isprint_y1, isprint(A));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isprint_y2, isprint(a));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isprint_y3, isprint(zero));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isprint_y4, isprint(underscore));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isprint_y5, isprint(space));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isprint_n, isprint(backspace));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_ispunct_y, ispunct(underscore));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_ispunct_n, ispunct(A));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isspace_y1, isspace(space));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isspace_y2, isspace(tab));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isspace_n, isspace(A));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isupper_y, isupper(X));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isupper_n, isupper(x));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isxdigit_y1, isxdigit(zero));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isxdigit_y2, isxdigit(a));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isxdigit_y3, isxdigit(A));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_isxdigit_n, isxdigit(underscore));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_toascii_y, isascii(x));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_toascii_n, isascii(top_bit_set));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_tolower_y, tolower(X));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_tolower_n, tolower(x));
-
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_toupper_y, toupper(x));
-BIONIC_TRIVIAL_BENCHMARK(BM_ctype_toupper_n, toupper(X));
+CTYPE_BENCHMARK(BM_ctype, toascii);
+CTYPE_BENCHMARK(BM_ctype, tolower);
+CTYPE_BENCHMARK(BM_ctype, _tolower);
+CTYPE_BENCHMARK(BM_ctype, toupper);
+CTYPE_BENCHMARK(BM_ctype, _toupper);
diff --git a/benchmarks/wctype_benchmark.cpp b/benchmarks/wctype_benchmark.cpp
index cdf5568..cf96057 100644
--- a/benchmarks/wctype_benchmark.cpp
+++ b/benchmarks/wctype_benchmark.cpp
@@ -16,17 +16,73 @@
#include <wctype.h>
+#include <numeric>
+#include <random>
+#include <vector>
+
#include <benchmark/benchmark.h>
#include "util.h"
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towlower_ascii_y, towlower('X'));
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towlower_ascii_n, towlower('x'));
+static std::vector<wint_t> RandomAscii() {
+ std::vector<wint_t> result(128);
+ std::iota(result.begin(), result.end(), 0);
+ std::shuffle(result.begin(), result.end(), std::mt19937{std::random_device{}()});
+ return result;
+}
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towlower_unicode_y, towlower(0x0391));
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towlower_unicode_n, towlower(0x03b1));
+static std::vector<wint_t> RandomNonAscii() {
+ std::vector<wint_t> result;
+ std::mt19937 rng{std::random_device{}()};
+ std::uniform_int_distribution<> d(0x80, 0xffff);
+ for (size_t i = 0; i < 128; i++) result.push_back(d(rng));
+ return result;
+}
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towupper_ascii_y, towupper('x'));
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towupper_ascii_n, towupper('X'));
+#define WCTYPE_BENCHMARK(__benchmark, fn, random_fn) \
+ static void __benchmark##_##fn(benchmark::State& state) { \
+ auto chars = random_fn(); \
+ for (auto _ : state) { \
+ for (char ch : chars) { \
+ benchmark::DoNotOptimize(fn(ch)); \
+ } \
+ } \
+ state.SetBytesProcessed(state.iterations() * chars.size()); \
+ } \
+ BIONIC_BENCHMARK(__benchmark##_##fn)
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towupper_unicode_y, towupper(0x03b1));
-BIONIC_TRIVIAL_BENCHMARK(BM_wctype_towupper_unicode_n, towupper(0x0391));
+#define WCTYPE_BENCHMARK_ASCII(__benchmark, fn) WCTYPE_BENCHMARK(__benchmark, fn, RandomAscii)
+
+#define WCTYPE_BENCHMARK_NON_ASCII(__benchmark, fn) \
+ WCTYPE_BENCHMARK(__benchmark, fn, RandomNonAscii)
+
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswalnum);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswalpha);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswblank);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswcntrl);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswdigit);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswgraph);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswlower);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswprint);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswpunct);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswspace);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswupper);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii, iswxdigit);
+
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii_transform, towlower);
+WCTYPE_BENCHMARK_ASCII(BM_wctype_ascii_transform, towupper);
+
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswalnum);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswalpha);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswblank);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswcntrl);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswdigit);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswgraph);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswlower);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswprint);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswpunct);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswspace);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswupper);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii, iswxdigit);
+
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii_transform, towlower);
+WCTYPE_BENCHMARK_NON_ASCII(BM_wctype_non_ascii_transform, towupper);
diff --git a/libc/Android.bp b/libc/Android.bp
index a2d2e0c..7788a48 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -87,10 +87,6 @@
recovery_available: true,
native_bridge_supported: true,
- // lld complains about duplicate symbols in libcrt and libgcc. Suppress the
- // warning since this is intended right now.
- ldflags: ["-Wl,-z,muldefs"],
-
product_variables: {
malloc_zero_contents: {
cflags: ["-DSCUDO_ZERO_CONTENTS"],
@@ -132,6 +128,45 @@
},
}
+// Leave the symbols in the shared library so that stack unwinders can produce
+// meaningful name resolution. This is a bit more ugly than it sounds because
+// arm32 is a bit broken.
+// ========================================================
+cc_defaults {
+ name: "keep_symbols",
+ arch: {
+ arm: {
+ // arm32 does not produce complete exidx unwind information,
+ // so keep the .debug_frame which is relatively small and does
+ // include needed unwind information.
+ // See b/132992102 for details.
+ strip: {
+ keep_symbols_and_debug_frame: true,
+ },
+ },
+ arm64: {
+ strip: {
+ keep_symbols: true,
+ },
+ },
+ riscv64: {
+ strip: {
+ keep_symbols: true,
+ },
+ },
+ x86: {
+ strip: {
+ keep_symbols: true,
+ },
+ },
+ x86_64: {
+ strip: {
+ keep_symbols: true,
+ },
+ },
+ },
+}
+
// Defaults for native allocator libs/includes to make it
// easier to change.
// ========================================================
@@ -1020,11 +1055,6 @@
"stdio/stdio_ext.cpp",
"stdio/vfscanf.cpp",
"stdio/vfwscanf.cpp",
-
- // TODO: why isn't this in a static-libc-only module?
- // This contains a weak stub implementation of __find_icu_symbol for wctype.cpp,
- // which will be overridden by the actual one in libc.so.
- "bionic/icu_static.cpp",
],
arch: {
@@ -1527,6 +1557,7 @@
srcs: [
"bionic/gwp_asan_wrappers.cpp",
"bionic/heap_tagging.cpp",
+ "bionic/icu_static.cpp",
"bionic/malloc_common.cpp",
"bionic/malloc_limit.cpp",
],
@@ -1548,6 +1579,7 @@
"libc_defaults",
"libc_native_allocator_defaults",
"bug_24465209_workaround",
+ "keep_symbols",
],
name: "libc_library_defaults",
product_variables: {
@@ -1595,12 +1627,6 @@
arch: {
arm: {
- ldflags: [
- // Since we are preserving the debug_frame, do not compress
- // in this case to make unwinds as fast as possible.
- "-Wl,--compress-debug-sections=none",
- ],
-
version_script: ":libc.arm.map",
no_libcrt: true,
@@ -1608,59 +1634,33 @@
srcs: [":libc_sources_shared_arm"],
// special for arm
cflags: ["-DCRT_LEGACY_WORKAROUND"],
- // For backwards-compatibility, some arm32 builtins are exported from libc.so.
+ // For backwards compatibility, some arm32 builtins are exported from libc.so.
static_libs: ["libclang_rt.builtins-exported"],
},
- // Arm 32 bit does not produce complete exidx unwind information
- // so keep the .debug_frame which is relatively small and does
- // include needed unwind information.
- // See b/132992102 for details.
- strip: {
- keep_symbols_and_debug_frame: true,
- },
+ ldflags: [
+ // Since we preserve the debug_frame for libc, do not compress
+ // in this case to make unwinds as fast as possible.
+ "-Wl,--compress-debug-sections=none",
+ ],
},
arm64: {
version_script: ":libc.arm64.map",
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
riscv64: {
version_script: ":libc.riscv64.map",
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
x86: {
version_script: ":libc.x86.map",
no_libcrt: true,
shared: {
- // For backwards-compatibility, some x86 builtins are exported from libc.so.
+ // For backwards compatibility, some x86 builtins are exported from libc.so.
static_libs: ["libclang_rt.builtins-exported"],
},
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
x86_64: {
version_script: ":libc.x86_64.map",
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
},
diff --git a/libc/SECCOMP_ALLOWLIST_APP.TXT b/libc/SECCOMP_ALLOWLIST_APP.TXT
index 7e1ecde..80b15b2 100644
--- a/libc/SECCOMP_ALLOWLIST_APP.TXT
+++ b/libc/SECCOMP_ALLOWLIST_APP.TXT
@@ -4,36 +4,36 @@
# This file is processed by a python script named genseccomp.py.
# Needed for debugging 32-bit Chrome
-int pipe:pipe(int pipefd[2]) lp32
+int pipe(int pipefd[2]) lp32
# b/34651972
-int access:access(const char *pathname, int mode) lp32
-int stat64:stat64(const char*, struct stat64*) lp32
+int access(const char *pathname, int mode) lp32
+int stat64(const char*, struct stat64*) lp32
# b/34813887
-int open:open(const char *path, int oflag, ... ) lp32,x86_64
-int getdents:getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count) lp32,x86_64
+int open(const char *path, int oflag, ... ) lp32,x86_64
+int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count) lp32,x86_64
# b/34719286
-int eventfd:eventfd(unsigned int initval, int flags) lp32
+int eventfd(unsigned int initval, int flags) lp32
# b/34817266
-int epoll_wait:epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) lp32
+int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) lp32
# b/34908783
-int epoll_create:epoll_create(int size) lp32
+int epoll_create(int size) lp32
# b/34979910
-int creat:creat(const char *pathname, mode_t mode) lp32
-int unlink:unlink(const char *pathname) lp32
+int creat(const char *pathname, mode_t mode) lp32
+int unlink(const char *pathname) lp32
# b/35059702
-int lstat64:lstat64(const char*, struct stat64*) lp32
+int lstat64(const char*, struct stat64*) lp32
# b/35217603
-int fcntl:fcntl(int fd, int cmd, ... /* arg */ ) lp32
-pid_t fork:fork() lp32
-int poll:poll(struct pollfd *fds, nfds_t nfds, int timeout) lp32
+int fcntl(int fd, int cmd, ... /* arg */ ) lp32
+pid_t fork() lp32
+int poll(struct pollfd *fds, nfds_t nfds, int timeout) lp32
# b/35906875
int inotify_init() lp32
diff --git a/libc/SECCOMP_BLOCKLIST_APP.TXT b/libc/SECCOMP_BLOCKLIST_APP.TXT
index 049d577..b9ecc02 100644
--- a/libc/SECCOMP_BLOCKLIST_APP.TXT
+++ b/libc/SECCOMP_BLOCKLIST_APP.TXT
@@ -6,40 +6,39 @@
#
# This file is processed by a python script named genseccomp.py.
-# Note: Some privileged syscalls are still needed in app process after fork before uid change,
-# including capset and setresuid. This is because the seccomp filter must be installed while
-# the process still has CAP_SYS_ADMIN; changing the uid would remove that capability.
-
-# syscalls to modify IDs
-int setgid:setgid32(gid_t) lp32
-int setgid:setgid(gid_t) lp64
-int setuid:setuid32(uid_t) lp32
-int setuid:setuid(uid_t) lp64
-int setregid:setregid32(gid_t, gid_t) lp32
-int setregid:setregid(gid_t, gid_t) lp64
-int setreuid:setreuid32(uid_t, uid_t) lp32
-int setreuid:setreuid(uid_t, uid_t) lp64
-int setresgid:setresgid32(gid_t, gid_t, gid_t) lp32
-int setresgid:setresgid(gid_t, gid_t, gid_t) lp64
+# Syscalls to modify IDs.
+# Note: Some privileged syscalls are still needed in app_process after fork but
+# before uid change, including capset and setresuid. This is because the seccomp
+# filter must be installed while the process still has CAP_SYS_ADMIN; changing
+# the uid would remove that capability.
+int setgid32(gid_t) lp32
+int setgid(gid_t) lp64
+int setuid32(uid_t) lp32
+int setuid(uid_t) lp64
+int setregid32(gid_t, gid_t) lp32
+int setregid(gid_t, gid_t) lp64
+int setreuid32(uid_t, uid_t) lp32
+int setreuid(uid_t, uid_t) lp64
+int setresgid32(gid_t, gid_t, gid_t) lp32
+int setresgid(gid_t, gid_t, gid_t) lp64
# setresuid is explicitly allowed, see above.
-int setfsgid:setfsgid32(gid_t) lp32
-int setfsgid:setfsgid(gid_t) lp64
-int setfsuid:setfsuid32(uid_t) lp32
-int setfsuid:setfsuid(uid_t) lp64
-int setgroups:setgroups32(int, const gid_t*) lp32
-int setgroups:setgroups(int, const gid_t*) lp64
+int setfsgid32(gid_t) lp32
+int setfsgid(gid_t) lp64
+int setfsuid32(uid_t) lp32
+int setfsuid(uid_t) lp64
+int setgroups32(int, const gid_t*) lp32
+int setgroups(int, const gid_t*) lp64
-# syscalls to modify times
+# Syscalls to modify times.
int adjtimex(struct timex*) all
int clock_adjtime(clockid_t, struct timex*) all
int clock_settime(clockid_t, const struct timespec*) all
int settimeofday(const struct timeval*, const struct timezone*) all
int acct(const char* filepath) all
-int klogctl:syslog(int, char*, int) all
+int syslog(int, char*, int) all
int chroot(const char*) all
-# syscalls to change machine various configurations
int init_module(void*, unsigned long, const char*) all
int delete_module(const char*, unsigned int) all
int mount(const char*, const char*, const char*, unsigned long, const void*) all
@@ -48,4 +47,4 @@
int swapoff(const char*) all
int setdomainname(const char*, size_t) all
int sethostname(const char*, size_t) all
-int __reboot:reboot(int, int, int, void*) all
+int reboot(int, int, int, void*) all
diff --git a/libc/bionic/icu_static.cpp b/libc/bionic/icu_static.cpp
index e81e291..cf24a38 100644
--- a/libc/bionic/icu_static.cpp
+++ b/libc/bionic/icu_static.cpp
@@ -29,6 +29,6 @@
#include "private/icu.h"
// We don't have dlopen/dlsym for static binaries yet.
-__attribute__((weak)) void* __find_icu_symbol(const char*) {
+void* __find_icu_symbol(const char*) {
return nullptr;
}
diff --git a/libc/include/ctype.h b/libc/include/ctype.h
index c15ee56..cb926a4 100644
--- a/libc/include/ctype.h
+++ b/libc/include/ctype.h
@@ -73,9 +73,35 @@
/** Internal implementation detail. Do not use. */
extern const char* _ctype_;
+/**
+ * Returns the corresponding lower-case character if `ch` is upper-case, or undefined otherwise.
+ *
+ * Prefer tolower() instead.
+ */
+__BIONIC_CTYPE_INLINE int _tolower(int __ch) {
+ return __ch | 0x20;
+}
+
+/**
+ * Returns the corresponding upper-case character if `ch` is lower-case, or undefined otherwise.
+ *
+ * Prefer toupper() instead.
+ */
+__BIONIC_CTYPE_INLINE int _toupper(int __ch) {
+ // Using EOR rather than AND makes no difference on arm, but saves an
+ // instruction on arm64.
+ return __ch ^ 0x20;
+}
+
+/** Internal implementation detail. Do not use. */
+__attribute__((__no_sanitize__("unsigned-integer-overflow")))
+static inline int __bionic_ctype_in_range(unsigned __lo, int __ch, unsigned __hi) {
+ return (__BIONIC_CAST(static_cast, unsigned, __ch) - __lo) < (__hi - __lo + 1);
+}
+
/** Returns true if `ch` is in `[A-Za-z]`. */
__BIONIC_CTYPE_INLINE int isalpha(int __ch) {
- return (__ch >= 'A' && __ch <= 'Z') || (__ch >= 'a' && __ch <= 'z');
+ return __bionic_ctype_in_range('a', _tolower(__ch), 'z');
}
/** Returns true if `ch` is a space or tab. */
@@ -90,37 +116,37 @@
/** Returns true if `ch` is in `[0-9]`. */
__BIONIC_CTYPE_INLINE int isdigit(int __ch) {
- return (__ch >= '0' && __ch <= '9');
+ return __bionic_ctype_in_range('0', __ch, '9');
}
/** Returns true if `ch` is `[A-Za-z0-9]` or punctuation. */
__BIONIC_CTYPE_INLINE int isgraph(int __ch) {
- return (__ch >= '!' && __ch <= '~');
+ return __bionic_ctype_in_range('!', __ch, '~');
}
/** Returns true if `ch` is in `[a-z]`. */
__BIONIC_CTYPE_INLINE int islower(int __ch) {
- return (__ch >= 'a' && __ch <= 'z');
+ return __bionic_ctype_in_range('a', __ch, 'z');
}
/** Returns true if `ch` is `[A-Za-z0-9]` or punctuation or space. */
__BIONIC_CTYPE_INLINE int isprint(int __ch) {
- return (__ch >= ' ' && __ch <= '~');
+ return __bionic_ctype_in_range(' ', __ch, '~');
}
/** Returns true if `ch` is in `[ \f\n\r\t\v]`. */
__BIONIC_CTYPE_INLINE int isspace(int __ch) {
- return __ch == ' ' || (__ch >= '\t' && __ch <= '\r');
+ return __ch == ' ' || __bionic_ctype_in_range('\t', __ch, '\r');
}
/** Returns true if `ch` is in `[A-Z]`. */
__BIONIC_CTYPE_INLINE int isupper(int __ch) {
- return (__ch >= 'A' && __ch <= 'Z');
+ return __bionic_ctype_in_range('A', __ch, 'Z');
}
/** Returns true if `ch` is in `[0-9A-Fa-f]`. */
__BIONIC_CTYPE_INLINE int isxdigit(int __ch) {
- return (__ch >= '0' && __ch <= '9') || (__ch >= 'a' && __ch <= 'f') || (__ch >= 'A' && __ch <= 'F');
+ return isdigit(__ch) || __bionic_ctype_in_range('a', _tolower(__ch), 'f') ;
}
/** Returns true if `ch` is in `[A-Za-z0-9]`. */
@@ -133,36 +159,14 @@
return isgraph(__ch) && !isalnum(__ch);
}
-/**
- * Returns the corresponding lower-case character if `ch` is upper-case, or undefined otherwise.
- *
- * Prefer tolower() instead.
- */
-__BIONIC_CTYPE_INLINE int _tolower(int __ch) {
- return __ch | 0x20;
-}
-
/** Returns the corresponding lower-case character if `ch` is upper-case, or `ch` otherwise. */
__BIONIC_CTYPE_INLINE int tolower(int __ch) {
- if (__ch >= 'A' && __ch <= 'Z') return _tolower(__ch);
- return __ch;
-}
-
-/**
- * Returns the corresponding upper-case character if `ch` is lower-case, or undefined otherwise.
- *
- * Prefer toupper() instead.
- */
-__BIONIC_CTYPE_INLINE int _toupper(int __ch) {
- // Using EOR rather than AND makes no difference on arm, but saves an
- // instruction on arm64.
- return __ch ^ 0x20;
+ return (__bionic_ctype_in_range('A', __ch, 'Z')) ? _tolower(__ch) : __ch;
}
/** Returns the corresponding upper-case character if `ch` is lower-case, or `ch` otherwise. */
__BIONIC_CTYPE_INLINE int toupper(int __ch) {
- if (__ch >= 'a' && __ch <= 'z') return _toupper(__ch);
- return __ch;
+ return (__bionic_ctype_in_range('a', __ch, 'z')) ? _toupper(__ch) : __ch;
}
/** Returns true if `ch` is less than 0x80. */
diff --git a/linker/Android.bp b/linker/Android.bp
index 143dbd5..694d1f5 100644
--- a/linker/Android.bp
+++ b/linker/Android.bp
@@ -273,57 +273,28 @@
// A template for the linker binary. May be inherited by native bridge implementations.
cc_defaults {
name: "linker_bin_template",
- defaults: ["linker_defaults"],
+ defaults: [
+ "linker_defaults",
+ "keep_symbols",
+ ],
srcs: [":linker_sources"],
arch: {
arm: {
srcs: [":linker_sources_arm"],
-
- // Arm 32 bit does not produce complete exidx unwind information
- // so keep the .debug_frame which is relatively small and does
- // include needed unwind information.
- // See b/242162222 for details.
- strip: {
- keep_symbols_and_debug_frame: true,
- },
},
arm64: {
srcs: [":linker_sources_arm64"],
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
riscv64: {
srcs: [":linker_sources_riscv64"],
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
x86: {
srcs: [":linker_sources_x86"],
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
x86_64: {
srcs: [":linker_sources_x86_64"],
-
- // Leave the symbols in the shared library so that stack unwinders can produce
- // meaningful name resolution.
- strip: {
- keep_symbols: true,
- },
},
},
diff --git a/tools/versioner/src/DeclarationDatabase.cpp b/tools/versioner/src/DeclarationDatabase.cpp
index a029c3b..9794286 100644
--- a/tools/versioner/src/DeclarationDatabase.cpp
+++ b/tools/versioner/src/DeclarationDatabase.cpp
@@ -103,7 +103,7 @@
}
std::string declaration_name = getDeclName(named_decl);
- bool is_extern = named_decl->getFormalLinkage() == ExternalLinkage;
+ bool is_extern = named_decl->getFormalLinkage() == Linkage::External;
bool is_definition = false;
bool no_guard = false;
bool fortify_inline = false;
diff --git a/tools/versioner/src/Driver.cpp b/tools/versioner/src/Driver.cpp
index 24dc5ec..79672ac 100644
--- a/tools/versioner/src/Driver.cpp
+++ b/tools/versioner/src/Driver.cpp
@@ -42,7 +42,7 @@
#include <llvm/ADT/SmallVector.h>
#include <llvm/ADT/StringRef.h>
#include <llvm/Option/Option.h>
-#include <llvm/Support/Host.h>
+#include <llvm/TargetParser/Host.h>
#include <llvm/Support/VirtualFileSystem.h>
#include "Arch.h"
diff --git a/tools/versioner/src/Preprocessor.cpp b/tools/versioner/src/Preprocessor.cpp
index 47b9017..74d5ba0 100644
--- a/tools/versioner/src/Preprocessor.cpp
+++ b/tools/versioner/src/Preprocessor.cpp
@@ -448,7 +448,7 @@
while (FTSENT* ent = fts_read(fts.get())) {
llvm::StringRef path = ent->fts_path;
- if (!path.startswith(src_dir)) {
+ if (!path.starts_with(src_dir)) {
err(1, "path '%s' doesn't start with source dir '%s'", ent->fts_path, src_dir.c_str());
}
@@ -489,7 +489,7 @@
// TODO: Merge adjacent non-identical guards.
mergeGuards(file_lines[file_path.str()], guard_map);
- if (!file_path.startswith(src_dir)) {
+ if (!file_path.starts_with(src_dir)) {
errx(1, "input file %s is not in %s\n", file_path.str().c_str(), src_dir.c_str());
}
diff --git a/tools/versioner/src/Utils.cpp b/tools/versioner/src/Utils.cpp
index dc6b5dd..d2bb1a8 100644
--- a/tools/versioner/src/Utils.cpp
+++ b/tools/versioner/src/Utils.cpp
@@ -83,7 +83,7 @@
}
llvm::StringRef StripPrefix(llvm::StringRef string, llvm::StringRef prefix) {
- if (string.startswith(prefix)) {
+ if (string.starts_with(prefix)) {
return string.drop_front(prefix.size());
}
return string;
diff --git a/tools/versioner/src/versioner.cpp b/tools/versioner/src/versioner.cpp
index 320c19c..37c8bac 100644
--- a/tools/versioner/src/versioner.cpp
+++ b/tools/versioner/src/versioner.cpp
@@ -146,7 +146,7 @@
continue;
}
- if (header.endswith("/" + it.first)) {
+ if (header.ends_with("/" + it.first)) {
return true;
}
}