Merge "Fix potential flakiness in android_mallopt test." into main
diff --git a/libc/Android.bp b/libc/Android.bp
index dc3c73f..aa555a1 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -133,6 +133,8 @@
lto: {
never: true,
},
+
+ apex_available: ["com.android.runtime"],
}
libc_scudo_product_variables = {
@@ -334,10 +336,16 @@
// automatically included.
cc_library_static {
+ name: "libc_freebsd_ldexp",
+ defaults: ["libc_defaults"],
+ cflags: ["-Dscalbn=ldexp"],
+ srcs: [":libc_ldexp_srcs"],
+}
+
+cc_library_static {
defaults: ["libc_defaults"],
tidy_disabled_srcs: ["upstream-*/**/*.c"],
srcs: [
- "upstream-freebsd/lib/libc/gen/ldexp.c",
"upstream-freebsd/lib/libc/stdlib/getopt_long.c",
"upstream-freebsd/lib/libc/stdlib/hcreate.c",
"upstream-freebsd/lib/libc/stdlib/hcreate_r.c",
@@ -1276,9 +1284,6 @@
srcs: [
"bionic/bionic_systrace.cpp",
],
- apex_available: [
- "com.android.runtime",
- ],
}
// ========================================================
@@ -1475,6 +1480,7 @@
"libc_fortify",
"libc_freebsd",
"libc_freebsd_large_stack",
+ "libc_freebsd_ldexp",
"libc_gdtoa",
"libc_netbsd",
"libc_openbsd_large_stack",
@@ -1509,6 +1515,7 @@
"libc_fortify",
"libc_freebsd",
"libc_freebsd_large_stack",
+ "libc_freebsd_ldexp",
"libc_gdtoa",
"libc_netbsd",
"libc_openbsd",
@@ -1831,7 +1838,6 @@
},
},
-
apex_available: [
"//apex_available:platform",
"com.android.runtime",
@@ -2095,6 +2101,9 @@
name: "libstdc++",
static_ndk_lib: true,
static_libs: ["libasync_safe"],
+ apex_available: [
+ "//apex_available:platform",
+ ],
static: {
system_shared_libs: [],
diff --git a/libc/upstream-freebsd/lib/libc/gen/ldexp.c b/libc/upstream-freebsd/lib/libc/gen/ldexp.c
deleted file mode 100644
index 887f673..0000000
--- a/libc/upstream-freebsd/lib/libc/gen/ldexp.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* @(#)s_scalbn.c 5.1 93/09/24 */
-/* @(#)fdlibm.h 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <machine/endian.h>
-#include <math.h>
-
-/* Bit fiddling routines copied from msun/src/math_private.h,v 1.15 */
-
-#if BYTE_ORDER == BIG_ENDIAN
-
-typedef union
-{
- double value;
- struct
- {
- u_int32_t msw;
- u_int32_t lsw;
- } parts;
-} ieee_double_shape_type;
-
-#endif
-
-#if BYTE_ORDER == LITTLE_ENDIAN
-
-typedef union
-{
- double value;
- struct
- {
- u_int32_t lsw;
- u_int32_t msw;
- } parts;
-} ieee_double_shape_type;
-
-#endif
-
-/* Get two 32 bit ints from a double. */
-
-#define EXTRACT_WORDS(ix0,ix1,d) \
-do { \
- ieee_double_shape_type ew_u; \
- ew_u.value = (d); \
- (ix0) = ew_u.parts.msw; \
- (ix1) = ew_u.parts.lsw; \
-} while (0)
-
-/* Get the more significant 32 bit int from a double. */
-
-#define GET_HIGH_WORD(i,d) \
-do { \
- ieee_double_shape_type gh_u; \
- gh_u.value = (d); \
- (i) = gh_u.parts.msw; \
-} while (0)
-
-/* Set the more significant 32 bits of a double from an int. */
-
-#define SET_HIGH_WORD(d,v) \
-do { \
- ieee_double_shape_type sh_u; \
- sh_u.value = (d); \
- sh_u.parts.msw = (v); \
- (d) = sh_u.value; \
-} while (0)
-
-
-static const double
-two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
-twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
-huge = 1.0e+300,
-tiny = 1.0e-300;
-
-static double
-_copysign(double x, double y)
-{
- u_int32_t hx,hy;
- GET_HIGH_WORD(hx,x);
- GET_HIGH_WORD(hy,y);
- SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000));
- return x;
-}
-
-double
-ldexp(double x, int n)
-{
- int32_t k,hx,lx;
- EXTRACT_WORDS(hx,lx,x);
- k = (hx&0x7ff00000)>>20; /* extract exponent */
- if (k==0) { /* 0 or subnormal x */
- if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
- x *= two54;
- GET_HIGH_WORD(hx,x);
- k = ((hx&0x7ff00000)>>20) - 54;
- if (n< -50000) return tiny*x; /*underflow*/
- }
- if (k==0x7ff) return x+x; /* NaN or Inf */
- k = k+n;
- if (k > 0x7fe) return huge*_copysign(huge,x); /* overflow */
- if (k > 0) /* normal result */
- {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
- if (k <= -54) {
- if (n > 50000) /* in case integer overflow in n+k */
- return huge*_copysign(huge,x); /*overflow*/
- else return tiny*_copysign(tiny,x); /*underflow*/
- }
- k += 54; /* subnormal result */
- SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
- return x*twom54;
-}
diff --git a/libm/Android.bp b/libm/Android.bp
index 079fd9a..bfb7a8c 100644
--- a/libm/Android.bp
+++ b/libm/Android.bp
@@ -509,3 +509,8 @@
tools: ["generate-version-script"],
cmd: "$(location generate-version-script) x86_64 $(in) $(out)",
}
+
+filegroup {
+ name: "libc_ldexp_srcs",
+ srcs: ["upstream-freebsd/lib/msun/src/s_scalbn.c"],
+}
diff --git a/tests/uchar_test.cpp b/tests/uchar_test.cpp
index 9c2d219..9e42f58 100644
--- a/tests/uchar_test.cpp
+++ b/tests/uchar_test.cpp
@@ -71,19 +71,42 @@
}
TEST(uchar, start_state) {
+ // C23 does not appear to specify the behavior of the conversion functions if
+ // a state is reused before the character is completed. In the wchar.h section
+ // (7.31.6.3) it says:
+ //
+ // If an mbstate_t object has been altered by any of the functions
+ // described in this subclause, and is then used with a different
+ // multibyte character sequence, or in the other conversion direction, or
+ // with a different LC_CTYPE category setting than on earlier function
+ // calls, the behavior is undefined.
+ //
+ // But "described in this subclause" refers to the wchar.h functions, not the
+ // uchar.h ones.
+ //
+ // Since C has no opinion, we need to make a choice. While no caller should
+ // ever do this (what does it mean to begin decoding a UTF-32 character while
+ // still in the middle of a UTF-8 sequence?), considering that a decoding
+ // error seems the least surprising. Bionic and glibc both have that behavior.
+ // musl ignores the state (it also doesn't make much sense to read the state
+ // when the entire conversion completes in a single call) and decodes the
+ // UTF-32 character.
+#if !defined(ANDROID_HOST_MUSL)
ASSERT_STREQ("C.UTF-8", setlocale(LC_CTYPE, "C.UTF-8"));
uselocale(LC_GLOBAL_LOCALE);
char out[MB_LEN_MAX];
mbstate_t ps;
- // Any non-initial state is invalid when calling c32rtomb.
memset(&ps, 0, sizeof(ps));
EXPECT_EQ(static_cast<size_t>(-2), mbrtoc32(nullptr, "\xc2", 1, &ps));
errno = 0;
EXPECT_EQ(static_cast<size_t>(-1), c32rtomb(out, 0x00a2, &ps));
EXPECT_EQ(EILSEQ, errno);
+ // Similarly (but not in compliance with the standard afaict), musl seems to
+ // ignore the state entirely for the UTF-32 functions rather than reset it.
+
// If the first argument to c32rtomb is nullptr or the second is L'\0' the shift
// state should be reset.
memset(&ps, 0, sizeof(ps));
@@ -95,6 +118,7 @@
EXPECT_EQ(static_cast<size_t>(-2), mbrtoc32(nullptr, "\xf0\xa4", 1, &ps));
EXPECT_EQ(1U, c32rtomb(out, L'\0', &ps));
EXPECT_TRUE(mbsinit(&ps));
+#endif
}
TEST(uchar, c16rtomb_null_out) {