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>
