Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Upgrade libm.
This brings us up to date with FreeBSD HEAD, fixes various bugs, unifies the set of functions we support on ARM, MIPS, and x86, fixes "long double", adds ISO C99 support, and adds basic unit tests. It turns out that our "long double" functions have always been broken for non-normal numbers. This patch fixes that by not using the upstream implementations and just forwarding to the regular "double" implementation instead (since "long double" on Android is just "double" anyway, which is what BSD doesn't support). All the tests pass on ARM, MIPS, and x86, plus glibc on x86-64. Bug: 3169850 Bug: 8012787 Bug: https://code.google.com/p/android/issues/detail?id=6697 Change-Id: If0c343030959c24bfc50d4d21c9530052c581837
- Loading branch information
Showing
with
8,348 additions
and 7,946 deletions.
- +2 −0 libc/arch-arm/include/machine/_types.h
- +2 −0 libc/arch-x86/include/machine/_types.h
- +15 −0 libc/include/sys/cdefs.h
- +64 −0 libc/tools/check-symbols.py
- +241 −216 libm/Android.mk
- +16 −4 libm/arm/_fpmath.h
- +46 −0 libm/digittoint.c
- +68 −0 libm/fake_long_double.c
- +1 −1 libm/fpclassify.c
- +13 −1 libm/{src → }/fpmath.h
- +7 −2 libm/i386/_fpmath.h
- +92 −0 libm/include/complex.h
- +77 −93 libm/include/math.h
- +1 −2 libm/isinf.c
- +0 −92 libm/man/acos.3
- +0 −82 libm/man/acosh.3
- +0 −94 libm/man/asin.3
- +0 −78 libm/man/asinh.3
- +0 −84 libm/man/atan.3
- +0 −187 libm/man/atan2.3
- +0 −85 libm/man/atanh.3
- +0 −82 libm/man/ceil.3
- +0 −96 libm/man/cimag.3
- +0 −90 libm/man/copysign.3
- +0 −83 libm/man/cos.3
- +0 −72 libm/man/cosh.3
- +0 −97 libm/man/erf.3
- +0 −236 libm/man/exp.3
- +0 −87 libm/man/fabs.3
- +0 −86 libm/man/fdim.3
- +0 −139 libm/man/feclearexcept.3
- +0 −98 libm/man/feenableexcept.3
- +0 −113 libm/man/fegetenv.3
- +0 −83 libm/man/fegetround.3
- +0 −289 libm/man/fenv.3
- +0 −82 libm/man/floor.3
- +0 −116 libm/man/fma.3
- +0 −97 libm/man/fmax.3
- +0 −87 libm/man/fmod.3
- +0 −134 libm/man/hypot.3
- +0 −448 libm/man/ieee.3
- +0 −93 libm/man/ieee_test.3
- +0 −127 libm/man/ilogb.3
- +0 −142 libm/man/j0.3
- +0 −185 libm/man/lgamma.3
- +0 −94 libm/man/lrint.3
- +0 −112 libm/man/lround.3
- +0 −242 libm/man/math.3
- +0 −100 libm/man/nextafter.3
- +0 −146 libm/man/remainder.3
- +0 −103 libm/man/rint.3
- +0 −80 libm/man/round.3
- +0 −95 libm/man/scalbn.3
- +0 −57 libm/man/signbit.3
- +0 −82 libm/man/sin.3
- +0 −71 libm/man/sinh.3
- +0 −100 libm/man/sqrt.3
- +0 −81 libm/man/tan.3
- +0 −80 libm/man/tanh.3
- +0 −80 libm/man/trunc.3
- +1 −1 libm/mips/_fpmath.h
- +0 −84 libm/src/e_asinf.c
- +0 −22 libm/src/e_ldexpf.c
- +0 −87 libm/src/e_log10.c
- +0 −55 libm/src/e_log10f.c
- +0 −98 libm/src/e_rem_pio2f.c
- +0 −304 libm/src/k_rem_pio2.c
- +0 −197 libm/src/k_rem_pio2f.c
- +0 −92 libm/src/s_cbrt.c
- +0 −202 libm/src/s_fma.c
- +0 −182 libm/src/s_fmal.c
- +0 −11 libm/src/s_llround.c
- +0 −11 libm/src/s_llroundf.c
- +0 −11 libm/src/s_llroundl.c
- +0 −28 libm/src/w_cabs.c
- +2 −4 libm/{ → upstream-freebsd/lib/msun}/bsdsrc/b_exp.c
- +2 −4 libm/{ → upstream-freebsd/lib/msun}/bsdsrc/b_log.c
- +22 −21 libm/{ → upstream-freebsd/lib/msun}/bsdsrc/b_tgamma.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/bsdsrc/mathimpl.h
- +12 −5 libm/{ → upstream-freebsd/lib/msun}/src/e_acos.c
- +24 −28 libm/{ → upstream-freebsd/lib/msun}/src/e_acosf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_acosh.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_acoshf.c
- +87 −0 libm/upstream-freebsd/lib/msun/src/e_acosl.c
- +14 −10 libm/{ → upstream-freebsd/lib/msun}/src/e_asin.c
- +65 −0 libm/upstream-freebsd/lib/msun/src/e_asinf.c
- +77 −0 libm/upstream-freebsd/lib/msun/src/e_asinl.c
- +19 −14 libm/{ → upstream-freebsd/lib/msun}/src/e_atan2.c
- +12 −13 libm/{ → upstream-freebsd/lib/msun}/src/e_atan2f.c
- +120 −0 libm/upstream-freebsd/lib/msun/src/e_atan2l.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_atanh.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_atanhf.c
- +4 −11 libm/{ → upstream-freebsd/lib/msun}/src/e_cosh.c
- +4 −8 libm/{ → upstream-freebsd/lib/msun}/src/e_coshf.c
- +19 −14 libm/{ → upstream-freebsd/lib/msun}/src/e_exp.c
- +24 −22 libm/{ → upstream-freebsd/lib/msun}/src/e_expf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_fmod.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_fmodf.c
- +149 −0 libm/upstream-freebsd/lib/msun/src/e_fmodl.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_gamma.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_gamma_r.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_gammaf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_gammaf_r.c
- +13 −7 libm/{ → upstream-freebsd/lib/msun}/src/e_hypot.c
- +8 −8 libm/{ → upstream-freebsd/lib/msun}/src/e_hypotf.c
- +124 −0 libm/upstream-freebsd/lib/msun/src/e_hypotl.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_j0.c
- +5 −7 libm/{ → upstream-freebsd/lib/msun}/src/e_j0f.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_j1.c
- +3 −5 libm/{ → upstream-freebsd/lib/msun}/src/e_j1f.c
- +8 −4 libm/{ → upstream-freebsd/lib/msun}/src/e_jn.c
- +9 −6 libm/{ → upstream-freebsd/lib/msun}/src/e_jnf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_lgamma.c
- +10 −10 libm/{ → upstream-freebsd/lib/msun}/src/e_lgamma_r.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_lgammaf.c
- +5 −6 libm/{ → upstream-freebsd/lib/msun}/src/e_lgammaf_r.c
- +11 −6 libm/{ → upstream-freebsd/lib/msun}/src/e_log.c
- +87 −0 libm/upstream-freebsd/lib/msun/src/e_log10.c
- +71 −0 libm/upstream-freebsd/lib/msun/src/e_log10f.c
- +110 −0 libm/upstream-freebsd/lib/msun/src/e_log2.c
- +81 −0 libm/upstream-freebsd/lib/msun/src/e_log2f.c
- +11 −6 libm/{ → upstream-freebsd/lib/msun}/src/e_logf.c
- +8 −6 libm/{ → upstream-freebsd/lib/msun}/src/e_pow.c
- +10 −8 libm/{ → upstream-freebsd/lib/msun}/src/e_powf.c
- +83 −65 libm/{ → upstream-freebsd/lib/msun}/src/e_rem_pio2.c
- +84 −0 libm/upstream-freebsd/lib/msun/src/e_rem_pio2f.c
- +10 −4 libm/{ → upstream-freebsd/lib/msun}/src/e_remainder.c
- +4 −4 libm/{ → upstream-freebsd/lib/msun}/src/e_remainderf.c
- +38 −0 libm/upstream-freebsd/lib/msun/src/e_remainderl.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_scalb.c
- +2 −5 libm/{ → upstream-freebsd/lib/msun}/src/e_scalbf.c
- +5 −11 libm/{ → upstream-freebsd/lib/msun}/src/e_sinh.c
- +5 −9 libm/{ → upstream-freebsd/lib/msun}/src/e_sinhf.c
- +8 −3 libm/{ → upstream-freebsd/lib/msun}/src/e_sqrt.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/e_sqrtf.c
- +159 −0 libm/upstream-freebsd/lib/msun/src/e_sqrtl.c
- +184 −0 libm/upstream-freebsd/lib/msun/src/fenv-softfloat.h
- +5 −5 libm/{ → upstream-freebsd/lib/msun}/src/k_cos.c
- +3 −4 libm/{ → upstream-freebsd/lib/msun}/src/k_cosf.c
- +108 −0 libm/upstream-freebsd/lib/msun/src/k_exp.c
- +87 −0 libm/upstream-freebsd/lib/msun/src/k_expf.c
- +100 −0 libm/upstream-freebsd/lib/msun/src/k_log.h
- +39 −0 libm/upstream-freebsd/lib/msun/src/k_logf.h
- +443 −0 libm/upstream-freebsd/lib/msun/src/k_rem_pio2.c
- +5 −5 libm/{ → upstream-freebsd/lib/msun}/src/k_sin.c
- +3 −4 libm/{ → upstream-freebsd/lib/msun}/src/k_sinf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/k_tan.c
- +3 −4 libm/{ → upstream-freebsd/lib/msun}/src/k_tanf.c
- +220 −21 libm/{ → upstream-freebsd/lib/msun}/src/math_private.h
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_asinh.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_asinhf.c
- +11 −6 libm/{ → upstream-freebsd/lib/msun}/src/s_atan.c
- +15 −22 libm/{ → upstream-freebsd/lib/msun}/src/s_atanf.c
- +85 −0 libm/upstream-freebsd/lib/msun/src/s_atanl.c
- +38 −0 libm/upstream-freebsd/lib/msun/src/s_carg.c
- +38 −0 libm/upstream-freebsd/lib/msun/src/s_cargf.c
- +38 −0 libm/upstream-freebsd/lib/msun/src/s_cargl.c
- +117 −0 libm/upstream-freebsd/lib/msun/src/s_cbrt.c
- +23 −29 libm/{ → upstream-freebsd/lib/msun}/src/s_cbrtf.c
- +143 −0 libm/upstream-freebsd/lib/msun/src/s_cbrtl.c
- +155 −0 libm/upstream-freebsd/lib/msun/src/s_ccosh.c
- +104 −0 libm/upstream-freebsd/lib/msun/src/s_ccoshf.c
- +8 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_ceil.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_ceilf.c
- +3 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_ceill.c
- +89 −0 libm/upstream-freebsd/lib/msun/src/s_cexp.c
- +89 −0 libm/upstream-freebsd/lib/msun/src/s_cexpf.c
- +5 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_cimag.c
- +5 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_cimagf.c
- +5 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_cimagl.c
- +5 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_conj.c
- +5 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_conjf.c
- +5 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_conjl.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_copysign.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_copysignf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_copysignl.c
- +11 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_cos.c
- +12 −9 libm/{ → upstream-freebsd/lib/msun}/src/s_cosf.c
- +95 −0 libm/upstream-freebsd/lib/msun/src/s_cosl.c
- +47 −0 libm/upstream-freebsd/lib/msun/src/s_cproj.c
- +43 −0 libm/upstream-freebsd/lib/msun/src/s_cprojf.c
- +43 −0 libm/upstream-freebsd/lib/msun/src/s_cprojl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_creal.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_crealf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_creall.c
- +157 −0 libm/upstream-freebsd/lib/msun/src/s_csinh.c
- +105 −0 libm/upstream-freebsd/lib/msun/src/s_csinhf.c
- +112 −0 libm/upstream-freebsd/lib/msun/src/s_csqrt.c
- +88 −0 libm/upstream-freebsd/lib/msun/src/s_csqrtf.c
- +108 −0 libm/upstream-freebsd/lib/msun/src/s_csqrtl.c
- +144 −0 libm/upstream-freebsd/lib/msun/src/s_ctanh.c
- +84 −0 libm/upstream-freebsd/lib/msun/src/s_ctanhf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_erf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_erff.c
- +21 −14 libm/{ → upstream-freebsd/lib/msun}/src/s_exp2.c
- +19 −24 libm/{ → upstream-freebsd/lib/msun}/src/s_exp2f.c
- +15 −18 libm/{ → upstream-freebsd/lib/msun}/src/s_expm1.c
- +21 −23 libm/{ → upstream-freebsd/lib/msun}/src/s_expm1f.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fabs.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_fabsf.c
- 0 libm/{ → upstream-freebsd/lib/msun}/src/s_fabsl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fdim.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_finite.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_finitef.c
- +8 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_floor.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_floorf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_floorl.c
- +284 −0 libm/upstream-freebsd/lib/msun/src/s_fma.c
- +32 −10 libm/{ → upstream-freebsd/lib/msun}/src/s_fmaf.c
- +268 −0 libm/upstream-freebsd/lib/msun/src/s_fmal.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fmax.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fmaxf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fmaxl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fmin.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fminf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_fminl.c
- +2 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_frexp.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_frexpf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_frexpl.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_ilogb.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_ilogbf.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_ilogbl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_isfinite.c
- +9 −6 libm/{ → upstream-freebsd/lib/msun}/src/s_isnan.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_isnormal.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_llrint.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_llrintf.c
- +9 −0 libm/upstream-freebsd/lib/msun/src/s_llrintl.c
- +11 −0 libm/upstream-freebsd/lib/msun/src/s_llround.c
- +11 −0 libm/upstream-freebsd/lib/msun/src/s_llroundf.c
- +11 −0 libm/upstream-freebsd/lib/msun/src/s_llroundl.c
- +13 −6 libm/{ → upstream-freebsd/lib/msun}/src/s_log1p.c
- +15 −8 libm/{ → upstream-freebsd/lib/msun}/src/s_log1pf.c
- +8 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_logb.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_logbf.c
- +55 −0 libm/upstream-freebsd/lib/msun/src/s_logbl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_lrint.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_lrintf.c
- +9 −0 libm/upstream-freebsd/lib/msun/src/s_lrintl.c
- +2 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_lround.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_lroundf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_lroundl.c
- +5 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_modf.c
- +4 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_modff.c
- +101 −0 libm/upstream-freebsd/lib/msun/src/s_modfl.c
- +1 −22 libm/{ → upstream-freebsd/lib/msun}/src/s_nan.c
- +2 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_nearbyint.c
- +2 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_nextafter.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_nextafterf.c
- +2 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_nextafterl.c
- +4 −5 libm/{ → upstream-freebsd/lib/msun}/src/s_nexttoward.c
- +4 −5 libm/{ → upstream-freebsd/lib/msun}/src/s_nexttowardf.c
- +12 −6 libm/{ → upstream-freebsd/lib/msun}/src/s_remquo.c
- +4 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_remquof.c
- +178 −0 libm/upstream-freebsd/lib/msun/src/s_remquol.c
- +10 −5 libm/{ → upstream-freebsd/lib/msun}/src/s_rint.c
- +8 −7 libm/{ → upstream-freebsd/lib/msun}/src/s_rintf.c
- +90 −0 libm/upstream-freebsd/lib/msun/src/s_rintl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_round.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_roundf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_roundl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_scalbln.c
- +2 −15 libm/{ → upstream-freebsd/lib/msun}/src/s_scalbn.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_scalbnf.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_scalbnl.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_signbit.c
- 0 libm/{ → upstream-freebsd/lib/msun}/src/s_signgam.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_significand.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_significandf.c
- +11 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_sin.c
- +12 −9 libm/{ → upstream-freebsd/lib/msun}/src/s_sinf.c
- +93 −0 libm/upstream-freebsd/lib/msun/src/s_sinl.c
- +11 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_tan.c
- +9 −6 libm/{ → upstream-freebsd/lib/msun}/src/s_tanf.c
- +12 −13 libm/{ → upstream-freebsd/lib/msun}/src/s_tanh.c
- +2 −3 libm/{ → upstream-freebsd/lib/msun}/src/s_tanhf.c
- +95 −0 libm/upstream-freebsd/lib/msun/src/s_tanl.c
- 0 libm/{ → upstream-freebsd/lib/msun}/src/s_tgammaf.c
- +8 −2 libm/{ → upstream-freebsd/lib/msun}/src/s_trunc.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/s_truncf.c
- +4 −4 libm/{ → upstream-freebsd/lib/msun}/src/s_truncl.c
- +23 −0 libm/upstream-freebsd/lib/msun/src/w_cabs.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/w_cabsf.c
- +20 −0 libm/upstream-freebsd/lib/msun/src/w_cabsl.c
- 0 libm/{ → upstream-freebsd/lib/msun}/src/w_drem.c
- +1 −1 libm/{ → upstream-freebsd/lib/msun}/src/w_dremf.c
- +2 −0 tests/Android.mk
- +4 −0 tests/fenv_test.cpp
- +1,176 −0 tests/math_test.cpp
| @@ -0,0 +1,64 @@ | ||
| #!/usr/bin/python | ||
|
|
||
| import glob | ||
| import os | ||
| import re | ||
| import string | ||
| import subprocess | ||
| import sys | ||
|
|
||
| toolchain = os.environ['ANDROID_TOOLCHAIN'] | ||
| arch = re.sub(r'.*/linux-x86/([^/]+)/.*', r'\1', toolchain) | ||
|
|
||
| sys.stderr.write('Checking symbols for arch "%s"...\n' % arch) | ||
|
|
||
| def GetSymbols(library, functions_or_variables): | ||
| api = '9' | ||
| if library == 'libm' and arch == 'arm': | ||
| api = '3' | ||
| path = '%s/development/ndk/platforms/android-%s/arch-%s/symbols/%s.so.%s.txt' % (os.environ['ANDROID_BUILD_TOP'], api, arch, library, functions_or_variables) | ||
| symbols = set() | ||
| for line in open(path, 'r'): | ||
| symbols.add(line.rstrip()) | ||
| #sys.stdout.write('%d %s in %s for %s\n' % (len(symbols), functions_or_variables, library, arch)) | ||
| return symbols | ||
|
|
||
| def CheckSymbols(library, functions_or_variables): | ||
| expected_symbols = GetSymbols(library, functions_or_variables) | ||
|
|
||
| so_file = '%s/system/lib/%s.so' % (os.environ['ANDROID_PRODUCT_OUT'], library) | ||
|
|
||
| # Example readelf output: | ||
| # 264: 0001623c 4 FUNC GLOBAL DEFAULT 8 cabsf | ||
| # 266: 00016244 4 FUNC GLOBAL DEFAULT 8 dremf | ||
| # 267: 00019018 4 OBJECT GLOBAL DEFAULT 11 __fe_dfl_env | ||
| # 268: 00000000 0 FUNC GLOBAL DEFAULT UND __aeabi_dcmplt | ||
|
|
||
|
|
||
| r = re.compile(r' +\d+: [0-9a-f]+ +\d+ (FUNC|OBJECT) +\S+ +\S+ +\d+ (\S+)') | ||
|
|
||
| actual_symbols = set() | ||
| for line in subprocess.check_output(['readelf', '--dyn-syms', so_file]).split('\n'): | ||
| m = r.match(line) | ||
| if m: | ||
| if m.group(1) == 'FUNC' and functions_or_variables == 'functions': | ||
| actual_symbols.add(m.group(2)) | ||
| elif m.group(1) == 'OBJECT' and functions_or_variables == 'variables': | ||
| actual_symbols.add(m.group(2)) | ||
| #else: | ||
| #print 'ignoring: ' % line | ||
|
|
||
| missing = expected_symbols - actual_symbols | ||
| if len(missing) > 0: | ||
| sys.stderr.write('%d missing %s in %s for %s:\n' % (len(missing), functions_or_variables, library, arch)) | ||
| for miss in sorted(missing): | ||
| sys.stderr.write(' %s\n' % miss) | ||
|
|
||
| return len(missing) == 0 | ||
|
|
||
| CheckSymbols("libc", "functions") | ||
| CheckSymbols("libc", "variables") | ||
| CheckSymbols("libm", "functions") | ||
| CheckSymbols("libm", "variables") | ||
|
|
||
| sys.exit(0) |
Oops, something went wrong.