From owner-freebsd-numerics@FreeBSD.ORG Thu Sep 5 08:52:19 2013 Return-Path: Delivered-To: freebsd-numerics@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 4FE292E7; Thu, 5 Sep 2013 08:52:19 +0000 (UTC) (envelope-from theraven@FreeBSD.org) Received: from theravensnest.org (theraven.freebsd.your.org [216.14.102.27]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 0F6DE2C4D; Thu, 5 Sep 2013 08:52:18 +0000 (UTC) Received: from [192.168.0.2] (cpc27-cmbg15-2-0-cust235.5-4.cable.virginmedia.com [86.27.188.236]) (authenticated bits=0) by theravensnest.org (8.14.5/8.14.5) with ESMTP id r858qGXa061394 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Thu, 5 Sep 2013 08:52:17 GMT (envelope-from theraven@FreeBSD.org) Content-Type: multipart/mixed; boundary="Apple-Mail=_25E7D4EE-FF10-4A0A-8154-123F69905584" Mime-Version: 1.0 (Mac OS X Mail 6.5 \(1508\)) Subject: Re: clang+libc++ using missing powl From: David Chisnall In-Reply-To: <20130904223842.GB82066@ithaqua.etoilebsd.net> Date: Thu, 5 Sep 2013 09:52:13 +0100 Message-Id: <80062343-53CD-4CEF-9C47-3BF614DADB64@FreeBSD.org> References: <20130904223842.GB82066@ithaqua.etoilebsd.net> To: Baptiste Daroussin X-Mailer: Apple Mail (2.1508) Cc: "freebsd-numerics@FreeBSD.org" , "current@freebsd.org Current" X-BeenThere: freebsd-numerics@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Discussions of high quality implementation of libm functions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Sep 2013 08:52:19 -0000 --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 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 +#include + +/* + * 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--