Skip site navigation (1)Skip section navigation (2)
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: <http://docs.FreeBSD.org/cgi/mid.cgi?80062343-53CD-4CEF-9C47-3BF614DADB64>