Date: Thu, 5 Sep 2013 09:52:13 +0100 From: David Chisnall <theraven@FreeBSD.org> To: Baptiste Daroussin <bapt@FreeBSD.org> Cc: "freebsd-numerics@FreeBSD.org" <freebsd-numerics@FreeBSD.org>, "current@freebsd.org Current" <current@FreeBSD.org> Subject: Re: clang+libc++ using missing powl Message-ID: <80062343-53CD-4CEF-9C47-3BF614DADB64@FreeBSD.org> In-Reply-To: <20130904223842.GB82066@ithaqua.etoilebsd.net> References: <20130904223842.GB82066@ithaqua.etoilebsd.net>
next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail=_25E7D4EE-FF10-4A0A-8154-123F69905584 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On 4 Sep 2013, at 23:38, Baptiste Daroussin <bapt@freebsd.org> wrote: > As a result we have a lot of fallouts of ports complaining about: > undefined reference to `powl' >=20 > It seems like libc++ is relying on a function we don't have yet in = libm, am I > missing something? I've attached a diff that I'd like to commit to msun that should allow = these things to link. This: - Provides thin wrappers around the 8 missing libm functions that libc++ = exposes that just call the double versions - Makes these weak references, so other libraries can replace them with = more precise versions if required - On platforms where long double is greater precision than double (e.g. = x86), it emits a linker warning when they are referenced These can then be replaced by proper versions as they become available = (at which point the linker warnings will go away). David --Apple-Mail=_25E7D4EE-FF10-4A0A-8154-123F69905584 Content-Disposition: attachment; filename=imprecise.diff Content-Type: application/octet-stream; x-unix-mode=0644; name="imprecise.diff" Content-Transfer-Encoding: 7bit Index: Makefile =================================================================== --- Makefile (revision 255091) +++ Makefile (working copy) @@ -53,6 +53,7 @@ e_pow.c e_powf.c e_rem_pio2.c \ e_rem_pio2f.c e_remainder.c e_remainderf.c e_scalb.c e_scalbf.c \ e_sinh.c e_sinhf.c e_sqrt.c e_sqrtf.c fenv.c \ + imprecise.c \ k_cos.c k_cosf.c k_exp.c k_expf.c k_rem_pio2.c k_sin.c k_sinf.c \ k_tan.c k_tanf.c \ s_asinh.c s_asinhf.c s_atan.c s_atanf.c s_carg.c s_cargf.c s_cargl.c \ Index: Symbol.map =================================================================== --- Symbol.map (revision 255091) +++ Symbol.map (working copy) @@ -270,4 +270,14 @@ log1pl; log2l; logl; + # Implemented as weak aliases for imprecise versions + powl; + coshl; + erfcl; + erfl; + lgammal; + powl; + sinhl; + tanhl; + tgammal; }; Index: src/imprecise.c =================================================================== --- src/imprecise.c (revision 0) +++ src/imprecise.c (working copy) @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2013 David Chisnall + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include <float.h> +#include <math.h> + +/* + * If long double is not the same size as double, then these will lose + * precision and we should emit a warning whenever something links against + * them. + */ +#if (LDBL_MANT_DIG > 53) +#define WARN_IMPRECISE(x) \ + __warn_references(x, # x " has lower than advertised precision"); +#else +#define WARN_IMPRECISE(x) +#endif +/* + * Declare the functions as weak variants so that other libraries providing + * real versions can override them. + */ +#define DECLARE_WEAK(x)\ + __weak_reference(imprecise_## x, x);\ + WARN_IMPRECISE(x) + +long double +imprecise_powl(long double x, long double y) +{ + + return pow(x, y); +} +DECLARE_WEAK(powl); + +#define DECLARE_IMPRECISE(f) \ + long double imprecise_ ## f ## l(long double v) { return f(v); }\ + DECLARE_WEAK(f ## l) + +DECLARE_IMPRECISE(cosh); +DECLARE_IMPRECISE(erfc); +DECLARE_IMPRECISE(erf); +DECLARE_IMPRECISE(lgamma); +DECLARE_IMPRECISE(sinh); +DECLARE_IMPRECISE(tanh); +DECLARE_IMPRECISE(tgamma); Property changes on: src/imprecise.c ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property --Apple-Mail=_25E7D4EE-FF10-4A0A-8154-123F69905584--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?80062343-53CD-4CEF-9C47-3BF614DADB64>